diff --git a/GNUmakefile b/GNUmakefile
index b17fb4c..f28dea8 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -58,6 +58,8 @@ BUILD_COUNTER ?= build.counter
LAST_COUNT = $(shell test ! -e $(BUILD_COUNTER) && echo 0; test -e $(BUILD_COUNTER) && cat $(BUILD_COUNTER))
COUNT = $(shell expr 1 + $(LAST_COUNT))
+SPECVERSION ?= $(COUNT)
+
init:
./autogen.sh
@@ -144,7 +146,7 @@ srpm-%: export $(PACKAGE)-%.spec
if [ -e $(BUILD_COUNTER) ]; then \
echo $(COUNT) > $(BUILD_COUNTER); \
fi
- sed -i 's/global\ specversion.*/global\ specversion\ $(COUNT)/' $(PACKAGE).spec
+ sed -i 's/global\ specversion.*/global\ specversion\ $(SPECVERSION)/' $(PACKAGE).spec
sed -i 's/global\ commit.*/global\ commit\ $(TAG)/' $(PACKAGE).spec
case "$(WITH)" in \
*pre_release*) \
diff --git a/attrd/commands.c b/attrd/commands.c
index c48ef1b..12771ee 100644
--- a/attrd/commands.c
+++ b/attrd/commands.c
@@ -202,21 +202,27 @@ attrd_client_message(crm_client_t *client, xmlNode *xml)
crm_debug("Setting %s to %s", regex, value);
if (regcomp(r_patt, regex, REG_EXTENDED)) {
crm_err("Bad regex '%s' for update", regex);
- regfree(r_patt);
- free(r_patt);
- return;
- }
- g_hash_table_iter_init(&aIter, attributes);
- while (g_hash_table_iter_next(&aIter, (gpointer *) & attr, NULL)) {
- int status = regexec(r_patt, attr, 0, NULL, 0);
+ } else {
- if(status == 0) {
- crm_trace("Matched %s with %s", attr, regex);
- crm_xml_add(xml, F_ATTRD_ATTRIBUTE, attr);
- send_attrd_message(NULL, xml);
+ g_hash_table_iter_init(&aIter, attributes);
+ while (g_hash_table_iter_next(&aIter, (gpointer *) & attr, NULL)) {
+ int status = regexec(r_patt, attr, 0, NULL, 0);
+
+ if(status == 0) {
+ crm_trace("Matched %s with %s", attr, regex);
+ crm_xml_add(xml, F_ATTRD_ATTRIBUTE, attr);
+ send_attrd_message(NULL, xml);
+ }
}
}
+
+ free(key);
+ free(set);
+ free(host);
+
+ regfree(r_patt);
+ free(r_patt);
return;
} else if(host == NULL) {
diff --git a/cib/callbacks.c b/cib/callbacks.c
index 610aa0a..9fb2de9 100644
--- a/cib/callbacks.c
+++ b/cib/callbacks.c
@@ -382,6 +382,9 @@ do_local_notify(xmlNode * notify_src, const char *client_id,
/* send callback to originating child */
crm_client_t *client_obj = NULL;
int local_rc = pcmk_ok;
+ int call_id = 0;
+
+ crm_element_value_int(notify_src, F_CIB_CALLID, &call_id);
if (client_id != NULL) {
client_obj = crm_client_get_by_id(client_id);
@@ -389,7 +392,7 @@ do_local_notify(xmlNode * notify_src, const char *client_id,
if (client_obj == NULL) {
local_rc = -ECONNRESET;
- crm_trace("No client to sent the response to. F_CIB_CLIENTID not set.");
+ crm_trace("No client to sent response %d to, F_CIB_CLIENTID not set.", call_id);
} else {
int rid = 0;
@@ -405,13 +408,13 @@ do_local_notify(xmlNode * notify_src, const char *client_id,
rid, client_obj->name,
from_peer ? "(originator of delegated request)" : "");
} else {
- crm_trace("Sending response to %s %s",
- client_obj->name, from_peer ? "(originator of delegated request)" : "");
+ crm_trace("Sending response [call %d] to %s %s",
+ call_id, client_obj->name, from_peer ? "(originator of delegated request)" : "");
}
} else {
- crm_trace("Sending an event to %s %s",
- client_obj->name, from_peer ? "(originator of delegated request)" : "");
+ crm_trace("Sending event %d to %s %s",
+ call_id, client_obj->name, from_peer ? "(originator of delegated request)" : "");
}
switch (client_obj->kind) {
diff --git a/crmd/control.c b/crmd/control.c
index 99ef659..8989859 100644
--- a/crmd/control.c
+++ b/crmd/control.c
@@ -945,17 +945,23 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void
throttle_load_target = strtof(value, NULL) / 100;
}
+ value = getenv("SBD_WATCHDOG_TIMEOUT");
+
+ if(value == NULL) {
+ value = crmd_pref(config_hash, "stonith-watchdog-timeout");
+ }
+
value = crmd_pref(config_hash, "stonith-watchdog-timeout");
- if(crm_get_msec(value) > 0 && daemon_option("watchdog") == NULL) {
+ if(crm_get_msec(value) > 0 && !daemon_option_enabled(crm_system_name, "watchdog")) {
do_crm_log_always(LOG_EMERG, "Shutting down pacemaker, no watchdog device configured");
crmd_exit(DAEMON_RESPAWN_STOP);
- } else if(crm_get_msec(value) <= 0 && daemon_option("watchdog")) {
+ } else if(crm_get_msec(value) <= 0 && daemon_option_enabled(crm_system_name, "watchdog")) {
crm_warn("Watchdog enabled but no stonith-watchdog-timeout configured");
}
value = crmd_pref(config_hash, "no-quorum-policy");
- if (safe_str_eq(value, "suicide") && daemon_option("watchdog")) {
+ if (safe_str_eq(value, "suicide") && daemon_option_enabled(crm_system_name, "watchdog")) {
no_quorum_suicide_escalation = TRUE;
}
diff --git a/crmd/election.c b/crmd/election.c
index e0bd6c4..a4f2e99 100644
--- a/crmd/election.c
+++ b/crmd/election.c
@@ -208,6 +208,9 @@ do_dc_takeover(long long action,
fsa_register_cib_callback(rc, FALSE, NULL, feature_update_callback);
update_attr_delegate(fsa_cib_conn, cib_none, XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
+ XML_ATTR_HAVE_WATCHDOG, daemon_option("watchdog"), FALSE, NULL, NULL);
+
+ update_attr_delegate(fsa_cib_conn, cib_none, XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
"dc-version", VERSION "-" BUILD_VERSION, FALSE, NULL, NULL);
update_attr_delegate(fsa_cib_conn, cib_none, XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
diff --git a/crmd/pengine.c b/crmd/pengine.c
index ab426be..2f7513f 100644
--- a/crmd/pengine.c
+++ b/crmd/pengine.c
@@ -237,6 +237,48 @@ do_pe_invoke(long long action,
fsa_register_cib_callback(fsa_pe_query, FALSE, NULL, do_pe_invoke_callback);
}
+static void
+force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value)
+{
+ int max = 0;
+ int lpc = 0;
+ int xpath_max = 1024;
+ char *xpath_string = NULL;
+ xmlXPathObjectPtr xpathObj = NULL;
+
+ xpath_string = calloc(1, xpath_max);
+ lpc = snprintf(xpath_string, xpath_max, "%.128s//%s//nvpair[@name='%.128s']",
+ get_object_path(XML_CIB_TAG_CRMCONFIG), XML_CIB_TAG_PROPSET, attr_name);
+ CRM_LOG_ASSERT(lpc > 0);
+
+ xpathObj = xpath_search(xml, xpath_string);
+ max = numXpathResults(xpathObj);
+ free(xpath_string);
+
+ for (lpc = 0; lpc < max; lpc++) {
+ xmlNode *match = getXpathResult(xpathObj, lpc);
+ crm_trace("Forcing %s/%s = %s", ID(match), attr_name, attr_value);
+ crm_xml_add(match, XML_NVPAIR_ATTR_VALUE, attr_value);
+ }
+
+ if(max == 0) {
+ char *attr_id = crm_concat(CIB_OPTIONS_FIRST, attr_name, '-');
+
+ crm_trace("Creating %s/%s = %s", attr_id, attr_name, attr_value);
+ xml = create_xml_node(xml, XML_CIB_TAG_CRMCONFIG);
+ xml = create_xml_node(xml, XML_CIB_TAG_PROPSET);
+ crm_xml_add(xml, XML_ATTR_ID, CIB_OPTIONS_FIRST);
+
+ xml = create_xml_node(xml, XML_CIB_TAG_NVPAIR);
+
+ crm_xml_add(xml, XML_ATTR_ID, attr_id);
+ crm_xml_add(xml, XML_NVPAIR_ATTR_NAME, attr_name);
+ crm_xml_add(xml, XML_NVPAIR_ATTR_VALUE, attr_value);
+
+ free(attr_id);
+ }
+}
+
void
do_pe_invoke_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void *user_data)
{
@@ -279,6 +321,7 @@ do_pe_invoke_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void
crm_xml_add(output, XML_ATTR_DC_UUID, fsa_our_uuid);
crm_xml_add_int(output, XML_ATTR_HAVE_QUORUM, fsa_has_quorum);
+ force_local_option(output, XML_ATTR_HAVE_WATCHDOG, daemon_option("watchdog"));
if (ever_had_quorum && crm_have_quorum == FALSE) {
crm_xml_add_int(output, XML_ATTR_QUORUM_PANIC, 1);
diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c
index f3dedeb..2f658ee 100644
--- a/crmd/remote_lrmd_ra.c
+++ b/crmd/remote_lrmd_ra.c
@@ -140,8 +140,6 @@ recurring_helper(gpointer data)
ra_data->recurring_cmds = g_list_remove(ra_data->recurring_cmds, cmd);
- cmd->call_id = generate_callid();
-
ra_data->cmds = g_list_append(ra_data->cmds, cmd);
mainloop_set_trigger(ra_data->work);
}
@@ -177,6 +175,24 @@ report_remote_ra_result(remote_ra_cmd_t * cmd)
op.interval = cmd->interval;
op.rc = cmd->rc;
op.op_status = cmd->op_status;
+ op.t_run = cmd->start_time;
+ op.t_rcchange = cmd->start_time;
+ if (cmd->reported_success && cmd->rc != PCMK_OCF_OK) {
+ op.t_rcchange = time(NULL);
+ /* This edge case will likely never ever occur, but if it does the
+ * result is that a failure will not be processed correctly. This is only
+ * remotely possible because we are able to detect a connection resource's tcp
+ * connection has failed at any moment after start has completed. The actual
+ * recurring operation is just a connectivity ping.
+ *
+ * basically, we are not guaranteed that the first successful monitor op and
+ * a subsequent failed monitor op will not occur in the same timestamp. We have to
+ * make it look like the operations occurred at separate times though. */
+ if (op.t_rcchange == op.t_run) {
+ op.t_rcchange++;
+ }
+ }
+
if (cmd->params) {
lrmd_key_value_t *tmp;
diff --git a/crmd/te_utils.c b/crmd/te_utils.c
index 66ed1da..69c22e3 100644
--- a/crmd/te_utils.c
+++ b/crmd/te_utils.c
@@ -126,19 +126,19 @@ tengine_stonith_notify(stonith_t * st, stonith_event_t * st_event)
if (st_event->result == pcmk_ok && safe_str_eq("on", st_event->action)) {
crm_notice("%s was successfully unfenced by %s (at the request of %s)",
- st_event->target, st_event->executioner, st_event->origin);
+ st_event->target, st_event->executioner ? st_event->executioner : "<anyone>", st_event->origin);
/* TODO: Hook up st_event->device */
return;
} else if (safe_str_eq("on", st_event->action)) {
crm_err("Unfencing of %s by %s failed: %s (%d)",
- st_event->target, st_event->executioner,
+ st_event->target, st_event->executioner ? st_event->executioner : "<anyone>",
pcmk_strerror(st_event->result), st_event->result);
return;
} else if (st_event->result == pcmk_ok && crm_str_eq(st_event->target, fsa_our_uname, TRUE)) {
crm_crit("We were allegedly just fenced by %s for %s!",
- st_event->executioner, st_event->origin); /* Dumps blackbox if enabled */
+ st_event->executioner ? st_event->executioner : "<anyone>", st_event->origin); /* Dumps blackbox if enabled */
qb_log_fini(); /* Try to get the above log message to disk - somehow */
diff --git a/cts/CIB.py b/cts/CIB.py
index 6ce38e9..d26efdb 100644
--- a/cts/CIB.py
+++ b/cts/CIB.py
@@ -177,6 +177,8 @@ class CIB11(ConfigBase):
for node in self.CM.Env["nodes"]:
ftype = self.CM.Env.RandomGen.choice(["levels-and", "levels-or ", "broadcast "])
self.CM.log(" - Using %s fencing for node: %s" % (ftype, node))
+ # for baremetal remote node tests
+ stt_nodes.append("remote_%s" % node)
if ftype == "levels-and":
stl.level(1, node, "FencingPass,Fencing")
stt_nodes.append(node)
diff --git a/cts/CTStests.py b/cts/CTStests.py
index cd5b7ce..d2b7668 100644
--- a/cts/CTStests.py
+++ b/cts/CTStests.py
@@ -453,8 +453,8 @@ class StonithdTest(CTSTest):
is_dc = self.CM.is_node_dc(node)
watchpats = []
- watchpats.append("Operation .* for host '%s' with device .* returned: 0" % node)
- watchpats.append("tengine_stonith_notify:.*Peer %s was terminated .*: OK" % node)
+ watchpats.append(self.templates["Pat:FenceOpOK"] % node)
+ watchpats.append(self.templates["Pat:NodeFenced"] % node)
if self.Env["at-boot"] == 0:
self.debug("Expecting %s to stay down" % node)
@@ -2634,11 +2634,11 @@ AllTestClasses.append(RemoteLXC)
###################################################################
-class RemoteBaremetal(CTSTest):
+class RemoteDriver(CTSTest):
###################################################################
def __init__(self, cm):
CTSTest.__init__(self,cm)
- self.name = "RemoteBaremetal"
+ self.name = "RemoteDriver"
self.is_docker_unsafe = 1
self.start = StartTest(cm)
self.startall = SimulStartLite(cm)
@@ -2647,9 +2647,8 @@ class RemoteBaremetal(CTSTest):
self.failed = 0
self.fail_string = ""
self.remote_node_added = 0
- self.remote_node = "remote1"
self.remote_rsc_added = 0
- self.remote_rsc = "remote1-rsc"
+ self.remote_rsc = "remote-rsc"
self.cib_cmd = """cibadmin -C -o %s -X '%s' """
def del_rsc(self, node, rsc):
@@ -2679,10 +2678,11 @@ class RemoteBaremetal(CTSTest):
def add_primitive_rsc(self, node):
rsc_xml = """
-<primitive class="ocf" id="%s" provider="pacemaker" type="Dummy">
+<primitive class="ocf" id="%s" provider="heartbeat" type="Dummy">
<operations>
- <op id="remote1-rsc-monitor-interval-10s" interval="10s" name="monitor"/>
+ <op id="remote-rsc-monitor-interval-10s" interval="10s" name="monitor"/>
</operations>
+ <meta_attributes id="remote-meta_attributes"/>
</primitive>""" % (self.remote_rsc)
self.add_rsc(node, rsc_xml)
if self.failed == 0:
@@ -2691,21 +2691,38 @@ class RemoteBaremetal(CTSTest):
def add_connection_rsc(self, node):
rsc_xml = """
<primitive class="ocf" id="%s" provider="pacemaker" type="remote">
- <instance_attributes id="remote1-instance_attributes"/>
- <instance_attributes id="remote1-instance_attributes">
- <nvpair id="remote1-instance_attributes-server" name="server" value="%s"/>
+ <instance_attributes id="remote-instance_attributes"/>
+ <instance_attributes id="remote-instance_attributes">
+ <nvpair id="remote-instance_attributes-server" name="server" value="%s"/>
</instance_attributes>
<operations>
- <op id="remote1-monitor-interval-60s" interval="60s" name="monitor"/>
- <op id="remote1-name-start-interval-0-timeout-60" interval="0" name="start" timeout="60"/>
+ <op id="remote-monitor-interval-60s" interval="60s" name="monitor"/>
+ <op id="remote-name-start-interval-0-timeout-120" interval="0" name="start" timeout="120"/>
</operations>
- <meta_attributes id="remote1-meta_attributes"/>
</primitive>""" % (self.remote_node, node)
self.add_rsc(node, rsc_xml)
if self.failed == 0:
self.remote_node_added = 1
- def step1_start_metal(self, node):
+ def stop_pcmk_remote(self, node):
+ # disable pcmk remote
+ for i in range(10):
+ rc = self.rsh(node, "service pacemaker_remote stop")
+ if rc != 0:
+ time.sleep(6)
+ else:
+ break
+
+ def start_pcmk_remote(self, node):
+ for i in range(10):
+ rc = self.rsh(node, "service pacemaker_remote start")
+ if rc != 0:
+ time.sleep(6)
+ else:
+ self.pcmk_started = 1
+ break
+
+ def start_metal(self, node):
pcmk_started = 0
# make sure the resource doesn't already exist for some reason
@@ -2717,13 +2734,7 @@ class RemoteBaremetal(CTSTest):
self.fail_string = "Failed to shutdown cluster node %s" % (node)
return
- for i in range(10):
- rc = self.rsh(node, "service pacemaker_remote start")
- if rc != 0:
- time.sleep(6)
- else:
- self.pcmk_started = 1
- break
+ self.start_pcmk_remote(node)
if self.pcmk_started == 0:
self.failed = 1
@@ -2735,6 +2746,7 @@ class RemoteBaremetal(CTSTest):
watch = self.create_watch(pats, 120)
watch.setwatch()
pats.append(self.templates["Pat:RscOpOK"] % (self.remote_node, "start"))
+ pats.append(self.templates["Pat:DC_IDLE"])
self.add_connection_rsc(node)
@@ -2745,7 +2757,112 @@ class RemoteBaremetal(CTSTest):
self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
self.failed = 1
- def step2_add_rsc(self, node):
+ def migrate_connection(self, node):
+ if self.failed == 1:
+ return
+
+ pats = [ ]
+ pats.append(self.templates["Pat:RscOpOK"] % (self.remote_node, "migrate_to"))
+ pats.append(self.templates["Pat:RscOpOK"] % (self.remote_node, "migrate_from"))
+ pats.append(self.templates["Pat:DC_IDLE"])
+ watch = self.create_watch(pats, 120)
+ watch.setwatch()
+
+ (rc, lines) = self.rsh(node, "crm_resource -M -r %s" % (self.remote_node), None)
+ if rc != 0:
+ self.fail_string = "failed to move remote node connection resource"
+ self.logger.log(self.fail_string)
+ self.failed = 1
+ return
+
+ self.set_timer("remoteMetalMigrate")
+ watch.lookforall()
+ self.log_timer("remoteMetalMigrate")
+
+ if watch.unmatched:
+ self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
+ self.logger.log(self.fail_string)
+ self.failed = 1
+ return
+
+ def fail_rsc(self, node):
+ if self.failed == 1:
+ return
+
+ watchpats = [ ]
+ watchpats.append(self.templates["Pat:RscRemoteOpOK"] % (self.remote_rsc, "stop", self.remote_node))
+ watchpats.append(self.templates["Pat:RscRemoteOpOK"] % (self.remote_rsc, "start", self.remote_node))
+ watchpats.append(self.templates["Pat:DC_IDLE"])
+
+ watch = self.create_watch(watchpats, 120)
+ watch.setwatch()
+
+ self.debug("causing dummy rsc to fail.")
+
+ rc = self.rsh(node, "rm -f /var/run/resource-agents/Dummy*")
+
+ self.set_timer("remoteRscFail")
+ watch.lookforall()
+ self.log_timer("remoteRscFail")
+ if watch.unmatched:
+ self.fail_string = "Unmatched patterns during rsc fail: %s" % (repr(watch.unmatched))
+ self.logger.log(self.fail_string)
+ self.failed = 1
+
+ def fail_connection(self, node):
+ if self.failed == 1:
+ return
+
+ watchpats = [ ]
+ watchpats.append(self.templates["Pat:FenceOpOK"] % self.remote_node)
+ watchpats.append(self.templates["Pat:NodeFenced"] % self.remote_node)
+
+ watch = self.create_watch(watchpats, 120)
+ watch.setwatch()
+
+ # force stop the pcmk remote daemon. this will result in fencing
+ self.debug("Force stopped active remote node")
+ self.stop_pcmk_remote(node)
+
+ self.debug("Waiting for remote node to be fenced.")
+ self.set_timer("remoteMetalFence")
+ watch.lookforall()
+ self.log_timer("remoteMetalFence")
+ if watch.unmatched:
+ self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
+ self.logger.log(self.fail_string)
+ self.failed = 1
+ return
+
+ self.debug("Waiting for the remote node to come back up")
+ self.CM.ns.WaitForNodeToComeUp(node, 120);
+
+ pats = [ ]
+ watch = self.create_watch(pats, 120)
+ watch.setwatch()
+ pats.append(self.templates["Pat:RscOpOK"] % (self.remote_node, "start"))
+ if self.remote_rsc_added == 1:
+ pats.append(self.templates["Pat:RscOpOK"] % (self.remote_rsc, "monitor"))
+
+ # start the remote node again watch it integrate back into cluster.
+ self.start_pcmk_remote(node)
+ if self.pcmk_started == 0:
+ self.failed = 1
+ self.fail_string = "Failed to start pacemaker_remote on node %s" % (node)
+ self.logger.log(self.fail_string)
+ return
+
+ self.debug("Waiting for remote node to rejoin cluster after being fenced.")
+ self.set_timer("remoteMetalRestart")
+ watch.lookforall()
+ self.log_timer("remoteMetalRestart")
+ if watch.unmatched:
+ self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
+ self.failed = 1
+ self.logger.log(self.fail_string)
+ return
+
+ def add_dummy_rsc(self, node):
if self.failed == 1:
return
@@ -2753,33 +2870,19 @@ class RemoteBaremetal(CTSTest):
pats = [ ]
watch = self.create_watch(pats, 120)
watch.setwatch()
- pats.append("process_lrm_event:.*Operation %s_start_0.*node=%s, .*confirmed.*true" % (self.remote_rsc, self.remote_node))
+ pats.append(self.templates["Pat:RscRemoteOpOK"] % (self.remote_rsc, "start", self.remote_node))
+ pats.append(self.templates["Pat:DC_IDLE"])
# Add a resource that must live on remote-node
self.add_primitive_rsc(node)
- # this crm_resource command actually occurs on the remote node
- # which verifies that the ipc proxy works
- time.sleep(1)
- (rc, lines) = self.rsh(node, "crm_resource -W -r remote1-rsc --quiet", None)
+ # force that rsc to prefer the remote node.
+ (rc, line) = self.CM.rsh(node, "crm_resource -M -r %s -N %s -f" % (self.remote_rsc, self.remote_node), None)
if rc != 0:
- self.fail_string = "Failed to get location of resource remote1-rsc"
+ self.fail_string = "Failed to place remote resource on remote node."
self.failed = 1
return
- find = 0
- for line in lines:
- if self.remote_node in line.split():
- find = 1
- break
-
- if find == 0:
- rc = self.rsh(node, "crm_resource -M -r remote1-rsc -N %s" % (self.remote_node))
- if rc != 0:
- self.fail_string = "Failed to place primitive on remote-node"
- self.failed = 1
- return
-
self.set_timer("remoteMetalRsc")
watch.lookforall()
self.log_timer("remoteMetalRsc")
@@ -2787,7 +2890,7 @@ class RemoteBaremetal(CTSTest):
self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
self.failed = 1
- def step3_test_attributes(self, node):
+ def test_attributes(self, node):
if self.failed == 1:
return
@@ -2827,9 +2930,10 @@ class RemoteBaremetal(CTSTest):
self.set_timer("remoteMetalCleanup")
if self.remote_rsc_added == 1:
- self.rsh(node, "crm_resource -U -r remote1-rsc -N %s" % (self.remote_node))
+ self.rsh(node, "crm_resource -U -r %s -N %s" % (self.remote_rsc, self.remote_node))
self.del_rsc(node, self.remote_rsc)
if self.remote_node_added == 1:
+ self.rsh(node, "crm_resource -U -r %s" % (self.remote_node))
self.del_rsc(node, self.remote_node)
watch.lookforall()
self.log_timer("remoteMetalCleanup")
@@ -2838,15 +2942,11 @@ class RemoteBaremetal(CTSTest):
self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched))
self.failed = 1
- # disable pcmk remote
- for i in range(10):
- rc = self.rsh(node, "service pacemaker_remote stop")
- if rc != 0:
- time.sleep(6)
- else:
- break
+ self.stop_pcmk_remote(node)
- def setup_env(self):
+ def setup_env(self, node):
+
+ self.remote_node = "remote_%s" % (node)
sync_key = 0
# we are assuming if all nodes have a key, that it is
@@ -2887,10 +2987,10 @@ class RemoteBaremetal(CTSTest):
if not ret:
return self.failure("Setup failed, start all nodes failed.")
- self.setup_env()
- self.step1_start_metal(node)
- self.step2_add_rsc(node)
- self.step3_test_attributes(node)
+ self.setup_env(node)
+ self.start_metal(node)
+ self.add_dummy_rsc(node)
+ self.test_attributes(node)
self.cleanup_metal(node)
self.debug("Waiting for the cluster to recover")
@@ -2902,11 +3002,201 @@ class RemoteBaremetal(CTSTest):
def errorstoignore(self):
'''Return list of errors which should be ignored'''
- return [ """is running on remote1 which isn't allowed""",
+ return [ """is running on remote.*which isn't allowed""",
"""Connection terminated""",
"""Failed to send remote""",
]
-AllTestClasses.append(RemoteBaremetal)
+# Remote driver is called by other tests.
+
+###################################################################
+class RemoteBasic(CTSTest):
+###################################################################
+ def __init__(self, cm):
+ CTSTest.__init__(self,cm)
+ self.name = "RemoteBasic"
+ self.start = StartTest(cm)
+ self.startall = SimulStartLite(cm)
+ self.driver = RemoteDriver(cm)
+ self.is_docker_unsafe = 1
+
+ def __call__(self, node):
+ '''Perform the 'RemoteBaremetal' test. '''
+ self.incr("calls")
+
+ ret = self.startall(None)
+ if not ret:
+ return self.failure("Setup failed, start all nodes failed.")
+
+ self.driver.setup_env(node)
+ self.driver.start_metal(node)
+ self.driver.add_dummy_rsc(node)
+ self.driver.test_attributes(node)
+ self.driver.cleanup_metal(node)
+
+ self.debug("Waiting for the cluster to recover")
+ self.CM.cluster_stable()
+ if self.driver.failed == 1:
+ return self.failure(self.driver.fail_string)
+
+ return self.success()
+
+ def is_applicable(self):
+ return self.driver.is_applicable()
+
+ def errorstoignore(self):
+ return self.driver.errorstoignore()
+
+AllTestClasses.append(RemoteBasic)
+
+###################################################################
+class RemoteStonithd(CTSTest):
+###################################################################
+ def __init__(self, cm):
+ CTSTest.__init__(self,cm)
+ self.name = "RemoteStonithd"
+ self.start = StartTest(cm)
+ self.startall = SimulStartLite(cm)
+ self.driver = RemoteDriver(cm)
+ self.is_docker_unsafe = 1
+
+ def __call__(self, node):
+ '''Perform the 'RemoteStonithd' test. '''
+ self.incr("calls")
+
+ ret = self.startall(None)
+ if not ret:
+ return self.failure("Setup failed, start all nodes failed.")
+
+ self.driver.setup_env(node)
+ self.driver.start_metal(node)
+ self.driver.add_dummy_rsc(node)
+
+ self.driver.fail_connection(node)
+ self.driver.cleanup_metal(node)
+
+ self.debug("Waiting for the cluster to recover")
+ self.CM.cluster_stable()
+ if self.driver.failed == 1:
+ return self.failure(self.driver.fail_string)
+
+ return self.success()
+
+ def is_applicable(self):
+ if not self.driver.is_applicable():
+ return False
+
+ if self.Env.has_key("DoFencing"):
+ return self.Env["DoFencing"]
+
+ return True
+
+ def errorstoignore(self):
+ ignore_pats = [
+ """Unexpected disconnect on remote-node""",
+ """error: process_lrm_event: Operation remote_.*_monitor""",
+ """LogActions: Recover remote_""",
+ """Calculated Transition .* /var/lib/pacemaker/pengine/pe-error""",
+ """error: native_create_actions: Resource .*ocf::.* is active on 2 nodes attempting recovery""",
+ ]
+
+ ignore_pats.extend(self.driver.errorstoignore())
+ return ignore_pats
+
+AllTestClasses.append(RemoteStonithd)
+
+###################################################################
+class RemoteMigrate(CTSTest):
+###################################################################
+ def __init__(self, cm):
+ CTSTest.__init__(self,cm)
+ self.name = "RemoteMigrate"
+ self.start = StartTest(cm)
+ self.startall = SimulStartLite(cm)
+ self.driver = RemoteDriver(cm)
+ self.is_docker_unsafe = 1
+
+ def __call__(self, node):
+ '''Perform the 'RemoteMigrate' test. '''
+ self.incr("calls")
+
+ ret = self.startall(None)
+ if not ret:
+ return self.failure("Setup failed, start all nodes failed.")
+
+ self.driver.setup_env(node)
+ self.driver.start_metal(node)
+ self.driver.add_dummy_rsc(node)
+ self.driver.migrate_connection(node)
+ self.driver.cleanup_metal(node)
+
+ self.debug("Waiting for the cluster to recover")
+ self.CM.cluster_stable()
+ if self.driver.failed == 1:
+ return self.failure(self.driver.fail_string)
+
+ return self.success()
+
+ def is_applicable(self):
+ return self.driver.is_applicable()
+
+ def errorstoignore(self):
+ return self.driver.errorstoignore()
+
+AllTestClasses.append(RemoteMigrate)
+
+
+###################################################################
+class RemoteRscFailure(CTSTest):
+###################################################################
+ def __init__(self, cm):
+
+ # fail a rsc on a remote node, verify recovery.
+ CTSTest.__init__(self,cm)
+ self.name = "RemoteRscFailure"
+ self.start = StartTest(cm)
+ self.startall = SimulStartLite(cm)
+ self.driver = RemoteDriver(cm)
+ self.is_docker_unsafe = 1
+
+ def __call__(self, node):
+ '''Perform the 'RemoteRscFailure' test. '''
+ self.incr("calls")
+
+ ret = self.startall(None)
+ if not ret:
+ return self.failure("Setup failed, start all nodes failed.")
+
+ self.driver.setup_env(node)
+ self.driver.start_metal(node)
+ self.driver.add_dummy_rsc(node)
+
+ # This is an important step. We are migrating the connection
+ # before failing the resource. This verifies that the migration
+ # has properly maintained control over the remote-node.
+ self.driver.migrate_connection(node)
+
+ self.driver.fail_rsc(node)
+ self.driver.cleanup_metal(node)
+
+ self.debug("Waiting for the cluster to recover")
+ self.CM.cluster_stable()
+ if self.driver.failed == 1:
+ return self.failure(self.driver.fail_string)
+
+ return self.success()
+
+ def is_applicable(self):
+ return self.driver.is_applicable()
+
+ def errorstoignore(self):
+ ignore_pats = [
+ """LogActions: Recover remote-rsc""",
+ ]
+
+ ignore_pats.extend(self.driver.errorstoignore())
+ return ignore_pats
+
+AllTestClasses.append(RemoteRscFailure)
# vim:ts=4:sw=4:et:
diff --git a/cts/patterns.py b/cts/patterns.py
index 8d34e1c..e734f40 100644
--- a/cts/patterns.py
+++ b/cts/patterns.py
@@ -56,6 +56,9 @@ class BasePatterns:
"Pat:Fencing_ok" : "stonith.*remote_op_done:.*Operation .* of %s by .*: OK",
"Pat:RscOpOK" : "process_lrm_event:.*Operation %s_%s.*ok.*confirmed",
+ "Pat:RscRemoteOpOK" : "process_lrm_event:.*Operation %s_%s.*ok.*node=%s, .*confirmed.*true",
+ "Pat:NodeFenced" : "tengine_stonith_notify:.*Peer %s was terminated .*: OK",
+ "Pat:FenceOpOK" : "Operation .* for host '%s' with device .* returned: 0",
}
def get_component(self, key):
diff --git a/cts/watcher.py b/cts/watcher.py
index 5e6ee43..41e4100 100644
--- a/cts/watcher.py
+++ b/cts/watcher.py
@@ -31,7 +31,8 @@ from cts.remote import *
from cts.logging import *
has_log_watcher = {}
-log_watcher_bin = CTSvars.CRM_DAEMON_DIR + "/cts_log_watcher.py"
+log_watcher_file = "cts_log_watcher.py"
+log_watcher_bin = CTSvars.CRM_DAEMON_DIR + "/" + log_watcher_file
log_watcher = """
import sys, os, fcntl
@@ -164,14 +165,16 @@ class FileObj(SearchObj):
global log_watcher
global log_watcher_bin
- self.debug("Installing %s on %s" % (log_watcher_bin, host))
+ self.debug("Installing %s on %s" % (log_watcher_file, host))
- os.system("cat << END >> %s\n%s\nEND" %(log_watcher_bin, log_watcher))
- os.system("chmod 755 %s" %(log_watcher_bin))
+ os.system("cat << END >> %s\n%s\nEND" %(log_watcher_file, log_watcher))
+ os.system("chmod 755 %s" %(log_watcher_file))
- self.rsh.cp(log_watcher_bin, "root@%s:%s" % (host, log_watcher_bin))
+ self.rsh.cp(log_watcher_file, "root@%s:%s" % (host, log_watcher_bin))
has_log_watcher[host] = 1
+ os.system("rm -f %s" %(log_watcher_file))
+
self.harvest()
def async_complete(self, pid, returncode, outLines, errLines):
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 8798365..9194f1d 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -29,6 +29,7 @@ publican_docs =
generated_docs =
generated_mans =
+ASCIIDOC_CLI_TYPE := pcs
DOCBOOK_FORMATS := html-desktop
DOCBOOK_LANGS := en-US
DOTs = $(wildcard */en-US/images/*.dot)
@@ -154,17 +155,15 @@ pdf:
make DOCBOOK_FORMATS="pdf" ASCIIDOC_CLI_TYPE=$(ASCIIDOC_CLI_TYPE) all-local
# Make sure www-(pcs|crmsh) happen in serial
-www:
- make www-pcs
- make www-crmsh
- make $(generated_docs) $(ascii)
+www: clean-local $(generated_docs) $(ascii)
+ make www-cli
rsync -rtz --progress $(generated_docs) $(ascii) $(asciiman) root@www.clusterlabs.org:/var/www/html/doc/
www-crmsh:
make ASCIIDOC_CLI_TYPE=crmsh clean-local www-cli
www-pcs:
- make ASCIIDOC_CLI_TYPE=pcs clean-local www-cli
+ make ASCIIDOC_CLI_TYPE=pcs www-cli
www-cli:
for book in $(docbook); do \
diff --git a/doc/Pacemaker_Explained/en-US/Ch-Options.txt b/doc/Pacemaker_Explained/en-US/Ch-Options.txt
index cf1478f..3a6ee0b 100644
--- a/doc/Pacemaker_Explained/en-US/Ch-Options.txt
+++ b/doc/Pacemaker_Explained/en-US/Ch-Options.txt
@@ -89,22 +89,22 @@ cluster cannot start resources or fence other nodes. See
+no-quorum-policy+ below.
| dc-version |
-indexterm:[dc-version,Cluster Peroperty]
-indexterm:[Cluster,Peroperty,dc-version]
+indexterm:[dc-version,Cluster Property]
+indexterm:[Cluster,Property,dc-version]
Version of Pacemaker on the cluster's DC.
Often includes the hash which identifies the exact Git changeset it
was built from. Used for diagnostic purposes.
| cluster-infrastructure |
-indexterm:[cluster-infrastructure,Cluster Peroperty]
-indexterm:[Cluster,Peroperty,cluster-infrastructure]
+indexterm:[cluster-infrastructure,Cluster Property]
+indexterm:[Cluster,Property,cluster-infrastructure]
The messaging stack on which Pacemaker is currently running.
Used for informational and diagnostic purposes.
| expected-quorum-votes |
-indexterm:[expected-quorum-votes,Cluster Peroperty]
-indexterm:[Cluster,Peroperty,expected-quorum-votes]
+indexterm:[expected-quorum-votes,Cluster Property]
+indexterm:[Cluster,Property,expected-quorum-votes]
The number of nodes expected to be in the cluster
Used to calculate quorum in Corosync 1.x (not CMAN) based clusters.
diff --git a/extra/resources/ping b/extra/resources/ping
index b9a69b8..e7b9973 100755
--- a/extra/resources/ping
+++ b/extra/resources/ping
@@ -77,7 +77,7 @@ The name of the attributes to set. This is the name to be used in the constrain
The number by which to multiply the number of connected ping nodes by
</longdesc>
<shortdesc lang="en">Value multiplier</shortdesc>
-<content type="integer" default=""/>
+<content type="integer" default="1"/>
</parameter>
<parameter name="host_list" unique="0" required="1">
@@ -93,7 +93,7 @@ The list of ping nodes to count.
Number of ping attempts, per host, before declaring it dead
</longdesc>
<shortdesc lang="en">no. of ping attempts</shortdesc>
-<content type="integer" default="2"/>
+<content type="integer" default="3"/>
</parameter>
<parameter name="timeout" unique="0">
@@ -121,6 +121,15 @@ Default never fails.
<content type="integer" default=""/>
</parameter>
+<parameter name="use_fping" unique="0">
+<longdesc lang="en">
+Use fping rather than ping, if found. If set to 0, fping
+will not be used even if present.
+</longdesc>
+<shortdesc lang="en">Use fping if available</shortdesc>
+<content type="boolean" default="1"/>
+</parameter>
+
<parameter name="debug" unique="0">
<longdesc lang="en">
Enables to use default attrd_updater verbose logging on every call.
@@ -154,7 +163,7 @@ ping_conditional_log() {
ping_usage() {
cat <<END
-usage: $0 {start|stop|monitor|migrate_to|migrate_from|validate-all|meta-data}
+usage: $0 {start|stop|monitor|validate-all|meta-data}
Expects to have a fully populated OCF RA-compliant environment set.
END
@@ -225,7 +234,7 @@ fping_check() {
n=$OCF_RESKEY_attempts
timeout=`expr $OCF_RESKEY_timeout \* 1000 / $OCF_RESKEY_attempts`
- cmd="fping -r $OCF_RESKEY_attempts -t $timeout -B 1.0 $OCF_RESKEY_host_list"
+ cmd="fping -r $OCF_RESKEY_attempts -t $timeout -B 1.0 $OCF_RESKEY_options $OCF_RESKEY_host_list"
$cmd>$f_out 2>$f_err; rc=$?
active=`grep alive $f_out|wc -l`
@@ -274,7 +283,7 @@ ping_check() {
ping_update() {
- if have_binary fping; then
+ if ocf_is_true "$OCF_RESKEY_use_fping" && have_binary fping; then
fping_check
active=$?
else
@@ -306,6 +315,7 @@ ping_update() {
: ${OCF_RESKEY_multiplier:="1"}
: ${OCF_RESKEY_debug:="false"}
: ${OCF_RESKEY_failure_score:="0"}
+: ${OCF_RESKEY_use_fping:="1"}
: ${OCF_RESKEY_CRM_meta_timeout:="20000"}
: ${OCF_RESKEY_CRM_meta_globally_unique:="true"}
diff --git a/extra/resources/remote b/extra/resources/remote
index 9f141a2..d79c4c3 100644
--- a/extra/resources/remote
+++ b/extra/resources/remote
@@ -58,12 +58,12 @@ meta_data() {
tcp port to connect to.
</longdesc>
<shortdesc lang="en">tcp port</shortdesc>
- <content type="string" default="1984"/>
+ <content type="string" default="3121"/>
</parameter>
</parameters>
<actions>
- <action name="start" timeout="40" />
- <action name="stop" timeout="40" />
+ <action name="start" timeout="60" />
+ <action name="stop" timeout="60" />
<action name="monitor" timeout="30" />
<action name="migrate_to" timeout="60" />
<action name="migrate_from" timeout="60" />
diff --git a/fencing/main.c b/fencing/main.c
index b03659e..fe6560d 100644
--- a/fencing/main.c
+++ b/fencing/main.c
@@ -1002,15 +1002,22 @@ update_cib_cache_cb(const char *event, xmlNode * msg)
stonith_enabled_s = crm_element_value(stonith_enabled_xml, XML_NVPAIR_ATTR_VALUE);
}
- if(daemon_option("watchdog")) {
- stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']", local_cib, LOG_TRACE);
- }
+ if(daemon_option_enabled(crm_system_name, "watchdog")) {
+ const char *value = getenv("SBD_WATCHDOG_TIMEOUT");
- if (stonith_watchdog_xml) {
- const char *value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
- stonith_watchdog_timeout_ms = crm_get_msec(value);
- } else {
- stonith_watchdog_timeout_ms = 0;
+ if(value == NULL) {
+ stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']", local_cib, LOG_TRACE);
+ if (stonith_watchdog_xml) {
+ value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
+ }
+ }
+
+ if(value) {
+ stonith_watchdog_timeout_ms = crm_get_msec(value);
+
+ } else {
+ stonith_watchdog_timeout_ms = 0;
+ }
}
if (stonith_enabled_s && crm_is_true(stonith_enabled_s) == FALSE) {
@@ -1354,11 +1361,12 @@ main(int argc, char **argv)
topology = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, free_topology_entry);
- if(daemon_option("watchdog")) {
+ if(daemon_option_enabled(crm_system_name, "watchdog")) {
xmlNode *xml;
stonith_key_value_t *params = NULL;
- stonith_key_value_add(params, STONITH_ATTR_HOSTLIST, stonith_our_uname);
+ params = stonith_key_value_add(params, STONITH_ATTR_HOSTLIST, stonith_our_uname);
+
xml = create_device_registration_xml("watchdog", "internal", STONITH_WATCHDOG_AGENT, params, NULL);
stonith_device_register(xml, NULL, FALSE);
diff --git a/fencing/remote.c b/fencing/remote.c
index 3f4f5ca..63c0274 100644
--- a/fencing/remote.c
+++ b/fencing/remote.c
@@ -277,11 +277,9 @@ remote_op_done(remote_fencing_op_t * op, xmlNode * data, int rc, int dup)
}
if (!op->delegate && data) {
- xmlNode *ndata = get_xpath_object("//@" F_STONITH_DELEGATE, data, LOG_WARNING);
+ xmlNode *ndata = get_xpath_object("//@" F_STONITH_DELEGATE, data, LOG_TRACE);
if(ndata) {
op->delegate = crm_element_value_copy(ndata, F_STONITH_DELEGATE);
- } else {
- op->delegate = crm_element_value_copy(data, F_ORIG);
}
}
@@ -1055,9 +1053,10 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer)
} else {
timeout_one = TIMEOUT_MULTIPLY_FACTOR * get_peer_timeout(peer, op->base_timeout);
- crm_info("Requesting that %s perform op %s %s for %s (%ds)",
- peer->host, op->action, op->target, op->client_name, timeout_one);
+ crm_info("Requesting that %s perform op %s %s for %s (%ds, %ds)",
+ peer->host, op->action, op->target, op->client_name, timeout_one, stonith_watchdog_timeout_ms);
crm_xml_add(remote_op, F_STONITH_MODE, "smart");
+
}
op->state = st_exec;
@@ -1065,7 +1064,17 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer)
g_source_remove(op->op_timer_one);
}
- if(device && stonith_watchdog_timeout_ms && safe_str_eq(device, "watchdog")) {
+ if(stonith_watchdog_timeout_ms > 0 && device && safe_str_eq(device, "watchdog")) {
+ crm_notice("Waiting %ds for %s to self-terminate for %s.%.8s (%p)",
+ stonith_watchdog_timeout_ms/1000, op->target, op->client_name, op->id, device);
+ op->op_timer_one = g_timeout_add(stonith_watchdog_timeout_ms, remote_op_watchdog_done, op);
+
+ /* TODO: We should probably look into peer->device_list to verify watchdog is going to be in use */
+ } else if(stonith_watchdog_timeout_ms > 0
+ && safe_str_eq(peer->host, op->target)
+ && safe_str_neq(op->action, "on")) {
+ crm_notice("Waiting %ds for %s to self-terminate for %s.%.8s (%p)",
+ stonith_watchdog_timeout_ms/1000, op->target, op->client_name, op->id, device);
op->op_timer_one = g_timeout_add(stonith_watchdog_timeout_ms, remote_op_watchdog_done, op);
} else {
@@ -1094,6 +1103,14 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer)
/* if the operation never left the query state,
* but we have all the expected replies, then no devices
* are available to execute the fencing operation. */
+ if(stonith_watchdog_timeout_ms && (device == NULL || safe_str_eq(device, "watchdog"))) {
+ crm_notice("Waiting %ds for %s to self-terminate for %s.%.8s (%p)",
+ stonith_watchdog_timeout_ms/1000, op->target, op->client_name, op->id, device);
+
+ op->op_timer_one = g_timeout_add(stonith_watchdog_timeout_ms, remote_op_watchdog_done, op);
+ return;
+ }
+
if (op->state == st_query) {
crm_info("None of the %d peers have devices capable of terminating %s for %s (%d)",
op->replies, op->target, op->client_name, op->state);
diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h
index 1ff425c..d3c2643 100644
--- a/include/crm/msg_xml.h
+++ b/include/crm/msg_xml.h
@@ -86,6 +86,7 @@
# define XML_ATTR_QUORUM_PANIC "no-quorum-panic"
# define XML_ATTR_HAVE_QUORUM "have-quorum"
+# define XML_ATTR_HAVE_WATCHDOG "have-watchdog"
# define XML_ATTR_EXPECTED_VOTES "expected-quorum-votes"
# define XML_ATTR_GENERATION "epoch"
# define XML_ATTR_GENERATION_ADMIN "admin_epoch"
@@ -298,6 +299,8 @@
# define XML_CONS_TAG_RSC_SET "resource_set"
# define XML_CONS_ATTR_SYMMETRICAL "symmetrical"
+# define XML_LOCATION_ATTR_DISCOVERY "resource-discovery"
+
# define XML_COLOC_ATTR_SOURCE "rsc"
# define XML_COLOC_ATTR_SOURCE_ROLE "rsc-role"
# define XML_COLOC_ATTR_TARGET "with-rsc"
@@ -321,6 +324,7 @@
# define XML_NVPAIR_ATTR_VALUE "value"
# define XML_NODE_ATTR_STATE "state"
+# define XML_NODE_ATTR_RSC_DISCOVERY "resource-discovery-enabled"
# define XML_CONFIG_ATTR_DC_DEADTIME "dc-deadtime"
# define XML_CONFIG_ATTR_ELECTION_FAIL "election-timeout"
diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h
index d0ba856..f08a910 100644
--- a/include/crm/pengine/status.h
+++ b/include/crm/pengine/status.h
@@ -136,6 +136,8 @@ struct node_shared_s {
gboolean shutdown;
gboolean expected_up;
gboolean is_dc;
+ gboolean rsc_discovery_enabled;
+
int num_resources;
GListPtr running_rsc; /* resource_t* */
GListPtr allocated_rsc; /* resource_t* */
@@ -156,6 +158,7 @@ struct node_shared_s {
struct node_s {
int weight;
gboolean fixed;
+ int rsc_discover_mode;
int count;
struct node_shared_s *details;
};
@@ -252,6 +255,7 @@ struct resource_s {
int migration_threshold;
gboolean is_remote_node;
+ gboolean exclusive_discover;
unsigned long long flags;
diff --git a/lib/cib/cib_utils.c b/lib/cib/cib_utils.c
index 022a8ab..15b354b 100644
--- a/lib/cib/cib_utils.c
+++ b/lib/cib/cib_utils.c
@@ -665,7 +665,7 @@ cib_native_callback(cib_t * cib, xmlNode * msg, int call_id, int rc)
crm_trace("Invoking global callback for call %d", call_id);
cib->op_callback(msg, call_id, rc, output);
}
- crm_trace("OP callback activated.");
+ crm_trace("OP callback activated for %d", call_id);
}
void
diff --git a/lib/common/mainloop.c b/lib/common/mainloop.c
index ac395ec..f2295ff 100644
--- a/lib/common/mainloop.c
+++ b/lib/common/mainloop.c
@@ -799,7 +799,7 @@ mainloop_add_fd(const char *name, int priority, int fd, void *userdata,
{
mainloop_io_t *client = NULL;
- if (fd > 0) {
+ if (fd >= 0) {
client = calloc(1, sizeof(mainloop_io_t));
client->name = strdup(name);
client->userdata = userdata;
diff --git a/lib/common/utils.c b/lib/common/utils.c
index dc54e6d..6b8b12c 100644
--- a/lib/common/utils.c
+++ b/lib/common/utils.c
@@ -2008,6 +2008,7 @@ attrd_update_delegate(crm_ipc_t * ipc, char command, const char *host, const cha
case 'u':
crm_xml_add(update, F_ATTRD_TASK, "update");
crm_xml_add(update, F_ATTRD_REGEX, name);
+ break;
case 'D':
case 'U':
case 'v':
diff --git a/lib/common/watchdog.c b/lib/common/watchdog.c
index 7d70f91..3c616cd 100644
--- a/lib/common/watchdog.c
+++ b/lib/common/watchdog.c
@@ -211,10 +211,10 @@ pcmk_panic_local(void)
if(ppid > 1) {
/* child daemon */
- crm_exit(pcmk_err_panic);
+ exit(pcmk_err_panic);
} else {
/* pacemakerd or orphan child */
- crm_exit(DAEMON_RESPAWN_STOP);
+ exit(DAEMON_RESPAWN_STOP);
}
}
@@ -222,6 +222,7 @@ static void
pcmk_panic_sbd(void)
{
union sigval signal_value;
+ pid_t ppid = getppid();
do_crm_log_always(LOG_EMERG, "Signaling sbd(%d) to panic", sbd_pid);
@@ -232,7 +233,13 @@ pcmk_panic_sbd(void)
pcmk_panic_local();
}
- crm_exit(DAEMON_RESPAWN_STOP);
+ if(ppid > 1) {
+ /* child daemon */
+ exit(pcmk_err_panic);
+ } else {
+ /* pacemakerd or orphan child */
+ exit(DAEMON_RESPAWN_STOP);
+ }
}
void
@@ -275,17 +282,27 @@ pcmk_locate_sbd(void)
}
/* Look for the pid file */
+ pidfile = g_strdup_printf("%s/sbd.pid", HA_STATE_DIR);
/* Read the pid file */
if(pidfile) {
int rc = crm_pidfile_inuse(pidfile, 1);
if(rc < pcmk_ok && rc != -ENOENT) {
sbd_pid = crm_read_pidfile(pidfile);
+ crm_trace("SBD detected at pid=%d (file)");
}
}
- /* Fall back to /proc for systems that support it */
- sbd_pid = pcmk_locate_proc_entry("sbd");
+ if(sbd_pid < 0) {
+ /* Fall back to /proc for systems that support it */
+ sbd_pid = pcmk_locate_proc_entry("sbd");
+ crm_trace("SBD detected at pid=%d (proc)");
+ }
+
+ if(sbd_pid < 0) {
+ sbd_pid = 0;
+ }
+ free(pidfile);
return sbd_pid;
}
diff --git a/lib/common/xml.c b/lib/common/xml.c
index 06de44c..58d0a00 100644
--- a/lib/common/xml.c
+++ b/lib/common/xml.c
@@ -386,6 +386,7 @@ static int __xml_build_schema_list(void)
xslt = get_schema_path(NULL, transform);
if(stat(xslt, &s) != 0) {
crm_err("Transform %s not found", xslt);
+ free(xslt);
__xml_schema_add(2, version, NULL, NULL, NULL, -1);
break;
} else {
@@ -1950,9 +1951,11 @@ bool xml_patch_versions(xmlNode *patchset, int add[3], int del[3])
return -EINVAL;
}
- for(lpc = 0; lpc < DIMOF(vfields); lpc++) {
- crm_element_value_int(tmp, vfields[lpc], &(del[lpc]));
- crm_trace("Got %d for del[%s]", del[lpc], vfields[lpc]);
+ if (tmp) {
+ for(lpc = 0; lpc < DIMOF(vfields); lpc++) {
+ crm_element_value_int(tmp, vfields[lpc], &(del[lpc]));
+ crm_trace("Got %d for del[%s]", del[lpc], vfields[lpc]);
+ }
}
switch(format) {
@@ -1973,9 +1976,11 @@ bool xml_patch_versions(xmlNode *patchset, int add[3], int del[3])
return -EINVAL;
}
- for(lpc = 0; lpc < DIMOF(vfields); lpc++) {
- crm_element_value_int(tmp, vfields[lpc], &(add[lpc]));
- crm_trace("Got %d for add[%s]", add[lpc], vfields[lpc]);
+ if (tmp) {
+ for(lpc = 0; lpc < DIMOF(vfields); lpc++) {
+ crm_element_value_int(tmp, vfields[lpc], &(add[lpc]));
+ crm_trace("Got %d for add[%s]", add[lpc], vfields[lpc]);
+ }
}
return pcmk_ok;
diff --git a/lib/pengine/common.c b/lib/pengine/common.c
index e98e1d3..e5e4ea7 100644
--- a/lib/pengine/common.c
+++ b/lib/pengine/common.c
@@ -106,6 +106,8 @@ pe_cluster_option pe_opts[] = {
"Action to send to STONITH device", NULL },
{ "stonith-timeout", NULL, "time", NULL, "60s", &check_timer,
"How long to wait for the STONITH action to complete", NULL },
+ { XML_ATTR_HAVE_WATCHDOG, NULL, "boolean", NULL, "false", &check_boolean,
+ "Enable watchdog integration", "Set automatically by the cluster if SBD is detected. User configured values are ignored." },
{ "startup-fencing", "startup_fencing", "boolean", NULL, "true", &check_boolean,
"STONITH unseen nodes", "Advanced Use Only! Not using the default is very unsafe!" },
diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c
index 7127c12..a19bdff 100644
--- a/lib/pengine/unpack.c
+++ b/lib/pengine/unpack.c
@@ -140,6 +140,12 @@ unpack_config(xmlNode * config, pe_working_set_t * data_set)
crm_info("Startup probes: disabled (dangerous)");
}
+ value = pe_pref(data_set->config_hash, XML_ATTR_HAVE_WATCHDOG);
+ if (value && crm_is_true(value)) {
+ crm_notice("Relying on watchdog integration for fencing");
+ set_bit(data_set->flags, pe_flag_have_stonith_resource);
+ }
+
value = pe_pref(data_set->config_hash, "stonith-timeout");
data_set->stonith_timeout = crm_get_msec(value);
crm_debug("STONITH timeout: %d", data_set->stonith_timeout);
@@ -294,6 +300,7 @@ create_node(const char *id, const char *uname, const char *type, const char *sco
new_node->details->uname = uname;
new_node->details->online = FALSE;
new_node->details->shutdown = FALSE;
+ new_node->details->rsc_discovery_enabled = TRUE;
new_node->details->running_rsc = NULL;
new_node->details->type = node_ping;
@@ -308,6 +315,13 @@ create_node(const char *id, const char *uname, const char *type, const char *sco
new_node->details->attrs = g_hash_table_new_full(crm_str_hash, g_str_equal,
g_hash_destroy_str,
g_hash_destroy_str);
+
+ if (is_remote_node(new_node)) {
+ g_hash_table_insert(new_node->details->attrs, strdup("#kind"), strdup("remote"));
+ } else {
+ g_hash_table_insert(new_node->details->attrs, strdup("#kind"), strdup("cluster"));
+ }
+
new_node->details->utilization =
g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str,
g_hash_destroy_str);
@@ -657,7 +671,10 @@ link_rsc2remotenode(pe_working_set_t *data_set, resource_t *new_rsc)
* as cluster nodes. */
if (new_rsc->container == NULL) {
handle_startup_fencing(data_set, remote_node);
- return;
+ } else {
+ /* At this point we know if the remote node is a container or baremetal
+ * remote node, update the #kind attribute if a container is involved */
+ g_hash_table_replace(remote_node->details->attrs, strdup("#kind"), strdup("container"));
}
}
@@ -723,10 +740,12 @@ unpack_resources(xmlNode * xml_resources, pe_working_set_t * data_set)
}
data_set->resources = g_list_sort(data_set->resources, sort_rsc_priority);
+ if (is_set(data_set->flags, pe_flag_quick_location)) {
+ /* Ignore */
+
+ } else if (is_set(data_set->flags, pe_flag_stonith_enabled)
+ && is_set(data_set->flags, pe_flag_have_stonith_resource) == FALSE) {
- if (is_not_set(data_set->flags, pe_flag_quick_location)
- && is_set(data_set->flags, pe_flag_stonith_enabled)
- && is_set(data_set->flags, pe_flag_have_stonith_resource) == FALSE) {
crm_config_err("Resource start-up disabled since no STONITH resources have been defined");
crm_config_err("Either configure some or disable STONITH with the stonith-enabled option");
crm_config_err("NOTE: Clusters with shared data need STONITH to ensure data integrity");
@@ -988,6 +1007,7 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set)
if (crm_str_eq((const char *)state->name, XML_CIB_TAG_STATE, TRUE)) {
xmlNode *attrs = NULL;
+ const char *resource_discovery_enabled = NULL;
id = crm_element_value(state, XML_ATTR_ID);
uname = crm_element_value(state, XML_ATTR_UNAME);
@@ -1027,6 +1047,12 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set)
this_node->details->maintenance = TRUE;
}
+ resource_discovery_enabled = g_hash_table_lookup(this_node->details->attrs, XML_NODE_ATTR_RSC_DISCOVERY);
+ if (resource_discovery_enabled && !crm_is_true(resource_discovery_enabled)) {
+ crm_warn("ignoring %s attribute on node %s, disabling resource discovery is not allowed on cluster nodes",
+ XML_NODE_ATTR_RSC_DISCOVERY, this_node->details->uname);
+ }
+
crm_trace("determining node state");
determine_online_status(state, this_node, data_set);
@@ -1102,6 +1128,7 @@ unpack_remote_status(xmlNode * status, pe_working_set_t * data_set)
/* process attributes */
for (state = __xml_first_child(status); state != NULL; state = __xml_next(state)) {
+ const char *resource_discovery_enabled = NULL;
xmlNode *attrs = NULL;
if (crm_str_eq((const char *)state->name, XML_CIB_TAG_STATE, TRUE) == FALSE) {
continue;
@@ -1125,6 +1152,26 @@ unpack_remote_status(xmlNode * status, pe_working_set_t * data_set)
crm_info("Node %s is in standby-mode", this_node->details->uname);
this_node->details->standby = TRUE;
}
+
+ if (crm_is_true(g_hash_table_lookup(this_node->details->attrs, "maintenance"))) {
+ crm_info("Node %s is in maintenance-mode", this_node->details->uname);
+ this_node->details->maintenance = TRUE;
+ }
+
+ resource_discovery_enabled = g_hash_table_lookup(this_node->details->attrs, XML_NODE_ATTR_RSC_DISCOVERY);
+ if (resource_discovery_enabled && !crm_is_true(resource_discovery_enabled)) {
+ if (is_baremetal_remote_node(this_node) && is_not_set(data_set->flags, pe_flag_stonith_enabled)) {
+ crm_warn("ignoring %s attribute on baremetal remote node %s, disabling resource discovery requires stonith to be enabled.",
+ XML_NODE_ATTR_RSC_DISCOVERY, this_node->details->uname);
+ } else {
+ /* if we're here, this is either a baremetal node and fencing is enabled,
+ * or this is a container node which we don't care if fencing is enabled
+ * or not on. container nodes are 'fenced' by recovering the container resource
+ * regardless of whether fencing is enabled. */
+ crm_info("Node %s has resource discovery disabled", this_node->details->uname);
+ this_node->details->rsc_discovery_enabled = FALSE;
+ }
+ }
}
/* process node rsc status */
@@ -1858,7 +1905,7 @@ process_rsc_state(resource_t * rsc, node_t * node,
* reconnect to the remote-node in this transition or not. */
if (is_set(rsc->flags, pe_rsc_failed) && rsc->is_remote_node) {
node_t *tmpnode = pe_find_node(data_set->nodes, rsc->id);
- if (tmpnode->details->unclean) {
+ if (tmpnode && tmpnode->details->unclean) {
tmpnode->details->unseen = FALSE;
}
}
@@ -3050,8 +3097,7 @@ add_node_attrs(xmlNode * xml_obj, node_t * node, gboolean overwrite, pe_working_
g_hash_table_insert(node->details->attrs,
strdup("#uname"), strdup(node->details->uname));
- g_hash_table_insert(node->details->attrs,
- strdup("#kind"), strdup(node->details->remote_rsc?"container":"cluster"));
+
g_hash_table_insert(node->details->attrs, strdup("#" XML_ATTR_ID), strdup(node->details->id));
if (safe_str_eq(node->details->id, data_set->dc_uuid)) {
data_set->dc_node = node;
diff --git a/lib/services/dbus.c b/lib/services/dbus.c
index 587589c..f4632f2 100644
--- a/lib/services/dbus.c
+++ b/lib/services/dbus.c
@@ -355,6 +355,11 @@ pcmk_dbus_get_property(
DBusMessage *reply = pcmk_dbus_send_recv(msg, connection, NULL);
output = pcmk_dbus_lookup_result(reply, query_data);
+ free(query_data->target);
+ free(query_data->object);
+ free(query_data->name);
+ free(query_data);
+
if(reply) {
dbus_message_unref(reply);
}
diff --git a/lib/services/services.c b/lib/services/services.c
index 8590b56..753e257 100644
--- a/lib/services/services.c
+++ b/lib/services/services.c
@@ -313,6 +313,7 @@ services_action_free(svc_action_t * op)
if (op->opaque->repeat_timer) {
g_source_remove(op->opaque->repeat_timer);
+ op->opaque->repeat_timer = 0;
}
if (op->opaque->stderr_gsource) {
mainloop_del_fd(op->opaque->stderr_gsource);
@@ -425,6 +426,7 @@ services_action_kick(const char *name, const char *action, int interval /* ms */
} else {
if (op->opaque->repeat_timer) {
g_source_remove(op->opaque->repeat_timer);
+ op->opaque->repeat_timer = 0;
}
recurring_action_timer(op);
return TRUE;
@@ -459,6 +461,7 @@ handle_duplicate_recurring(svc_action_t * op, void (*action_callback) (svc_actio
if (dup->pid != 0) {
if (op->opaque->repeat_timer) {
g_source_remove(op->opaque->repeat_timer);
+ op->opaque->repeat_timer = 0;
}
recurring_action_timer(dup);
}
diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c
index 961ff18..2279e4e 100644
--- a/lib/services/services_linux.c
+++ b/lib/services/services_linux.c
@@ -227,6 +227,7 @@ recurring_action_timer(gpointer data)
op->stdout_data = NULL;
free(op->stderr_data);
op->stderr_data = NULL;
+ op->opaque->repeat_timer = 0;
services_action_async(op, NULL);
return FALSE;
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
index c967430..9a7b078 100644
--- a/lib/services/systemd.c
+++ b/lib/services/systemd.c
@@ -303,10 +303,14 @@ systemd_unit_listall(void)
gboolean
systemd_unit_exists(const char *name)
{
+ char *unit = NULL;
+
/* Note: Makes a blocking dbus calls
* Used by resources_find_service_class() when resource class=service
*/
- if(systemd_unit_by_name(name, NULL)) {
+ unit = systemd_unit_by_name(name, NULL);
+ if(unit) {
+ free(unit);
return TRUE;
}
return FALSE;
@@ -542,9 +546,15 @@ systemd_unit_exec_with_unit(svc_action_t * op, const char *unit)
reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error);
systemd_exec_result(reply, op);
+
if(reply) {
dbus_message_unref(reply);
}
+ if(msg) {
+ dbus_message_unref(msg);
+ }
+
+ return FALSE;
}
if(msg) {
@@ -563,6 +573,8 @@ systemd_unit_exec_with_unit(svc_action_t * op, const char *unit)
gboolean
systemd_unit_exec(svc_action_t * op)
{
+ char *unit = NULL;
+
CRM_ASSERT(op);
CRM_ASSERT(systemd_init());
op->rc = PCMK_OCF_UNKNOWN_ERROR;
@@ -580,7 +592,9 @@ systemd_unit_exec(svc_action_t * op)
return TRUE;
}
- systemd_unit_by_name(op->agent, op);
+ unit = systemd_unit_by_name(op->agent, op);
+ free(unit);
+
if (op->synchronous == FALSE) {
return TRUE;
}
diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c
index 7075b9f..d3ede18 100644
--- a/lrmd/lrmd.c
+++ b/lrmd/lrmd.c
@@ -837,7 +837,9 @@ action_complete(svc_action_t * action)
}
cmd_reset(cmd);
- rsc->active = NULL;
+ if(rsc) {
+ rsc->active = NULL;
+ }
schedule_lrmd_cmd(rsc, cmd);
return;
diff --git a/mcp/pacemaker.c b/mcp/pacemaker.c
index ba3c88f..c7852c3 100644
--- a/mcp/pacemaker.c
+++ b/mcp/pacemaker.c
@@ -1038,6 +1038,10 @@ main(int argc, char **argv)
crm_exit(ENOPROTOOPT);
}
+ if(pcmk_locate_sbd() > 0) {
+ setenv("PCMK_watchdog", "true", 1);
+ }
+
find_and_track_existing_processes();
cluster.destroy = mcp_cpg_destroy;
diff --git a/mcp/pacemaker.service.in b/mcp/pacemaker.service.in
index b9f3336..7871167 100644
--- a/mcp/pacemaker.service.in
+++ b/mcp/pacemaker.service.in
@@ -18,6 +18,7 @@ KillMode=process
NotifyAccess=main
SysVStartPriority=99
EnvironmentFile=-@sysconfdir@/sysconfig/pacemaker
+EnvironmentFile=-@sysconfdir@/sysconfig/sbd
SuccessExitStatus=100
ExecStart=@sbindir@/pacemakerd -f
diff --git a/pengine/allocate.c b/pengine/allocate.c
index 8d02d9b..e708e26 100644
--- a/pengine/allocate.c
+++ b/pengine/allocate.c
@@ -755,7 +755,7 @@ apply_system_health(pe_working_set_t * data_set)
for (; gIter2 != NULL; gIter2 = gIter2->next) {
resource_t *rsc = (resource_t *) gIter2->data;
- rsc2node_new(health_strategy, rsc, system_health, node, data_set);
+ rsc2node_new(health_strategy, rsc, system_health, NULL, node, data_set);
}
}
@@ -861,6 +861,10 @@ probe_resources(pe_working_set_t * data_set)
/* TODO enable container node probes once ordered probing is implemented. */
continue;
+ } else if (node->details->rsc_discovery_enabled == FALSE) {
+ /* resource discovery is disabled for this node */
+ continue;
+
} else if (probe_complete == NULL) {
probe_complete = get_pseudo_op(CRM_OP_PROBED, data_set);
if (is_set(data_set->flags, pe_flag_have_remote_nodes)) {
diff --git a/pengine/constraints.c b/pengine/constraints.c
index 1aa848e..88e382b 100644
--- a/pengine/constraints.c
+++ b/pengine/constraints.c
@@ -658,6 +658,7 @@ unpack_rsc_location(xmlNode * xml_obj, resource_t * rsc_lh, const char * role,
const char *id_lh = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE);
const char *id = crm_element_value(xml_obj, XML_ATTR_ID);
const char *node = crm_element_value(xml_obj, XML_CIB_TAG_NODE);
+ const char *discovery = crm_element_value(xml_obj, XML_LOCATION_ATTR_DISCOVERY);
if (rsc_lh == NULL) {
/* only a warn as BSC adds the constraint then the resource */
@@ -676,7 +677,7 @@ unpack_rsc_location(xmlNode * xml_obj, resource_t * rsc_lh, const char * role,
if (!match) {
return FALSE;
}
- location = rsc2node_new(id, rsc_lh, score_i, match, data_set);
+ location = rsc2node_new(id, rsc_lh, score_i, discovery, match, data_set);
} else {
xmlNode *rule_xml = NULL;
@@ -720,6 +721,7 @@ unpack_rsc_location(xmlNode * xml_obj, resource_t * rsc_lh, const char * role,
}
}
}
+
return TRUE;
}
@@ -958,7 +960,7 @@ generate_location_rule(resource_t * rsc, xmlNode * rule_xml, pe_working_set_t *
do_and = FALSE;
}
- location_rule = rsc2node_new(rule_id, rsc, 0, NULL, data_set);
+ location_rule = rsc2node_new(rule_id, rsc, 0, NULL, NULL, data_set);
if (location_rule == NULL) {
return NULL;
diff --git a/pengine/native.c b/pengine/native.c
index 5db8c60..0020344 100644
--- a/pengine/native.c
+++ b/pengine/native.c
@@ -2097,9 +2097,14 @@ native_rsc_location(resource_t * rsc, rsc_to_node_t * constraint)
other_node->weight = merge_weights(other_node->weight, node->weight);
} else {
- node_t *new_node = node_copy(node);
+ other_node = node_copy(node);
- g_hash_table_insert(rsc->allowed_nodes, (gpointer) new_node->details->id, new_node);
+ g_hash_table_insert(rsc->allowed_nodes, (gpointer) other_node->details->id, other_node);
+ }
+
+ if (other_node->rsc_discover_mode < constraint->discover_mode) {
+ /* exclusive > never > always... always is default */
+ other_node->rsc_discover_mode = constraint->discover_mode;
}
}
@@ -2704,6 +2709,7 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete,
char *key = NULL;
action_t *probe = NULL;
node_t *running = NULL;
+ node_t *allowed = NULL;
resource_t *top = uber_parent(rsc);
static const char *rc_master = NULL;
@@ -2780,6 +2786,23 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete,
return FALSE;
}
+ allowed = g_hash_table_lookup(rsc->allowed_nodes, node->details->id);
+ if (rsc->exclusive_discover || top->exclusive_discover) {
+ if (allowed == NULL) {
+ /* exclusive discover is enabled and this node is not in the allowed list. */
+ return FALSE;
+ } else if (allowed->rsc_discover_mode != discover_exclusive) {
+ /* exclusive discover is enabled and this node is not marked
+ * as a node this resource should be discovered on */
+ return FALSE;
+ }
+ }
+ if (allowed && allowed->rsc_discover_mode == discover_never) {
+ /* this resource is marked as not needing to be discovered on this node */
+ return FALSE;
+ }
+
+
key = generate_op_key(rsc->id, RSC_STATUS, 0);
probe = custom_action(rsc, key, RSC_STATUS, node, FALSE, TRUE, data_set);
update_action_flags(probe, pe_action_optional | pe_action_clear);
diff --git a/pengine/pengine.h b/pengine/pengine.h
index 653fadf..87fa150 100644
--- a/pengine/pengine.h
+++ b/pengine/pengine.h
@@ -75,11 +75,18 @@ struct rsc_ticket_s {
int role_lh;
};
+enum rsc_discover_e {
+ discover_always = 0,
+ discover_never,
+ discover_exclusive,
+};
+
struct rsc_to_node_s {
const char *id;
resource_t *rsc_lh;
enum rsc_role_e role_filter;
+ enum rsc_discover_e discover_mode;
GListPtr node_list_rh; /* node_t* */
};
diff --git a/pengine/regression.sh b/pengine/regression.sh
index bdc7d3a..a9a5605 100755
--- a/pengine/regression.sh
+++ b/pengine/regression.sh
@@ -768,5 +768,10 @@ do_test remote-disable "Disable a baremetal remote-node"
do_test remote-orphaned "Properly shutdown orphaned connection resource"
do_test remote-recover "Recover connection resource after cluster-node fails."
do_test remote-stale-node-entry "Make sure we properly handle leftover remote-node entries in the node section"
+
+echo ""
+do_test resource-discovery "Exercises resource-discovery location constraint option."
+do_test rsc-discovery-per-node "Disable resource discovery per node"
+
echo ""
test_results
diff --git a/pengine/test10/remote-disable.dot b/pengine/test10/remote-disable.dot
index 2e21fef..fbcea60 100644
--- a/pengine/test10/remote-disable.dot
+++ b/pengine/test10/remote-disable.dot
@@ -1,8 +1,4 @@
digraph "g" {
-"FAKE2_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKE2_start_0 18builder" -> "FAKE2_monitor_60000 18builder" [ style = bold]
-"FAKE2_start_0 18builder" [ style=bold color="green" fontcolor="black"]
-"FAKE2_stop_0 remote1" -> "FAKE2_start_0 18builder" [ style = bold]
"FAKE2_stop_0 remote1" -> "all_stopped" [ style = bold]
"FAKE2_stop_0 remote1" -> "remote1_stop_0 18builder" [ style = bold]
"FAKE2_stop_0 remote1" [ style=bold color="green" fontcolor="black"]
diff --git a/pengine/test10/remote-disable.exp b/pengine/test10/remote-disable.exp
index 3273bb2..99c1c55 100644
--- a/pengine/test10/remote-disable.exp
+++ b/pengine/test10/remote-disable.exp
@@ -14,32 +14,6 @@
</synapse>
<synapse id="1">
<action_set>
- <rsc_op id="20" operation="monitor" operation_key="FAKE2_monitor_60000" on_node="18builder" on_node_uuid="5">
- <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
- <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
- </rsc_op>
- </action_set>
- <inputs>
- <trigger>
- <rsc_op id="19" operation="start" operation_key="FAKE2_start_0" on_node="18builder" on_node_uuid="5"/>
- </trigger>
- </inputs>
- </synapse>
- <synapse id="2">
- <action_set>
- <rsc_op id="19" operation="start" operation_key="FAKE2_start_0" on_node="18builder" on_node_uuid="5">
- <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
- <attributes CRM_meta_timeout="20000" />
- </rsc_op>
- </action_set>
- <inputs>
- <trigger>
- <rsc_op id="18" operation="stop" operation_key="FAKE2_stop_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
- </trigger>
- </inputs>
- </synapse>
- <synapse id="3">
- <action_set>
<rsc_op id="18" operation="stop" operation_key="FAKE2_stop_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
<primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
<attributes CRM_meta_timeout="20000" />
@@ -47,7 +21,7 @@
</action_set>
<inputs/>
</synapse>
- <synapse id="4">
+ <synapse id="2">
<action_set>
<pseudo_event id="7" operation="all_stopped" operation_key="all_stopped">
<attributes />
diff --git a/pengine/test10/remote-disable.scores b/pengine/test10/remote-disable.scores
index 4efd7d8..d66861f 100644
--- a/pengine/test10/remote-disable.scores
+++ b/pengine/test10/remote-disable.scores
@@ -3,9 +3,9 @@ native_color: FAKE1 allocation score on 18builder: 0
native_color: FAKE1 allocation score on 18node1: 0
native_color: FAKE1 allocation score on 18node2: 0
native_color: FAKE1 allocation score on remote1: 0
-native_color: FAKE2 allocation score on 18builder: 0
-native_color: FAKE2 allocation score on 18node1: 0
-native_color: FAKE2 allocation score on 18node2: 0
+native_color: FAKE2 allocation score on 18builder: -INFINITY
+native_color: FAKE2 allocation score on 18node1: -INFINITY
+native_color: FAKE2 allocation score on 18node2: -INFINITY
native_color: FAKE2 allocation score on remote1: 0
native_color: FAKE3 allocation score on 18builder: 0
native_color: FAKE3 allocation score on 18node1: 0
diff --git a/pengine/test10/remote-disable.summary b/pengine/test10/remote-disable.summary
index 57b06fe..0627647 100644
--- a/pengine/test10/remote-disable.summary
+++ b/pengine/test10/remote-disable.summary
@@ -12,14 +12,12 @@ RemoteOnline: [ remote1 ]
Transition Summary:
* Stop remote1 (18builder)
- * Move FAKE2 (Started remote1 -> 18builder)
+ * Stop FAKE2 (remote1)
Executing cluster transition:
* Resource action: FAKE2 stop on remote1
* Resource action: remote1 stop on 18builder
- * Resource action: FAKE2 start on 18builder
* Pseudo action: all_stopped
- * Resource action: FAKE2 monitor=60000 on 18builder
Revised cluster status:
Online: [ 18builder 18node1 18node2 ]
@@ -28,7 +26,7 @@ RemoteOFFLINE: [ remote1 ]
shooter (stonith:fence_xvm): Started 18node1
remote1 (ocf::pacemaker:remote): Stopped
FAKE1 (ocf::heartbeat:Dummy): Started 18node2
- FAKE2 (ocf::heartbeat:Dummy): Started 18builder
+ FAKE2 (ocf::heartbeat:Dummy): Stopped
FAKE3 (ocf::heartbeat:Dummy): Started 18builder
FAKE4 (ocf::heartbeat:Dummy): Started 18node1
diff --git a/pengine/test10/remote-disable.xml b/pengine/test10/remote-disable.xml
index eae0055..1637801 100644
--- a/pengine/test10/remote-disable.xml
+++ b/pengine/test10/remote-disable.xml
@@ -52,7 +52,13 @@
</operations>
</primitive>
</resources>
- <constraints/>
+ <constraints>
+ <rsc_location id="FAKE2-location" rsc="FAKE2">
+ <rule id="FAKE2-on-remote" score="-INFINITY">
+ <expression id="FAKE2-on-remote-exp" attribute="#kind" operation="ne" value="remote"/>
+ </rule>
+ </rsc_location>
+ </constraints>
</configuration>
<status>
<node_state id="5" uname="18builder" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
diff --git a/pengine/test10/resource-discovery.dot b/pengine/test10/resource-discovery.dot
new file mode 100644
index 0000000..efb2434
--- /dev/null
+++ b/pengine/test10/resource-discovery.dot
@@ -0,0 +1,185 @@
+ digraph "g" {
+"FAKE1_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKE1_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE1_start_0 18node2" -> "FAKE1_monitor_60000 18node2" [ style = bold]
+"FAKE1_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE2_start_0 18node3" -> "FAKE2_monitor_60000 18node3" [ style = bold]
+"FAKE2_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE2_stop_0 18node2" -> "FAKE2_start_0 18node3" [ style = bold]
+"FAKE2_stop_0 18node2" -> "all_stopped" [ style = bold]
+"FAKE2_stop_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE3_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE3_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE3_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE3_start_0 18node3" -> "FAKE3_monitor_60000 18node3" [ style = bold]
+"FAKE3_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE3_stop_0 18builder" -> "FAKE3_start_0 18node3" [ style = bold]
+"FAKE3_stop_0 18builder" -> "all_stopped" [ style = bold]
+"FAKE3_stop_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE4_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE4_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE4_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE4_start_0 18node4" -> "FAKE4_monitor_60000 18node4" [ style = bold]
+"FAKE4_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE4_stop_0 18node1" -> "FAKE4_start_0 18node4" [ style = bold]
+"FAKE4_stop_0 18node1" -> "all_stopped" [ style = bold]
+"FAKE4_stop_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKE5_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE5_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE5_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE5_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE5_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 remote1" -> "probe_complete remote1" [ style = bold]
+"FAKE5_monitor_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_start_0 remote1" -> "FAKE5_monitor_60000 remote1" [ style = bold]
+"FAKE5_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1-clone_running_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:0_start_0 18builder" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:1_start_0 18node1" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:2_start_0 18node2" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:5_start_0 18node3" [ style = bold]
+"FAKECLONE1-clone_start_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE1:0_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_start_0 18builder" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:0_start_0 18builder" -> "FAKECLONE1:0_monitor_60000 18builder" [ style = bold]
+"FAKECLONE1:0_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_start_0 18node1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:1_start_0 18node1" -> "FAKECLONE1:1_monitor_60000 18node1" [ style = bold]
+"FAKECLONE1:1_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:2_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:2_start_0 18node2" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:2_start_0 18node2" -> "FAKECLONE1:2_monitor_60000 18node2" [ style = bold]
+"FAKECLONE1:2_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1:3_monitor_60000 18node4" [ style = bold]
+"FAKECLONE1:3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:4_monitor_0 remote1" -> "probe_complete remote1" [ style = bold]
+"FAKECLONE1:4_monitor_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
+"FAKECLONE1:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:5_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:5_start_0 18node3" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:5_start_0 18node3" -> "FAKECLONE1:5_monitor_60000 18node3" [ style = bold]
+"FAKECLONE1:5_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2-clone_running_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:0_start_0 18builder" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:1_start_0 18node1" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:2_start_0 18node2" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:5_start_0 18node3" [ style = bold]
+"FAKECLONE2-clone_start_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE2:0_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKECLONE2:0_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_start_0 18builder" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:0_start_0 18builder" -> "FAKECLONE2:0_monitor_60000 18builder" [ style = bold]
+"FAKECLONE2:0_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKECLONE2:1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_start_0 18node1" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:1_start_0 18node1" -> "FAKECLONE2:1_monitor_60000 18node1" [ style = bold]
+"FAKECLONE2:1_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:2_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:2_start_0 18node2" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:2_start_0 18node2" -> "FAKECLONE2:2_monitor_60000 18node2" [ style = bold]
+"FAKECLONE2:2_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKECLONE2:3_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_start_0 18node4" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:3_start_0 18node4" -> "FAKECLONE2:3_monitor_60000 18node4" [ style = bold]
+"FAKECLONE2:3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:4_monitor_0 remote1" -> "probe_complete remote1" [ style = bold]
+"FAKECLONE2:4_monitor_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
+"FAKECLONE2:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKECLONE2:5_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_start_0 18node3" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:5_start_0 18node3" -> "FAKECLONE2:5_monitor_60000 18node3" [ style = bold]
+"FAKECLONE2:5_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"all_stopped" [ style=bold color="green" fontcolor="orange"]
+"probe_complete 18builder" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18builder" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node1" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node1" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node2" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node2" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node3" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node3" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node4" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node4" [ style=bold color="green" fontcolor="black"]
+"probe_complete remote1" -> "probe_complete" [ style = bold]
+"probe_complete remote1" [ style=bold color="green" fontcolor="black"]
+"probe_complete" -> "FAKE1_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKE2_stop_0 18node2" [ style = bold]
+"probe_complete" -> "FAKE3_start_0 18node3" [ style = bold]
+"probe_complete" -> "FAKE3_stop_0 18builder" [ style = bold]
+"probe_complete" -> "FAKE4_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKE4_stop_0 18node1" [ style = bold]
+"probe_complete" -> "FAKE5_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:0_start_0 18builder" [ style = bold]
+"probe_complete" -> "FAKECLONE1:1_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:2_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:5_start_0 18node3" [ style = bold]
+"probe_complete" -> "FAKECLONE2:0_start_0 18builder" [ style = bold]
+"probe_complete" -> "FAKECLONE2:1_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE2:2_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE2:5_start_0 18node3" [ style = bold]
+"probe_complete" [ style=bold color="green" fontcolor="orange"]
+"probe_nodes_complete" -> "remote1_start_0 18builder" [ style = bold]
+"probe_nodes_complete" [ style=bold color="green" fontcolor="orange"]
+"remote1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"remote1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"remote1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"remote1_start_0 18builder" -> "FAKE5_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKE5_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKE5_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE1:4_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE2:4_monitor_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "remote1_monitor_60000 18builder" [ style = bold]
+"remote1_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"shooter_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"shooter_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+}
diff --git a/pengine/test10/resource-discovery.exp b/pengine/test10/resource-discovery.exp
new file mode 100644
index 0000000..2770f4e
--- /dev/null
+++ b/pengine/test10/resource-discovery.exp
@@ -0,0 +1,1041 @@
+<transition_graph cluster-delay="60s" stonith-timeout="60s" failed-stop-offset="INFINITY" failed-start-offset="INFINITY" transition_id="0">
+ <synapse id="0">
+ <action_set>
+ <rsc_op id="27" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="shooter" class="stonith" type="fence_xvm"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="1">
+ <action_set>
+ <rsc_op id="20" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="shooter" class="stonith" type="fence_xvm"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="2">
+ <action_set>
+ <rsc_op id="40" operation="monitor" operation_key="remote1_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="3">
+ <action_set>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="4">
+ <action_set>
+ <rsc_op id="28" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="5">
+ <action_set>
+ <rsc_op id="21" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="6">
+ <action_set>
+ <rsc_op id="42" operation="monitor" operation_key="FAKE1_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="7">
+ <action_set>
+ <rsc_op id="41" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="8">
+ <action_set>
+ <rsc_op id="29" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="9">
+ <action_set>
+ <rsc_op id="22" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="10">
+ <action_set>
+ <rsc_op id="17" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="11">
+ <action_set>
+ <rsc_op id="13" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="12">
+ <action_set>
+ <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="13">
+ <action_set>
+ <rsc_op id="45" operation="monitor" operation_key="FAKE2_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="44" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="14">
+ <action_set>
+ <rsc_op id="44" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="15">
+ <action_set>
+ <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="16">
+ <action_set>
+ <rsc_op id="48" operation="monitor" operation_key="FAKE3_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="47" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="17">
+ <action_set>
+ <rsc_op id="47" operation="start" operation_key="FAKE3_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="18">
+ <action_set>
+ <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="19">
+ <action_set>
+ <rsc_op id="23" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="20">
+ <action_set>
+ <rsc_op id="51" operation="monitor" operation_key="FAKE4_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="50" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="21">
+ <action_set>
+ <rsc_op id="50" operation="start" operation_key="FAKE4_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="22">
+ <action_set>
+ <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="23">
+ <action_set>
+ <rsc_op id="30" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="24">
+ <action_set>
+ <rsc_op id="53" operation="monitor" operation_key="FAKE5_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="52" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="25">
+ <action_set>
+ <rsc_op id="52" operation="start" operation_key="FAKE5_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="26">
+ <action_set>
+ <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="27">
+ <action_set>
+ <rsc_op id="31" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="28">
+ <action_set>
+ <rsc_op id="24" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="29">
+ <action_set>
+ <rsc_op id="18" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="30">
+ <action_set>
+ <rsc_op id="14" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="31">
+ <action_set>
+ <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="32">
+ <action_set>
+ <rsc_op id="55" operation="monitor" operation_key="FAKECLONE1:0_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="33">
+ <action_set>
+ <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="34">
+ <action_set>
+ <rsc_op id="57" operation="monitor" operation_key="FAKECLONE1:1_monitor_60000" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="35">
+ <action_set>
+ <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="36">
+ <action_set>
+ <rsc_op id="59" operation="monitor" operation_key="FAKECLONE1:2_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="37">
+ <action_set>
+ <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="38">
+ <action_set>
+ <rsc_op id="61" operation="monitor" operation_key="FAKECLONE1:3_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="39">
+ <action_set>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="40">
+ <action_set>
+ <rsc_op id="63" operation="monitor" operation_key="FAKECLONE1:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="41">
+ <action_set>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="42">
+ <action_set>
+ <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="43">
+ <action_set>
+ <rsc_op id="65" operation="monitor" operation_key="FAKECLONE1:5_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="44">
+ <action_set>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="45" priority="1000000">
+ <action_set>
+ <pseudo_event id="67" operation="running" operation_key="FAKECLONE1-clone_running_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="54" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="56" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="58" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="46">
+ <action_set>
+ <pseudo_event id="66" operation="start" operation_key="FAKECLONE1-clone_start_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="47">
+ <action_set>
+ <rsc_op id="71" operation="monitor" operation_key="FAKECLONE2:0_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="48">
+ <action_set>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="49">
+ <action_set>
+ <rsc_op id="11" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="50">
+ <action_set>
+ <rsc_op id="73" operation="monitor" operation_key="FAKECLONE2:1_monitor_60000" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="51">
+ <action_set>
+ <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="52">
+ <action_set>
+ <rsc_op id="15" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="53">
+ <action_set>
+ <rsc_op id="75" operation="monitor" operation_key="FAKECLONE2:2_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="54">
+ <action_set>
+ <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="55">
+ <action_set>
+ <rsc_op id="77" operation="monitor" operation_key="FAKECLONE2:3_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="56">
+ <action_set>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="57">
+ <action_set>
+ <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="58">
+ <action_set>
+ <rsc_op id="79" operation="monitor" operation_key="FAKECLONE2:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="59">
+ <action_set>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="60">
+ <action_set>
+ <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="61">
+ <action_set>
+ <rsc_op id="81" operation="monitor" operation_key="FAKECLONE2:5_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="62">
+ <action_set>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="63">
+ <action_set>
+ <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="64" priority="1000000">
+ <action_set>
+ <pseudo_event id="83" operation="running" operation_key="FAKECLONE2-clone_running_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="72" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="74" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="65">
+ <action_set>
+ <pseudo_event id="82" operation="start" operation_key="FAKECLONE2-clone_start_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="66" priority="1000000">
+ <action_set>
+ <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="34" operation="monitor" operation_key="FAKE5_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="35" operation="monitor" operation_key="FAKECLONE1:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="36" operation="monitor" operation_key="FAKECLONE2:4_monitor_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="67" priority="1000000">
+ <action_set>
+ <rsc_op id="26" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="27" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="28" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="29" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="30" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="31" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="68" priority="1000000">
+ <action_set>
+ <rsc_op id="19" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="20" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="21" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="22" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="23" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="24" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="25" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="69" priority="1000000">
+ <action_set>
+ <rsc_op id="16" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="17" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="18" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="70" priority="1000000">
+ <action_set>
+ <rsc_op id="12" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="13" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="14" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="15" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="71" priority="1000000">
+ <action_set>
+ <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="11" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="72">
+ <action_set>
+ <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="12" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="16" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="19" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="26" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="73">
+ <action_set>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-remote1" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="74">
+ <action_set>
+ <pseudo_event id="5" operation="all_stopped" operation_key="all_stopped">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="43" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="46" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="49" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+</transition_graph>
diff --git a/pengine/test10/resource-discovery.scores b/pengine/test10/resource-discovery.scores
new file mode 100644
index 0000000..e1fa78e
--- /dev/null
+++ b/pengine/test10/resource-discovery.scores
@@ -0,0 +1,199 @@
+Allocation scores:
+clone_color: FAKECLONE1-clone allocation score on 18builder: 0
+clone_color: FAKECLONE1-clone allocation score on 18node1: 0
+clone_color: FAKECLONE1-clone allocation score on 18node2: 0
+clone_color: FAKECLONE1-clone allocation score on 18node3: 0
+clone_color: FAKECLONE1-clone allocation score on 18node4: 0
+clone_color: FAKECLONE1-clone allocation score on remote1: 0
+clone_color: FAKECLONE1:0 allocation score on 18builder: 0
+clone_color: FAKECLONE1:0 allocation score on 18node1: 0
+clone_color: FAKECLONE1:0 allocation score on 18node2: 0
+clone_color: FAKECLONE1:0 allocation score on 18node3: 0
+clone_color: FAKECLONE1:0 allocation score on 18node4: 0
+clone_color: FAKECLONE1:0 allocation score on remote1: 0
+clone_color: FAKECLONE1:1 allocation score on 18builder: 0
+clone_color: FAKECLONE1:1 allocation score on 18node1: 0
+clone_color: FAKECLONE1:1 allocation score on 18node2: 0
+clone_color: FAKECLONE1:1 allocation score on 18node3: 0
+clone_color: FAKECLONE1:1 allocation score on 18node4: 0
+clone_color: FAKECLONE1:1 allocation score on remote1: 0
+clone_color: FAKECLONE1:2 allocation score on 18builder: 0
+clone_color: FAKECLONE1:2 allocation score on 18node1: 0
+clone_color: FAKECLONE1:2 allocation score on 18node2: 0
+clone_color: FAKECLONE1:2 allocation score on 18node3: 0
+clone_color: FAKECLONE1:2 allocation score on 18node4: 0
+clone_color: FAKECLONE1:2 allocation score on remote1: 0
+clone_color: FAKECLONE1:3 allocation score on 18builder: 0
+clone_color: FAKECLONE1:3 allocation score on 18node1: 0
+clone_color: FAKECLONE1:3 allocation score on 18node2: 0
+clone_color: FAKECLONE1:3 allocation score on 18node3: 0
+clone_color: FAKECLONE1:3 allocation score on 18node4: 0
+clone_color: FAKECLONE1:3 allocation score on remote1: 0
+clone_color: FAKECLONE1:4 allocation score on 18builder: 0
+clone_color: FAKECLONE1:4 allocation score on 18node1: 0
+clone_color: FAKECLONE1:4 allocation score on 18node2: 0
+clone_color: FAKECLONE1:4 allocation score on 18node3: 0
+clone_color: FAKECLONE1:4 allocation score on 18node4: 0
+clone_color: FAKECLONE1:4 allocation score on remote1: 0
+clone_color: FAKECLONE1:5 allocation score on 18builder: 0
+clone_color: FAKECLONE1:5 allocation score on 18node1: 0
+clone_color: FAKECLONE1:5 allocation score on 18node2: 0
+clone_color: FAKECLONE1:5 allocation score on 18node3: 0
+clone_color: FAKECLONE1:5 allocation score on 18node4: 0
+clone_color: FAKECLONE1:5 allocation score on remote1: 0
+clone_color: FAKECLONE2-clone allocation score on 18builder: 0
+clone_color: FAKECLONE2-clone allocation score on 18node1: 0
+clone_color: FAKECLONE2-clone allocation score on 18node2: 0
+clone_color: FAKECLONE2-clone allocation score on 18node3: 0
+clone_color: FAKECLONE2-clone allocation score on 18node4: 0
+clone_color: FAKECLONE2-clone allocation score on remote1: 0
+clone_color: FAKECLONE2:0 allocation score on 18builder: 0
+clone_color: FAKECLONE2:0 allocation score on 18node1: 0
+clone_color: FAKECLONE2:0 allocation score on 18node2: 0
+clone_color: FAKECLONE2:0 allocation score on 18node3: 0
+clone_color: FAKECLONE2:0 allocation score on 18node4: 0
+clone_color: FAKECLONE2:0 allocation score on remote1: 0
+clone_color: FAKECLONE2:1 allocation score on 18builder: 0
+clone_color: FAKECLONE2:1 allocation score on 18node1: 0
+clone_color: FAKECLONE2:1 allocation score on 18node2: 0
+clone_color: FAKECLONE2:1 allocation score on 18node3: 0
+clone_color: FAKECLONE2:1 allocation score on 18node4: 0
+clone_color: FAKECLONE2:1 allocation score on remote1: 0
+clone_color: FAKECLONE2:2 allocation score on 18builder: 0
+clone_color: FAKECLONE2:2 allocation score on 18node1: 0
+clone_color: FAKECLONE2:2 allocation score on 18node2: 0
+clone_color: FAKECLONE2:2 allocation score on 18node3: 0
+clone_color: FAKECLONE2:2 allocation score on 18node4: 0
+clone_color: FAKECLONE2:2 allocation score on remote1: 0
+clone_color: FAKECLONE2:3 allocation score on 18builder: 0
+clone_color: FAKECLONE2:3 allocation score on 18node1: 0
+clone_color: FAKECLONE2:3 allocation score on 18node2: 0
+clone_color: FAKECLONE2:3 allocation score on 18node3: 0
+clone_color: FAKECLONE2:3 allocation score on 18node4: 0
+clone_color: FAKECLONE2:3 allocation score on remote1: 0
+clone_color: FAKECLONE2:4 allocation score on 18builder: 0
+clone_color: FAKECLONE2:4 allocation score on 18node1: 0
+clone_color: FAKECLONE2:4 allocation score on 18node2: 0
+clone_color: FAKECLONE2:4 allocation score on 18node3: 0
+clone_color: FAKECLONE2:4 allocation score on 18node4: 0
+clone_color: FAKECLONE2:4 allocation score on remote1: 0
+clone_color: FAKECLONE2:5 allocation score on 18builder: 0
+clone_color: FAKECLONE2:5 allocation score on 18node1: 0
+clone_color: FAKECLONE2:5 allocation score on 18node2: 0
+clone_color: FAKECLONE2:5 allocation score on 18node3: 0
+clone_color: FAKECLONE2:5 allocation score on 18node4: 0
+clone_color: FAKECLONE2:5 allocation score on remote1: 0
+native_color: FAKE1 allocation score on 18builder: 0
+native_color: FAKE1 allocation score on 18node1: 0
+native_color: FAKE1 allocation score on 18node2: 0
+native_color: FAKE1 allocation score on 18node3: 0
+native_color: FAKE1 allocation score on 18node4: 0
+native_color: FAKE1 allocation score on remote1: -INFINITY
+native_color: FAKE2 allocation score on 18builder: 0
+native_color: FAKE2 allocation score on 18node1: 0
+native_color: FAKE2 allocation score on 18node2: -INFINITY
+native_color: FAKE2 allocation score on 18node3: 0
+native_color: FAKE2 allocation score on 18node4: 0
+native_color: FAKE2 allocation score on remote1: 0
+native_color: FAKE3 allocation score on 18builder: 0
+native_color: FAKE3 allocation score on 18node1: 0
+native_color: FAKE3 allocation score on 18node2: 0
+native_color: FAKE3 allocation score on 18node3: INFINITY
+native_color: FAKE3 allocation score on 18node4: 0
+native_color: FAKE3 allocation score on remote1: 0
+native_color: FAKE4 allocation score on 18builder: 0
+native_color: FAKE4 allocation score on 18node1: 0
+native_color: FAKE4 allocation score on 18node2: 0
+native_color: FAKE4 allocation score on 18node3: 0
+native_color: FAKE4 allocation score on 18node4: 0
+native_color: FAKE4 allocation score on remote1: 0
+native_color: FAKE5 allocation score on 18builder: 0
+native_color: FAKE5 allocation score on 18node1: 0
+native_color: FAKE5 allocation score on 18node2: 0
+native_color: FAKE5 allocation score on 18node3: 0
+native_color: FAKE5 allocation score on 18node4: 0
+native_color: FAKE5 allocation score on remote1: 0
+native_color: FAKECLONE1:0 allocation score on 18builder: 0
+native_color: FAKECLONE1:0 allocation score on 18node1: 0
+native_color: FAKECLONE1:0 allocation score on 18node2: 0
+native_color: FAKECLONE1:0 allocation score on 18node3: 0
+native_color: FAKECLONE1:0 allocation score on 18node4: 0
+native_color: FAKECLONE1:0 allocation score on remote1: 0
+native_color: FAKECLONE1:1 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:1 allocation score on 18node1: 0
+native_color: FAKECLONE1:1 allocation score on 18node2: 0
+native_color: FAKECLONE1:1 allocation score on 18node3: 0
+native_color: FAKECLONE1:1 allocation score on 18node4: 0
+native_color: FAKECLONE1:1 allocation score on remote1: 0
+native_color: FAKECLONE1:2 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node2: 0
+native_color: FAKECLONE1:2 allocation score on 18node3: 0
+native_color: FAKECLONE1:2 allocation score on 18node4: 0
+native_color: FAKECLONE1:2 allocation score on remote1: 0
+native_color: FAKECLONE1:3 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node3: 0
+native_color: FAKECLONE1:3 allocation score on 18node4: 0
+native_color: FAKECLONE1:3 allocation score on remote1: 0
+native_color: FAKECLONE1:4 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node3: 0
+native_color: FAKECLONE1:4 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:4 allocation score on remote1: 0
+native_color: FAKECLONE1:5 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node3: 0
+native_color: FAKECLONE1:5 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:5 allocation score on remote1: -INFINITY
+native_color: FAKECLONE2:0 allocation score on 18builder: 0
+native_color: FAKECLONE2:0 allocation score on 18node1: 0
+native_color: FAKECLONE2:0 allocation score on 18node2: 0
+native_color: FAKECLONE2:0 allocation score on 18node3: 0
+native_color: FAKECLONE2:0 allocation score on 18node4: 0
+native_color: FAKECLONE2:0 allocation score on remote1: 0
+native_color: FAKECLONE2:1 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE2:1 allocation score on 18node1: 0
+native_color: FAKECLONE2:1 allocation score on 18node2: 0
+native_color: FAKECLONE2:1 allocation score on 18node3: 0
+native_color: FAKECLONE2:1 allocation score on 18node4: 0
+native_color: FAKECLONE2:1 allocation score on remote1: 0
+native_color: FAKECLONE2:2 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE2:2 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:2 allocation score on 18node2: 0
+native_color: FAKECLONE2:2 allocation score on 18node3: 0
+native_color: FAKECLONE2:2 allocation score on 18node4: 0
+native_color: FAKECLONE2:2 allocation score on remote1: 0
+native_color: FAKECLONE2:3 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node3: 0
+native_color: FAKECLONE2:3 allocation score on 18node4: 0
+native_color: FAKECLONE2:3 allocation score on remote1: 0
+native_color: FAKECLONE2:4 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node3: 0
+native_color: FAKECLONE2:4 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE2:4 allocation score on remote1: 0
+native_color: FAKECLONE2:5 allocation score on 18builder: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node3: 0
+native_color: FAKECLONE2:5 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE2:5 allocation score on remote1: -INFINITY
+native_color: remote1 allocation score on 18builder: 0
+native_color: remote1 allocation score on 18node1: 0
+native_color: remote1 allocation score on 18node2: 0
+native_color: remote1 allocation score on 18node3: 0
+native_color: remote1 allocation score on 18node4: 0
+native_color: remote1 allocation score on remote1: -INFINITY
+native_color: shooter allocation score on 18builder: 0
+native_color: shooter allocation score on 18node1: 0
+native_color: shooter allocation score on 18node2: 0
+native_color: shooter allocation score on 18node3: 0
+native_color: shooter allocation score on 18node4: 0
+native_color: shooter allocation score on remote1: -INFINITY
diff --git a/pengine/test10/resource-discovery.summary b/pengine/test10/resource-discovery.summary
new file mode 100644
index 0000000..af0e5b3
--- /dev/null
+++ b/pengine/test10/resource-discovery.summary
@@ -0,0 +1,124 @@
+
+Current cluster status:
+Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+RemoteOFFLINE: [ remote1 ]
+
+ shooter (stonith:fence_xvm): Started 18node1
+ remote1 (ocf::pacemaker:remote): Stopped
+ FAKE1 (ocf::heartbeat:Dummy): Stopped
+ FAKE2 (ocf::heartbeat:Dummy): Started 18node2
+ FAKE3 (ocf::heartbeat:Dummy): Started 18builder
+ FAKE4 (ocf::heartbeat:Dummy): Started 18node1
+ FAKE5 (ocf::heartbeat:Dummy): Stopped
+ Clone Set: FAKECLONE1-clone [FAKECLONE1]
+ Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+ Clone Set: FAKECLONE2-clone [FAKECLONE2]
+ Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+
+Transition Summary:
+ * Start remote1 (18builder)
+ * Start FAKE1 (18node2)
+ * Move FAKE2 (Started 18node2 -> 18node3)
+ * Move FAKE3 (Started 18builder -> 18node3)
+ * Move FAKE4 (Started 18node1 -> 18node4)
+ * Start FAKE5 (remote1)
+ * Start FAKECLONE1:0 (18builder)
+ * Start FAKECLONE1:1 (18node1)
+ * Start FAKECLONE1:2 (18node2)
+ * Start FAKECLONE1:3 (18node4)
+ * Start FAKECLONE1:4 (remote1)
+ * Start FAKECLONE1:5 (18node3)
+ * Start FAKECLONE2:0 (18builder)
+ * Start FAKECLONE2:1 (18node1)
+ * Start FAKECLONE2:2 (18node2)
+ * Start FAKECLONE2:3 (18node4)
+ * Start FAKECLONE2:4 (remote1)
+ * Start FAKECLONE2:5 (18node3)
+
+Executing cluster transition:
+ * Resource action: shooter monitor on 18node4
+ * Resource action: shooter monitor on 18node3
+ * Resource action: remote1 monitor on 18node4
+ * Resource action: remote1 monitor on 18node3
+ * Resource action: FAKE1 monitor on 18node4
+ * Resource action: FAKE1 monitor on 18node3
+ * Resource action: FAKE1 monitor on 18node2
+ * Resource action: FAKE1 monitor on 18node1
+ * Resource action: FAKE1 monitor on 18builder
+ * Resource action: FAKE3 monitor on 18node3
+ * Resource action: FAKE4 monitor on 18node4
+ * Resource action: FAKE5 monitor on 18node4
+ * Resource action: FAKE5 monitor on 18node3
+ * Resource action: FAKE5 monitor on 18node2
+ * Resource action: FAKE5 monitor on 18node1
+ * Resource action: FAKE5 monitor on 18builder
+ * Pseudo action: FAKECLONE1-clone_start_0
+ * Resource action: FAKECLONE2:0 monitor on 18builder
+ * Resource action: FAKECLONE2:1 monitor on 18node1
+ * Resource action: FAKECLONE2:3 monitor on 18node4
+ * Resource action: FAKECLONE2:5 monitor on 18node3
+ * Pseudo action: FAKECLONE2-clone_start_0
+ * Pseudo action: probe_nodes_complete
+ * Resource action: remote1 start on 18builder
+ * Resource action: FAKE5 monitor on remote1
+ * Resource action: FAKECLONE1:4 monitor on remote1
+ * Resource action: FAKECLONE2:4 monitor on remote1
+ * Pseudo action: probe_complete
+ * Resource action: remote1 monitor=60000 on 18builder
+ * Resource action: FAKE1 start on 18node2
+ * Resource action: FAKE2 stop on 18node2
+ * Resource action: FAKE3 stop on 18builder
+ * Resource action: FAKE4 stop on 18node1
+ * Resource action: FAKE5 start on remote1
+ * Resource action: FAKECLONE1:0 start on 18builder
+ * Resource action: FAKECLONE1:1 start on 18node1
+ * Resource action: FAKECLONE1:2 start on 18node2
+ * Resource action: FAKECLONE1:3 start on 18node4
+ * Resource action: FAKECLONE1:4 start on remote1
+ * Resource action: FAKECLONE1:5 start on 18node3
+ * Pseudo action: FAKECLONE1-clone_running_0
+ * Resource action: FAKECLONE2:0 start on 18builder
+ * Resource action: FAKECLONE2:1 start on 18node1
+ * Resource action: FAKECLONE2:2 start on 18node2
+ * Resource action: FAKECLONE2:3 start on 18node4
+ * Resource action: FAKECLONE2:4 start on remote1
+ * Resource action: FAKECLONE2:5 start on 18node3
+ * Pseudo action: FAKECLONE2-clone_running_0
+ * Pseudo action: all_stopped
+ * Resource action: FAKE1 monitor=60000 on 18node2
+ * Resource action: FAKE2 start on 18node3
+ * Resource action: FAKE3 start on 18node3
+ * Resource action: FAKE4 start on 18node4
+ * Resource action: FAKE5 monitor=60000 on remote1
+ * Resource action: FAKECLONE1:0 monitor=60000 on 18builder
+ * Resource action: FAKECLONE1:1 monitor=60000 on 18node1
+ * Resource action: FAKECLONE1:2 monitor=60000 on 18node2
+ * Resource action: FAKECLONE1:3 monitor=60000 on 18node4
+ * Resource action: FAKECLONE1:4 monitor=60000 on remote1
+ * Resource action: FAKECLONE1:5 monitor=60000 on 18node3
+ * Resource action: FAKECLONE2:0 monitor=60000 on 18builder
+ * Resource action: FAKECLONE2:1 monitor=60000 on 18node1
+ * Resource action: FAKECLONE2:2 monitor=60000 on 18node2
+ * Resource action: FAKECLONE2:3 monitor=60000 on 18node4
+ * Resource action: FAKECLONE2:4 monitor=60000 on remote1
+ * Resource action: FAKECLONE2:5 monitor=60000 on 18node3
+ * Resource action: FAKE2 monitor=60000 on 18node3
+ * Resource action: FAKE3 monitor=60000 on 18node3
+ * Resource action: FAKE4 monitor=60000 on 18node4
+
+Revised cluster status:
+Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+RemoteOnline: [ remote1 ]
+
+ shooter (stonith:fence_xvm): Started 18node1
+ remote1 (ocf::pacemaker:remote): Started 18builder
+ FAKE1 (ocf::heartbeat:Dummy): Started 18node2
+ FAKE2 (ocf::heartbeat:Dummy): Started 18node3
+ FAKE3 (ocf::heartbeat:Dummy): Started 18node3
+ FAKE4 (ocf::heartbeat:Dummy): Started 18node4
+ FAKE5 (ocf::heartbeat:Dummy): Started remote1
+ Clone Set: FAKECLONE1-clone [FAKECLONE1]
+ Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+ Clone Set: FAKECLONE2-clone [FAKECLONE2]
+ Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+
diff --git a/pengine/test10/resource-discovery.xml b/pengine/test10/resource-discovery.xml
new file mode 100644
index 0000000..5836804
--- /dev/null
+++ b/pengine/test10/resource-discovery.xml
@@ -0,0 +1,185 @@
+<cib epoch="11" num_updates="1" admin_epoch="0" validate-with="pacemaker-next" cib-last-written="Tue Sep 3 17:59:24 2013" update-origin="18builder" update-client="crm_resource" crm_feature_set="3.0.7" have-quorum="1" dc-uuid="5">
+ <configuration>
+ <crm_config>
+ <cluster_property_set id="cib-bootstrap-options">
+ <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="1.1.10-ab50afe"/>
+ <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="corosync"/>
+ </cluster_property_set>
+ </crm_config>
+ <nodes>
+ <node id="1" uname="18node1"/>
+ <node id="2" uname="18node2"/>
+ <node id="3" uname="18node3"/>
+ <node id="4" uname="18node4"/>
+ <node id="5" uname="18builder"/>
+ </nodes>
+ <resources>
+ <primitive class="stonith" id="shooter" type="fence_xvm">
+ <instance_attributes id="shooter-instance_attributes"/>
+ <operations>
+ <op id="shooter-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="remote1" provider="pacemaker" type="remote">
+ <instance_attributes id="remote1-instance_attributes"/>
+ <operations>
+ <op id="remote1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ <meta_attributes id="remote1-meta_attributes"/>
+ </primitive>
+ <primitive class="ocf" id="FAKE1" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE1-instance_attributes"/>
+ <meta_attributes id="FAKE1-meta_attributes">
+ </meta_attributes>
+ <operations>
+ <op id="FAKE1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE2" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE2-instance_attributes"/>
+ <meta_attributes id="FAKE2-meta_attributes">
+ </meta_attributes>
+ <operations>
+ <op id="FAKE2-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE3" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE3-instance_attributes"/>
+ <operations>
+ <op id="FAKE3-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE4" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE4-instance_attributes"/>
+ <operations>
+ <op id="FAKE4-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE5" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE5-instance_attributes"/>
+ <operations>
+ <op id="FAKE5-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <clone id="FAKECLONE1-clone">
+ <primitive class="ocf" id="FAKECLONE1" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKECLONE1-instance_attributes"/>
+ <operations>
+ <op id="FAKECLONE1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ </clone>
+ <clone id="FAKECLONE2-clone">
+ <primitive class="ocf" id="FAKECLONE2" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKECLONE2-instance_attributes"/>
+ <operations>
+ <op id="FAKECLONE2-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ </clone>
+ </resources>
+ <constraints>
+ <rsc_location id="location-FAKE1-remote1--INFINITY" node="remote1" rsc="FAKE1" score="-INFINITY" resource-discovery="never" />
+ <rsc_location id="location-FAKE2-18node2--INFINITY" node="18node2" rsc="FAKE2" score="-INFINITY" resource-discovery="exclusive" />
+ <rsc_location id="location-FAKE3-18node3--INFINITY" node="18node3" rsc="FAKE3" score="INFINITY" resource-discovery="exclusive" />
+ <rsc_location id="location-FAKE4-1-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="always" />
+ <rsc_location id="location-FAKE4-2-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="never" />
+ <rsc_location id="location-FAKE4-3-18node3--INFINITY" node="18node4" rsc="FAKE4" score="0" resource-discovery="exclusive" />
+ <rsc_location id="location-FAKE5-18node3--INFINITY" node="18node4" rsc="FAKE5" score="0" resource-discovery="always" />
+ <rsc_location id="location-FAKECLONE1-remote--INFINITY" node="remote1" rsc="FAKECLONE1-clone" score="0" resource-discovery="exclusive" />
+ <rsc_location id="location-FAKECLONE2-18node2--INFINITY" node="18node2" rsc="FAKECLONE2-clone" score="0" resource-discovery="never" />
+ </constraints>
+ </configuration>
+ <status>
+ <node_state id="5" uname="18builder" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
+ <transient_attributes id="5">
+ <instance_attributes id="status-5">
+ </instance_attributes>
+ </transient_attributes>
+ <lrm id="5">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="11:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;11:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="16" rc-code="0" op-status="0" interval="0" last-run="1378248545" last-rc-change="1378248545" exec-time="1" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:3:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:3:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="11" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248534" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:6:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:6:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="13" rc-code="0" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="remote1_monitor_60000" operation_key="remote1_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:5:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:5:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="3" rc-code="0" op-status="0" interval="60000" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="7:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;7:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="39" rc-code="7" op-status="0" interval="0" last-run="1378249145" last-rc-change="1378249145" exec-time="61" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="18:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;18:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="53" rc-code="0" op-status="0" interval="0" last-run="1378249147" last-rc-change="1378249147" exec-time="11" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE3_monitor_60000" operation_key="FAKE3_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="19:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;19:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="56" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249147" exec-time="10" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="61" rc-code="7" op-status="0" interval="0" last-run="1378249149" last-rc-change="1378249149" exec-time="65" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ </node_state>
+ <node_state id="1" uname="18node1" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+ <lrm id="1">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="9" rc-code="0" op-status="0" interval="0" last-run="1378248547" last-rc-change="1378248547" exec-time="19" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="12" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248548" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="25" rc-code="7" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="28" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_failure_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="30" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="32" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="33" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="15" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="22:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;22:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="40" rc-code="0" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="36" queue-time="38" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE4_monitor_60000" operation_key="FAKE4_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="23:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;23:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="44" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249148" exec-time="14" queue-time="1" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="1">
+ <instance_attributes id="status-1">
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ <node_state id="2" uname="18node2" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+ <lrm id="2">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:3:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:3:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="5" rc-code="7" op-status="0" interval="0" last-run="1378248530" last-rc-change="1378248530" exec-time="980" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;10:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="16:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;16:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="18" rc-code="0" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="18" queue-time="9" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE2_monitor_60000" operation_key="FAKE2_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="22" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249144" exec-time="20" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;12:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="27" rc-code="7" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="35" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;13:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="32" rc-code="7" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="33" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="2">
+ <instance_attributes id="status-2">
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ <node_state id="3" uname="18node3" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
+ <node_state id="4" uname="18node4" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
+ <node_state remote_node="true" id="remote1" uname="remote1" crm-debug-origin="remote_init_cib_status">
+ <transient_attributes id="remote1">
+ <instance_attributes id="status-remote1">
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ </status>
+</cib>
diff --git a/pengine/test10/rsc-discovery-per-node.dot b/pengine/test10/rsc-discovery-per-node.dot
new file mode 100644
index 0000000..8f5889a
--- /dev/null
+++ b/pengine/test10/rsc-discovery-per-node.dot
@@ -0,0 +1,195 @@
+ digraph "g" {
+"FAKE1_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKE1_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE1_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE1_start_0 18node2" -> "FAKE1_monitor_60000 18node2" [ style = bold]
+"FAKE1_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE2_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE2_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE2_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE2_start_0 18node3" -> "FAKE2_monitor_60000 18node3" [ style = bold]
+"FAKE2_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE2_stop_0 18node2" -> "FAKE2_start_0 18node3" [ style = bold]
+"FAKE2_stop_0 18node2" -> "all_stopped" [ style = bold]
+"FAKE2_stop_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE3_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE3_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE3_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE3_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE3_start_0 18node4" -> "FAKE3_monitor_60000 18node4" [ style = bold]
+"FAKE3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE3_stop_0 18builder" -> "FAKE3_start_0 18node4" [ style = bold]
+"FAKE3_stop_0 18builder" -> "all_stopped" [ style = bold]
+"FAKE3_stop_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE4_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE4_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE4_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE4_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKE4_start_0 remote1" -> "FAKE4_monitor_60000 remote1" [ style = bold]
+"FAKE4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKE4_stop_0 18node1" -> "FAKE4_start_0 remote1" [ style = bold]
+"FAKE4_stop_0 18node1" -> "all_stopped" [ style = bold]
+"FAKE4_stop_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKE5_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKE5_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKE5_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKE5_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKE5_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKE5_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKE5_start_0 18builder" -> "FAKE5_monitor_60000 18builder" [ style = bold]
+"FAKE5_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1-clone_running_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:0_start_0 18node1" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:1_start_0 18node2" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:2_start_0 18node3" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"FAKECLONE1-clone_start_0" -> "FAKECLONE1:5_start_0 18builder" [ style = bold]
+"FAKECLONE1-clone_start_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE1:0_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKECLONE1:0_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:0_start_0 18node1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:0_start_0 18node1" -> "FAKECLONE1:0_monitor_60000 18node1" [ style = bold]
+"FAKECLONE1:0_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKECLONE1:1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:1_start_0 18node2" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:1_start_0 18node2" -> "FAKECLONE1:1_monitor_60000 18node2" [ style = bold]
+"FAKECLONE1:1_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:2_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKECLONE1:2_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:2_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:2_start_0 18node3" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:2_start_0 18node3" -> "FAKECLONE1:2_monitor_60000 18node3" [ style = bold]
+"FAKECLONE1:2_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:3_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKECLONE1:3_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:3_start_0 18node4" -> "FAKECLONE1:3_monitor_60000 18node4" [ style = bold]
+"FAKECLONE1:3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:4_start_0 remote1" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
+"FAKECLONE1:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:5_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKECLONE1:5_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:5_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE1:5_start_0 18builder" -> "FAKECLONE1-clone_running_0" [ style = bold]
+"FAKECLONE1:5_start_0 18builder" -> "FAKECLONE1:5_monitor_60000 18builder" [ style = bold]
+"FAKECLONE1:5_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2-clone_running_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:0_start_0 18node1" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:1_start_0 18node2" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:2_start_0 18node3" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"FAKECLONE2-clone_start_0" -> "FAKECLONE2:5_start_0 18builder" [ style = bold]
+"FAKECLONE2-clone_start_0" [ style=bold color="green" fontcolor="orange"]
+"FAKECLONE2:0_monitor_0 18node1" -> "probe_complete 18node1" [ style = bold]
+"FAKECLONE2:0_monitor_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:0_start_0 18node1" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:0_start_0 18node1" -> "FAKECLONE2:0_monitor_60000 18node1" [ style = bold]
+"FAKECLONE2:0_start_0 18node1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_monitor_0 18node2" -> "probe_complete 18node2" [ style = bold]
+"FAKECLONE2:1_monitor_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_monitor_60000 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:1_start_0 18node2" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:1_start_0 18node2" -> "FAKECLONE2:1_monitor_60000 18node2" [ style = bold]
+"FAKECLONE2:1_start_0 18node2" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:2_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"FAKECLONE2:2_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:2_monitor_60000 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:2_start_0 18node3" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:2_start_0 18node3" -> "FAKECLONE2:2_monitor_60000 18node3" [ style = bold]
+"FAKECLONE2:2_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"FAKECLONE2:3_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_monitor_60000 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:3_start_0 18node4" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:3_start_0 18node4" -> "FAKECLONE2:3_monitor_60000 18node4" [ style = bold]
+"FAKECLONE2:3_start_0 18node4" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:4_monitor_60000 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:4_start_0 remote1" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
+"FAKECLONE2:4_start_0 remote1" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_monitor_0 18builder" -> "probe_complete 18builder" [ style = bold]
+"FAKECLONE2:5_monitor_0 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"FAKECLONE2:5_start_0 18builder" -> "FAKECLONE2-clone_running_0" [ style = bold]
+"FAKECLONE2:5_start_0 18builder" -> "FAKECLONE2:5_monitor_60000 18builder" [ style = bold]
+"FAKECLONE2:5_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"all_stopped" [ style=bold color="green" fontcolor="orange"]
+"probe_complete 18builder" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18builder" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node1" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node1" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node2" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node2" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node3" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node3" [ style=bold color="green" fontcolor="black"]
+"probe_complete 18node4" -> "probe_nodes_complete" [ style = bold]
+"probe_complete 18node4" [ style=bold color="green" fontcolor="black"]
+"probe_complete" -> "FAKE1_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKE2_start_0 18node3" [ style = bold]
+"probe_complete" -> "FAKE2_stop_0 18node2" [ style = bold]
+"probe_complete" -> "FAKE3_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKE3_stop_0 18builder" [ style = bold]
+"probe_complete" -> "FAKE4_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKE4_stop_0 18node1" [ style = bold]
+"probe_complete" -> "FAKE5_start_0 18builder" [ style = bold]
+"probe_complete" -> "FAKECLONE1:0_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:1_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKECLONE1:2_start_0 18node3" [ style = bold]
+"probe_complete" -> "FAKECLONE1:3_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE1:5_start_0 18builder" [ style = bold]
+"probe_complete" -> "FAKECLONE2:0_start_0 18node1" [ style = bold]
+"probe_complete" -> "FAKECLONE2:1_start_0 18node2" [ style = bold]
+"probe_complete" -> "FAKECLONE2:2_start_0 18node3" [ style = bold]
+"probe_complete" -> "FAKECLONE2:3_start_0 18node4" [ style = bold]
+"probe_complete" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"probe_complete" -> "FAKECLONE2:5_start_0 18builder" [ style = bold]
+"probe_complete" [ style=bold color="green" fontcolor="orange"]
+"probe_nodes_complete" -> "remote1_start_0 18builder" [ style = bold]
+"probe_nodes_complete" [ style=bold color="green" fontcolor="orange"]
+"remote1_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"remote1_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"remote1_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+"remote1_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"]
+"remote1_start_0 18builder" -> "FAKE4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKE4_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE1:4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE1:4_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE2:4_monitor_60000 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "FAKECLONE2:4_start_0 remote1" [ style = bold]
+"remote1_start_0 18builder" -> "remote1_monitor_60000 18builder" [ style = bold]
+"remote1_start_0 18builder" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node3" -> "probe_complete 18node3" [ style = bold]
+"shooter_monitor_0 18node3" [ style=bold color="green" fontcolor="black"]
+"shooter_monitor_0 18node4" -> "probe_complete 18node4" [ style = bold]
+"shooter_monitor_0 18node4" [ style=bold color="green" fontcolor="black"]
+}
diff --git a/pengine/test10/rsc-discovery-per-node.exp b/pengine/test10/rsc-discovery-per-node.exp
new file mode 100644
index 0000000..8de04cd
--- /dev/null
+++ b/pengine/test10/rsc-discovery-per-node.exp
@@ -0,0 +1,1103 @@
+<transition_graph cluster-delay="60s" stonith-timeout="60s" failed-stop-offset="INFINITY" failed-start-offset="INFINITY" transition_id="0">
+ <synapse id="0">
+ <action_set>
+ <rsc_op id="34" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="shooter" class="stonith" type="fence_xvm"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="1">
+ <action_set>
+ <rsc_op id="24" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="shooter" class="stonith" type="fence_xvm"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="2">
+ <action_set>
+ <rsc_op id="46" operation="monitor" operation_key="remote1_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="3">
+ <action_set>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="4">
+ <action_set>
+ <rsc_op id="35" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="5">
+ <action_set>
+ <rsc_op id="25" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="remote1" class="ocf" provider="pacemaker" type="remote"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="6">
+ <action_set>
+ <rsc_op id="48" operation="monitor" operation_key="FAKE1_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="47" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="7">
+ <action_set>
+ <rsc_op id="47" operation="start" operation_key="FAKE1_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="8">
+ <action_set>
+ <rsc_op id="36" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="9">
+ <action_set>
+ <rsc_op id="26" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="10">
+ <action_set>
+ <rsc_op id="19" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="11">
+ <action_set>
+ <rsc_op id="14" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="12">
+ <action_set>
+ <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="13">
+ <action_set>
+ <rsc_op id="51" operation="monitor" operation_key="FAKE2_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="50" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="14">
+ <action_set>
+ <rsc_op id="50" operation="start" operation_key="FAKE2_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="49" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="15">
+ <action_set>
+ <rsc_op id="49" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="16">
+ <action_set>
+ <rsc_op id="37" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="17">
+ <action_set>
+ <rsc_op id="27" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="18">
+ <action_set>
+ <rsc_op id="54" operation="monitor" operation_key="FAKE3_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="53" operation="start" operation_key="FAKE3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="19">
+ <action_set>
+ <rsc_op id="53" operation="start" operation_key="FAKE3_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="52" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="20">
+ <action_set>
+ <rsc_op id="52" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="21">
+ <action_set>
+ <rsc_op id="38" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="22">
+ <action_set>
+ <rsc_op id="28" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="23">
+ <action_set>
+ <rsc_op id="57" operation="monitor" operation_key="FAKE4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="56" operation="start" operation_key="FAKE4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="24">
+ <action_set>
+ <rsc_op id="56" operation="start" operation_key="FAKE4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="55" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="25">
+ <action_set>
+ <rsc_op id="55" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="26">
+ <action_set>
+ <rsc_op id="39" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="27">
+ <action_set>
+ <rsc_op id="29" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="28">
+ <action_set>
+ <rsc_op id="59" operation="monitor" operation_key="FAKE5_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="58" operation="start" operation_key="FAKE5_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="29">
+ <action_set>
+ <rsc_op id="58" operation="start" operation_key="FAKE5_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="30">
+ <action_set>
+ <rsc_op id="40" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="31">
+ <action_set>
+ <rsc_op id="30" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="32">
+ <action_set>
+ <rsc_op id="20" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="33">
+ <action_set>
+ <rsc_op id="15" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="34">
+ <action_set>
+ <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKE5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="35">
+ <action_set>
+ <rsc_op id="61" operation="monitor" operation_key="FAKECLONE1:0_monitor_60000" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="36">
+ <action_set>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="37">
+ <action_set>
+ <rsc_op id="16" operation="monitor" operation_key="FAKECLONE1:0_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="38">
+ <action_set>
+ <rsc_op id="63" operation="monitor" operation_key="FAKECLONE1:1_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="39">
+ <action_set>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="40">
+ <action_set>
+ <rsc_op id="21" operation="monitor" operation_key="FAKECLONE1:1_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="41">
+ <action_set>
+ <rsc_op id="65" operation="monitor" operation_key="FAKECLONE1:2_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="42">
+ <action_set>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="43">
+ <action_set>
+ <rsc_op id="31" operation="monitor" operation_key="FAKECLONE1:2_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="44">
+ <action_set>
+ <rsc_op id="67" operation="monitor" operation_key="FAKECLONE1:3_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="66" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="45">
+ <action_set>
+ <rsc_op id="66" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="46">
+ <action_set>
+ <rsc_op id="41" operation="monitor" operation_key="FAKECLONE1:3_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="47">
+ <action_set>
+ <rsc_op id="69" operation="monitor" operation_key="FAKECLONE1:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="68" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="48">
+ <action_set>
+ <rsc_op id="68" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="49">
+ <action_set>
+ <rsc_op id="71" operation="monitor" operation_key="FAKECLONE1:5_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="50">
+ <action_set>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="51">
+ <action_set>
+ <rsc_op id="11" operation="monitor" operation_key="FAKECLONE1:5_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE1" long-id="FAKECLONE1:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="52" priority="1000000">
+ <action_set>
+ <pseudo_event id="73" operation="running" operation_key="FAKECLONE1-clone_running_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="60" operation="start" operation_key="FAKECLONE1:0_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="62" operation="start" operation_key="FAKECLONE1:1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="64" operation="start" operation_key="FAKECLONE1:2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="66" operation="start" operation_key="FAKECLONE1:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="68" operation="start" operation_key="FAKECLONE1:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="70" operation="start" operation_key="FAKECLONE1:5_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="53">
+ <action_set>
+ <pseudo_event id="72" operation="start" operation_key="FAKECLONE1-clone_start_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="54">
+ <action_set>
+ <rsc_op id="77" operation="monitor" operation_key="FAKECLONE2:0_monitor_60000" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="55">
+ <action_set>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="56">
+ <action_set>
+ <rsc_op id="17" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:0" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="0" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="57">
+ <action_set>
+ <rsc_op id="79" operation="monitor" operation_key="FAKECLONE2:1_monitor_60000" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="58">
+ <action_set>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="59">
+ <action_set>
+ <rsc_op id="22" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node2" on_node_uuid="2">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:1" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="1" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="60">
+ <action_set>
+ <rsc_op id="81" operation="monitor" operation_key="FAKECLONE2:2_monitor_60000" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="61">
+ <action_set>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="62">
+ <action_set>
+ <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:2_monitor_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:2" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="2" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="63">
+ <action_set>
+ <rsc_op id="83" operation="monitor" operation_key="FAKECLONE2:3_monitor_60000" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="82" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="64">
+ <action_set>
+ <rsc_op id="82" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="65">
+ <action_set>
+ <rsc_op id="42" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:3" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="3" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="66">
+ <action_set>
+ <rsc_op id="85" operation="monitor" operation_key="FAKECLONE2:4_monitor_60000" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="84" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="67">
+ <action_set>
+ <rsc_op id="84" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:4" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="4" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="remote1_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="68">
+ <action_set>
+ <rsc_op id="87" operation="monitor" operation_key="FAKECLONE2:5_monitor_60000" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_interval="60000" CRM_meta_name="monitor" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="86" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="69">
+ <action_set>
+ <rsc_op id="86" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="70">
+ <action_set>
+ <rsc_op id="12" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18builder" on_node_uuid="5">
+ <primitive id="FAKECLONE2" long-id="FAKECLONE2:5" class="ocf" provider="heartbeat" type="Dummy"/>
+ <attributes CRM_meta_clone="5" CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_op_target_rc="7" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="71" priority="1000000">
+ <action_set>
+ <pseudo_event id="89" operation="running" operation_key="FAKECLONE2-clone_running_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="76" operation="start" operation_key="FAKECLONE2:0_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="78" operation="start" operation_key="FAKECLONE2:1_start_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="80" operation="start" operation_key="FAKECLONE2:2_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="82" operation="start" operation_key="FAKECLONE2:3_start_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="84" operation="start" operation_key="FAKECLONE2:4_start_0" on_node="remote1" on_node_uuid="remote1" router_node="18builder"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="86" operation="start" operation_key="FAKECLONE2:5_start_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="72">
+ <action_set>
+ <pseudo_event id="88" operation="start" operation_key="FAKECLONE2-clone_start_0">
+ <attributes CRM_meta_clone_max="6" CRM_meta_clone_node_max="1" CRM_meta_globally_unique="false" CRM_meta_notify="false" CRM_meta_timeout="20000" />
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="73" priority="1000000">
+ <action_set>
+ <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="34" operation="monitor" operation_key="shooter_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="35" operation="monitor" operation_key="remote1_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="36" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="37" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="38" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="39" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="40" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="41" operation="monitor" operation_key="FAKECLONE1:3_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="42" operation="monitor" operation_key="FAKECLONE2:3_monitor_0" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="74" priority="1000000">
+ <action_set>
+ <rsc_op id="23" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="24" operation="monitor" operation_key="shooter_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="25" operation="monitor" operation_key="remote1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="26" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="27" operation="monitor" operation_key="FAKE2_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="28" operation="monitor" operation_key="FAKE3_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="29" operation="monitor" operation_key="FAKE4_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="30" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="31" operation="monitor" operation_key="FAKECLONE1:2_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="32" operation="monitor" operation_key="FAKECLONE2:2_monitor_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="75" priority="1000000">
+ <action_set>
+ <rsc_op id="18" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="19" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="20" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="21" operation="monitor" operation_key="FAKECLONE1:1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="22" operation="monitor" operation_key="FAKECLONE2:1_monitor_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="76" priority="1000000">
+ <action_set>
+ <rsc_op id="13" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="14" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="15" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="16" operation="monitor" operation_key="FAKECLONE1:0_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="17" operation="monitor" operation_key="FAKECLONE2:0_monitor_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="77" priority="1000000">
+ <action_set>
+ <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5">
+ <attributes CRM_meta_op_no_wait="true" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="9" operation="monitor" operation_key="FAKE1_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="10" operation="monitor" operation_key="FAKE5_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="11" operation="monitor" operation_key="FAKECLONE1:5_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="12" operation="monitor" operation_key="FAKECLONE2:5_monitor_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="78">
+ <action_set>
+ <pseudo_event id="7" operation="probe_nodes_complete" operation_key="probe_nodes_complete">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="8" operation="probe_complete" operation_key="probe_complete-18builder" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="13" operation="probe_complete" operation_key="probe_complete-18node1" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="18" operation="probe_complete" operation_key="probe_complete-18node2" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="23" operation="probe_complete" operation_key="probe_complete-18node3" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="33" operation="probe_complete" operation_key="probe_complete-18node4" on_node="18node4" on_node_uuid="4"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="79">
+ <action_set>
+ <pseudo_event id="6" operation="probe_complete" operation_key="probe_complete">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="80">
+ <action_set>
+ <pseudo_event id="5" operation="all_stopped" operation_key="all_stopped">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="49" operation="stop" operation_key="FAKE2_stop_0" on_node="18node2" on_node_uuid="2"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="52" operation="stop" operation_key="FAKE3_stop_0" on_node="18builder" on_node_uuid="5"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="55" operation="stop" operation_key="FAKE4_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+</transition_graph>
diff --git a/pengine/test10/rsc-discovery-per-node.scores b/pengine/test10/rsc-discovery-per-node.scores
new file mode 100644
index 0000000..a0ad11f
--- /dev/null
+++ b/pengine/test10/rsc-discovery-per-node.scores
@@ -0,0 +1,199 @@
+Allocation scores:
+clone_color: FAKECLONE1-clone allocation score on 18builder: 0
+clone_color: FAKECLONE1-clone allocation score on 18node1: 0
+clone_color: FAKECLONE1-clone allocation score on 18node2: 0
+clone_color: FAKECLONE1-clone allocation score on 18node3: 0
+clone_color: FAKECLONE1-clone allocation score on 18node4: 0
+clone_color: FAKECLONE1-clone allocation score on remote1: 0
+clone_color: FAKECLONE1:0 allocation score on 18builder: 0
+clone_color: FAKECLONE1:0 allocation score on 18node1: 0
+clone_color: FAKECLONE1:0 allocation score on 18node2: 0
+clone_color: FAKECLONE1:0 allocation score on 18node3: 0
+clone_color: FAKECLONE1:0 allocation score on 18node4: 0
+clone_color: FAKECLONE1:0 allocation score on remote1: 0
+clone_color: FAKECLONE1:1 allocation score on 18builder: 0
+clone_color: FAKECLONE1:1 allocation score on 18node1: 0
+clone_color: FAKECLONE1:1 allocation score on 18node2: 0
+clone_color: FAKECLONE1:1 allocation score on 18node3: 0
+clone_color: FAKECLONE1:1 allocation score on 18node4: 0
+clone_color: FAKECLONE1:1 allocation score on remote1: 0
+clone_color: FAKECLONE1:2 allocation score on 18builder: 0
+clone_color: FAKECLONE1:2 allocation score on 18node1: 0
+clone_color: FAKECLONE1:2 allocation score on 18node2: 0
+clone_color: FAKECLONE1:2 allocation score on 18node3: 0
+clone_color: FAKECLONE1:2 allocation score on 18node4: 0
+clone_color: FAKECLONE1:2 allocation score on remote1: 0
+clone_color: FAKECLONE1:3 allocation score on 18builder: 0
+clone_color: FAKECLONE1:3 allocation score on 18node1: 0
+clone_color: FAKECLONE1:3 allocation score on 18node2: 0
+clone_color: FAKECLONE1:3 allocation score on 18node3: 0
+clone_color: FAKECLONE1:3 allocation score on 18node4: 0
+clone_color: FAKECLONE1:3 allocation score on remote1: 0
+clone_color: FAKECLONE1:4 allocation score on 18builder: 0
+clone_color: FAKECLONE1:4 allocation score on 18node1: 0
+clone_color: FAKECLONE1:4 allocation score on 18node2: 0
+clone_color: FAKECLONE1:4 allocation score on 18node3: 0
+clone_color: FAKECLONE1:4 allocation score on 18node4: 0
+clone_color: FAKECLONE1:4 allocation score on remote1: 0
+clone_color: FAKECLONE1:5 allocation score on 18builder: 0
+clone_color: FAKECLONE1:5 allocation score on 18node1: 0
+clone_color: FAKECLONE1:5 allocation score on 18node2: 0
+clone_color: FAKECLONE1:5 allocation score on 18node3: 0
+clone_color: FAKECLONE1:5 allocation score on 18node4: 0
+clone_color: FAKECLONE1:5 allocation score on remote1: 0
+clone_color: FAKECLONE2-clone allocation score on 18builder: 0
+clone_color: FAKECLONE2-clone allocation score on 18node1: 0
+clone_color: FAKECLONE2-clone allocation score on 18node2: 0
+clone_color: FAKECLONE2-clone allocation score on 18node3: 0
+clone_color: FAKECLONE2-clone allocation score on 18node4: 0
+clone_color: FAKECLONE2-clone allocation score on remote1: 0
+clone_color: FAKECLONE2:0 allocation score on 18builder: 0
+clone_color: FAKECLONE2:0 allocation score on 18node1: 0
+clone_color: FAKECLONE2:0 allocation score on 18node2: 0
+clone_color: FAKECLONE2:0 allocation score on 18node3: 0
+clone_color: FAKECLONE2:0 allocation score on 18node4: 0
+clone_color: FAKECLONE2:0 allocation score on remote1: 0
+clone_color: FAKECLONE2:1 allocation score on 18builder: 0
+clone_color: FAKECLONE2:1 allocation score on 18node1: 0
+clone_color: FAKECLONE2:1 allocation score on 18node2: 0
+clone_color: FAKECLONE2:1 allocation score on 18node3: 0
+clone_color: FAKECLONE2:1 allocation score on 18node4: 0
+clone_color: FAKECLONE2:1 allocation score on remote1: 0
+clone_color: FAKECLONE2:2 allocation score on 18builder: 0
+clone_color: FAKECLONE2:2 allocation score on 18node1: 0
+clone_color: FAKECLONE2:2 allocation score on 18node2: 0
+clone_color: FAKECLONE2:2 allocation score on 18node3: 0
+clone_color: FAKECLONE2:2 allocation score on 18node4: 0
+clone_color: FAKECLONE2:2 allocation score on remote1: 0
+clone_color: FAKECLONE2:3 allocation score on 18builder: 0
+clone_color: FAKECLONE2:3 allocation score on 18node1: 0
+clone_color: FAKECLONE2:3 allocation score on 18node2: 0
+clone_color: FAKECLONE2:3 allocation score on 18node3: 0
+clone_color: FAKECLONE2:3 allocation score on 18node4: 0
+clone_color: FAKECLONE2:3 allocation score on remote1: 0
+clone_color: FAKECLONE2:4 allocation score on 18builder: 0
+clone_color: FAKECLONE2:4 allocation score on 18node1: 0
+clone_color: FAKECLONE2:4 allocation score on 18node2: 0
+clone_color: FAKECLONE2:4 allocation score on 18node3: 0
+clone_color: FAKECLONE2:4 allocation score on 18node4: 0
+clone_color: FAKECLONE2:4 allocation score on remote1: 0
+clone_color: FAKECLONE2:5 allocation score on 18builder: 0
+clone_color: FAKECLONE2:5 allocation score on 18node1: 0
+clone_color: FAKECLONE2:5 allocation score on 18node2: 0
+clone_color: FAKECLONE2:5 allocation score on 18node3: 0
+clone_color: FAKECLONE2:5 allocation score on 18node4: 0
+clone_color: FAKECLONE2:5 allocation score on remote1: 0
+native_color: FAKE1 allocation score on 18builder: 0
+native_color: FAKE1 allocation score on 18node1: 0
+native_color: FAKE1 allocation score on 18node2: 0
+native_color: FAKE1 allocation score on 18node3: 0
+native_color: FAKE1 allocation score on 18node4: 0
+native_color: FAKE1 allocation score on remote1: 0
+native_color: FAKE2 allocation score on 18builder: 0
+native_color: FAKE2 allocation score on 18node1: 0
+native_color: FAKE2 allocation score on 18node2: 0
+native_color: FAKE2 allocation score on 18node3: 0
+native_color: FAKE2 allocation score on 18node4: 0
+native_color: FAKE2 allocation score on remote1: 0
+native_color: FAKE3 allocation score on 18builder: 0
+native_color: FAKE3 allocation score on 18node1: 0
+native_color: FAKE3 allocation score on 18node2: 0
+native_color: FAKE3 allocation score on 18node3: 0
+native_color: FAKE3 allocation score on 18node4: 0
+native_color: FAKE3 allocation score on remote1: 0
+native_color: FAKE4 allocation score on 18builder: 0
+native_color: FAKE4 allocation score on 18node1: 0
+native_color: FAKE4 allocation score on 18node2: 0
+native_color: FAKE4 allocation score on 18node3: 0
+native_color: FAKE4 allocation score on 18node4: 0
+native_color: FAKE4 allocation score on remote1: 0
+native_color: FAKE5 allocation score on 18builder: 0
+native_color: FAKE5 allocation score on 18node1: 0
+native_color: FAKE5 allocation score on 18node2: 0
+native_color: FAKE5 allocation score on 18node3: 0
+native_color: FAKE5 allocation score on 18node4: 0
+native_color: FAKE5 allocation score on remote1: 0
+native_color: FAKECLONE1:0 allocation score on 18builder: 0
+native_color: FAKECLONE1:0 allocation score on 18node1: 0
+native_color: FAKECLONE1:0 allocation score on 18node2: 0
+native_color: FAKECLONE1:0 allocation score on 18node3: 0
+native_color: FAKECLONE1:0 allocation score on 18node4: 0
+native_color: FAKECLONE1:0 allocation score on remote1: 0
+native_color: FAKECLONE1:1 allocation score on 18builder: 0
+native_color: FAKECLONE1:1 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:1 allocation score on 18node2: 0
+native_color: FAKECLONE1:1 allocation score on 18node3: 0
+native_color: FAKECLONE1:1 allocation score on 18node4: 0
+native_color: FAKECLONE1:1 allocation score on remote1: 0
+native_color: FAKECLONE1:2 allocation score on 18builder: 0
+native_color: FAKECLONE1:2 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:2 allocation score on 18node3: 0
+native_color: FAKECLONE1:2 allocation score on 18node4: 0
+native_color: FAKECLONE1:2 allocation score on remote1: 0
+native_color: FAKECLONE1:3 allocation score on 18builder: 0
+native_color: FAKECLONE1:3 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:3 allocation score on 18node4: 0
+native_color: FAKECLONE1:3 allocation score on remote1: 0
+native_color: FAKECLONE1:4 allocation score on 18builder: 0
+native_color: FAKECLONE1:4 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:4 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:4 allocation score on remote1: 0
+native_color: FAKECLONE1:5 allocation score on 18builder: 0
+native_color: FAKECLONE1:5 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE1:5 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE1:5 allocation score on remote1: -INFINITY
+native_color: FAKECLONE2:0 allocation score on 18builder: 0
+native_color: FAKECLONE2:0 allocation score on 18node1: 0
+native_color: FAKECLONE2:0 allocation score on 18node2: 0
+native_color: FAKECLONE2:0 allocation score on 18node3: 0
+native_color: FAKECLONE2:0 allocation score on 18node4: 0
+native_color: FAKECLONE2:0 allocation score on remote1: 0
+native_color: FAKECLONE2:1 allocation score on 18builder: 0
+native_color: FAKECLONE2:1 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:1 allocation score on 18node2: 0
+native_color: FAKECLONE2:1 allocation score on 18node3: 0
+native_color: FAKECLONE2:1 allocation score on 18node4: 0
+native_color: FAKECLONE2:1 allocation score on remote1: 0
+native_color: FAKECLONE2:2 allocation score on 18builder: 0
+native_color: FAKECLONE2:2 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:2 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:2 allocation score on 18node3: 0
+native_color: FAKECLONE2:2 allocation score on 18node4: 0
+native_color: FAKECLONE2:2 allocation score on remote1: 0
+native_color: FAKECLONE2:3 allocation score on 18builder: 0
+native_color: FAKECLONE2:3 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE2:3 allocation score on 18node4: 0
+native_color: FAKECLONE2:3 allocation score on remote1: 0
+native_color: FAKECLONE2:4 allocation score on 18builder: 0
+native_color: FAKECLONE2:4 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE2:4 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE2:4 allocation score on remote1: 0
+native_color: FAKECLONE2:5 allocation score on 18builder: 0
+native_color: FAKECLONE2:5 allocation score on 18node1: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node2: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node3: -INFINITY
+native_color: FAKECLONE2:5 allocation score on 18node4: -INFINITY
+native_color: FAKECLONE2:5 allocation score on remote1: -INFINITY
+native_color: remote1 allocation score on 18builder: 0
+native_color: remote1 allocation score on 18node1: 0
+native_color: remote1 allocation score on 18node2: 0
+native_color: remote1 allocation score on 18node3: 0
+native_color: remote1 allocation score on 18node4: 0
+native_color: remote1 allocation score on remote1: -INFINITY
+native_color: shooter allocation score on 18builder: 0
+native_color: shooter allocation score on 18node1: 0
+native_color: shooter allocation score on 18node2: 0
+native_color: shooter allocation score on 18node3: 0
+native_color: shooter allocation score on 18node4: 0
+native_color: shooter allocation score on remote1: -INFINITY
diff --git a/pengine/test10/rsc-discovery-per-node.summary b/pengine/test10/rsc-discovery-per-node.summary
new file mode 100644
index 0000000..69d5ee3
--- /dev/null
+++ b/pengine/test10/rsc-discovery-per-node.summary
@@ -0,0 +1,131 @@
+
+Current cluster status:
+Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+RemoteOFFLINE: [ remote1 ]
+
+ shooter (stonith:fence_xvm): Started 18node1
+ remote1 (ocf::pacemaker:remote): Stopped
+ FAKE1 (ocf::heartbeat:Dummy): Stopped
+ FAKE2 (ocf::heartbeat:Dummy): Started 18node2
+ FAKE3 (ocf::heartbeat:Dummy): Started 18builder
+ FAKE4 (ocf::heartbeat:Dummy): Started 18node1
+ FAKE5 (ocf::heartbeat:Dummy): Stopped
+ Clone Set: FAKECLONE1-clone [FAKECLONE1]
+ Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+ Clone Set: FAKECLONE2-clone [FAKECLONE2]
+ Stopped: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+
+Transition Summary:
+ * Start remote1 (18builder)
+ * Start FAKE1 (18node2)
+ * Move FAKE2 (Started 18node2 -> 18node3)
+ * Move FAKE3 (Started 18builder -> 18node4)
+ * Move FAKE4 (Started 18node1 -> remote1)
+ * Start FAKE5 (18builder)
+ * Start FAKECLONE1:0 (18node1)
+ * Start FAKECLONE1:1 (18node2)
+ * Start FAKECLONE1:2 (18node3)
+ * Start FAKECLONE1:3 (18node4)
+ * Start FAKECLONE1:4 (remote1)
+ * Start FAKECLONE1:5 (18builder)
+ * Start FAKECLONE2:0 (18node1)
+ * Start FAKECLONE2:1 (18node2)
+ * Start FAKECLONE2:2 (18node3)
+ * Start FAKECLONE2:3 (18node4)
+ * Start FAKECLONE2:4 (remote1)
+ * Start FAKECLONE2:5 (18builder)
+
+Executing cluster transition:
+ * Resource action: shooter monitor on 18node4
+ * Resource action: shooter monitor on 18node3
+ * Resource action: remote1 monitor on 18node4
+ * Resource action: remote1 monitor on 18node3
+ * Resource action: FAKE1 monitor on 18node4
+ * Resource action: FAKE1 monitor on 18node3
+ * Resource action: FAKE1 monitor on 18node2
+ * Resource action: FAKE1 monitor on 18node1
+ * Resource action: FAKE1 monitor on 18builder
+ * Resource action: FAKE2 monitor on 18node4
+ * Resource action: FAKE2 monitor on 18node3
+ * Resource action: FAKE3 monitor on 18node4
+ * Resource action: FAKE3 monitor on 18node3
+ * Resource action: FAKE4 monitor on 18node4
+ * Resource action: FAKE4 monitor on 18node3
+ * Resource action: FAKE5 monitor on 18node4
+ * Resource action: FAKE5 monitor on 18node3
+ * Resource action: FAKE5 monitor on 18node2
+ * Resource action: FAKE5 monitor on 18node1
+ * Resource action: FAKE5 monitor on 18builder
+ * Resource action: FAKECLONE1:0 monitor on 18node1
+ * Resource action: FAKECLONE1:1 monitor on 18node2
+ * Resource action: FAKECLONE1:2 monitor on 18node3
+ * Resource action: FAKECLONE1:3 monitor on 18node4
+ * Resource action: FAKECLONE1:5 monitor on 18builder
+ * Pseudo action: FAKECLONE1-clone_start_0
+ * Resource action: FAKECLONE2:0 monitor on 18node1
+ * Resource action: FAKECLONE2:1 monitor on 18node2
+ * Resource action: FAKECLONE2:2 monitor on 18node3
+ * Resource action: FAKECLONE2:3 monitor on 18node4
+ * Resource action: FAKECLONE2:5 monitor on 18builder
+ * Pseudo action: FAKECLONE2-clone_start_0
+ * Pseudo action: probe_nodes_complete
+ * Pseudo action: probe_complete
+ * Resource action: remote1 start on 18builder
+ * Resource action: FAKE1 start on 18node2
+ * Resource action: FAKE2 stop on 18node2
+ * Resource action: FAKE3 stop on 18builder
+ * Resource action: FAKE4 stop on 18node1
+ * Resource action: FAKE5 start on 18builder
+ * Resource action: FAKECLONE1:0 start on 18node1
+ * Resource action: FAKECLONE1:1 start on 18node2
+ * Resource action: FAKECLONE1:2 start on 18node3
+ * Resource action: FAKECLONE1:3 start on 18node4
+ * Resource action: FAKECLONE1:4 start on remote1
+ * Resource action: FAKECLONE1:5 start on 18builder
+ * Pseudo action: FAKECLONE1-clone_running_0
+ * Resource action: FAKECLONE2:0 start on 18node1
+ * Resource action: FAKECLONE2:1 start on 18node2
+ * Resource action: FAKECLONE2:2 start on 18node3
+ * Resource action: FAKECLONE2:3 start on 18node4
+ * Resource action: FAKECLONE2:4 start on remote1
+ * Resource action: FAKECLONE2:5 start on 18builder
+ * Pseudo action: FAKECLONE2-clone_running_0
+ * Pseudo action: all_stopped
+ * Resource action: remote1 monitor=60000 on 18builder
+ * Resource action: FAKE1 monitor=60000 on 18node2
+ * Resource action: FAKE2 start on 18node3
+ * Resource action: FAKE3 start on 18node4
+ * Resource action: FAKE4 start on remote1
+ * Resource action: FAKE5 monitor=60000 on 18builder
+ * Resource action: FAKECLONE1:0 monitor=60000 on 18node1
+ * Resource action: FAKECLONE1:1 monitor=60000 on 18node2
+ * Resource action: FAKECLONE1:2 monitor=60000 on 18node3
+ * Resource action: FAKECLONE1:3 monitor=60000 on 18node4
+ * Resource action: FAKECLONE1:4 monitor=60000 on remote1
+ * Resource action: FAKECLONE1:5 monitor=60000 on 18builder
+ * Resource action: FAKECLONE2:0 monitor=60000 on 18node1
+ * Resource action: FAKECLONE2:1 monitor=60000 on 18node2
+ * Resource action: FAKECLONE2:2 monitor=60000 on 18node3
+ * Resource action: FAKECLONE2:3 monitor=60000 on 18node4
+ * Resource action: FAKECLONE2:4 monitor=60000 on remote1
+ * Resource action: FAKECLONE2:5 monitor=60000 on 18builder
+ * Resource action: FAKE2 monitor=60000 on 18node3
+ * Resource action: FAKE3 monitor=60000 on 18node4
+ * Resource action: FAKE4 monitor=60000 on remote1
+
+Revised cluster status:
+Online: [ 18builder 18node1 18node2 18node3 18node4 ]
+RemoteOnline: [ remote1 ]
+
+ shooter (stonith:fence_xvm): Started 18node1
+ remote1 (ocf::pacemaker:remote): Started 18builder
+ FAKE1 (ocf::heartbeat:Dummy): Started 18node2
+ FAKE2 (ocf::heartbeat:Dummy): Started 18node3
+ FAKE3 (ocf::heartbeat:Dummy): Started 18node4
+ FAKE4 (ocf::heartbeat:Dummy): Started remote1
+ FAKE5 (ocf::heartbeat:Dummy): Started 18builder
+ Clone Set: FAKECLONE1-clone [FAKECLONE1]
+ Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+ Clone Set: FAKECLONE2-clone [FAKECLONE2]
+ Started: [ 18builder 18node1 18node2 18node3 18node4 remote1 ]
+
diff --git a/pengine/test10/rsc-discovery-per-node.xml b/pengine/test10/rsc-discovery-per-node.xml
new file mode 100644
index 0000000..c111de8
--- /dev/null
+++ b/pengine/test10/rsc-discovery-per-node.xml
@@ -0,0 +1,182 @@
+<cib epoch="11" num_updates="1" admin_epoch="0" validate-with="pacemaker-next" cib-last-written="Tue Sep 3 17:59:24 2013" update-origin="18builder" update-client="crm_resource" crm_feature_set="3.0.7" have-quorum="1" dc-uuid="5">
+ <configuration>
+ <crm_config>
+ <cluster_property_set id="cib-bootstrap-options">
+ <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="1.1.10-ab50afe"/>
+ <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="corosync"/>
+ </cluster_property_set>
+ </crm_config>
+ <nodes>
+ <node id="1" uname="18node1">
+ <instance_attributes id="instance_attributes-18node1">
+ <nvpair name="resource-discovery-enabled" id="discovery-18node1" value="false"/>
+ </instance_attributes>
+ </node>
+ <node id="2" uname="18node2"/>
+ <node id="3" uname="18node3"/>
+ <node id="4" uname="18node4"/>
+ <node id="5" uname="18builder"/>
+ </nodes>
+ <resources>
+ <primitive class="stonith" id="shooter" type="fence_xvm">
+ <instance_attributes id="shooter-instance_attributes"/>
+ <operations>
+ <op id="shooter-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="remote1" provider="pacemaker" type="remote">
+ <instance_attributes id="remote1-instance_attributes"/>
+ <operations>
+ <op id="remote1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ <meta_attributes id="remote1-meta_attributes"/>
+ </primitive>
+ <primitive class="ocf" id="FAKE1" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE1-instance_attributes"/>
+ <meta_attributes id="FAKE1-meta_attributes">
+ </meta_attributes>
+ <operations>
+ <op id="FAKE1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE2" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE2-instance_attributes"/>
+ <meta_attributes id="FAKE2-meta_attributes">
+ </meta_attributes>
+ <operations>
+ <op id="FAKE2-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE3" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE3-instance_attributes"/>
+ <operations>
+ <op id="FAKE3-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE4" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE4-instance_attributes"/>
+ <operations>
+ <op id="FAKE4-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <primitive class="ocf" id="FAKE5" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKE5-instance_attributes"/>
+ <operations>
+ <op id="FAKE5-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ <clone id="FAKECLONE1-clone">
+ <primitive class="ocf" id="FAKECLONE1" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKECLONE1-instance_attributes"/>
+ <operations>
+ <op id="FAKECLONE1-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ </clone>
+ <clone id="FAKECLONE2-clone">
+ <primitive class="ocf" id="FAKECLONE2" provider="heartbeat" type="Dummy">
+ <instance_attributes id="FAKECLONE2-instance_attributes"/>
+ <operations>
+ <op id="FAKECLONE2-monitor-interval-60s" interval="60s" name="monitor"/>
+ </operations>
+ </primitive>
+ </clone>
+ </resources>
+ <constraints>
+ </constraints>
+ </configuration>
+ <status>
+ <node_state id="5" uname="18builder" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
+ <transient_attributes id="5">
+ <instance_attributes id="status-5">
+ </instance_attributes>
+ </transient_attributes>
+ <lrm id="5">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="11:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;11:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="16" rc-code="0" op-status="0" interval="0" last-run="1378248545" last-rc-change="1378248545" exec-time="1" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:3:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:3:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="11" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248534" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:6:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:6:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="13" rc-code="0" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="remote1_monitor_60000" operation_key="remote1_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:5:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:5:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="3" rc-code="0" op-status="0" interval="60000" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="7:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;7:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="39" rc-code="7" op-status="0" interval="0" last-run="1378249145" last-rc-change="1378249145" exec-time="61" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="18:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;18:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="53" rc-code="0" op-status="0" interval="0" last-run="1378249147" last-rc-change="1378249147" exec-time="11" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE3_monitor_60000" operation_key="FAKE3_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="19:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;19:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="56" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249147" exec-time="10" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="61" rc-code="7" op-status="0" interval="0" last-run="1378249149" last-rc-change="1378249149" exec-time="65" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ </node_state>
+ <node_state id="1" uname="18node1" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+ <lrm id="1">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;12:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="9" rc-code="0" op-status="0" interval="0" last-run="1378248547" last-rc-change="1378248547" exec-time="19" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="shooter_monitor_60000" operation_key="shooter_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:4:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;13:4:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="12" rc-code="0" op-status="0" interval="60000" last-rc-change="1378248548" exec-time="8" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="9:9:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;9:9:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="25" rc-code="7" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="28" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_failure_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;10:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="30" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="32" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:11:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:11:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="33" rc-code="0" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="15" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="22:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;22:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="40" rc-code="0" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="36" queue-time="38" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE4_monitor_60000" operation_key="FAKE4_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="23:12:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;23:12:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="44" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249148" exec-time="14" queue-time="1" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="1">
+ <instance_attributes id="status-1">
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ <node_state id="2" uname="18node2" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
+ <lrm id="2">
+ <lrm_resources>
+ <lrm_resource id="shooter" type="fence_xvm" class="stonith">
+ <lrm_rsc_op id="shooter_last_0" operation_key="shooter_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="8:3:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;8:3:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="5" rc-code="7" op-status="0" interval="0" last-run="1378248530" last-rc-change="1378248530" exec-time="980" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="remote1" type="remote" class="ocf" provider="pacemaker">
+ <lrm_rsc_op id="remote1_last_0" operation_key="remote1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="10:4:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;10:4:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="1" rc-code="7" op-status="0" interval="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE2" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE2_last_0" operation_key="FAKE2_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="16:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;16:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="18" rc-code="0" op-status="0" interval="0" last-run="1378249144" last-rc-change="1378249144" exec-time="18" queue-time="9" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ <lrm_rsc_op id="FAKE2_monitor_60000" operation_key="FAKE2_monitor_60000" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="17:9:0:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:0;17:9:0:6277c962-3d23-450c-8410-560e51c1302b" call-id="22" rc-code="0" op-status="0" interval="60000" last-rc-change="1378249144" exec-time="20" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE3" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE3_last_0" operation_key="FAKE3_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="12:10:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;12:10:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="27" rc-code="7" op-status="0" interval="0" last-run="1378249146" last-rc-change="1378249146" exec-time="35" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ <lrm_resource id="FAKE4" type="Dummy" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="FAKE4_last_0" operation_key="FAKE4_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.0.7" transition-key="13:12:7:6277c962-3d23-450c-8410-560e51c1302b" transition-magic="0:7;13:12:7:6277c962-3d23-450c-8410-560e51c1302b" call-id="32" rc-code="7" op-status="0" interval="0" last-run="1378249148" last-rc-change="1378249148" exec-time="33" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="2">
+ <instance_attributes id="status-2">
+ <nvpair name="resource-discovery-enabled" id="discovery-18node2" value="false"/>
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ <node_state id="3" uname="18node3" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
+ <node_state id="4" uname="18node4" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member"/>
+ <node_state remote_node="true" id="remote1" uname="remote1" crm-debug-origin="remote_init_cib_status">
+ <transient_attributes id="remote1">
+ <instance_attributes id="status-remote1">
+ <nvpair name="resource-discovery-enabled" id="discovery-18node2" value="false"/>
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ </status>
+</cib>
diff --git a/pengine/test10/whitebox-start.dot b/pengine/test10/whitebox-start.dot
index bec57b0..659ea97 100644
--- a/pengine/test10/whitebox-start.dot
+++ b/pengine/test10/whitebox-start.dot
@@ -1,4 +1,16 @@
digraph "g" {
+"A_monitor_10000 lxc1" [ style=bold color="green" fontcolor="black"]
+"A_start_0 lxc1" -> "A_monitor_10000 lxc1" [ style = bold]
+"A_start_0 lxc1" [ style=bold color="green" fontcolor="black"]
+"A_stop_0 18node1" -> "A_start_0 lxc1" [ style = bold]
+"A_stop_0 18node1" -> "all_stopped" [ style = bold]
+"A_stop_0 18node1" [ style=bold color="green" fontcolor="black"]
+"B_monitor_10000 18node3" [ style=bold color="green" fontcolor="black"]
+"B_start_0 18node3" -> "B_monitor_10000 18node3" [ style = bold]
+"B_start_0 18node3" [ style=bold color="green" fontcolor="black"]
+"B_stop_0 lxc2" -> "B_start_0 18node3" [ style = bold]
+"B_stop_0 lxc2" -> "all_stopped" [ style = bold]
+"B_stop_0 lxc2" [ style=bold color="green" fontcolor="black"]
"M-clone_running_0" [ style=bold color="green" fontcolor="orange"]
"M-clone_start_0" -> "M-clone_running_0" [ style = bold]
"M-clone_start_0" -> "M_start_0 lxc1" [ style = bold]
@@ -7,9 +19,12 @@ digraph "g" {
"M_start_0 lxc1" -> "M-clone_running_0" [ style = bold]
"M_start_0 lxc1" -> "M_monitor_10000 lxc1" [ style = bold]
"M_start_0 lxc1" [ style=bold color="green" fontcolor="black"]
+"all_stopped" [ style=bold color="green" fontcolor="orange"]
"container1_start_0 18node1" -> "lxc1_start_0 18node1" [ style = bold]
"container1_start_0 18node1" [ style=bold color="green" fontcolor="black"]
"lxc1_monitor_30000 18node1" [ style=bold color="green" fontcolor="black"]
+"lxc1_start_0 18node1" -> "A_monitor_10000 lxc1" [ style = bold]
+"lxc1_start_0 18node1" -> "A_start_0 lxc1" [ style = bold]
"lxc1_start_0 18node1" -> "M_monitor_10000 lxc1" [ style = bold]
"lxc1_start_0 18node1" -> "M_start_0 lxc1" [ style = bold]
"lxc1_start_0 18node1" -> "lxc1_monitor_30000 18node1" [ style = bold]
diff --git a/pengine/test10/whitebox-start.exp b/pengine/test10/whitebox-start.exp
index 0ee104c..68ede8e 100644
--- a/pengine/test10/whitebox-start.exp
+++ b/pengine/test10/whitebox-start.exp
@@ -20,7 +20,7 @@
<rsc_op id="29" operation="start" operation_key="M_start_0" internal_operation_key="M:4_start_0" on_node="lxc1" on_node_uuid="lxc1" router_node="18node1"/>
</trigger>
<trigger>
- <rsc_op id="43" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
</trigger>
</inputs>
</synapse>
@@ -36,7 +36,7 @@
<pseudo_event id="31" operation="start" operation_key="M-clone_start_0"/>
</trigger>
<trigger>
- <rsc_op id="43" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
</trigger>
</inputs>
</synapse>
@@ -65,20 +65,96 @@
</synapse>
<synapse id="5">
<action_set>
- <rsc_op id="44" operation="monitor" operation_key="lxc1_monitor_30000" on_node="18node1" on_node_uuid="1">
+ <rsc_op id="37" operation="monitor" operation_key="A_monitor_10000" on_node="lxc1" on_node_uuid="lxc1" router_node="18node1">
+ <primitive id="A" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="36" operation="start" operation_key="A_start_0" on_node="lxc1" on_node_uuid="lxc1" router_node="18node1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="6">
+ <action_set>
+ <rsc_op id="36" operation="start" operation_key="A_start_0" on_node="lxc1" on_node_uuid="lxc1" router_node="18node1">
+ <primitive id="A" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="35" operation="stop" operation_key="A_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="7">
+ <action_set>
+ <rsc_op id="35" operation="stop" operation_key="A_stop_0" on_node="18node1" on_node_uuid="1">
+ <primitive id="A" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="8">
+ <action_set>
+ <rsc_op id="40" operation="monitor" operation_key="B_monitor_10000" on_node="18node3" on_node_uuid="3">
+ <primitive id="B" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="39" operation="start" operation_key="B_start_0" on_node="18node3" on_node_uuid="3"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="9">
+ <action_set>
+ <rsc_op id="39" operation="start" operation_key="B_start_0" on_node="18node3" on_node_uuid="3">
+ <primitive id="B" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="38" operation="stop" operation_key="B_stop_0" on_node="lxc2" on_node_uuid="lxc2" router_node="18node2"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="10">
+ <action_set>
+ <rsc_op id="38" operation="stop" operation_key="B_stop_0" on_node="lxc2" on_node_uuid="lxc2" router_node="18node2">
+ <primitive id="B" class="ocf" provider="pacemaker" type="Dummy"/>
+ <attributes CRM_meta_timeout="20000" />
+ </rsc_op>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="11">
+ <action_set>
+ <rsc_op id="46" operation="monitor" operation_key="lxc1_monitor_30000" on_node="18node1" on_node_uuid="1">
<primitive id="lxc1" class="ocf" provider="pacemaker" type="remote"/>
<attributes CRM_meta_container="container1" CRM_meta_interval="30000" CRM_meta_name="monitor" CRM_meta_timeout="30000" />
</rsc_op>
</action_set>
<inputs>
<trigger>
- <rsc_op id="43" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1"/>
</trigger>
</inputs>
</synapse>
- <synapse id="6">
+ <synapse id="12">
<action_set>
- <rsc_op id="43" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1">
+ <rsc_op id="45" operation="start" operation_key="lxc1_start_0" on_node="18node1" on_node_uuid="1">
<primitive id="lxc1" class="ocf" provider="pacemaker" type="remote"/>
<attributes CRM_meta_container="container1" CRM_meta_name="start" CRM_meta_timeout="60000" />
</rsc_op>
@@ -89,5 +165,19 @@
</trigger>
</inputs>
</synapse>
+ <synapse id="13">
+ <action_set>
+ <pseudo_event id="10" operation="all_stopped" operation_key="all_stopped">
+ <attributes />
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="35" operation="stop" operation_key="A_stop_0" on_node="18node1" on_node_uuid="1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="38" operation="stop" operation_key="B_stop_0" on_node="lxc2" on_node_uuid="lxc2" router_node="18node2"/>
+ </trigger>
+ </inputs>
+ </synapse>
</transition_graph>
-
diff --git a/pengine/test10/whitebox-start.scores b/pengine/test10/whitebox-start.scores
index 1a00b28..1f0f273 100644
--- a/pengine/test10/whitebox-start.scores
+++ b/pengine/test10/whitebox-start.scores
@@ -32,11 +32,11 @@ clone_color: M:4 allocation score on lxc2: 0
native_color: A allocation score on 18node1: 100
native_color: A allocation score on 18node2: 0
native_color: A allocation score on 18node3: 0
-native_color: A allocation score on lxc1: 0
-native_color: A allocation score on lxc2: 0
-native_color: B allocation score on 18node1: 0
-native_color: B allocation score on 18node2: 0
-native_color: B allocation score on 18node3: 0
+native_color: A allocation score on lxc1: INFINITY
+native_color: A allocation score on lxc2: INFINITY
+native_color: B allocation score on 18node1: INFINITY
+native_color: B allocation score on 18node2: INFINITY
+native_color: B allocation score on 18node3: INFINITY
native_color: B allocation score on lxc1: 0
native_color: B allocation score on lxc2: 100
native_color: C allocation score on 18node1: 0
diff --git a/pengine/test10/whitebox-start.summary b/pengine/test10/whitebox-start.summary
index 2801abe..6819ebc 100644
--- a/pengine/test10/whitebox-start.summary
+++ b/pengine/test10/whitebox-start.summary
@@ -17,16 +17,25 @@ Containers: [ lxc2:container2 ]
Transition Summary:
* Start container1 (18node1)
* Start M:4 (lxc1)
+ * Move A (Started 18node1 -> lxc1)
+ * Move B (Started lxc2 -> 18node3)
* Start lxc1 (18node1)
Executing cluster transition:
* Resource action: container1 start on 18node1
* Pseudo action: M-clone_start_0
+ * Resource action: A stop on 18node1
+ * Resource action: B stop on lxc2
* Resource action: lxc1 start on 18node1
+ * Pseudo action: all_stopped
* Resource action: M start on lxc1
* Pseudo action: M-clone_running_0
+ * Resource action: A start on lxc1
+ * Resource action: B start on 18node3
* Resource action: lxc1 monitor=30000 on 18node1
* Resource action: M monitor=10000 on lxc1
+ * Resource action: A monitor=10000 on lxc1
+ * Resource action: B monitor=10000 on 18node3
Revised cluster status:
Online: [ 18node1 18node2 18node3 ]
@@ -37,8 +46,8 @@ Containers: [ lxc1:container1 lxc2:container2 ]
shoot1 (stonith:fence_xvm): Started 18node3
Clone Set: M-clone [M]
Started: [ 18node1 18node2 18node3 lxc1 lxc2 ]
- A (ocf::pacemaker:Dummy): Started 18node1
- B (ocf::pacemaker:Dummy): Started lxc2
+ A (ocf::pacemaker:Dummy): Started lxc1
+ B (ocf::pacemaker:Dummy): Started 18node3
C (ocf::pacemaker:Dummy): Started lxc2
D (ocf::pacemaker:Dummy): Started 18node1
diff --git a/pengine/test10/whitebox-start.xml b/pengine/test10/whitebox-start.xml
index 2dad074..67fcbaf 100644
--- a/pengine/test10/whitebox-start.xml
+++ b/pengine/test10/whitebox-start.xml
@@ -78,7 +78,18 @@
</operations>
</primitive>
</resources>
- <constraints/>
+ <constraints>
+ <rsc_location id="A-location" rsc="A">
+ <rule id="A-on-remote" score="INFINITY">
+ <expression id="A-on-remote-exp" attribute="#kind" operation="eq" value="container"/>
+ </rule>
+ </rsc_location>
+ <rsc_location id="B-location" rsc="B">
+ <rule id="B-on-cluster" score="INFINITY">
+ <expression id="B-on-cluster-exp" attribute="#kind" operation="eq" value="cluster"/>
+ </rule>
+ </rsc_location>
+ </constraints>
<rsc_defaults>
<meta_attributes id="rsc_defaults-options">
<nvpair id="rsc_defaults-options-resource-stickiness" name="resource-stickiness" value="100"/>
diff --git a/pengine/utils.c b/pengine/utils.c
index 7dfaf95..9782cb6 100644
--- a/pengine/utils.c
+++ b/pengine/utils.c
@@ -60,7 +60,8 @@ pe_free_rsc_to_node(GListPtr constraints)
rsc_to_node_t *
rsc2node_new(const char *id, resource_t * rsc,
- int node_weight, node_t * foo_node, pe_working_set_t * data_set)
+ int node_weight, const char *discover_mode,
+ node_t * foo_node, pe_working_set_t * data_set)
{
rsc_to_node_t *new_con = NULL;
@@ -79,6 +80,18 @@ rsc2node_new(const char *id, resource_t * rsc,
new_con->node_list_rh = NULL;
new_con->role_filter = RSC_ROLE_UNKNOWN;
+
+ if (discover_mode == NULL || safe_str_eq(discover_mode, "always")) {
+ new_con->discover_mode = discover_always;
+ } else if (safe_str_eq(discover_mode, "never")) {
+ new_con->discover_mode = discover_never;
+ } else if (safe_str_eq(discover_mode, "exclusive")) {
+ new_con->discover_mode = discover_exclusive;
+ rsc->exclusive_discover = TRUE;
+ } else {
+ pe_err("Invalid %s value %s in location constraint", XML_LOCATION_ATTR_DISCOVERY, discover_mode);
+ }
+
if (foo_node != NULL) {
node_t *copy = node_copy(foo_node);
diff --git a/pengine/utils.h b/pengine/utils.h
index 1939d40..5142e68 100644
--- a/pengine/utils.h
+++ b/pengine/utils.h
@@ -23,7 +23,8 @@ extern rsc_colocation_t *invert_constraint(rsc_colocation_t * constraint);
extern rsc_to_node_t *copy_constraint(rsc_to_node_t * constraint);
-extern rsc_to_node_t *rsc2node_new(const char *id, resource_t * rsc, int weight, node_t * node,
+extern rsc_to_node_t *rsc2node_new(const char *id, resource_t * rsc, int weight,
+ const char *discovery_mode, node_t * node,
pe_working_set_t * data_set);
extern void pe_free_rsc_to_node(GListPtr constraints);
diff --git a/tools/crm_resource.c b/tools/crm_resource.c
index 56583e0..ff5effd 100644
--- a/tools/crm_resource.c
+++ b/tools/crm_resource.c
@@ -94,6 +94,10 @@ resource_ipc_connection_destroy(gpointer user_data)
static void
start_mainloop(void)
{
+ if (crmd_replies_needed == 0) {
+ return;
+ }
+
mainloop = g_main_new(FALSE);
fprintf(stderr, "Waiting for %d replies from the CRMd", crmd_replies_needed);
crm_debug("Waiting for %d replies from the CRMd", crmd_replies_needed);
@@ -789,6 +793,7 @@ delete_lrm_rsc(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname
resource_t * rsc, pe_working_set_t * data_set)
{
int rc = pcmk_ok;
+ node_t *node = NULL;
if (rsc == NULL) {
return -ENXIO;
@@ -807,7 +812,7 @@ delete_lrm_rsc(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname
GListPtr lpc = NULL;
for (lpc = data_set->nodes; lpc != NULL; lpc = lpc->next) {
- node_t *node = (node_t *) lpc->data;
+ node = (node_t *) lpc->data;
if (node->details->online) {
delete_lrm_rsc(cib_conn, crmd_channel, node->details->uname, rsc, data_set);
@@ -817,15 +822,20 @@ delete_lrm_rsc(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname
return pcmk_ok;
}
- printf("Cleaning up %s on %s\n", rsc->id, host_uname);
- rc = send_lrm_rsc_op(crmd_channel, CRM_OP_LRM_DELETE, host_uname, rsc->id, TRUE, data_set);
+ node = pe_find_node(data_set->nodes, host_uname);
+
+ if (node && node->details->rsc_discovery_enabled) {
+ printf("Cleaning up %s on %s\n", rsc->id, host_uname);
+ rc = send_lrm_rsc_op(crmd_channel, CRM_OP_LRM_DELETE, host_uname, rsc->id, TRUE, data_set);
+ } else {
+ printf("Resource discovery disabled on %s. Unable to delete lrm state.\n", host_uname);
+ }
if (rc == pcmk_ok) {
char *attr_name = NULL;
const char *id = rsc->id;
- node_t *node = pe_find_node(data_set->nodes, host_uname);
- if(node && node->details->remote_rsc == NULL) {
+ if(node && node->details->remote_rsc == NULL && node->details->rsc_discovery_enabled) {
crmd_replies_needed++;
}
if (rsc->clone_name) {
@@ -1970,6 +1980,7 @@ main(int argc, char **argv)
node_t *current = NULL;
node_t *dest = pe_find_node(data_set.nodes, host_uname);
resource_t *rsc = pe_find_resource(data_set.resources, rsc_id);
+ gboolean cur_is_dest = FALSE;
rc = -EINVAL;
@@ -2032,11 +2043,16 @@ main(int argc, char **argv)
} else if(scope_master && rsc->fns->state(rsc, TRUE) != RSC_ROLE_MASTER) {
crm_trace("%s is already active on %s but not in correct state", rsc_id, dest->details->uname);
-
} else if (safe_str_eq(current->details->uname, dest->details->uname)) {
- CMD_ERR("Error performing operation: %s is already %s on %s\n",
- rsc_id, scope_master?"promoted":"active", dest->details->uname);
- goto bail;
+ cur_is_dest = TRUE;
+ if (do_force) {
+ crm_info("%s is already %s on %s, reinforcing placement with location constraint.\n",
+ rsc_id, scope_master?"promoted":"active", dest->details->uname);
+ } else {
+ CMD_ERR("Error performing operation: %s is already %s on %s\n",
+ rsc_id, scope_master?"promoted":"active", dest->details->uname);
+ goto bail;
+ }
}
/* Clear any previous constraints for 'dest' */
@@ -2048,7 +2064,10 @@ main(int argc, char **argv)
crm_trace("%s%s now prefers node %s%s",
rsc->id, scope_master?" (master)":"", dest->details->uname, do_force?"(forced)":"");
- if(do_force) {
+ /* only ban the previous location if current location != destination location.
+ * it is possible to use -M to enforce a location without regard of where the
+ * resource is currently located */
+ if(do_force && (cur_is_dest == FALSE)) {
/* Ban the original location if possible */
if(current) {
ban_resource(rsc_id, current->details->uname, NULL, cib_conn);
diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c
index 07f0871..7c0dcc7 100644
--- a/tools/crm_simulate.c
+++ b/tools/crm_simulate.c
@@ -964,7 +964,7 @@ set_ticket_state_attr(const char *ticket_id, const char *attr_name,
static void
modify_configuration(pe_working_set_t * data_set,
- const char *quorum, GListPtr node_up, GListPtr node_down, GListPtr node_fail,
+ const char *quorum, const char *watchdog, GListPtr node_up, GListPtr node_down, GListPtr node_fail,
GListPtr op_inject, GListPtr ticket_grant, GListPtr ticket_revoke,
GListPtr ticket_standby, GListPtr ticket_activate)
{
@@ -988,6 +988,16 @@ modify_configuration(pe_working_set_t * data_set,
CRM_ASSERT(rc == pcmk_ok);
}
+ if (watchdog) {
+ quiet_log(" + Setting watchdog: %s\n", watchdog);
+
+ rc = update_attr_delegate(global_cib, cib_sync_call | cib_scope_local,
+ XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
+ XML_ATTR_HAVE_WATCHDOG, watchdog, FALSE, NULL, NULL);
+
+ CRM_ASSERT(rc == pcmk_ok);
+ }
+
for (gIter = node_up; gIter != NULL; gIter = gIter->next) {
char *node = (char *)gIter->data;
@@ -1245,6 +1255,7 @@ static struct crm_option long_options[] = {
{"-spacer-", 0, 0, '-', "\t\tThe transition will normally stop at the failed action. Save the result with --save-output and re-run with --xml-file"},
{"set-datetime", 1, 0, 't', "Set date/time"},
{"quorum", 1, 0, 'q', "\tSpecify a value for quorum"},
+ {"watchdog", 1, 0, 'w', "\tAssume a watchdog device is active"},
{"ticket-grant", 1, 0, 'g', "Grant a ticket"},
{"ticket-revoke", 1, 0, 'r', "Revoke a ticket"},
{"ticket-standby", 1, 0, 'b', "Make a ticket standby"},
@@ -1359,6 +1370,7 @@ main(int argc, char **argv)
const char *xml_file = "-";
const char *quorum = NULL;
+ const char *watchdog = NULL;
const char *test_dir = NULL;
const char *dot_file = NULL;
const char *graph_file = NULL;
@@ -1445,6 +1457,10 @@ main(int argc, char **argv)
simulate = TRUE;
op_fail = g_list_append(op_fail, optarg);
break;
+ case 'w':
+ modified++;
+ watchdog = optarg;
+ break;
case 'q':
modified++;
quorum = optarg;
@@ -1555,7 +1571,7 @@ main(int argc, char **argv)
if (modified) {
quiet_log("Performing requested modifications\n");
- modify_configuration(&data_set, quorum, node_up, node_down, node_fail, op_inject,
+ modify_configuration(&data_set, quorum, watchdog, node_up, node_down, node_fail, op_inject,
ticket_grant, ticket_revoke, ticket_standby, ticket_activate);
rc = global_cib->cmds->query(global_cib, NULL, &input, cib_sync_call);
diff --git a/tools/regression.acls.exp b/tools/regression.acls.exp
index 2abdf97..2cea125 100644
--- a/tools/regression.acls.exp
+++ b/tools/regression.acls.exp
@@ -1,4 +1,4 @@
-Created new pacemaker-1.3 configuration
+Created new pacemaker configuration
Setting up shadow instance
A new shadow instance was created. To begin using it paste the following into your shell:
CIB_shadow=tools-regression ; export CIB_shadow
diff --git a/tools/regression.sh b/tools/regression.sh
index 285dcba..0c4896c 100755
--- a/tools/regression.sh
+++ b/tools/regression.sh
@@ -578,6 +578,7 @@ for t in $tests; do
-e 's/ last-run=\"[0-9]*\"//' \
-e 's/crm_feature_set="[^"]*" //'\
-e 's/validate-with="[^"]*" //'\
+ -e 's/Created new pacemaker-.* configuration/Created new pacemaker configuration/'\
-e 's/.*__xml_acl_check/__xml_acl_check/g'\
-e 's/.*__xml_acl_post_process/__xml_acl_post_process/g'\
-e 's/.*error: unpack_resources:/error: unpack_resources:/g'\
diff --git a/tools/regression.tools.exp b/tools/regression.tools.exp
index 5b12c84..287caf9 100644
--- a/tools/regression.tools.exp
+++ b/tools/regression.tools.exp
@@ -1,4 +1,4 @@
-Created new pacemaker-2.1 configuration
+Created new pacemaker configuration
Setting up shadow instance
A new shadow instance was created. To begin using it paste the following into your shell:
CIB_shadow=tools-regression ; export CIB_shadow
diff --git a/xml/Makefile.am b/xml/Makefile.am
index 4c21e55..e3a3d04 100644
--- a/xml/Makefile.am
+++ b/xml/Makefile.am
@@ -26,8 +26,8 @@ xslt_SCRIPTS = upgrade06.xsl upgrade-*.xsl
RNGdir = $(dtddir)
# See Readme.md for details on updating schema files
-RNG_max = $(firstword $(shell ls -1 *.rng | sed -e 's/.*-//' -e 's/.rng//' | sort -unr))
-RNG_last = $(shell ls -1 *.rng | sed -e 's/.*-//' -e 's/.rng//' | sort -unr | head -n 2 | tail -n 1)
+RNG_max ?= $(firstword $(shell ls -1 *.rng | sed -e 's/.*-//' -e 's/.rng//' | sort -unr))
+RNG_last ?= $(shell ls -1 *.rng | sed -e 's/.*-//' -e 's/.rng//' | sort -unr | head -n 2 | tail -n 1)
RNG_versions = $(shell ls -1 *.rng | sed -e 's/.*-//' -e 's/.rng//' | sort -un)
RNG_generated = pacemaker.rng $(foreach base,$(RNG_versions),pacemaker-$(base).rng) versions.rng
diff --git a/xml/constraints-2.2.rng b/xml/constraints-2.2.rng
new file mode 100644
index 0000000..216bf9c
--- /dev/null
+++ b/xml/constraints-2.2.rng
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <start>
+ <ref name="element-constraints"/>
+ </start>
+
+ <define name="element-constraints">
+ <element name="constraints">
+ <zeroOrMore>
+ <choice>
+ <ref name="element-location"/>
+ <ref name="element-colocation"/>
+ <ref name="element-order"/>
+ <ref name="element-rsc_ticket"/>
+ </choice>
+ </zeroOrMore>
+ </element>
+ </define>
+
+ <define name="element-location">
+ <element name="rsc_location">
+ <attribute name="id"><data type="ID"/></attribute>
+ <choice>
+ <group>
+ <attribute name="rsc"><data type="IDREF"/></attribute>
+ <optional>
+ <attribute name="role">
+ <ref name="attribute-roles"/>
+ </attribute>
+ </optional>
+ </group>
+ <oneOrMore>
+ <ref name="element-resource-set"/>
+ </oneOrMore>
+ </choice>
+ <choice>
+ <group>
+ <externalRef href="score.rng"/>
+ <attribute name="node"><text/></attribute>
+ </group>
+ <oneOrMore>
+ <externalRef href="rule.rng"/>
+ </oneOrMore>
+ </choice>
+ <optional>
+ <ref name="element-lifetime"/>
+ </optional>
+ <optional>
+ <attribute name="resource-discovery">
+ <ref name="attribute-discovery"/>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
+ <define name="element-resource-set">
+ <element name="resource_set">
+ <choice>
+ <attribute name="id-ref"><data type="IDREF"/></attribute>
+ <group>
+ <attribute name="id"><data type="ID"/></attribute>
+ <optional>
+ <attribute name="sequential"><data type="boolean"/></attribute>
+ </optional>
+ <optional>
+ <attribute name="require-all"><data type="boolean"/></attribute>
+ </optional>
+ <optional>
+ <attribute name="ordering">
+ <choice>
+ <value>group</value>
+ <value>listed</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="action">
+ <ref name="attribute-actions"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="role">
+ <ref name="attribute-roles"/>
+ </attribute>
+ </optional>
+ <optional>
+ <externalRef href="score.rng"/>
+ </optional>
+ <oneOrMore>
+ <element name="resource_ref">
+ <attribute name="id"><data type="IDREF"/></attribute>
+ </element>
+ </oneOrMore>
+ </group>
+ </choice>
+ </element>
+ </define>
+
+ <define name="element-colocation">
+ <element name="rsc_colocation">
+ <attribute name="id"><data type="ID"/></attribute>
+ <optional>
+ <choice>
+ <externalRef href="score.rng"/>
+ <attribute name="score-attribute"><text/></attribute>
+ <attribute name="score-attribute-mangle"><text/></attribute>
+ </choice>
+ </optional>
+ <optional>
+ <ref name="element-lifetime"/>
+ </optional>
+ <choice>
+ <oneOrMore>
+ <ref name="element-resource-set"/>
+ </oneOrMore>
+ <group>
+ <attribute name="rsc"><data type="IDREF"/></attribute>
+ <attribute name="with-rsc"><data type="IDREF"/></attribute>
+ <optional>
+ <attribute name="node-attribute"><text/></attribute>
+ </optional>
+ <optional>
+ <attribute name="rsc-role">
+ <ref name="attribute-roles"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="with-rsc-role">
+ <ref name="attribute-roles"/>
+ </attribute>
+ </optional>
+ </group>
+ </choice>
+ </element>
+ </define>
+
+ <define name="element-order">
+ <element name="rsc_order">
+ <attribute name="id"><data type="ID"/></attribute>
+ <optional>
+ <ref name="element-lifetime"/>
+ </optional>
+ <optional>
+ <attribute name="symmetrical"><data type="boolean"/></attribute>
+ </optional>
+ <optional>
+ <choice>
+ <externalRef href="score.rng"/>
+ <attribute name="kind">
+ <ref name="order-types"/>
+ </attribute>
+ </choice>
+ </optional>
+ <choice>
+ <oneOrMore>
+ <ref name="element-resource-set"/>
+ </oneOrMore>
+ <group>
+ <attribute name="first"><data type="IDREF"/></attribute>
+ <attribute name="then"><data type="IDREF"/></attribute>
+ <optional>
+ <attribute name="first-action">
+ <ref name="attribute-actions"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="then-action">
+ <ref name="attribute-actions"/>
+ </attribute>
+ </optional>
+ </group>
+ </choice>
+ </element>
+ </define>
+
+ <define name="element-rsc_ticket">
+ <element name="rsc_ticket">
+ <attribute name="id"><data type="ID"/></attribute>
+ <choice>
+ <oneOrMore>
+ <ref name="element-resource-set"/>
+ </oneOrMore>
+ <group>
+ <attribute name="rsc"><data type="IDREF"/></attribute>
+ <optional>
+ <attribute name="rsc-role">
+ <ref name="attribute-roles"/>
+ </attribute>
+ </optional>
+ </group>
+ </choice>
+ <attribute name="ticket"><text/></attribute>
+ <optional>
+ <attribute name="loss-policy">
+ <choice>
+ <value>stop</value>
+ <value>demote</value>
+ <value>fence</value>
+ <value>freeze</value>
+ </choice>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
+ <define name="attribute-discovery">
+ <choice>
+ <value>always</value>
+ <value>never</value>
+ <value>exclusive</value>
+ </choice>
+ </define>
+
+ <define name="attribute-actions">
+ <choice>
+ <value>start</value>
+ <value>promote</value>
+ <value>demote</value>
+ <value>stop</value>
+ </choice>
+ </define>
+
+ <define name="attribute-roles">
+ <choice>
+ <value>Stopped</value>
+ <value>Started</value>
+ <value>Master</value>
+ <value>Slave</value>
+ </choice>
+ </define>
+
+ <define name="order-types">
+ <choice>
+ <value>Optional</value>
+ <value>Mandatory</value>
+ <value>Serialize</value>
+ </choice>
+ </define>
+
+ <define name="element-lifetime">
+ <element name="lifetime">
+ <oneOrMore>
+ <externalRef href="rule.rng"/>
+ </oneOrMore>
+ </element>
+ </define>
+
+</grammar>
diff --git a/xml/constraints-next.rng b/xml/constraints-next.rng
index 051603d..0defe8f 100644
--- a/xml/constraints-next.rng
+++ b/xml/constraints-next.rng
@@ -49,6 +49,11 @@
<optional>
<ref name="element-lifetime"/>
</optional>
+ <optional>
+ <attribute name="resource-discovery">
+ <ref name="attribute-discovery"/>
+ </attribute>
+ </optional>
</element>
</define>
@@ -65,6 +70,14 @@
<attribute name="require-all"><data type="boolean"/></attribute>
</optional>
<optional>
+ <attribute name="ordering">
+ <choice>
+ <value>group</value>
+ <value>listed</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
<attribute name="action">
<ref name="attribute-actions"/>
</attribute>
@@ -206,6 +219,14 @@
</element>
</define>
+ <define name="attribute-discovery">
+ <choice>
+ <value>always</value>
+ <value>never</value>
+ <value>exclusive</value>
+ </choice>
+ </define>
+
<define name="attribute-actions">
<choice>
<value>start</value>