From 1f016acd09968c6ffbdb3adf173629b739936787 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 05 2015 13:21:35 +0000 Subject: import pacemaker-1.1.12-22.el7 --- diff --git a/.gitignore b/.gitignore index 9aa67c0..7fc59c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/Pacemaker-1.1.10.tar.gz +SOURCES/pacemaker-a14efad51ca8f1e3742fd8520e051cd7a0864f04.tar.gz diff --git a/.pacemaker.metadata b/.pacemaker.metadata index 5133579..d60206d 100644 --- a/.pacemaker.metadata +++ b/.pacemaker.metadata @@ -1 +1 @@ -e718c70b1a234d1864a78c26339706c39f73f1f6 SOURCES/Pacemaker-1.1.10.tar.gz +131ba58261066b1fd2cf874e41600262ecb584c6 SOURCES/pacemaker-a14efad51ca8f1e3742fd8520e051cd7a0864f04.tar.gz diff --git a/SOURCES/bz1011618-pcmk-consistently_use_slave_as_the_role_for_unpromoted_master_slave_resources.patch b/SOURCES/bz1011618-pcmk-consistently_use_slave_as_the_role_for_unpromoted_master_slave_resources.patch deleted file mode 100644 index 8877f65..0000000 --- a/SOURCES/bz1011618-pcmk-consistently_use_slave_as_the_role_for_unpromoted_master_slave_resources.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 6bb62a4a2b304de64d8ccf0e38ae6dd3c3d5e772 -Author: Andrew Beekhof -Date: Wed Sep 25 11:53:35 2013 +1000 - - Fix: Bug rhbz#1011618 - Consistently use 'Slave' as the role for unpromoted master/slave resources - - (cherry picked from commit bc5e0b677b7ee45c022496cb926f91bad3731974) - -diff --git a/lib/pengine/native.c b/lib/pengine/native.c -index c81a218..adfd5ba 100644 ---- a/lib/pengine/native.c -+++ b/lib/pengine/native.c -@@ -294,16 +294,21 @@ native_print_attr(gpointer key, gpointer value, gpointer user_data) - static void - native_print_xml(resource_t * rsc, const char *pre_text, long options, void *print_data) - { -+ enum rsc_role_e role = rsc->role; - const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); - const char *prov = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER); - -+ if(role == RSC_ROLE_STARTED && uber_parent(rsc)->variant == pe_master) { -+ role = RSC_ROLE_SLAVE; -+ } -+ - /* resource information. */ - status_print("%sxml, XML_ATTR_TYPE)); -- status_print("role=\"%s\" ", role2text(rsc->role)); -+ status_print("role=\"%s\" ", role2text(role)); - status_print("active=\"%s\" ", rsc->fns->active(rsc, TRUE) ? "true" : "false"); - status_print("orphaned=\"%s\" ", is_set(rsc->flags, pe_rsc_orphan) ? "true" : "false"); - status_print("managed=\"%s\" ", is_set(rsc->flags, pe_rsc_managed) ? "true" : "false"); diff --git a/SOURCES/bz1028627-pcmk-fix_controld_use_corosync2_dlm_variant.patch b/SOURCES/bz1028627-pcmk-fix_controld_use_corosync2_dlm_variant.patch deleted file mode 100644 index f8803c5..0000000 --- a/SOURCES/bz1028627-pcmk-fix_controld_use_corosync2_dlm_variant.patch +++ /dev/null @@ -1,22 +0,0 @@ -commit 16ed615a81294fb32e7d5795db86172d167975ae -Author: Andrew Beekhof -Date: Mon Nov 11 09:28:18 2013 +1100 - - Fix: controld: Use the correct variant of dlm_controld for corosync-2 clusters - (cherry picked from commit 0e33fe668aa23520da9552b271aba59016b9cb03) - -diff --git a/extra/resources/controld b/extra/resources/controld -index bacf0e9..bdd31bb 100644 ---- a/extra/resources/controld -+++ b/extra/resources/controld -@@ -209,8 +209,8 @@ controld_validate() { - : ${OCF_RESKEY_CRM_meta_globally_unique:="false"} - - case "$HA_quorum_type" in -- cman|corosync) daemon_ext="";; -- *) daemon_ext=".pcmk";; -+ pcmk) daemon_ext=".pcmk";; -+ *) daemon_ext="";; - esac - - case "$OCF_RESOURCE_INSTANCE" in diff --git a/SOURCES/bz1057697-pcmk-dbus_use_native_function_for_adding_arguments_to_messages.patch b/SOURCES/bz1057697-pcmk-dbus_use_native_function_for_adding_arguments_to_messages.patch deleted file mode 100644 index fe35e42..0000000 --- a/SOURCES/bz1057697-pcmk-dbus_use_native_function_for_adding_arguments_to_messages.patch +++ /dev/null @@ -1,77 +0,0 @@ -commit 04d86af8d57dd8c16283ea6acc6d6798053cf2a0 -Author: Andrew Beekhof -Date: Wed Feb 5 10:56:51 2014 +1100 - - Refactor: dbus: Use native function for adding arguments to messages - - (cherry picked from commit bab144c83e90785c7df01423d3b239cbd4a2cd55) - -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index 66a98a0..b424c0b 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -33,19 +33,6 @@ void pcmk_dbus_disconnect(DBusConnection *connection) - { - } - --bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value) --{ -- DBusMessageIter args; -- -- dbus_message_iter_init_append(msg, &args); -- if (!dbus_message_iter_append_basic(&args, dtype, value)) { -- crm_err("dbus_message_iter_append_basic(%c) failed", dtype); -- return FALSE; -- } -- -- return TRUE; --} -- - bool - pcmk_dbus_find_error(const char *method, DBusPendingCall* pending, DBusMessage *reply, DBusError *ret) - { -@@ -235,7 +222,7 @@ pcmk_dbus_get_property( - return NULL; - } - -- pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &iface); -+ CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &iface, DBUS_TYPE_INVALID)); - - reply = pcmk_dbus_send_recv(msg, connection, &error); - dbus_message_unref(msg); -diff --git a/lib/services/pcmk-dbus.h b/lib/services/pcmk-dbus.h -index c8d2234..3b7a598 100644 ---- a/lib/services/pcmk-dbus.h -+++ b/lib/services/pcmk-dbus.h -@@ -5,7 +5,6 @@ void pcmk_dbus_disconnect(DBusConnection *connection); - bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, - void(*done)(DBusPendingCall *pending, void *user_data), void *user_data); - DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, DBusError *error); --bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value); - bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line); - char *pcmk_dbus_get_property(DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name); - -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index b461c5f..374a03e 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -146,7 +146,7 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - msg = systemd_new_method(BUS_NAME".Manager", method); - CRM_ASSERT(msg != NULL); - -- pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); -+ CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)); - - dbus_error_init(&error); - reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); -@@ -477,8 +477,8 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - CRM_ASSERT(msg != NULL); - - /* (ss) */ -- pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); -- pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &replace_s); -+ CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)); -+ CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &replace_s, DBUS_TYPE_INVALID)); - - if (synchronous == FALSE) { - free(unit); diff --git a/SOURCES/bz1057697-pcmk-portability_use_basic_types_for_dbus_compatability_struct.patch b/SOURCES/bz1057697-pcmk-portability_use_basic_types_for_dbus_compatability_struct.patch deleted file mode 100644 index e5e1c29..0000000 --- a/SOURCES/bz1057697-pcmk-portability_use_basic_types_for_dbus_compatability_struct.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit 6080e33737a133d080eb0f86a7b66f3af04f4c91 -Author: Andrew Beekhof -Date: Mon Feb 3 14:59:18 2014 +1100 - - Fix: Portability: Use basic types for DBus compatability struct - - (cherry picked from commit 73a40012cc03336fb9753bc6e47bace7bc44a794) - -diff --git a/include/portability.h b/include/portability.h -index 29d1177..4eb6eaa 100644 ---- a/include/portability.h -+++ b/include/portability.h -@@ -178,6 +178,7 @@ g_list_free_full(GList * list, GDestroyNotify free_func) - # endif - - # ifndef HAVE_DBUSBASICVALUE -+# include - # include - /** - * An 8-byte struct you could use to access int64 without having -@@ -185,8 +186,8 @@ g_list_free_full(GList * list, GDestroyNotify free_func) - */ - typedef struct - { -- dbus_uint32_t first32; /**< first 32 bits in the 8 bytes (beware endian issues) */ -- dbus_uint32_t second32; /**< second 32 bits in the 8 bytes (beware endian issues) */ -+ uint32_t first32; /**< first 32 bits in the 8 bytes (beware endian issues) */ -+ uint32_t second32; /**< second 32 bits in the 8 bytes (beware endian issues) */ - } DBus8ByteStruct; - - /** -@@ -202,14 +203,14 @@ typedef struct - typedef union - { - unsigned char bytes[8]; /**< as 8 individual bytes */ -- dbus_int16_t i16; /**< as int16 */ -- dbus_uint16_t u16; /**< as int16 */ -- dbus_int32_t i32; /**< as int32 */ -- dbus_uint32_t u32; /**< as int32 */ -- dbus_bool_t bool_val; /**< as boolean */ -+ int16_t i16; /**< as int16 */ -+ uint16_t u16; /**< as int16 */ -+ int32_t i32; /**< as int32 */ -+ uint32_t u32; /**< as int32 */ -+ uint32_t bool_val; /**< as boolean */ - # ifdef DBUS_HAVE_INT64 -- dbus_int64_t i64; /**< as int64 */ -- dbus_uint64_t u64; /**< as int64 */ -+ int64_t i64; /**< as int64 */ -+ uint64_t u64; /**< as int64 */ - # endif - DBus8ByteStruct eight; /**< as 8-byte struct */ - double dbl; /**< as double */ diff --git a/SOURCES/bz1057697-pcmk-services_detect_missing_agents_and_permission_errors_before_forking.patch b/SOURCES/bz1057697-pcmk-services_detect_missing_agents_and_permission_errors_before_forking.patch deleted file mode 100644 index bfa676e..0000000 --- a/SOURCES/bz1057697-pcmk-services_detect_missing_agents_and_permission_errors_before_forking.patch +++ /dev/null @@ -1,271 +0,0 @@ -commit 385cb2b6a11d967145d8034fd5c05574a6594a4f -Author: Andrew Beekhof -Date: Thu Aug 8 11:21:03 2013 +1000 - - Feature: services: Detect missing agents and permission errors before forking - - Also set the operation status to distinguish between the agent being - missing and something the agent needs being missing. - - (cherry picked from commit 20eee043d376ed03edf5e4bb4cc4639f8697e44a) - -diff --git a/crmd/te_actions.c b/crmd/te_actions.c -index 63d15bb..4e3bc22 100644 ---- a/crmd/te_actions.c -+++ b/crmd/te_actions.c -@@ -465,7 +465,7 @@ te_rsc_command(crm_graph_t * graph, crm_action_t * action) - && safe_str_neq(task, CRMD_ACTION_DELETE)) { - /* write a "pending" entry to the CIB, inhibit notification */ - crm_debug("Recording pending op %s in the CIB", task_uuid); -- cib_action_update(action, PCMK_LRM_OP_PENDING, PCMK_OCF_STATUS_UNKNOWN); -+ cib_action_update(action, PCMK_LRM_OP_PENDING, PCMK_OCF_UNKNOWN); - } - - return TRUE; -diff --git a/crmd/te_callbacks.c b/crmd/te_callbacks.c -index c0360b4..4b8aac5 100644 ---- a/crmd/te_callbacks.c -+++ b/crmd/te_callbacks.c -@@ -548,7 +548,6 @@ action_timer_callback(gpointer data) - } - - if (send_update) { -- /* cib_action_update(timer->action, PCMK_LRM_OP_PENDING, PCMK_OCF_STATUS_UNKNOWN); */ - cib_action_update(timer->action, PCMK_LRM_OP_TIMEOUT, PCMK_OCF_UNKNOWN_ERROR); - } - } -diff --git a/include/crm/services.h b/include/crm/services.h -index 0c0cca9..9fe9d37 100644 ---- a/include/crm/services.h -+++ b/include/crm/services.h -@@ -88,9 +88,10 @@ enum ocf_exitcode { - PCMK_OCF_RUNNING_MASTER = 8, - PCMK_OCF_FAILED_MASTER = 9, - -- PCMK_OCF_STATUS_UNKNOWN = 14, /* Already in use */ - - /* 150-199 reserved for application use */ -+ PCMK_OCF_EXEC_ERROR = 192, /* Generic problem invoking the agent */ -+ PCMK_OCF_UNKNOWN = 193, /* State of the service is unknown - used for recording in-flight operations */ - PCMK_OCF_SIGNAL = 194, - PCMK_OCF_NOT_SUPPORTED = 195, - PCMK_OCF_PENDING = 196, -@@ -106,6 +107,7 @@ enum op_status { - PCMK_LRM_OP_TIMEOUT, - PCMK_LRM_OP_NOTSUPPORTED, - PCMK_LRM_OP_ERROR, -+ PCMK_LRM_OP_NOT_INSTALLED, - }; - - enum nagios_exitcode { -@@ -263,6 +265,7 @@ enum nagios_exitcode { - case PCMK_LRM_OP_TIMEOUT:return "Timed Out"; - case PCMK_LRM_OP_NOTSUPPORTED:return "NOT SUPPORTED"; - case PCMK_LRM_OP_ERROR:return "Error"; -+ case PCMK_LRM_OP_NOT_INSTALLED:return "Not installed"; - default:return "UNKNOWN!"; - }} static inline const char *services_ocf_exitcode_str(enum ocf_exitcode code) { - switch (code) { -diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c -index 868dc5b..ac0138f 100644 ---- a/lib/services/services_linux.c -+++ b/lib/services/services_linux.c -@@ -307,14 +307,62 @@ operation_finished(mainloop_child_t * p, pid_t pid, int core, int signo, int exi - operation_finalize(op); - } - -+static void -+services_handle_exec_error(svc_action_t * op, int error) -+{ -+ op->stdout_data = NULL; -+ op->stderr_data = NULL; -+ -+ /* Need to mimic the return codes for each standard as thats what we'll convert back from in get_uniform_rc() */ -+ if (safe_str_eq(op->standard, "lsb") && safe_str_eq(op->action, "status")) { -+ switch (errno) { /* see execve(2) */ -+ case ENOENT: /* No such file or directory */ -+ case EISDIR: /* Is a directory */ -+ op->rc = PCMK_LSB_STATUS_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; -+ break; -+ case EACCES: /* permission denied (various errors) */ -+ /* LSB status ops don't support 'not installed' */ -+ break; -+ } -+ -+#if SUPPORT_NAGIOS -+ } else if (safe_str_eq(op->standard, "nagios")) { -+ switch (errno) { -+ case ENOENT: /* No such file or directory */ -+ case EISDIR: /* Is a directory */ -+ op->rc = NAGIOS_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; -+ break; -+ case EACCES: /* permission denied (various errors) */ -+ op->rc = NAGIOS_INSUFFICIENT_PRIV; -+ break; -+ } -+#endif -+ -+ } else { -+ switch (errno) { -+ case ENOENT: /* No such file or directory */ -+ case EISDIR: /* Is a directory */ -+ op->rc = PCMK_OCF_NOT_INSTALLED; /* Valid for LSB */ -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; -+ break; -+ case EACCES: /* permission denied (various errors) */ -+ op->rc = PCMK_OCF_INSUFFICIENT_PRIV; /* Valid for LSB */ -+ break; -+ } -+ } -+} -+ - gboolean - services_os_action_execute(svc_action_t * op, gboolean synchronous) - { -- int rc, lpc; -+ int lpc; - int stdout_fd[2]; - int stderr_fd[2]; - sigset_t mask; - sigset_t old_mask; -+ struct stat st; - - if (pipe(stdout_fd) < 0) { - crm_err("pipe() failed"); -@@ -324,6 +372,13 @@ services_os_action_execute(svc_action_t * op, gboolean synchronous) - crm_err("pipe() failed"); - } - -+ /* Fail fast */ -+ if(stat(op->opaque->exec, &st) != 0) { -+ crm_warn("Cannot execute '%s': %s (%d)", op->opaque->exec, pcmk_strerror(errno), errno); -+ services_handle_exec_error(op, errno); -+ return FALSE; -+ } -+ - if (synchronous) { - sigemptyset(&mask); - sigaddset(&mask, SIGCHLD); -@@ -337,11 +392,14 @@ services_os_action_execute(svc_action_t * op, gboolean synchronous) - op->pid = fork(); - switch (op->pid) { - case -1: -- crm_err("fork() failed"); -+ crm_err("Could not execute '%s': %s (%d)", op->opaque->exec, pcmk_strerror(errno), errno); -+ - close(stdout_fd[0]); - close(stdout_fd[1]); - close(stderr_fd[0]); - close(stderr_fd[1]); -+ -+ services_handle_exec_error(op, errno); - return FALSE; - - case 0: /* Child */ -@@ -390,29 +448,9 @@ services_os_action_execute(svc_action_t * op, gboolean synchronous) - /* execute the RA */ - execvp(op->opaque->exec, op->opaque->args); - -- switch (errno) { /* see execve(2) */ -- case ENOENT: /* No such file or directory */ -- case EISDIR: /* Is a directory */ -- rc = PCMK_OCF_NOT_INSTALLED; --#if SUPPORT_NAGIOS -- if (safe_str_eq(op->standard, "nagios")) { -- rc = NAGIOS_NOT_INSTALLED; -- } --#endif -- break; -- case EACCES: /* permission denied (various errors) */ -- rc = PCMK_OCF_INSUFFICIENT_PRIV; --#if SUPPORT_NAGIOS -- if (safe_str_eq(op->standard, "nagios")) { -- rc = NAGIOS_INSUFFICIENT_PRIV; -- } --#endif -- break; -- default: -- rc = PCMK_OCF_UNKNOWN_ERROR; -- break; -- } -- _exit(rc); -+ /* Most cases should have been already handled by stat() */ -+ services_handle_exec_error(op, errno); -+ _exit(op->rc); - } - - /* Only the parent reaches here */ -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index 783caca..ea804c8 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -385,6 +385,7 @@ systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer use - - } else { - op->rc = PCMK_OCF_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; - } - - } else { -@@ -441,6 +442,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - error ? error->message : "unknown"); - if (error && strstr(error->message, "systemd1.NoSuchUnit")) { - op->rc = PCMK_OCF_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; - } - if(error) { - g_error_free(error); -diff --git a/lib/services/upstart.c b/lib/services/upstart.c -index daeb398..831e7cf 100644 ---- a/lib/services/upstart.c -+++ b/lib/services/upstart.c -@@ -446,6 +446,7 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - op->rc = PCMK_OCF_OK; - } else { - op->rc = PCMK_OCF_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; - } - goto cleanup; - } -diff --git a/lrmd/regression.py.in b/lrmd/regression.py.in -index 8d5fea4..9009e1c 100755 ---- a/lrmd/regression.py.in -+++ b/lrmd/regression.py.in -@@ -629,7 +629,7 @@ if __name__ == "__main__": - test.add_cmd("-c register_rsc -r \"test_rsc\" -C systemd -T this_is_fake1234 -t 3000 " - "-l \"NEW_EVENT event_type:register rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - test.add_cmd("-c exec -r \"test_rsc\" -a \"start\" -t 3000 " -- "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:complete\" ") -+ "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:Not installed\" ") - test.add_cmd("-c unregister_rsc -r \"test_rsc\" -t 3000 " - "-l \"NEW_EVENT event_type:unregister rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - -@@ -638,7 +638,7 @@ if __name__ == "__main__": - test.add_cmd("-c register_rsc -r \"test_rsc\" -C upstart -T this_is_fake1234 -t 3000 " - "-l \"NEW_EVENT event_type:register rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - test.add_cmd("-c exec -r \"test_rsc\" -a \"start\" -t 3000 " -- "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:complete\" ") -+ "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:Not installed\" ") - test.add_cmd("-c unregister_rsc -r \"test_rsc\" -t 3000 " - "-l \"NEW_EVENT event_type:unregister rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - -@@ -647,7 +647,7 @@ if __name__ == "__main__": - test.add_cmd("-c register_rsc -r \"test_rsc\" -C ocf -P pacemaker -T this_is_fake1234 -t 3000 " - "-l \"NEW_EVENT event_type:register rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - test.add_cmd("-c exec -r \"test_rsc\" -a \"start\" -t 3000 " -- "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:complete\" ") -+ "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:Not installed\" ") - test.add_cmd("-c unregister_rsc -r \"test_rsc\" -t 3000 " - "-l \"NEW_EVENT event_type:unregister rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - -@@ -656,7 +656,7 @@ if __name__ == "__main__": - test.add_cmd("-c register_rsc -r \"test_rsc\" -C ocf -P pancakes -T Dummy -t 3000 " - "-l \"NEW_EVENT event_type:register rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - test.add_cmd("-c exec -r \"test_rsc\" -a \"start\" -t 3000 " -- "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:complete\" ") -+ "-l \"NEW_EVENT event_type:exec_complete rsc_id:test_rsc action:start rc:not installed op_status:Not installed\" ") - test.add_cmd("-c unregister_rsc -r \"test_rsc\" -t 3000 " - "-l \"NEW_EVENT event_type:unregister rsc_id:test_rsc action:none rc:ok op_status:complete\" ") - diff --git a/SOURCES/bz1057697-pcmk-services_keep_dbus_build_support_optional.patch b/SOURCES/bz1057697-pcmk-services_keep_dbus_build_support_optional.patch deleted file mode 100644 index eebd849..0000000 --- a/SOURCES/bz1057697-pcmk-services_keep_dbus_build_support_optional.patch +++ /dev/null @@ -1,55 +0,0 @@ -commit 719498e7cfbceffa01eff37263c55ceaf1623379 -Author: David Vossel -Date: Wed Feb 5 17:42:01 2014 -0600 - - Low: services: Keep dbus build support optional - - (cherry picked from commit e4d030a6d278fb3a43aa9c7eb359b488673f504a) - -diff --git a/configure.ac b/configure.ac -index f90ccdc..cad5190 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1162,6 +1162,8 @@ HAVE_upstart=0 - HAVE_systemd=0 - PKG_CHECK_MODULES(DBUS, dbus-1, ,HAVE_dbus=0) - -+AM_CONDITIONAL(BUILD_DBUS, test $HAVE_dbus = 1) -+ - if test $HAVE_dbus = 1; then - CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" - fi -diff --git a/include/portability.h b/include/portability.h -index 4eb6eaa..b1302d2 100644 ---- a/include/portability.h -+++ b/include/portability.h -@@ -177,7 +177,7 @@ g_list_free_full(GList * list, GDestroyNotify free_func) - } - # endif - --# ifndef HAVE_DBUSBASICVALUE -+# if defined(BUILD_DBUS) && !defined(HAVE_DBUSBASICVALUE) - # include - # include - /** -diff --git a/lib/services/Makefile.am b/lib/services/Makefile.am -index 6ed4d01..96ccdb0 100644 ---- a/lib/services/Makefile.am -+++ b/lib/services/Makefile.am -@@ -23,11 +23,15 @@ INCLUDES = -I$(top_builddir)/include - lib_LTLIBRARIES = libcrmservice.la - noinst_HEADERS = upstart.h systemd.h services_private.h - --libcrmservice_la_SOURCES = services.c services_linux.c dbus.c -+libcrmservice_la_SOURCES = services.c services_linux.c - libcrmservice_la_LDFLAGS = -version-info 1:0:0 - libcrmservice_la_CFLAGS = $(GIO_CFLAGS) -DOCF_ROOT_DIR=\"@OCF_ROOT_DIR@\" - libcrmservice_la_LIBADD = $(GIO_LIBS) $(top_builddir)/lib/common/libcrmcommon.la $(DBUS_LIBS) - -+if BUILD_DBUS -+libcrmservice_la_SOURCES += dbus.c -+endif -+ - if BUILD_UPSTART - libcrmservice_la_SOURCES += upstart.c - endif diff --git a/SOURCES/bz1057697-pcmk-systemd_simplify_dbus_api_usage.patch b/SOURCES/bz1057697-pcmk-systemd_simplify_dbus_api_usage.patch deleted file mode 100644 index f24694a..0000000 --- a/SOURCES/bz1057697-pcmk-systemd_simplify_dbus_api_usage.patch +++ /dev/null @@ -1,160 +0,0 @@ -commit 5be9e5b63815cb632b4944f00dd67f6f9dcbff70 -Author: Andrew Beekhof -Date: Mon Feb 3 14:43:38 2014 +1100 - - Refactor: systemd: Simplify dbus API usage - - (cherry picked from commit e3aa2f12bb4f00d4b0d8a38f1dd5727de2eba351) - -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index a3286f2..a9b1eba 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -179,7 +179,22 @@ bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, - - bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line) - { -- int dtype = dbus_message_iter_get_arg_type(field); -+ int dtype = 0; -+ DBusMessageIter lfield; -+ -+ if(field == NULL) { -+ if(dbus_message_iter_init(msg, &lfield)) { -+ field = &lfield; -+ } -+ } -+ -+ if(field == NULL) { -+ do_crm_log_alias(LOG_ERR, __FILE__, function, line, -+ "Empty parameter list in reply expecting '%c'", expected); -+ return FALSE; -+ } -+ -+ dtype = dbus_message_iter_get_arg_type(field); - - if(dtype != expected) { - DBusMessageIter args; -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index a06d547..b461c5f 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -119,7 +119,6 @@ static gboolean - systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - { - DBusMessage *msg; -- DBusMessageIter args; - DBusMessage *reply = NULL; - const char *method = "GetUnit"; - char *name = NULL; -@@ -137,6 +136,10 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - - */ - -+ if (systemd_init() == FALSE) { -+ return FALSE; -+ } -+ - name = systemd_service_name(arg_name); - - while(*out_unit == NULL) { -@@ -152,17 +155,19 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - if(error.name) { - crm_info("Call to %s failed: %s", method, error.name); - -- } else if (dbus_message_iter_init(reply, &args)) { -+ } else if(pcmk_dbus_type_check(reply, NULL, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ if(out_unit) { -+ char *path = NULL; - -- if(pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -- DBusBasicValue value; -+ dbus_message_get_args (reply, NULL, -+ DBUS_TYPE_OBJECT_PATH, &path, -+ DBUS_TYPE_INVALID); - -- dbus_message_iter_get_basic(&args, &value); -- *out_unit = strdup(value.str); -- dbus_message_unref(reply); -- free(name); -- return TRUE; -+ *out_unit = strdup(path); - } -+ dbus_message_unref(reply); -+ free(name); -+ return TRUE; - } - - if(strcmp(method, "LoadUnit") != 0) { -@@ -171,6 +176,7 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - systemd_daemon_reload(); - if(reply) { - dbus_message_unref(reply); -+ reply = NULL; - } - - } else { -@@ -264,20 +270,7 @@ systemd_unit_listall(void) - gboolean - systemd_unit_exists(const char *name) - { -- char *path = NULL; -- gboolean pass = FALSE; -- -- if (systemd_init() == FALSE) { -- return FALSE; -- } -- -- if(systemd_unit_by_name(name, &path) && path) { -- crm_trace("Got %s", path); -- pass = TRUE; -- } -- -- free(path); -- return pass; -+ return systemd_unit_by_name(name, NULL); - } - - static char * -@@ -360,12 +353,7 @@ systemd_async_dispatch(DBusPendingCall *pending, void *user_data) - } - - } else { -- DBusMessageIter args; -- -- if(!dbus_message_iter_init(reply, &args)) { -- crm_err("Call to %s failed: no arguments", op->action); -- -- } else if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ if(!pcmk_dbus_type_check(reply, NULL, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { - crm_warn("Call to %s passed but return type was unexpected", op->action); - op->rc = PCMK_OCF_OK; - -@@ -403,7 +391,6 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - char *name = systemd_service_name(op->agent); - DBusMessage *msg = NULL; - DBusMessage *reply = NULL; -- DBusMessageIter args; - - dbus_error_init(&error); - op->rc = PCMK_OCF_UNKNOWN_ERROR; -@@ -499,6 +486,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - return pcmk_dbus_send(msg, systemd_proxy, systemd_async_dispatch, op); - } - -+ dbus_error_init(&error); - reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); - - if(error.name) { -@@ -508,11 +496,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - } - goto cleanup; - -- } else if(!dbus_message_iter_init(reply, &args)) { -- crm_err("Call to %s failed: no arguments", method); -- goto cleanup; -- -- } else if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ } else if(!pcmk_dbus_type_check(reply, NULL, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { - crm_warn("Call to %s passed but return type was unexpected", op->action); - op->rc = PCMK_OCF_OK; - diff --git a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_async_support_to_avoid_problematic_use_of_threads.patch b/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_async_support_to_avoid_problematic_use_of_threads.patch deleted file mode 100644 index aac073c..0000000 --- a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_async_support_to_avoid_problematic_use_of_threads.patch +++ /dev/null @@ -1,622 +0,0 @@ -commit c7ca5eccb5709c75797579f508c3f9ae968cd55e -Author: Andrew Beekhof -Date: Fri Jan 31 10:53:35 2014 +1100 - - Fix: Bug rhbz#1057697 - Use native DBus library for systemd async support to avoid problematic use of threads - - (cherry picked from commit 2f90aad962c63eba313ed466580703434c80bd1a) - -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index 69ea6ac..a3286f2 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -4,6 +4,9 @@ - #include - #include - -+#define BUS_PROPERTY_IFACE "org.freedesktop.DBus.Properties" -+ -+ - static bool pcmk_dbus_error_check(DBusError *err, const char *prefix, const char *function, int line) - { - if (err && dbus_error_is_set(err)) { -@@ -43,36 +46,18 @@ bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value) - return TRUE; - } - --DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, char **e) -+bool -+pcmk_dbus_find_error(const char *method, DBusPendingCall* pending, DBusMessage *reply, DBusError *ret) - { - DBusError error; -- const char *method = NULL; -- DBusMessage *reply = NULL; -- DBusPendingCall* pending = NULL; - - dbus_error_init(&error); - -- CRM_ASSERT(dbus_message_get_type (msg) == DBUS_MESSAGE_TYPE_METHOD_CALL); -- method = dbus_message_get_member (msg); -+ if(pending == NULL) { -+ error.name = "org.clusterlabs.pacemaker.NoRequest"; -+ error.message = "No request sent"; - -- // send message and get a handle for a reply -- if (!dbus_connection_send_with_reply (connection, msg, &pending, -1)) { // -1 is default timeout -- crm_err("Send with reply failed"); -- return NULL; -- } -- if (NULL == pending) { -- crm_err("No pending call found"); -- return NULL; -- } -- -- dbus_connection_flush(connection); -- -- /* block until we receive a reply */ -- dbus_pending_call_block(pending); -- -- /* get the reply message */ -- reply = dbus_pending_call_steal_reply(pending); -- if(reply == NULL) { -+ } else if(reply == NULL) { - error.name = "org.clusterlabs.pacemaker.NoReply"; - error.message = "No reply"; - -@@ -80,7 +65,6 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, c - DBusMessageIter args; - int dtype = dbus_message_get_type(reply); - -- - switch(dtype) { - case DBUS_MESSAGE_TYPE_METHOD_RETURN: - dbus_message_iter_init(reply, &args); -@@ -104,7 +88,7 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, c - - case DBUS_MESSAGE_TYPE_ERROR: - dbus_set_error_from_message (&error, reply); -- crm_err("%s error '%s': %s", method, error.name, error.message); -+ crm_info("%s error '%s': %s", method, error.name, error.message); - break; - default: - error.message = "Unknown reply type"; -@@ -113,23 +97,86 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, c - } - } - -- if(error.name) { -- if(e) { -- *e = strdup(error.name); -+ if(ret && (error.name || error.message)) { -+ *ret = error; -+ return TRUE; -+ } -+ -+ return FALSE; -+} -+ -+DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, DBusError *error) -+{ -+ const char *method = NULL; -+ DBusMessage *reply = NULL; -+ DBusPendingCall* pending = NULL; -+ -+ CRM_ASSERT(dbus_message_get_type (msg) == DBUS_MESSAGE_TYPE_METHOD_CALL); -+ method = dbus_message_get_member (msg); -+ -+ // send message and get a handle for a reply -+ if (!dbus_connection_send_with_reply (connection, msg, &pending, -1)) { // -1 is default timeout -+ if(error) { -+ error->message = "Call to dbus_connection_send_with_reply() failed"; -+ error->name = "org.clusterlabs.pacemaker.SendFailed"; - } -+ crm_err("Error sending %s request", method); -+ return NULL; -+ } -+ -+ dbus_connection_flush(connection); -+ -+ if(pending) { -+ /* block until we receive a reply */ -+ dbus_pending_call_block(pending); -+ -+ /* get the reply message */ -+ reply = dbus_pending_call_steal_reply(pending); -+ } -+ -+ if(pcmk_dbus_find_error(method, pending, reply, error)) { -+ crm_trace("Was error: '%s' '%s'", error->name, error->message); - if(reply) { - dbus_message_unref(reply); - reply = NULL; - } -- } else if(e) { -- *e = NULL; -+ } -+ crm_trace("Was error: '%s' '%s'", error->name, error->message); -+ -+ if(pending) { -+ /* free the pending message handle */ -+ dbus_pending_call_unref(pending); - } - -- /* free the pending message handle */ -- dbus_pending_call_unref(pending); - return reply; - } - -+bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, -+ void(*done)(DBusPendingCall *pending, void *user_data), void *user_data) -+{ -+ DBusError error; -+ const char *method = NULL; -+ DBusPendingCall* pending = NULL; -+ -+ dbus_error_init(&error); -+ -+ CRM_ASSERT(dbus_message_get_type (msg) == DBUS_MESSAGE_TYPE_METHOD_CALL); -+ method = dbus_message_get_member (msg); -+ -+ // send message and get a handle for a reply -+ if (!dbus_connection_send_with_reply (connection, msg, &pending, -1)) { // -1 is default timeout -+ crm_err("Send with reply failed for %s", method); -+ return FALSE; -+ -+ } else if (pending == NULL) { -+ crm_err("No pending call found for %s", method); -+ return FALSE; -+ -+ } -+ CRM_ASSERT(dbus_pending_call_set_notify(pending, done, user_data, NULL)); -+ return TRUE; -+} -+ - bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line) - { - int dtype = dbus_message_iter_get_arg_type(field); -@@ -147,8 +194,6 @@ bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected - return TRUE; - } - --#define BUS_PROPERTY_IFACE "org.freedesktop.DBus.Properties" -- - char * - pcmk_dbus_get_property( - DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name) -@@ -160,10 +205,11 @@ pcmk_dbus_get_property( - /* DBusBasicValue value; */ - const char *method = "GetAll"; - char *output = NULL; -- char *error = NULL; -+ DBusError error; - - /* desc = systemd_unit_property(path, BUS_NAME ".Unit", "Description"); */ - -+ dbus_error_init(&error); - crm_info("Calling: %s on %s", method, target); - msg = dbus_message_new_method_call(target, // target for the method call - obj, // object to call on -@@ -180,7 +226,7 @@ pcmk_dbus_get_property( - reply = pcmk_dbus_send_recv(msg, connection, &error); - dbus_message_unref(msg); - -- if(reply == NULL) { -+ if(error.name) { - crm_err("Call to %s for %s failed: No reply", method, iface); - return NULL; - -@@ -242,20 +288,105 @@ pcmk_dbus_get_property( - return output; - } - -+static void pcmk_dbus_connection_dispatch(DBusConnection *connection, DBusDispatchStatus new_status, void *data){ -+ crm_trace("status %d for %p", new_status, data); -+ if (new_status == DBUS_DISPATCH_DATA_REMAINS){ -+ dbus_connection_dispatch(connection); -+ } -+} -+ -+static int -+pcmk_dbus_watch_dispatch(gpointer userdata) -+{ -+ DBusWatch *watch = userdata; -+ int flags = dbus_watch_get_flags(watch); - -+ crm_trace("Dispatching %p with flags %d", watch, flags); -+ if(flags & DBUS_WATCH_READABLE) { -+ dbus_watch_handle(watch, DBUS_WATCH_READABLE); -+ } else { -+ dbus_watch_handle(watch, DBUS_WATCH_ERROR); -+ } -+ return 0; -+} -+ -+static void -+pcmk_dbus_watch_destroy(gpointer userdata) -+{ -+ crm_trace("Destroyed %p", userdata); -+} - - -+struct mainloop_fd_callbacks pcmk_dbus_cb = { -+ .dispatch = pcmk_dbus_watch_dispatch, -+ .destroy = pcmk_dbus_watch_destroy, -+}; - --int dbus_watch_get_unix_fd ( DBusWatch * watch ); -+static dbus_bool_t -+pcmk_dbus_watch_add(DBusWatch *watch, void *data){ -+ int fd = dbus_watch_get_unix_fd(watch); - -+ mainloop_io_t *client = mainloop_add_fd( -+ "dbus", G_PRIORITY_DEFAULT, fd, watch, &pcmk_dbus_cb); - --/* http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html#gaebf031eb444b4f847606aa27daa3d8e6 */ -- --DBUS_EXPORT dbus_bool_t dbus_connection_set_watch_functions( -- DBusConnection * connection, -- DBusAddWatchFunction add_function, -- DBusRemoveWatchFunction remove_function, -- DBusWatchToggledFunction toggled_function, -- void * data, -- DBusFreeFunction free_data_function -- ); -+ crm_trace("Added %p with fd=%d", watch, fd); -+ dbus_watch_set_data(watch, client, NULL); -+ return TRUE; -+} -+ -+static void -+pcmk_dbus_watch_remove(DBusWatch *watch, void *data){ -+ mainloop_io_t *client = dbus_watch_get_data(watch); -+ -+ crm_trace("Removed %p", watch); -+ mainloop_del_fd(client); -+} -+ -+static gboolean -+pcmk_dbus_timeout_dispatch(gpointer data) -+{ -+ crm_trace("Timeout for %p"); -+ dbus_timeout_handle(data); -+ return FALSE; -+} -+ -+static dbus_bool_t -+pcmk_dbus_timeout_add(DBusTimeout *timeout, void *data){ -+ guint id = g_timeout_add(dbus_timeout_get_interval(timeout), pcmk_dbus_timeout_dispatch, timeout); -+ -+ if(id) { -+ dbus_timeout_set_data(timeout, GUINT_TO_POINTER(id), NULL); -+ } -+ return TRUE; -+} -+ -+static void -+pcmk_dbus_timeout_remove(DBusTimeout *timeout, void *data){ -+ void *vid = dbus_timeout_get_data(timeout); -+ guint id = GPOINTER_TO_UINT(vid); -+ -+ if(id) { -+ g_source_remove(id); -+ dbus_timeout_set_data(timeout, 0, NULL); -+ } -+} -+ -+static void -+pcmk_dbus_timeout_toggle(DBusTimeout *timeout, void *data){ -+ if(dbus_timeout_get_enabled(timeout)) { -+ pcmk_dbus_timeout_add(timeout, data); -+ } else { -+ pcmk_dbus_timeout_remove(timeout, data); -+ } -+} -+ -+/* Inspired by http://www.kolej.mff.cuni.cz/~vesej3am/devel/dbus-select.c */ -+ -+void pcmk_dbus_connection_setup_with_select(DBusConnection *c){ -+ dbus_connection_set_timeout_functions( -+ c, pcmk_dbus_timeout_add, pcmk_dbus_timeout_remove, pcmk_dbus_timeout_toggle, NULL, NULL); -+ dbus_connection_set_watch_functions(c, pcmk_dbus_watch_add, pcmk_dbus_watch_remove, NULL, NULL, NULL); -+ dbus_connection_set_dispatch_status_function(c, pcmk_dbus_connection_dispatch, NULL, NULL); -+ -+ pcmk_dbus_connection_dispatch(c, dbus_connection_get_dispatch_status(c), NULL); -+} -diff --git a/lib/services/pcmk-dbus.h b/lib/services/pcmk-dbus.h -index 27ac737..c8d2234 100644 ---- a/lib/services/pcmk-dbus.h -+++ b/lib/services/pcmk-dbus.h -@@ -1,7 +1,13 @@ - DBusConnection *pcmk_dbus_connect(void); -+void pcmk_dbus_connection_setup_with_select(DBusConnection *c); - void pcmk_dbus_disconnect(DBusConnection *connection); - --DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, char **error); -+bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, -+ void(*done)(DBusPendingCall *pending, void *user_data), void *user_data); -+DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, DBusError *error); - bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value); - bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line); - char *pcmk_dbus_get_property(DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name); -+ -+bool pcmk_dbus_find_error(const char *method, DBusPendingCall* pending, DBusMessage *reply, DBusError *error); -+ -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index 9aa5b03..a06d547 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -69,6 +69,7 @@ systemd_init(void) - if (need_init) { - need_init = 0; - systemd_proxy = pcmk_dbus_connect(); -+ pcmk_dbus_connection_setup_with_select(systemd_proxy); - } - if (systemd_proxy == NULL) { - return FALSE; -@@ -122,7 +123,7 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - DBusMessage *reply = NULL; - const char *method = "GetUnit"; - char *name = NULL; -- char *error = NULL; -+ DBusError error; - - /* - -@@ -144,13 +145,12 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - - pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); - -+ dbus_error_init(&error); - reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); - dbus_message_unref(msg); - -- if(error) { -- crm_info("Call to %s failed: %s", method, error); -- free(error); -- error = NULL; -+ if(error.name) { -+ crm_info("Call to %s failed: %s", method, error.name); - - } else if (dbus_message_iter_init(reply, &args)) { - -@@ -192,7 +192,7 @@ systemd_unit_listall(void) - DBusMessage *msg = NULL; - DBusMessage *reply = NULL; - const char *method = "ListUnits"; -- char *error = NULL; -+ DBusError error; - - if (systemd_init() == FALSE) { - return NULL; -@@ -204,15 +204,15 @@ systemd_unit_listall(void) - " \n" \ - */ - -+ dbus_error_init(&error); - msg = systemd_new_method(BUS_NAME".Manager", method); - CRM_ASSERT(msg != NULL); - - reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); - dbus_message_unref(msg); - -- if(error) { -- crm_err("Call to %s failed: %s", method, error); -- free(error); -+ if(error.name) { -+ crm_err("Call to %s failed: %s", method, error.name); - return NULL; - - } else if (!dbus_message_iter_init(reply, &args)) { -@@ -318,64 +318,84 @@ systemd_unit_metadata(const char *name) - return meta; - } - --#if 0 -+static bool -+systemd_mask_error(svc_action_t *op, const char *error) -+{ -+ crm_trace("Could not issue %s for %s: %s", op->action, op->rsc, error); -+ if(strstr(error, "org.freedesktop.systemd1.InvalidName") -+ || strstr(error, "org.freedesktop.systemd1.LoadFailed") -+ || strstr(error, "org.freedesktop.systemd1.NoSuchUnit")) { -+ -+ if (safe_str_eq(op->action, "stop")) { -+ crm_trace("Masking %s failure for %s: unknown services are stopped", op->action, op->rsc); -+ op->rc = PCMK_OCF_OK; -+ -+ } else { -+ crm_trace("Mapping %s failure for %s: unknown services are not installed", op->action, op->rsc); -+ op->rc = PCMK_OCF_NOT_INSTALLED; -+ op->status = PCMK_LRM_OP_NOT_INSTALLED; -+ } -+ return TRUE; -+ } -+ -+ return FALSE; -+} -+ - static void --systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer user_data) -+systemd_async_dispatch(DBusPendingCall *pending, void *user_data) - { -- GError *error = NULL; -- GVariant *_ret = NULL; -+ DBusError error; -+ DBusMessage *reply = NULL; - svc_action_t *op = user_data; -- GDBusProxy *proxy = G_DBUS_PROXY(source_object); - -- /* Obtain rc and stderr/out */ -- _ret = g_dbus_proxy_call_finish(proxy, res, &error); -+ dbus_error_init(&error); -+ if(pending) { -+ reply = dbus_pending_call_steal_reply(pending); -+ } -+ if(pcmk_dbus_find_error(op->action, pending, reply, &error)) { - -- if (error) { - /* ignore "already started" or "not running" errors */ -- crm_trace("Could not issue %s for %s: %s", op->action, op->rsc, error->message); -- if (strstr(error->message, "systemd1.LoadFailed") -- || strstr(error->message, "systemd1.InvalidName")) { -+ if (!systemd_mask_error(op, error.name)) { -+ crm_err("%s for %s: %s", op->action, op->rsc, error.message); -+ } - -- if (safe_str_eq(op->action, "stop")) { -- crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_OCF_OK; -+ } else { -+ DBusMessageIter args; - -- } else { -- op->rc = PCMK_OCF_NOT_INSTALLED; -- op->status = PCMK_LRM_OP_NOT_INSTALLED; -- } -+ if(!dbus_message_iter_init(reply, &args)) { -+ crm_err("Call to %s failed: no arguments", op->action); - -- } else { -- crm_err("Could not issue %s for %s: %s", op->action, op->rsc, error->message); -- } -- g_error_free(error); -- -- } else if(g_variant_is_of_type (_ret, G_VARIANT_TYPE("(o)"))) { -- char *path = NULL; -+ } else if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ crm_warn("Call to %s passed but return type was unexpected", op->action); -+ op->rc = PCMK_OCF_OK; - -- g_variant_get(_ret, "(o)", &path); -- crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), -- path); -- op->rc = PCMK_OCF_OK; -+ } else { -+ const char *path = NULL; - -- } else { -- crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -- op->rc = PCMK_OCF_OK; -+ dbus_message_get_args (reply, NULL, -+ DBUS_TYPE_OBJECT_PATH, &path, -+ DBUS_TYPE_INVALID); -+ crm_info("Call to %s passed: %s", op->action, path); -+ op->rc = PCMK_OCF_OK; -+ } - } - - operation_finalize(op); -- if (_ret) { -- g_variant_unref(_ret); -+ -+ if(pending) { -+ dbus_pending_call_unref(pending); -+ } -+ if(reply) { -+ dbus_message_unref(reply); - } - } --#endif - - #define SYSTEMD_OVERRIDE_ROOT "/run/systemd/system/" - - gboolean - systemd_unit_exec(svc_action_t * op, gboolean synchronous) - { -- char *error = NULL; -+ DBusError error; - char *unit = NULL; - const char *replace_s = "replace"; - gboolean pass = FALSE; -@@ -384,7 +404,8 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - DBusMessage *msg = NULL; - DBusMessage *reply = NULL; - DBusMessageIter args; -- -+ -+ dbus_error_init(&error); - op->rc = PCMK_OCF_UNKNOWN_ERROR; - CRM_ASSERT(systemd_init()); - -@@ -465,16 +486,6 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - - crm_debug("Calling %s for %s: %s", method, op->rsc, unit); - --#if 0 -- if (synchronous == FALSE) { -- g_dbus_proxy_call(systemd_proxy, method, g_variant_new("(ss)", name, "replace"), -- G_DBUS_CALL_FLAGS_NONE, op->timeout, NULL, systemd_unit_exec_done, op); -- free(unit); -- free(name); -- return TRUE; -- } --#endif -- - msg = systemd_new_method(BUS_NAME".Manager", method); - CRM_ASSERT(msg != NULL); - -@@ -482,43 +493,47 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); - pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &replace_s); - -+ if (synchronous == FALSE) { -+ free(unit); -+ free(name); -+ return pcmk_dbus_send(msg, systemd_proxy, systemd_async_dispatch, op); -+ } -+ - reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); -- dbus_message_unref(msg); - -- if(error) { -+ if(error.name) { - /* ignore "already started" or "not running" errors */ -- if (safe_str_eq(op->action, "stop") -- && (strstr(error, "org.freedesktop.systemd1.InvalidName") -- || strstr(error, "org.freedesktop.systemd1.NoSuchUnit"))) { -- crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_OCF_OK; -- } else { -- crm_err("Could not issue %s for %s: %s (%s)", method, op->rsc, error, unit); -+ if(!systemd_mask_error(op, error.name)) { -+ crm_err("Could not issue %s for %s: %s (%s)", method, op->rsc, error.name, unit); - } - goto cleanup; - - } else if(!dbus_message_iter_init(reply, &args)) { - crm_err("Call to %s failed: no arguments", method); - goto cleanup; -- } - -- /* (o) */ -- if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -- crm_err("Call to %s failed: Message has invalid arguments", method); -+ } else if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ crm_warn("Call to %s passed but return type was unexpected", op->action); -+ op->rc = PCMK_OCF_OK; - - } else { -- DBusBasicValue value; -+ const char *path = NULL; - -- dbus_message_iter_get_basic(&args, &value); -- crm_info("Call to %s passed: %s", op->action, value.str); -+ dbus_message_get_args (reply, NULL, -+ DBUS_TYPE_OBJECT_PATH, &path, -+ DBUS_TYPE_INVALID); -+ crm_info("Call to %s passed: %s", op->action, path); - op->rc = PCMK_OCF_OK; - } - - cleanup: -- free(error); - free(unit); - free(name); - -+ if(msg) { -+ dbus_message_unref(msg); -+ } -+ - if(reply) { - dbus_message_unref(reply); - } diff --git a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_support_to_avoid_problematic_use_of_threads.patch b/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_support_to_avoid_problematic_use_of_threads.patch deleted file mode 100644 index b5cb93b..0000000 --- a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_systemd_support_to_avoid_problematic_use_of_threads.patch +++ /dev/null @@ -1,1012 +0,0 @@ -commit 6b3f1e2e65db9d6fe229ccda22567a80d14efc3c -Author: Andrew Beekhof -Date: Thu Jan 30 08:23:35 2014 +1100 - - Fix: Bug rhbz#1057697 - Use native DBus library for systemd support to avoid problematic use of threads - - (cherry picked from commit 24404bfa83f32357e8fa2d7e80b1dd7c6a893244) - -diff --git a/configure.ac b/configure.ac -index b94c26e..628f46f 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1157,20 +1157,22 @@ AC_DEFINE_UNQUOTED(BUILD_VERSION, "$BUILD_VERSION", Build version) - AC_SUBST(BUILD_VERSION) - - --HAVE_gio=1 -+HAVE_dbus=1 - HAVE_upstart=0 - HAVE_systemd=0 --PKG_CHECK_MODULES(GIO, gio-2.0, ,HAVE_gio=0) -+PKG_CHECK_MODULES(DBUS, dbus-1, ,HAVE_dbus=0) - --AC_CHECK_TYPE([GDBusProxy],,,[[#include ]]) -- --if test x$ac_cv_type_GDBusProxy != xyes; then -- HAVE_gio=0 -- AC_MSG_WARN(Unable to support systemd/upstart. You need to use glib >= 2.26) -+if test $HAVE_dbus = 1; then -+ CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1`" - fi - --if test $HAVE_gio = 1 -a "x${enable_upstart}" != xno; then -- HAVE_upstart=1 -+DBUS_LIBS="$CFLAGS `$PKGCONFIG --libs dbus-1`" -+AC_SUBST(DBUS_LIBS) -+ -+AC_CHECK_TYPES([DBusBasicValue],,,[[#include ]]) -+ -+if test $HAVE_dbus = 1 -a "x${enable_upstart}" != xno; then -+ HAVE_upstart=0 - PCMK_FEATURES="$PCMK_FEATURES upstart" - fi - -@@ -1186,7 +1188,7 @@ else - enable_systemd=no - fi - --if test $HAVE_gio = 1 -a "x${enable_systemd}" != xno; then -+if test $HAVE_dbus = 1 -a "x${enable_systemd}" != xno; then - if test -n "$systemdunitdir" -a "x$systemdunitdir" != xno; then - HAVE_systemd=1 - PCMK_FEATURES="$PCMK_FEATURES systemd" -diff --git a/include/portability.h b/include/portability.h -index b0f9f1c..29d1177 100644 ---- a/include/portability.h -+++ b/include/portability.h -@@ -177,6 +177,48 @@ g_list_free_full(GList * list, GDestroyNotify free_func) - } - # endif - -+# ifndef HAVE_DBUSBASICVALUE -+# include -+/** -+ * An 8-byte struct you could use to access int64 without having -+ * int64 support -+ */ -+typedef struct -+{ -+ dbus_uint32_t first32; /**< first 32 bits in the 8 bytes (beware endian issues) */ -+ dbus_uint32_t second32; /**< second 32 bits in the 8 bytes (beware endian issues) */ -+} DBus8ByteStruct; -+ -+/** -+ * A simple value union that lets you access bytes as if they -+ * were various types; useful when dealing with basic types via -+ * void pointers and varargs. -+ * -+ * This union also contains a pointer member (which can be used -+ * to retrieve a string from dbus_message_iter_get_basic(), for -+ * instance), so on future platforms it could conceivably be larger -+ * than 8 bytes. -+ */ -+typedef union -+{ -+ unsigned char bytes[8]; /**< as 8 individual bytes */ -+ dbus_int16_t i16; /**< as int16 */ -+ dbus_uint16_t u16; /**< as int16 */ -+ dbus_int32_t i32; /**< as int32 */ -+ dbus_uint32_t u32; /**< as int32 */ -+ dbus_bool_t bool_val; /**< as boolean */ -+# ifdef DBUS_HAVE_INT64 -+ dbus_int64_t i64; /**< as int64 */ -+ dbus_uint64_t u64; /**< as int64 */ -+# endif -+ DBus8ByteStruct eight; /**< as 8-byte struct */ -+ double dbl; /**< as double */ -+ unsigned char byt; /**< as byte */ -+ char *str; /**< as char* (string, object path or signature) */ -+ int fd; /**< as Unix file descriptor */ -+} DBusBasicValue; -+# endif -+ - /* Replacement error codes for non-linux */ - # ifndef ENOTUNIQ - # define ENOTUNIQ 190 -diff --git a/lib/services/Makefile.am b/lib/services/Makefile.am -index 67d7237..6ed4d01 100644 ---- a/lib/services/Makefile.am -+++ b/lib/services/Makefile.am -@@ -23,10 +23,10 @@ INCLUDES = -I$(top_builddir)/include - lib_LTLIBRARIES = libcrmservice.la - noinst_HEADERS = upstart.h systemd.h services_private.h - --libcrmservice_la_SOURCES = services.c services_linux.c -+libcrmservice_la_SOURCES = services.c services_linux.c dbus.c - libcrmservice_la_LDFLAGS = -version-info 1:0:0 - libcrmservice_la_CFLAGS = $(GIO_CFLAGS) -DOCF_ROOT_DIR=\"@OCF_ROOT_DIR@\" --libcrmservice_la_LIBADD = $(GIO_LIBS) $(top_builddir)/lib/common/libcrmcommon.la -+libcrmservice_la_LIBADD = $(GIO_LIBS) $(top_builddir)/lib/common/libcrmcommon.la $(DBUS_LIBS) - - if BUILD_UPSTART - libcrmservice_la_SOURCES += upstart.c -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -new file mode 100644 -index 0000000..69ea6ac ---- /dev/null -+++ b/lib/services/dbus.c -@@ -0,0 +1,261 @@ -+#include -+#include -+#include -+#include -+#include -+ -+static bool pcmk_dbus_error_check(DBusError *err, const char *prefix, const char *function, int line) -+{ -+ if (err && dbus_error_is_set(err)) { -+ do_crm_log_alias(LOG_ERR, __FILE__, function, line, "%s: DBus error '%s'", prefix, err->message); -+ dbus_error_free(err); -+ return TRUE; -+ } -+ return FALSE; -+} -+ -+DBusConnection *pcmk_dbus_connect(void) -+{ -+ DBusError err; -+ DBusConnection *connection; -+ -+ dbus_error_init(&err); -+ connection = dbus_bus_get(DBUS_BUS_SYSTEM, &err); -+ pcmk_dbus_error_check(&err, "Could not connect to System DBus", __FUNCTION__, __LINE__); -+ -+ return connection; -+} -+ -+void pcmk_dbus_disconnect(DBusConnection *connection) -+{ -+} -+ -+bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value) -+{ -+ DBusMessageIter args; -+ -+ dbus_message_iter_init_append(msg, &args); -+ if (!dbus_message_iter_append_basic(&args, dtype, value)) { -+ crm_err("dbus_message_iter_append_basic(%c) failed", dtype); -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ -+DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, char **e) -+{ -+ DBusError error; -+ const char *method = NULL; -+ DBusMessage *reply = NULL; -+ DBusPendingCall* pending = NULL; -+ -+ dbus_error_init(&error); -+ -+ CRM_ASSERT(dbus_message_get_type (msg) == DBUS_MESSAGE_TYPE_METHOD_CALL); -+ method = dbus_message_get_member (msg); -+ -+ // send message and get a handle for a reply -+ if (!dbus_connection_send_with_reply (connection, msg, &pending, -1)) { // -1 is default timeout -+ crm_err("Send with reply failed"); -+ return NULL; -+ } -+ if (NULL == pending) { -+ crm_err("No pending call found"); -+ return NULL; -+ } -+ -+ dbus_connection_flush(connection); -+ -+ /* block until we receive a reply */ -+ dbus_pending_call_block(pending); -+ -+ /* get the reply message */ -+ reply = dbus_pending_call_steal_reply(pending); -+ if(reply == NULL) { -+ error.name = "org.clusterlabs.pacemaker.NoReply"; -+ error.message = "No reply"; -+ -+ } else { -+ DBusMessageIter args; -+ int dtype = dbus_message_get_type(reply); -+ -+ -+ switch(dtype) { -+ case DBUS_MESSAGE_TYPE_METHOD_RETURN: -+ dbus_message_iter_init(reply, &args); -+ crm_trace("Call to %s returned '%s'", method, dbus_message_iter_get_signature(&args)); -+ break; -+ case DBUS_MESSAGE_TYPE_INVALID: -+ error.message = "Invalid reply"; -+ error.name = "org.clusterlabs.pacemaker.InvalidReply"; -+ crm_err("Error processing %s response: %s", method, error.message); -+ break; -+ case DBUS_MESSAGE_TYPE_METHOD_CALL: -+ error.message = "Invalid reply (method call)"; -+ error.name = "org.clusterlabs.pacemaker.InvalidReply.Method"; -+ crm_err("Error processing %s response: %s", method, error.message); -+ break; -+ case DBUS_MESSAGE_TYPE_SIGNAL: -+ error.message = "Invalid reply (signal)"; -+ error.name = "org.clusterlabs.pacemaker.InvalidReply.Signal"; -+ crm_err("Error processing %s response: %s", method, error.message); -+ break; -+ -+ case DBUS_MESSAGE_TYPE_ERROR: -+ dbus_set_error_from_message (&error, reply); -+ crm_err("%s error '%s': %s", method, error.name, error.message); -+ break; -+ default: -+ error.message = "Unknown reply type"; -+ error.name = "org.clusterlabs.pacemaker.InvalidReply.Type"; -+ crm_err("Error processing %s response: %s (%d)", method, error.message, dtype); -+ } -+ } -+ -+ if(error.name) { -+ if(e) { -+ *e = strdup(error.name); -+ } -+ if(reply) { -+ dbus_message_unref(reply); -+ reply = NULL; -+ } -+ } else if(e) { -+ *e = NULL; -+ } -+ -+ /* free the pending message handle */ -+ dbus_pending_call_unref(pending); -+ return reply; -+} -+ -+bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line) -+{ -+ int dtype = dbus_message_iter_get_arg_type(field); -+ -+ if(dtype != expected) { -+ DBusMessageIter args; -+ -+ dbus_message_iter_init(msg, &args); -+ do_crm_log_alias(LOG_ERR, __FILE__, function, line, -+ "Unexepcted DBus type, expected %c instead of %c in '%s'", -+ expected, dtype, dbus_message_iter_get_signature(&args)); -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ -+#define BUS_PROPERTY_IFACE "org.freedesktop.DBus.Properties" -+ -+char * -+pcmk_dbus_get_property( -+ DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name) -+{ -+ DBusMessage *msg; -+ DBusMessageIter args; -+ DBusMessageIter dict; -+ DBusMessage *reply = NULL; -+ /* DBusBasicValue value; */ -+ const char *method = "GetAll"; -+ char *output = NULL; -+ char *error = NULL; -+ -+ /* desc = systemd_unit_property(path, BUS_NAME ".Unit", "Description"); */ -+ -+ crm_info("Calling: %s on %s", method, target); -+ msg = dbus_message_new_method_call(target, // target for the method call -+ obj, // object to call on -+ BUS_PROPERTY_IFACE, // interface to call on -+ method); // method name -+ -+ if (NULL == msg) { -+ crm_err("Call to %s failed: No message", method); -+ return NULL; -+ } -+ -+ pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &iface); -+ -+ reply = pcmk_dbus_send_recv(msg, connection, &error); -+ dbus_message_unref(msg); -+ -+ if(reply == NULL) { -+ crm_err("Call to %s for %s failed: No reply", method, iface); -+ return NULL; -+ -+ } else if (!dbus_message_iter_init(reply, &args)) { -+ crm_err("Cannot get properties for %s from %s", obj, iface); -+ return NULL; -+ } -+ -+ if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_ARRAY, __FUNCTION__, __LINE__)) { -+ crm_err("Call to %s failed: Message has invalid arguments", method); -+ dbus_message_unref(reply); -+ return NULL; -+ } -+ -+ dbus_message_iter_recurse(&args, &dict); -+ while (dbus_message_iter_get_arg_type (&dict) != DBUS_TYPE_INVALID) { -+ DBusMessageIter sv; -+ DBusMessageIter v; -+ DBusBasicValue value; -+ -+ if(!pcmk_dbus_type_check(reply, &dict, DBUS_TYPE_DICT_ENTRY, __FUNCTION__, __LINE__)) { -+ dbus_message_iter_next (&dict); -+ continue; -+ } -+ -+ dbus_message_iter_recurse(&dict, &sv); -+ while (dbus_message_iter_get_arg_type (&sv) != DBUS_TYPE_INVALID) { -+ int dtype = dbus_message_iter_get_arg_type(&sv); -+ -+ switch(dtype) { -+ case DBUS_TYPE_STRING: -+ dbus_message_iter_get_basic(&sv, &value); -+ -+ crm_trace("Got: %s", value.str); -+ if(strcmp(value.str, name) != 0) { -+ dbus_message_iter_next (&sv); /* Skip the value */ -+ } -+ break; -+ case DBUS_TYPE_VARIANT: -+ dbus_message_iter_recurse(&sv, &v); -+ if(pcmk_dbus_type_check(reply, &v, DBUS_TYPE_STRING, __FUNCTION__, __LINE__)) { -+ dbus_message_iter_get_basic(&v, &value); -+ -+ crm_trace("Result: %s", value.str); -+ output = strdup(value.str); -+ } -+ break; -+ default: -+ pcmk_dbus_type_check(reply, &sv, DBUS_TYPE_STRING, __FUNCTION__, __LINE__); -+ } -+ dbus_message_iter_next (&sv); -+ } -+ -+ dbus_message_iter_next (&dict); -+ } -+ -+ -+ crm_trace("Property %s[%s] is '%s'", obj, name, output); -+ return output; -+} -+ -+ -+ -+ -+ -+int dbus_watch_get_unix_fd ( DBusWatch * watch ); -+ -+ -+/* http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html#gaebf031eb444b4f847606aa27daa3d8e6 */ -+ -+DBUS_EXPORT dbus_bool_t dbus_connection_set_watch_functions( -+ DBusConnection * connection, -+ DBusAddWatchFunction add_function, -+ DBusRemoveWatchFunction remove_function, -+ DBusWatchToggledFunction toggled_function, -+ void * data, -+ DBusFreeFunction free_data_function -+ ); -diff --git a/lib/services/pcmk-dbus.h b/lib/services/pcmk-dbus.h -new file mode 100644 -index 0000000..27ac737 ---- /dev/null -+++ b/lib/services/pcmk-dbus.h -@@ -0,0 +1,7 @@ -+DBusConnection *pcmk_dbus_connect(void); -+void pcmk_dbus_disconnect(DBusConnection *connection); -+ -+DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, char **error); -+bool pcmk_dbus_append_arg(DBusMessage *msg, int dtype, const void *value); -+bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line); -+char *pcmk_dbus_get_property(DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name); -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index ea804c8..9aa5b03 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -24,6 +24,8 @@ - #include - #include - #include -+#include -+#include - - #define BUS_NAME "org.freedesktop.systemd1" - #define BUS_PATH "/org/freedesktop/systemd1" -@@ -47,42 +49,26 @@ struct unit_info { - const char *job_path; - }; - --static GDBusProxy *systemd_proxy = NULL; -- --static GDBusProxy * --get_proxy(const char *path, const char *interface) -+static DBusMessage *systemd_new_method(const char *iface, const char *method) - { -- GError *error = NULL; -- GDBusProxy *proxy = NULL; -- --#ifndef GLIB_DEPRECATED_IN_2_36 -- g_type_init(); --#endif -- -- if (path == NULL) { -- path = BUS_PATH; -- } -- -- proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL, /* GDBusInterfaceInfo */ -- BUS_NAME, path, interface, -- NULL, /* GCancellable */ &error); -- -- if (error) { -- crm_err("Can't connect obtain proxy to %s interface: %s", interface, error->message); -- g_error_free(error); -- proxy = NULL; -- } -- return proxy; -+ crm_trace("Calling: %s on %s", method, iface); -+ return dbus_message_new_method_call(BUS_NAME, // target for the method call -+ BUS_PATH, // object to call on -+ iface, // interface to call on -+ method); // method name - } - -+ -+static DBusConnection* systemd_proxy = NULL; - static gboolean - systemd_init(void) - { - static int need_init = 1; -+ /* http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html */ - - if (need_init) { - need_init = 0; -- systemd_proxy = get_proxy(NULL, BUS_NAME ".Manager"); -+ systemd_proxy = pcmk_dbus_connect(); - } - if (systemd_proxy == NULL) { - return FALSE; -@@ -94,7 +80,7 @@ void - systemd_cleanup(void) - { - if (systemd_proxy) { -- g_object_unref(systemd_proxy); -+ pcmk_dbus_disconnect(systemd_proxy); - systemd_proxy = NULL; - } - } -@@ -112,130 +98,87 @@ systemd_service_name(const char *name) - return g_strdup_printf("%s.service", name); - } - --static void --systemd_daemon_reload(GDBusProxy * proxy, GError ** error) -+static bool -+systemd_daemon_reload(void) - { -- GVariant *_ret = g_dbus_proxy_call_sync(proxy, "Reload", g_variant_new("()"), -- G_DBUS_CALL_FLAGS_NONE, -1, NULL, error); -- -- if (_ret) { -- g_variant_unref(_ret); -+ const char *method = "Reload"; -+ DBusMessage *reply = NULL; -+ DBusMessage *msg = systemd_new_method(BUS_NAME".Manager", method); -+ -+ CRM_ASSERT(msg != NULL); -+ reply = pcmk_dbus_send_recv(msg, systemd_proxy, NULL); -+ dbus_message_unref(msg); -+ if(reply) { -+ dbus_message_unref(reply); - } -+ return TRUE; - } - - static gboolean --systemd_unit_by_name(GDBusProxy * proxy, -- const gchar * arg_name, -- gchar ** out_unit, GCancellable * cancellable, GError ** error) -+systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - { -- GError *reload_error = NULL; -- GVariant *_ret = NULL; -+ DBusMessage *msg; -+ DBusMessageIter args; -+ DBusMessage *reply = NULL; -+ const char *method = "GetUnit"; - char *name = NULL; -- int retry = 0; -+ char *error = NULL; - - /* -- " \n" \ -- " \n" \ -- " \n" \ -- " \n" \ --*/ -- -- name = systemd_service_name(arg_name); -- crm_debug("Calling GetUnit"); -- _ret = g_dbus_proxy_call_sync(proxy, "GetUnit", g_variant_new("(s)", name), -- G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error); -- -- if (_ret) { -- crm_debug("Checking output"); -- g_variant_get(_ret, "(o)", out_unit); -- crm_debug("%s = %s", arg_name, *out_unit); -- g_variant_unref(_ret); -- goto done; -- } -- -- crm_debug("Reloading the systemd manager configuration"); -- systemd_daemon_reload(proxy, &reload_error); -- retry++; -- -- if (reload_error) { -- crm_err("Cannot reload the systemd manager configuration: %s", reload_error->message); -- g_error_free(reload_error); -- goto done; -- } -- -- if (*error) { -- crm_debug("Cannot find %s: %s", name, (*error)->message); -- g_error_free(*error); -- *error = NULL; -- } -+ -+ -+ -+ - --/* - - - - - */ -- crm_debug("Calling LoadUnit"); -- _ret = g_dbus_proxy_call_sync(proxy, "LoadUnit", g_variant_new("(s)", name), -- G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error); - -- if (_ret) { -- crm_debug("Checking output"); -- g_variant_get(_ret, "(o)", out_unit); -- crm_debug("%s = %s", arg_name, *out_unit); -- g_variant_unref(_ret); -- } -+ name = systemd_service_name(arg_name); - -- done: -- free(name); -- return _ret != NULL; --} -+ while(*out_unit == NULL) { -+ msg = systemd_new_method(BUS_NAME".Manager", method); -+ CRM_ASSERT(msg != NULL); - --static char * --systemd_unit_property(const char *obj, const gchar * iface, const char *name) --{ -- GError *error = NULL; -- GDBusProxy *proxy; -- GVariant *asv = NULL; -- GVariant *value = NULL; -- GVariant *_ret = NULL; -- char *output = NULL; -+ pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); - -- crm_trace("Calling GetAll on %s", obj); -- proxy = get_proxy(obj, BUS_PROPERTY_IFACE); -+ reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); -+ dbus_message_unref(msg); - -- if (!proxy) { -- return NULL; -- } -+ if(error) { -+ crm_info("Call to %s failed: %s", method, error); -+ free(error); -+ error = NULL; - -- _ret = g_dbus_proxy_call_sync(proxy, "GetAll", g_variant_new("(s)", iface), -- G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); -+ } else if (dbus_message_iter_init(reply, &args)) { - -- if (error) { -- crm_err("Cannot get properties for %s: %s", g_dbus_proxy_get_object_path(proxy), -- error->message); -- g_error_free(error); -- g_object_unref(proxy); -- return NULL; -- } -- crm_debug("Call to GetAll passed: type '%s' %d\n", g_variant_get_type_string(_ret), -- g_variant_n_children(_ret)); -+ if(pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ DBusBasicValue value; - -- asv = g_variant_get_child_value(_ret, 0); -- crm_trace("asv type '%s' %d\n", g_variant_get_type_string(asv), g_variant_n_children(asv)); -+ dbus_message_iter_get_basic(&args, &value); -+ *out_unit = strdup(value.str); -+ dbus_message_unref(reply); -+ free(name); -+ return TRUE; -+ } -+ } - -- value = g_variant_lookup_value(asv, name, NULL); -- if (value && g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { -- crm_info("Got value '%s' for %s[%s]", g_variant_get_string(value, NULL), obj, name); -- output = g_variant_dup_string(value, NULL); -+ if(strcmp(method, "LoadUnit") != 0) { -+ method = "LoadUnit"; -+ crm_debug("Cannot find %s, reloading the systemd manager configuration", name); -+ systemd_daemon_reload(); -+ if(reply) { -+ dbus_message_unref(reply); -+ } - -- } else { -- crm_info("No value for %s[%s]", obj, name); -+ } else { -+ free(name); -+ return FALSE; -+ } - } -- -- g_object_unref(proxy); -- g_variant_unref(_ret); -- return output; -+ return FALSE; - } - - GList * -@@ -243,11 +186,13 @@ systemd_unit_listall(void) - { - int lpc = 0; - GList *units = NULL; -- GError *error = NULL; -- GVariant *out_units = NULL; -- GVariantIter iter; -- struct unit_info u; -- GVariant *_ret = NULL; -+ DBusMessageIter args; -+ DBusMessageIter unit; -+ DBusMessageIter elem; -+ DBusMessage *msg = NULL; -+ DBusMessage *reply = NULL; -+ const char *method = "ListUnits"; -+ char *error = NULL; - - if (systemd_init() == FALSE) { - return NULL; -@@ -259,40 +204,60 @@ systemd_unit_listall(void) - " \n" \ - */ - -- _ret = g_dbus_proxy_call_sync(systemd_proxy, "ListUnits", g_variant_new("()"), -- G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); -+ msg = systemd_new_method(BUS_NAME".Manager", method); -+ CRM_ASSERT(msg != NULL); - -- if (error || _ret == NULL) { -- crm_info("Call to ListUnits failed: %s", error ? error->message : "unknown"); -- if(error) { -- g_error_free(error); -- } -+ reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); -+ dbus_message_unref(msg); -+ -+ if(error) { -+ crm_err("Call to %s failed: %s", method, error); -+ free(error); -+ return NULL; -+ -+ } else if (!dbus_message_iter_init(reply, &args)) { -+ crm_err("Call to %s failed: Message has no arguments", method); -+ dbus_message_unref(reply); - return NULL; - } - -- g_variant_get(_ret, "(@a(ssssssouso))", &out_units); -- -- g_variant_iter_init(&iter, out_units); -- while (g_variant_iter_loop(&iter, "(ssssssouso)", -- &u.id, -- &u.description, -- &u.load_state, -- &u.active_state, -- &u.sub_state, -- &u.following, &u.unit_path, &u.job_id, &u.job_type, &u.job_path)) { -- char *match = strstr(u.id, ".service"); -- -- if (match) { -- lpc++; -- match[0] = 0; -- crm_trace("Got %s[%s] = %s", u.id, u.active_state, u.description); -- units = g_list_append(units, strdup(u.id)); -+ if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_ARRAY, __FUNCTION__, __LINE__)) { -+ crm_err("Call to %s failed: Message has invalid arguments", method); -+ dbus_message_unref(reply); -+ return NULL; -+ } -+ -+ dbus_message_iter_recurse(&args, &unit); -+ while (dbus_message_iter_get_arg_type (&unit) != DBUS_TYPE_INVALID) { -+ DBusBasicValue value; -+ -+ if(!pcmk_dbus_type_check(reply, &unit, DBUS_TYPE_STRUCT, __FUNCTION__, __LINE__)) { -+ continue; - } -+ -+ dbus_message_iter_recurse(&unit, &elem); -+ if(!pcmk_dbus_type_check(reply, &elem, DBUS_TYPE_STRING, __FUNCTION__, __LINE__)) { -+ continue; -+ } -+ -+ dbus_message_iter_get_basic(&elem, &value); -+ crm_trace("Got: %s", value.str); -+ if(value.str) { -+ char *match = strstr(value.str, ".service"); -+ -+ if (match) { -+ lpc++; -+ match[0] = 0; -+ -+ units = g_list_append(units, strdup(value.str)); -+ } -+ } -+ dbus_message_iter_next (&unit); - } - -- crm_info("Call to ListUnits passed: type '%s' count %d", g_variant_get_type_string(out_units), -- lpc); -- g_variant_unref(_ret); -+ dbus_message_unref(reply); -+ -+ crm_trace("Found %d systemd services", lpc); - return units; - } - -@@ -300,26 +265,18 @@ gboolean - systemd_unit_exists(const char *name) - { - char *path = NULL; -- GError *error = NULL; - gboolean pass = FALSE; - - if (systemd_init() == FALSE) { - return FALSE; - } - -- pass = systemd_unit_by_name(systemd_proxy, name, &path, NULL, &error); -- -- if (error || pass == FALSE) { -- pass = FALSE; -- crm_err("Call to ListUnits failed: %s", error ? error->message : "unknown"); -- if(error) { -- g_error_free(error); -- } -- -- } else { -+ if(systemd_unit_by_name(name, &path) && path) { - crm_trace("Got %s", path); -+ pass = TRUE; - } -- /* free(path) */ -+ -+ free(path); - return pass; - } - -@@ -329,11 +286,10 @@ systemd_unit_metadata(const char *name) - char *path = NULL; - char *meta = NULL; - char *desc = NULL; -- GError *error = NULL; - - CRM_ASSERT(systemd_init()); -- if (systemd_unit_by_name(systemd_proxy, name, &path, NULL, &error)) { -- desc = systemd_unit_property(path, BUS_NAME ".Unit", "Description"); -+ if (systemd_unit_by_name(name, &path)) { -+ desc = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, path, BUS_NAME ".Unit", "Description"); - } else { - desc = g_strdup_printf("systemd unit file for %s", name); - } -@@ -362,6 +318,7 @@ systemd_unit_metadata(const char *name) - return meta; - } - -+#if 0 - static void - systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer user_data) - { -@@ -411,19 +368,23 @@ systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer use - g_variant_unref(_ret); - } - } -+#endif - - #define SYSTEMD_OVERRIDE_ROOT "/run/systemd/system/" - - gboolean - systemd_unit_exec(svc_action_t * op, gboolean synchronous) - { -+ char *error = NULL; - char *unit = NULL; -- GError *error = NULL; -+ const char *replace_s = "replace"; - gboolean pass = FALSE; -- GVariant *_ret = NULL; -- const char *action = op->action; -+ const char *method = op->action; - char *name = systemd_service_name(op->agent); -- -+ DBusMessage *msg = NULL; -+ DBusMessage *reply = NULL; -+ DBusMessageIter args; -+ - op->rc = PCMK_OCF_UNKNOWN_ERROR; - CRM_ASSERT(systemd_init()); - -@@ -436,22 +397,20 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - goto cleanup; - } - -- pass = systemd_unit_by_name(systemd_proxy, op->agent, &unit, NULL, &error); -- if (error || pass == FALSE) { -- crm_debug("Could not obtain unit named '%s': %s", op->agent, -- error ? error->message : "unknown"); -+ pass = systemd_unit_by_name(op->agent, &unit); -+ if (pass == FALSE) { -+ crm_debug("Could not obtain unit named '%s'", op->agent); -+#if 0 - if (error && strstr(error->message, "systemd1.NoSuchUnit")) { - op->rc = PCMK_OCF_NOT_INSTALLED; - op->status = PCMK_LRM_OP_NOT_INSTALLED; - } -- if(error) { -- g_error_free(error); -- } -+#endif - goto cleanup; - } - -- if (safe_str_eq(op->action, "monitor") || safe_str_eq(action, "status")) { -- char *state = systemd_unit_property(unit, BUS_NAME ".Unit", "ActiveState"); -+ if (safe_str_eq(op->action, "monitor") || safe_str_eq(method, "status")) { -+ char *state = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, unit, BUS_NAME ".Unit", "ActiveState"); - - if (g_strcmp0(state, "active") == 0) { - op->rc = PCMK_OCF_OK; -@@ -462,12 +421,12 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - free(state); - goto cleanup; - -- } else if (g_strcmp0(action, "start") == 0) { -+ } else if (g_strcmp0(method, "start") == 0) { - FILE *file_strm = NULL; - char *override_dir = g_strdup_printf("%s/%s", SYSTEMD_OVERRIDE_ROOT, unit); - char *override_file = g_strdup_printf("%s/50-pacemaker.conf", override_dir); - -- action = "StartUnit"; -+ method = "StartUnit"; - crm_build_path(override_dir, 0755); - - file_strm = fopen(override_file, "w"); -@@ -485,74 +444,85 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - fflush(file_strm); - fclose(file_strm); - } -- systemd_daemon_reload(systemd_proxy, &error); -- if(error) { -- g_error_free(error); -- } -+ systemd_daemon_reload(); - free(override_file); - free(override_dir); - -- } else if (g_strcmp0(action, "stop") == 0) { -+ } else if (g_strcmp0(method, "stop") == 0) { - char *override_file = g_strdup_printf("%s/%s/50-pacemaker.conf", SYSTEMD_OVERRIDE_ROOT, unit); - -- action = "StopUnit"; -+ method = "StopUnit"; - unlink(override_file); - free(override_file); -- systemd_daemon_reload(systemd_proxy, &error); -- if(error) { -- g_error_free(error); -- } -+ systemd_daemon_reload(); - -- } else if (g_strcmp0(action, "restart") == 0) { -- action = "RestartUnit"; -+ } else if (g_strcmp0(method, "restart") == 0) { -+ method = "RestartUnit"; - } else { - op->rc = PCMK_OCF_UNIMPLEMENT_FEATURE; - goto cleanup; - } - -- crm_debug("Calling %s for %s: %s", action, op->rsc, unit); -+ crm_debug("Calling %s for %s: %s", method, op->rsc, unit); -+ -+#if 0 - if (synchronous == FALSE) { -- g_dbus_proxy_call(systemd_proxy, action, g_variant_new("(ss)", name, "replace"), -+ g_dbus_proxy_call(systemd_proxy, method, g_variant_new("(ss)", name, "replace"), - G_DBUS_CALL_FLAGS_NONE, op->timeout, NULL, systemd_unit_exec_done, op); - free(unit); - free(name); - return TRUE; - } -+#endif - -- _ret = g_dbus_proxy_call_sync(systemd_proxy, action, g_variant_new("(ss)", name, "replace"), -- G_DBUS_CALL_FLAGS_NONE, op->timeout, NULL, &error); -+ msg = systemd_new_method(BUS_NAME".Manager", method); -+ CRM_ASSERT(msg != NULL); - -- if (error) { -+ /* (ss) */ -+ pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &name); -+ pcmk_dbus_append_arg(msg, DBUS_TYPE_STRING, &replace_s); -+ -+ reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); -+ dbus_message_unref(msg); -+ -+ if(error) { - /* ignore "already started" or "not running" errors */ - if (safe_str_eq(op->action, "stop") -- && strstr(error->message, "systemd1.InvalidName")) { -+ && (strstr(error, "org.freedesktop.systemd1.InvalidName") -+ || strstr(error, "org.freedesktop.systemd1.NoSuchUnit"))) { - crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); - op->rc = PCMK_OCF_OK; - } else { -- crm_err("Could not issue %s for %s: %s (%s)", action, op->rsc, error->message, unit); -+ crm_err("Could not issue %s for %s: %s (%s)", method, op->rsc, error, unit); - } -- g_error_free(error); -+ goto cleanup; - -- } else if(g_variant_is_of_type (_ret, G_VARIANT_TYPE("(o)"))) { -- char *path = NULL; -+ } else if(!dbus_message_iter_init(reply, &args)) { -+ crm_err("Call to %s failed: no arguments", method); -+ goto cleanup; -+ } - -- g_variant_get(_ret, "(o)", &path); -- crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), -- path); -- op->rc = PCMK_OCF_OK; -+ /* (o) */ -+ if(!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_OBJECT_PATH, __FUNCTION__, __LINE__)) { -+ crm_err("Call to %s failed: Message has invalid arguments", method); - - } else { -- crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -+ DBusBasicValue value; -+ -+ dbus_message_iter_get_basic(&args, &value); -+ crm_info("Call to %s passed: %s", op->action, value.str); - op->rc = PCMK_OCF_OK; - } - - cleanup: -+ free(error); - free(unit); - free(name); - -- if (_ret) { -- g_variant_unref(_ret); -+ if(reply) { -+ dbus_message_unref(reply); - } -+ - if (synchronous == FALSE) { - operation_finalize(op); - return TRUE; diff --git a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_upstart_support_to_avoid_problematic_use_of_threads.patch b/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_upstart_support_to_avoid_problematic_use_of_threads.patch deleted file mode 100644 index eae4e0a..0000000 --- a/SOURCES/bz1057697-pcmk-use_native_dbus_library_for_upstart_support_to_avoid_problematic_use_of_threads.patch +++ /dev/null @@ -1,36 +0,0 @@ -commit c12446403e348c3d6f2763bcd370cea3e6b601d1 -Author: Andrew Beekhof -Date: Mon Feb 3 14:44:51 2014 +1100 - - Fix: Bug rhbz#1057697 - Use native DBus library for upstart support to avoid problematic use of threads - - (cherry picked from commit d7996e792844b98021061bd8ae74ab929f9b8ba7) - - Conflicts: - lib/services/upstart.c - -diff --git a/configure.ac b/configure.ac -index 628f46f..f90ccdc 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1173,7 +1173,7 @@ AC_CHECK_TYPES([DBusBasicValue],,,[[#include ]]) - - if test $HAVE_dbus = 1 -a "x${enable_upstart}" != xno; then - HAVE_upstart=0 -- PCMK_FEATURES="$PCMK_FEATURES upstart" -+ dnl PCMK_FEATURES="$PCMK_FEATURES upstart" - fi - - AC_DEFINE_UNQUOTED(SUPPORT_UPSTART, $HAVE_upstart, Support upstart based system services) -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index a9b1eba..66a98a0 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -141,7 +141,6 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, D - reply = NULL; - } - } -- crm_trace("Was error: '%s' '%s'", error->name, error->message); - - if(pending) { - /* free the pending message handle */ diff --git a/SOURCES/bz1060205-pcmk-mcp_tell_systemd_not_to_respawn_us_if_we_return_100.patch b/SOURCES/bz1060205-pcmk-mcp_tell_systemd_not_to_respawn_us_if_we_return_100.patch deleted file mode 100644 index e503a3c..0000000 --- a/SOURCES/bz1060205-pcmk-mcp_tell_systemd_not_to_respawn_us_if_we_return_100.patch +++ /dev/null @@ -1,18 +0,0 @@ -commit 8e0d074cd9dac515a95e49af23331e5d06b66fae -Author: Andrew Beekhof -Date: Wed Feb 12 23:10:16 2014 +1100 - - Fix: mcp: Tell systemd not to respawn us if we return 100 - -diff --git a/mcp/pacemaker.service.in b/mcp/pacemaker.service.in -index 4d7e308..b5f1ffc 100644 ---- a/mcp/pacemaker.service.in -+++ b/mcp/pacemaker.service.in -@@ -17,6 +17,7 @@ Type=simple - KillMode=process - NotifyAccess=main - SysVStartPriority=99 -+SuccessExitStatus=100 - EnvironmentFile=-@sysconfdir@/sysconfig/pacemaker - - ExecStart=@sbindir@/pacemakerd -f diff --git a/SOURCES/bz1064519-pcmk-controld-handles-dlm-startup-fencing.patch b/SOURCES/bz1064519-pcmk-controld-handles-dlm-startup-fencing.patch deleted file mode 100644 index 371dda0..0000000 --- a/SOURCES/bz1064519-pcmk-controld-handles-dlm-startup-fencing.patch +++ /dev/null @@ -1,97 +0,0 @@ -commit 1b0fa29aa0e52fa5cb28ef80139e657119b15fca -Author: David Vossel -Date: Mon Feb 17 15:19:27 2014 -0600 - - High: controld: handling startup fencing within the controld agent, not the dlm - - Resolves: rhbz#1064519 - (cherry picked from commit 11160a94b76ada9844c277128054719445acf22f) - -diff --git a/extra/resources/controld b/extra/resources/controld -index bdd31bb..bf5466d 100644 ---- a/extra/resources/controld -+++ b/extra/resources/controld -@@ -34,6 +34,12 @@ - - ####################################################################### - -+if [ -e "$OCF_ROOT/resource.d/heartbeat/controld" ]; then -+ ocf_log info "Using heartbeat controld agent" -+ $OCF_ROOT/resource.d/heartbeat/controld $1 -+ exit $? -+fi -+ - meta_data() { - cat < -@@ -89,6 +95,8 @@ END - - ####################################################################### - -+DLM_SYSFS_DIR="/sys/kernel/dlm" -+ - controld_usage() { - cat <&1) -+ if [ $? -eq 0 ]; then -+ if [ -n "$tmp" ]; then -+ -+ ocf_log err "Uncontrolled lockspace exists, system must reboot. Executing suicide fencing" -+ stonith_admin --reboot=$(crm_node -n) --tag controld -+ -+ exit $OCF_ERR_GENERIC -+ fi -+ fi -+} -+ - controld_start() { - controld_monitor; rc=$? - -@@ -180,13 +203,22 @@ controld_stop() { - } - - controld_monitor() { -+ local rc - killall -0 ${OCF_RESKEY_daemon} >/dev/null 2>&1 ; rc=$? - - case $rc in -- 0) return $OCF_SUCCESS;; -- 1) return $OCF_NOT_RUNNING;; -- *) return $OCF_ERR_GENERIC;; -+ 0) rc=$OCF_SUCCESS;; -+ 1) rc=$OCF_NOT_RUNNING;; -+ *) rc=$OCF_ERR_GENERIC;; - esac -+ -+ # if the dlm is not successfully running, but -+ # dlm lockspace bits are left over, we self must fence. -+ if [ $rc -ne $OCF_SUCCESS ]; then -+ check_uncontrolled_locks -+ fi -+ -+ return $rc - } - - controld_validate() { -@@ -219,11 +251,11 @@ case "$OCF_RESOURCE_INSTANCE" in - : ${OCF_RESKEY_daemon=gfs_controld${daemon_ext}} - ;; - *[dD][lL][mM]*) -- : ${OCF_RESKEY_args=-q 0} -+ : ${OCF_RESKEY_args=-q 0 -s 0} - : ${OCF_RESKEY_daemon=dlm_controld${daemon_ext}} - ;; - *) -- : ${OCF_RESKEY_args=-q 0} -+ : ${OCF_RESKEY_args=-q 0 -s 0} - : ${OCF_RESKEY_daemon=dlm_controld${daemon_ext}} - esac - diff --git a/SOURCES/bz1064519-pcmk-remove_q_0_from_default_dlm_controld_arguments.patch b/SOURCES/bz1064519-pcmk-remove_q_0_from_default_dlm_controld_arguments.patch deleted file mode 100644 index c3d2ef0..0000000 --- a/SOURCES/bz1064519-pcmk-remove_q_0_from_default_dlm_controld_arguments.patch +++ /dev/null @@ -1,39 +0,0 @@ -commit 2c3992bd6ad2dbcde5a39f8e02059cd99271fabd -Author: David Vossel -Date: Tue Mar 25 16:34:02 2014 -0500 - - Low: controld: Remove '-q 0' from default dlm_controld arguments - - The '-q 0' argument allows the dlm to fence nodes even when - quorum is lost. This is not a desired default. - - Resolves: rhbz#1064519 - (cherry picked from commit 20472946f54b0f6f07d286d96e5fb17baaf230ef) - -diff --git a/extra/resources/controld b/extra/resources/controld -index 2cc5f4d..a58d4ec 100644 ---- a/extra/resources/controld -+++ b/extra/resources/controld -@@ -61,7 +61,7 @@ In most cases, it should be run as an anonymous clone. - Any additional options to start the dlm_controld service with - - DLM Options -- -+ - - - -@@ -251,11 +251,11 @@ case "$OCF_RESOURCE_INSTANCE" in - : ${OCF_RESKEY_daemon=gfs_controld${daemon_ext}} - ;; - *[dD][lL][mM]*) -- : ${OCF_RESKEY_args=-q 0 -s 0} -+ : ${OCF_RESKEY_args=-s 0} - : ${OCF_RESKEY_daemon=dlm_controld${daemon_ext}} - ;; - *) -- : ${OCF_RESKEY_args=-q 0 -s 0} -+ : ${OCF_RESKEY_args=-s 0} - : ${OCF_RESKEY_daemon=dlm_controld${daemon_ext}} - esac - diff --git a/SOURCES/bz1067536-pcmk-controld-wait-for-address-list.patch b/SOURCES/bz1067536-pcmk-controld-wait-for-address-list.patch deleted file mode 100644 index 3090f14..0000000 --- a/SOURCES/bz1067536-pcmk-controld-wait-for-address-list.patch +++ /dev/null @@ -1,23 +0,0 @@ -commit cd08b68161a541965a68433979ed6bb188fe39ec -Author: David Vossel -Date: Thu Feb 20 17:47:47 2014 -0500 - - Fix: controld: Do not consider the dlm up until the address list is present - - (cherry picked from commit 84c45113eadf321d69b13a5c34529d7234c26c0f) - -diff --git a/extra/resources/controld b/extra/resources/controld -index bf5466d..2cc5f4d 100644 ---- a/extra/resources/controld -+++ b/extra/resources/controld -@@ -159,8 +159,8 @@ controld_start() { - controld_monitor; rc=$? - case $rc in - $OCF_SUCCESS) -- check_dir=/sys/kernel/config/dlm/cluster/comms -- if grep 1 $check_dir/*/local >/dev/null 2>&1; then -+ local addr_list=$(cat /sys/kernel/config/dlm/cluster/comms/*/addr_list 2>/dev/null) -+ if [ $? -eq 0 ] && [ -n "$addr_list" ]; then - return $OCF_SUCCESS - fi - ;; diff --git a/SOURCES/bz1069284-pcmk-prevent_resources_in_an_anti_colocation_from_even_temporarily_running_on_a_same_node.patch b/SOURCES/bz1069284-pcmk-prevent_resources_in_an_anti_colocation_from_even_temporarily_running_on_a_same_node.patch deleted file mode 100644 index becd90e..0000000 --- a/SOURCES/bz1069284-pcmk-prevent_resources_in_an_anti_colocation_from_even_temporarily_running_on_a_same_node.patch +++ /dev/null @@ -1,70 +0,0 @@ -commit 79759709fd71a2d0b9f4d0167ba9697257a9653c -Author: Gao,Yan -Date: Thu Feb 20 01:24:46 2014 +0800 - - Fix: pengine: cl#5187 - Prevent resources in an anti-colocation from even temporarily running on a same node - - (cherry picked from commit 9f9ed87e01bfafec0ddeee6592eb07e81bef963e) - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index eb52464..158a562 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -338,6 +338,7 @@ enum pe_ordering { - pe_order_asymmetrical = 0x100000, /* Indicates asymmetrical one way ordering constraint. */ - pe_order_load = 0x200000, /* Only relevant if... */ - pe_order_one_or_more = 0x400000, /* 'then' is only runnable if one or more of it's dependancies are too */ -+ pe_order_anti_colocation = 0x800000, - - pe_order_trace = 0x4000000 /* test marker */ - }; -diff --git a/pengine/constraints.c b/pengine/constraints.c -index 594d630..3b4370d 100644 ---- a/pengine/constraints.c -+++ b/pengine/constraints.c -@@ -689,6 +689,13 @@ rsc_colocation_new(const char *id, const char *node_attr, int score, - - data_set->colocation_constraints = g_list_append(data_set->colocation_constraints, new_con); - -+ if (score <= -INFINITY) { -+ new_rsc_order(rsc_lh, CRMD_ACTION_STOP, rsc_rh, CRMD_ACTION_START, -+ pe_order_anti_colocation, data_set); -+ new_rsc_order(rsc_rh, CRMD_ACTION_STOP, rsc_lh, CRMD_ACTION_START, -+ pe_order_anti_colocation, data_set); -+ } -+ - return TRUE; - } - -diff --git a/pengine/graph.c b/pengine/graph.c -index 9c1bc15..779f0e0 100644 ---- a/pengine/graph.c -+++ b/pengine/graph.c -@@ -991,6 +991,27 @@ should_dump_input(int last_action, action_t * action, action_wrapper_t * wrapper - return FALSE; - } - -+ } else if (wrapper->type == pe_order_anti_colocation) { -+ crm_trace("check anti-colocation filter %s.%s -> %s.%s", -+ wrapper->action->uuid, -+ wrapper->action->node ? wrapper->action->node->details->uname : "", -+ action->uuid, -+ action->node ? action->node->details->uname : ""); -+ -+ if (wrapper->action->node && action->node -+ && wrapper->action->node->details != action->node->details) { -+ /* Check if the actions are for the same node, ignore otherwise */ -+ crm_trace("anti-colocation filter - node"); -+ wrapper->type = pe_order_none; -+ return FALSE; -+ -+ } else if (is_set(wrapper->action->flags, pe_action_optional)) { -+ /* Check if the pre-req is optional, ignore if so */ -+ crm_trace("anti-colocation filter - optional"); -+ wrapper->type = pe_order_none; -+ return FALSE; -+ } -+ - } else if (wrapper->action->rsc - && wrapper->action->rsc != action->rsc - && is_set(wrapper->action->rsc->flags, pe_rsc_failed) diff --git a/SOURCES/bz1070916-pcmk-api_time_helper_now_returns_when_the_most_recent_fencing_operation_completed.patch b/SOURCES/bz1070916-pcmk-api_time_helper_now_returns_when_the_most_recent_fencing_operation_completed.patch deleted file mode 100644 index 2ef051c..0000000 --- a/SOURCES/bz1070916-pcmk-api_time_helper_now_returns_when_the_most_recent_fencing_operation_completed.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit 893a7468b83b8323ee343903617bbc72a7c3205b -Author: David Vossel -Date: Thu Feb 27 11:50:32 2014 -0600 - - Fix: stonith_api_time_helper now returns when the most recent fencing operation completed - - (cherry picked from commit 054fedfe70867c6f333b61e68fb64bf68e71c90b) - - Conflicts: - lib/fencing/st_client.c - -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 02f2836..4deb71f 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -2458,7 +2458,9 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - - } else if (hp->state == st_done) { - completed++; -- when = hp->completed; -+ if (hp->completed > when) { -+ when = hp->completed; -+ } - } - } - diff --git a/SOURCES/bz1070916-pcmk-crm_report_additional_dlm_detail.patch b/SOURCES/bz1070916-pcmk-crm_report_additional_dlm_detail.patch deleted file mode 100644 index 029b43a..0000000 --- a/SOURCES/bz1070916-pcmk-crm_report_additional_dlm_detail.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit 062630f5823635f7be31965738b9b1a4c0e29f10 -Author: Andrew Beekhof -Date: Tue Feb 25 10:21:08 2014 +1100 - - Fix: crm_report: Additional dlm detail - - (cherry picked from commit 3cafe4b9b44fc3faea72d5738a428d2a7fcda53c) - -diff --git a/tools/report.collector b/tools/report.collector -index 62cbe8b..f40dc01 100644 ---- a/tools/report.collector -+++ b/tools/report.collector -@@ -491,15 +491,18 @@ sys_stats() { - - dlm_dump() { - if which dlm_tool >/dev/null 2>&1 ; then -- echo NOTICE - Lockspace overview: -- dlm_tool ls -+ echo "--- Lockspace overview:" -+ dlm_tool ls -n -+ -+ echo "---Lockspace history:" -+ dlm_tool dump -+ - dlm_tool ls | grep name | - while read X N ; do -- echo NOTICE - Lockspace $N: -- dlm_tool lockdump $N -+ echo "--- Lockspace $N:" -+ dlm_tool lockdump "$N" -+ dlm_tool lockdebug -svw "$N" - done -- echo NOTICE - Lockspace history: -- dlm_tool dump - fi - } - diff --git a/SOURCES/bz1070916-pcmk-crm_report_allow_ssh_alternatives_to_be_used.patch b/SOURCES/bz1070916-pcmk-crm_report_allow_ssh_alternatives_to_be_used.patch deleted file mode 100644 index 893851b..0000000 --- a/SOURCES/bz1070916-pcmk-crm_report_allow_ssh_alternatives_to_be_used.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit b7e8996ed0ecf7dd46c0cc2adf630f8c3f1ce9a3 -Author: Andrew Beekhof -Date: Mon Feb 24 14:17:48 2014 +1100 - - Feature: crm_report: Allow ssh alternatives to be used - - (cherry picked from commit 334f4f7c2863424f2461c13880621fb1e7e26ebb) - -diff --git a/tools/crm_report.in b/tools/crm_report.in -index 3af1b3f..0607ebf 100755 ---- a/tools/crm_report.in -+++ b/tools/crm_report.in -@@ -20,12 +20,12 @@ - - # Note the quotes around `$TEMP': they are essential! - TEMP=`getopt \ -- -o hv?xl:f:t:n:T:Lp:c:dSACHu:D:MVs \ -- --long help,cts:,cts-log:,dest:,node:,nodes:,from:,to:logfile:,as-directory,single-node,cluster:,user:,max-depth:,version,features \ -+ -o hv?xl:f:t:n:T:Lp:c:dSACHu:D:MVse: \ -+ --long help,cts:,cts-log:,dest:,node:,nodes:,from:,to:logfile:,as-directory,single-node,cluster:,user:,max-depth:,version,features,rsh: \ - -n 'crm_report' -- "$@"` - eval set -- "$TEMP" - -- -+rsh="ssh -T" - times="" - tests="" - nodes="" -@@ -72,6 +72,7 @@ Options: - -H, --heartbeat force the cluster type to be Heartbeat - -u, --user user ssh username for cluster nodes (default: root) - -D, --depth search depth to use when attempting to locate files -+ -e, --rsh specify the remote shell to use (default: ssh -T) - --dest a custom destination directory/file - dest a custom destination directory/file - -@@ -115,6 +116,7 @@ while true; do - -C|--corosync) cluster="corosync"; shift;; - -H|--heartbeat) cluster="heartbeat"; shift;; - -c|--cluster) cluster="$2"; shift; shift;; -+ -e|--rsh) rsh="$2"; shift; shift;; - -u|--user) ssh_user="$2"; shift; shift;; - -D|--max-depth) maxdepth="$2"; shift; shift;; - -M) search_logs=0; shift;; -@@ -184,7 +186,7 @@ EOF - bash $l_base/collector - else - cat $l_base/.env $report_data/report.common $report_data/report.collector \ -- | ssh -l $ssh_user -T $node -- "mkdir -p $r_base; cat > $r_base/collector; bash $r_base/collector" | (cd $l_base && tar mxf -) -+ | $rsh -l $ssh_user $node -- "mkdir -p $r_base; cat > $r_base/collector; bash $r_base/collector" | (cd $l_base && tar mxf -) - fi - done - diff --git a/SOURCES/bz1070916-pcmk-crm_report_only_gather_dlm_data_if_dlm_controld_is_running.patch b/SOURCES/bz1070916-pcmk-crm_report_only_gather_dlm_data_if_dlm_controld_is_running.patch deleted file mode 100644 index 702e0fd..0000000 --- a/SOURCES/bz1070916-pcmk-crm_report_only_gather_dlm_data_if_dlm_controld_is_running.patch +++ /dev/null @@ -1,30 +0,0 @@ -commit 03e9a30a4d42d0495bcff45fc6c9df84615c6070 -Author: Andrew Beekhof -Date: Fri Feb 28 08:41:58 2014 +1100 - - Fix: crm_report: Only gather dlm data if dlm_controld is running - - (cherry picked from commit 837763e9abe258baf8b916f5744c07b7ff348871) - -diff --git a/tools/report.collector b/tools/report.collector -index f40dc01..d17ce5f 100644 ---- a/tools/report.collector -+++ b/tools/report.collector -@@ -491,6 +491,9 @@ sys_stats() { - - dlm_dump() { - if which dlm_tool >/dev/null 2>&1 ; then -+ if -+ ps -ef | egrep -qs '[d]lm_controld' -+ then - echo "--- Lockspace overview:" - dlm_tool ls -n - -@@ -503,6 +506,7 @@ dlm_dump() { - dlm_tool lockdump "$N" - dlm_tool lockdebug -svw "$N" - done -+ fi - fi - } - diff --git a/SOURCES/bz1070916-pcmk-crm_resource_prevent_use_of_null.patch b/SOURCES/bz1070916-pcmk-crm_resource_prevent_use_of_null.patch deleted file mode 100644 index ca34199..0000000 --- a/SOURCES/bz1070916-pcmk-crm_resource_prevent_use_of_null.patch +++ /dev/null @@ -1,19 +0,0 @@ -commit a59501c3e87e795c7295654e0172b5075639f143 -Author: Andrew Beekhof -Date: Fri Feb 28 14:03:23 2014 +1100 - - crm_resource: Prevent use-of-NULL - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 2f0e282..1fcb2a2 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -807,7 +807,7 @@ delete_lrm_rsc(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname - const char *id = rsc->id; - node_t *node = pe_find_node(data_set->nodes, host_uname); - -- if(node->details->remote_rsc == NULL) { -+ if(node && node->details->remote_rsc == NULL) { - crmd_replies_needed++; - } - if (rsc->clone_name) { diff --git a/SOURCES/bz1070916-pcmk-crmd_gracefully_handle_actions_that_cannot_be_initiated.patch b/SOURCES/bz1070916-pcmk-crmd_gracefully_handle_actions_that_cannot_be_initiated.patch deleted file mode 100644 index c4d7420..0000000 --- a/SOURCES/bz1070916-pcmk-crmd_gracefully_handle_actions_that_cannot_be_initiated.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit d7874e2b5e9072faac3655196f20a3f5d4880d36 -Author: Andrew Beekhof -Date: Wed Aug 7 09:10:15 2013 +1000 - - Fix: crmd: Gracefully handle actions that cannot be initiated - - (cherry picked from commit f02d6676bad129bee7175f31e810cf15f4786b70) - -diff --git a/lib/transition/graph.c b/lib/transition/graph.c -index 401a976..1965dde 100644 ---- a/lib/transition/graph.c -+++ b/lib/transition/graph.c -@@ -363,8 +363,13 @@ run_graph(crm_graph_t * graph) - } else if (should_fire_synapse(synapse)) { - crm_trace("Synapse %d fired", synapse->id); - graph->fired++; -- CRM_CHECK(fire_synapse(graph, synapse), stat_log_level = LOG_ERR; -- graph->abort_priority = INFINITY; graph->incomplete++; graph->fired--); -+ if(fire_synapse(graph, synapse) == FALSE) { -+ crm_err("Synapse %d failed to fire", synapse->id); -+ stat_log_level = LOG_ERR; -+ graph->abort_priority = INFINITY; -+ graph->incomplete++; -+ graph->fired--; -+ } - - if (synapse->confirmed == FALSE) { - graph->pending++; diff --git a/SOURCES/bz1070916-pcmk-fencing_pass_the_correct_options_when_looking_up_the_history_by_node_name.patch b/SOURCES/bz1070916-pcmk-fencing_pass_the_correct_options_when_looking_up_the_history_by_node_name.patch deleted file mode 100644 index a95c7b9..0000000 --- a/SOURCES/bz1070916-pcmk-fencing_pass_the_correct_options_when_looking_up_the_history_by_node_name.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit f50f6e73625bab6c6feee82acf94f84bede0137c -Author: Andrew Beekhof -Date: Thu Feb 27 11:28:35 2014 +1100 - - Fix: Fencing: Pass the correct options when looking up the history by node name - - (cherry picked from commit d9921e5783ef7a33bcacf844a4268bd08e583a93) - -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 7f2204f..02f2836 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -2446,7 +2446,7 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - int progress = 0; - int completed = 0; - -- rc = st->cmds->history(st, st_opt_sync_call | st_opt_cs_nodeid, name, &history, 120); -+ rc = st->cmds->history(st, opts, name, &history, 120); - - for (hp = history; hp; hp = hp->next) { - entries++; diff --git a/SOURCES/bz1070916-pcmk-fencing_remove_shadow_definition_and_use_of_variable_progress.patch b/SOURCES/bz1070916-pcmk-fencing_remove_shadow_definition_and_use_of_variable_progress.patch deleted file mode 100644 index c9d4bb0..0000000 --- a/SOURCES/bz1070916-pcmk-fencing_remove_shadow_definition_and_use_of_variable_progress.patch +++ /dev/null @@ -1,40 +0,0 @@ -commit 29d542447da8bd120072a7fa8dd6df832f0856eb -Author: Andrew Beekhof -Date: Fri Feb 28 14:11:23 2014 +1100 - - Fix: Fencing: Remove shadow definition and use of variable 'progress' - - (cherry picked from commit 0debc914b1dda2c4d04f4a33a3b38fbb4d873b1b) - -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 4deb71f..95ea0f7 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -2420,7 +2420,6 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - char *name = NULL; - - time_t when = 0; -- time_t progress = 0; - stonith_t *st = NULL; - stonith_history_t *history, *hp = NULL; - enum stonith_call_options opts = st_opt_sync_call; -@@ -2453,7 +2452,7 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - if (in_progress) { - progress++; - if (hp->state != st_done && hp->state != st_failed) { -- progress = time(NULL); -+ when = time(NULL); - } - - } else if (hp->state == st_done) { -@@ -2471,10 +2470,6 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - } - } - -- if (progress) { -- when = progress; -- } -- - if (st) { - st->cmds->disconnect(st); - stonith_api_delete(st); diff --git a/SOURCES/bz1070916-pcmk-pe_gracefully_handle_bad_values_for_xml_attr_transition_magic.patch b/SOURCES/bz1070916-pcmk-pe_gracefully_handle_bad_values_for_xml_attr_transition_magic.patch deleted file mode 100644 index c56bad6..0000000 --- a/SOURCES/bz1070916-pcmk-pe_gracefully_handle_bad_values_for_xml_attr_transition_magic.patch +++ /dev/null @@ -1,54 +0,0 @@ -commit 5882024877d6c22f0663160a3f7278a421f31819 -Author: Andrew Beekhof -Date: Wed Aug 7 09:03:43 2013 +1000 - - Fix: PE: Gracefully handle bad values for XML_ATTR_TRANSITION_MAGIC - - (cherry picked from commit 164ca366c14c914794f9230acd7646426641e6b2) - -diff --git a/lib/common/utils.c b/lib/common/utils.c -index 4e18039..7543464 100644 ---- a/lib/common/utils.c -+++ b/lib/common/utils.c -@@ -885,15 +885,13 @@ decode_transition_magic(const char *magic, char **uuid, int *transition_id, int - key = calloc(1, strlen(magic) + 1); - res = sscanf(magic, "%d:%d;%s", op_status, op_rc, key); - if (res != 3) { -- crm_crit("Only found %d items in: %s", res, magic); -- result = FALSE; -- goto bail; -+ crm_warn("Only found %d items in: '%s'", res, magic); -+ free(key); -+ return FALSE; - } - -- CRM_CHECK(decode_transition_key(key, uuid, transition_id, action_id, target_rc), result = FALSE; -- goto bail;); -+ CRM_CHECK(decode_transition_key(key, uuid, transition_id, action_id, target_rc), result = FALSE); - -- bail: - free(key); - return result; - } -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index e9997a2..1e827e0 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1332,11 +1332,12 @@ sort_op_by_callid(gconstpointer a, gconstpointer b) - const char *b_magic = crm_element_value_const(xml_b, XML_ATTR_TRANSITION_MAGIC); - - CRM_CHECK(a_magic != NULL && b_magic != NULL, sort_return(0, "No magic")); -- CRM_CHECK(decode_transition_magic(a_magic, &a_uuid, &a_id, &dummy, &dummy, &dummy, &dummy), -- sort_return(0, "bad magic a")); -- CRM_CHECK(decode_transition_magic(b_magic, &b_uuid, &b_id, &dummy, &dummy, &dummy, &dummy), -- sort_return(0, "bad magic b")); -- -+ if(!decode_transition_magic(a_magic, &a_uuid, &a_id, &dummy, &dummy, &dummy, &dummy)) { -+ sort_return(0, "bad magic a"); -+ } -+ if(!decode_transition_magic(b_magic, &b_uuid, &b_id, &dummy, &dummy, &dummy, &dummy)) { -+ sort_return(0, "bad magic b"); -+ } - /* try and determin the relative age of the operation... - * some pending operations (ie. a start) may have been supuerceeded - * by a subsequent stop diff --git a/SOURCES/bz1070916-pcmk-pengine_update_regression_tests.patch b/SOURCES/bz1070916-pcmk-pengine_update_regression_tests.patch deleted file mode 100644 index c73b4f9..0000000 --- a/SOURCES/bz1070916-pcmk-pengine_update_regression_tests.patch +++ /dev/null @@ -1,137 +0,0 @@ -commit d4c8712bfcf95eeb746887f1fc3de73ca878528a -Author: Andrew Beekhof -Date: Fri Feb 28 11:03:10 2014 +1100 - - Update regression tests for bz1069284 fix - -diff --git a/pengine/test10/bug-lf-2435.dot b/pengine/test10/bug-lf-2435.dot -index 2313c38..2d0b65d 100644 ---- a/pengine/test10/bug-lf-2435.dot -+++ b/pengine/test10/bug-lf-2435.dot -@@ -5,6 +5,7 @@ digraph "g" { - "dummy2_stop_0 c20.chepkov.lan" -> "dummy2_start_0 c21.chepkov.lan" [ style = bold] - "dummy2_stop_0 c20.chepkov.lan" [ style=bold color="green" fontcolor="black" ] - "dummy3_stop_0 c21.chepkov.lan" -> "all_stopped" [ style = bold] -+"dummy3_stop_0 c21.chepkov.lan" -> "dummy2_start_0 c21.chepkov.lan" [ style = bold] - "dummy3_stop_0 c21.chepkov.lan" [ style=bold color="green" fontcolor="black" ] - "dummy4_monitor_0 c19.chepkov.lan" -> "probe_complete c19.chepkov.lan" [ style = bold] - "dummy4_monitor_0 c19.chepkov.lan" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/bug-lf-2435.exp b/pengine/test10/bug-lf-2435.exp -index 046dd97..7255127 100644 ---- a/pengine/test10/bug-lf-2435.exp -+++ b/pengine/test10/bug-lf-2435.exp -@@ -10,6 +10,9 @@ - - - -+ -+ -+ - - - -diff --git a/pengine/test10/simple6.dot b/pengine/test10/simple6.dot -index ac3c495..3fac608 100644 ---- a/pengine/test10/simple6.dot -+++ b/pengine/test10/simple6.dot -@@ -6,6 +6,7 @@ - "probe_complete" -> "rsc2_start_0 node1" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] - "rsc1_stop_0 node1" -> "all_stopped" [ style = bold] -+"rsc1_stop_0 node1" -> "rsc2_start_0 node1" [ style = bold] - "rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ] - "rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] - "rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/simple6.exp b/pengine/test10/simple6.exp -index 590e64b..79d230d 100644 ---- a/pengine/test10/simple6.exp -+++ b/pengine/test10/simple6.exp -@@ -10,6 +10,9 @@ - - - -+ -+ -+ - - - -diff --git a/pengine/test10/simple6.summary b/pengine/test10/simple6.summary -index 2c4079b..42dde4a 100644 ---- a/pengine/test10/simple6.summary -+++ b/pengine/test10/simple6.summary -@@ -12,9 +12,9 @@ Transition Summary: - Executing cluster transition: - * Resource action: rsc2 monitor on node1 - * Pseudo action: probe_complete -- * Resource action: rsc2 start on node1 - * Resource action: rsc1 stop on node1 - * Pseudo action: all_stopped -+ * Resource action: rsc2 start on node1 - - Revised cluster status: - Online: [ node1 ] -diff --git a/tools/regression.exp b/tools/regression.exp -index ef27353..1682f72 100755 ---- a/tools/regression.exp -+++ b/tools/regression.exp -@@ -1317,7 +1317,7 @@ WARNING: Creating rsc_location constraint 'cli-ban-dummy-on-node1' with a score - - - -- -+ - - - -@@ -2027,7 +2027,7 @@ WARNING: Creating rsc_location constraint 'cli-ban-dummy-on-node1' with a score - - - -- -+ - - - -@@ -2113,8 +2113,8 @@ WARNING: Creating rsc_location constraint 'cli-ban-dummy-on-node2' with a score - - - -- -- -+ -+ - - - -@@ -2217,8 +2217,8 @@ Online: [ node1 node2 node3 ] - - - -- -- -+ -+ - - - -@@ -2300,8 +2300,8 @@ Online: [ node1 node2 node3 ] - - - -- -- -+ -+ - - - -@@ -2383,7 +2383,7 @@ Online: [ node1 node2 node3 ] - - - -- -+ - - - diff --git a/SOURCES/bz1070916-pcmk-send_details_of_stonith_api_time_and_stonith_api_kick_to_syslog.patch b/SOURCES/bz1070916-pcmk-send_details_of_stonith_api_time_and_stonith_api_kick_to_syslog.patch deleted file mode 100644 index 846bbd6..0000000 --- a/SOURCES/bz1070916-pcmk-send_details_of_stonith_api_time_and_stonith_api_kick_to_syslog.patch +++ /dev/null @@ -1,146 +0,0 @@ -commit 02bc6c85f814e85b5840f75e198a29d86ac6f2f2 -Author: Andrew Beekhof -Date: Thu Feb 27 11:27:30 2014 +1100 - - Log: Fencing: Send details of stonith_api_time() and stonith_api_kick() to syslog - - (cherry picked from commit b0a8876fe230f5e3e5770734f78e36284c0bae62) - -diff --git a/include/crm/stonith-ng.h b/include/crm/stonith-ng.h -index 35f6e5a..7f6938a 100644 ---- a/include/crm/stonith-ng.h -+++ b/include/crm/stonith-ng.h -@@ -348,8 +348,8 @@ void stonith_key_value_freeall(stonith_key_value_t * kvp, int keys, int values); - * - * At least one of nodeid and uname are required - */ --int stonith_api_kick(int nodeid, const char *uname, int timeout, bool off); --time_t stonith_api_time(int nodeid, const char *uname, bool in_progress); -+int stonith_api_kick(uint32_t nodeid, const char *uname, int timeout, bool off); -+time_t stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress); - - /* - * Helpers for using the above functions without install-time dependancies -@@ -394,7 +394,7 @@ time_t stonith_api_time(int nodeid, const char *uname, bool in_progress); - # define STONITH_LIBRARY "libstonithd.so.2" - - static inline int --stonith_api_kick_helper(int nodeid, int timeout, bool off) -+stonith_api_kick_helper(uint32_t nodeid, int timeout, bool off) - { - static void *st_library = NULL; - static int (*st_kick_fn) (int nodeid, const char *uname, int timeout, bool off) = NULL; -@@ -413,7 +413,7 @@ stonith_api_kick_helper(int nodeid, int timeout, bool off) - } - - static inline time_t --stonith_api_time_helper(int nodeid, bool in_progress) -+stonith_api_time_helper(uint32_t nodeid, bool in_progress) - { - static void *st_library = NULL; - static time_t(*st_time_fn) (int nodeid, const char *uname, bool in_progress) = NULL; -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 3c6a7e7..7f2204f 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -2361,8 +2361,11 @@ stonith_key_value_freeall(stonith_key_value_t * head, int keys, int values) - } - } - -+#define api_log_open() openlog("stonith-api", LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON) -+#define api_log(level, fmt, args...) syslog(level, "%s: "fmt, __FUNCTION__, args) -+ - int --stonith_api_kick(int nodeid, const char *uname, int timeout, bool off) -+stonith_api_kick(uint32_t nodeid, const char *uname, int timeout, bool off) - { - char *name = NULL; - const char *action = "reboot"; -@@ -2371,9 +2374,13 @@ stonith_api_kick(int nodeid, const char *uname, int timeout, bool off) - stonith_t *st = NULL; - enum stonith_call_options opts = st_opt_sync_call | st_opt_allow_suicide; - -+ api_log_open(); - st = stonith_api_new(); - if (st) { - rc = st->cmds->connect(st, "stonith-api", NULL); -+ if(rc != pcmk_ok) { -+ api_log(LOG_ERR, "Connection failed, could not kick (%s) node %u/%s : %s (%d)", action, nodeid, uname, pcmk_strerror(rc), rc); -+ } - } - - if (uname != NULL) { -@@ -2390,6 +2397,11 @@ stonith_api_kick(int nodeid, const char *uname, int timeout, bool off) - - if (rc == pcmk_ok) { - rc = st->cmds->fence(st, opts, name, action, timeout, 0); -+ if(rc != pcmk_ok) { -+ api_log(LOG_ERR, "Could not kick (%s) node %u/%s : %s (%d)", action, nodeid, uname, pcmk_strerror(rc), rc); -+ } else { -+ api_log(LOG_NOTICE, "Node %u/%s kicked: %s ", nodeid, uname, action); -+ } - } - - if (st) { -@@ -2402,7 +2414,7 @@ stonith_api_kick(int nodeid, const char *uname, int timeout, bool off) - } - - time_t --stonith_api_time(int nodeid, const char *uname, bool in_progress) -+stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress) - { - int rc = 0; - char *name = NULL; -@@ -2416,6 +2428,9 @@ stonith_api_time(int nodeid, const char *uname, bool in_progress) - st = stonith_api_new(); - if (st) { - rc = st->cmds->connect(st, "stonith-api", NULL); -+ if(rc != pcmk_ok) { -+ api_log(LOG_NOTICE, "Connection failed: %s (%d)", pcmk_strerror(rc), rc); -+ } - } - - if (uname != NULL) { -@@ -2427,18 +2442,31 @@ stonith_api_time(int nodeid, const char *uname, bool in_progress) - } - - if (st && rc == pcmk_ok) { -- st->cmds->history(st, st_opt_sync_call | st_opt_cs_nodeid, name, &history, 120); -+ int entries = 0; -+ int progress = 0; -+ int completed = 0; -+ -+ rc = st->cmds->history(st, st_opt_sync_call | st_opt_cs_nodeid, name, &history, 120); - - for (hp = history; hp; hp = hp->next) { -+ entries++; - if (in_progress) { -+ progress++; - if (hp->state != st_done && hp->state != st_failed) { - progress = time(NULL); - } - - } else if (hp->state == st_done) { -+ completed++; - when = hp->completed; - } - } -+ -+ if(rc == pcmk_ok) { -+ api_log(LOG_INFO, "Found %d entries for %u/%s: %d in progress, %d completed", entries, nodeid, uname, progress, completed); -+ } else { -+ api_log(LOG_ERR, "Could not retrieve fence history for %u/%s: %s (%d)", nodeid, uname, pcmk_strerror(rc), rc); -+ } - } - - if (progress) { -@@ -2450,6 +2478,9 @@ stonith_api_time(int nodeid, const char *uname, bool in_progress) - stonith_api_delete(st); - } - -+ if(when) { -+ api_log(LOG_INFO, "Node %u/%s last kicked at: %ld", nodeid, uname, (long int)when); -+ } - free(name); - return when; - } diff --git a/SOURCES/bz1070916-pcmk-systemd_prevent_use_of_null_when_determining_if_an_agent_exists.patch b/SOURCES/bz1070916-pcmk-systemd_prevent_use_of_null_when_determining_if_an_agent_exists.patch deleted file mode 100644 index cd22bff..0000000 --- a/SOURCES/bz1070916-pcmk-systemd_prevent_use_of_null_when_determining_if_an_agent_exists.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 4d52d269e3022a693155fd1b443990f5956057d7 -Author: Andrew Beekhof -Date: Fri Feb 28 14:11:15 2014 +1100 - - Fix: systemd: Prevent use-of-NULL when determining if an agent exists - - (cherry picked from commit 0597697bf408690a5b52e1dfb128888ef974bfe7) - -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index 374a03e..a28ae14 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -142,7 +142,7 @@ systemd_unit_by_name(const gchar * arg_name, gchar ** out_unit) - - name = systemd_service_name(arg_name); - -- while(*out_unit == NULL) { -+ while(TRUE) { - msg = systemd_new_method(BUS_NAME".Manager", method); - CRM_ASSERT(msg != NULL); - diff --git a/SOURCES/bz1070916-pcmk-test_tools_set_up_override_for_local_schema_file_locations.patch b/SOURCES/bz1070916-pcmk-test_tools_set_up_override_for_local_schema_file_locations.patch deleted file mode 100644 index 14876f7..0000000 --- a/SOURCES/bz1070916-pcmk-test_tools_set_up_override_for_local_schema_file_locations.patch +++ /dev/null @@ -1,25 +0,0 @@ -commit 87b04358f7024ee1263f6baaa5a7df7f31b18028 -Author: Andrew Beekhof -Date: Tue Feb 4 12:22:37 2014 +1100 - - Test: tools: Set up override for local schema file locations - - (cherry picked from commit 3d43ec1aa27420e23b8a5c9a921e9fab57669eb1) - -diff --git a/tools/regression.sh b/tools/regression.sh -index 12e2bcf..8c9a4d4 100755 ---- a/tools/regression.sh -+++ b/tools/regression.sh -@@ -60,8 +60,10 @@ while test "$done" = "0"; do - done - - if [ "x$VALGRIND_CMD" = "x" -a -x $test_home/crm_simulate ]; then -- echo "Using local binaries from: $test_home" -- PATH="$test_home:$PATH" -+ xml_home=`dirname ${test_home}` -+ echo "Using local binaries from: $test_home, schemas from $xml_home" -+ export PATH="$test_home:$PATH" -+ export PCMK_schema_directory=${xml_home}/xml - fi - - function test_tools() { diff --git a/SOURCES/bz1078078-pcmk-crm_report_suppress_logging_errors_after_the_target_directory_has_been_compressed.patch b/SOURCES/bz1078078-pcmk-crm_report_suppress_logging_errors_after_the_target_directory_has_been_compressed.patch deleted file mode 100644 index 4b96e99..0000000 --- a/SOURCES/bz1078078-pcmk-crm_report_suppress_logging_errors_after_the_target_directory_has_been_compressed.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 3de41452c059cb44028433bea1ab6425e239a38c -Author: Andrew Beekhof -Date: Wed Dec 18 08:12:29 2013 +1100 - - Fix: crm_report: Suppress logging errors after the target directory has been compressed - - (cherry picked from commit 571c7b0e66b174442604883fe105dbe8d10f1bc4) - -diff --git a/tools/report.common.in b/tools/report.common.in -index 9742f1c..bba7c63 100644 ---- a/tools/report.common.in -+++ b/tools/report.common.in -@@ -76,7 +76,7 @@ record() { - if [ x != x"$REPORT_HOME" -a -d "${REPORT_HOME}/$shorthost" ]; then - rec="${REPORT_HOME}/$shorthost/report.out" - -- elif [ x != x"${l_base}" ]; then -+ elif [ x != x"${l_base}" -a -d "${l_base}" ]; then - rec="${l_base}/report.summary" - - else diff --git a/SOURCES/bz1078078-pcmk-crm_resource_wait_for_the_correct_number_of_replies_when_cleaning_up_resources.patch b/SOURCES/bz1078078-pcmk-crm_resource_wait_for_the_correct_number_of_replies_when_cleaning_up_resources.patch deleted file mode 100644 index 9b7a4e5..0000000 --- a/SOURCES/bz1078078-pcmk-crm_resource_wait_for_the_correct_number_of_replies_when_cleaning_up_resources.patch +++ /dev/null @@ -1,29 +0,0 @@ -commit ec35b157495c79cf79572fdca4b369f37d42e2bf -Author: Andrew Beekhof -Date: Thu Oct 31 14:04:21 2013 +1100 - - Fix: crm_resource: Wait for the correct number of replies when cleaning up resources - - (cherry picked from commit 145c782e432d8108ca865f994640cf5a62406363) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 1fcb2a2..c344997 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -61,7 +61,7 @@ char *our_pid = NULL; - crm_ipc_t *crmd_channel = NULL; - char *xml_file = NULL; - int cib_options = cib_sync_call; --int crmd_replies_needed = 0; -+int crmd_replies_needed = 1; /* The welcome message */ - GMainLoop *mainloop = NULL; - - extern void cleanup_alloc_calculations(pe_working_set_t * data_set); -@@ -93,7 +93,6 @@ static void - start_mainloop(void) - { - mainloop = g_main_new(FALSE); -- crmd_replies_needed++; /* The welcome message */ - fprintf(stderr, "Waiting for %d replies from the CRMd", crmd_replies_needed); - crm_debug("Waiting for %d replies from the CRMd", crmd_replies_needed); - diff --git a/SOURCES/bz1078078-pcmk-crmd_correctly_react_to_successful_unfencing_operations.patch b/SOURCES/bz1078078-pcmk-crmd_correctly_react_to_successful_unfencing_operations.patch deleted file mode 100644 index e3c79b3..0000000 --- a/SOURCES/bz1078078-pcmk-crmd_correctly_react_to_successful_unfencing_operations.patch +++ /dev/null @@ -1,27 +0,0 @@ -commit 110cdd2056407a3a448a0e0cf3ef4e126fb26753 -Author: Andrew Beekhof -Date: Fri Apr 4 12:13:04 2014 +1100 - - Fix: crmd: Correctly react to successful unfencing operations - - Hint: We don't want to shut down - (cherry picked from commit 69c8d227c605d0b85038a536be948f5a56cfe4bd) - -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index 239af63..60dd21c 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -123,7 +123,12 @@ tengine_stonith_notify(stonith_t * st, stonith_event_t * st_event) - return; - } - -- if (st_event->result == pcmk_ok && crm_str_eq(st_event->target, fsa_our_uname, TRUE)) { -+ if (st_event->result == pcmk_ok && safe_str_eq("on", st_event->action)) { -+ crm_notice("%s was successfully unfenced by %s for %s with %s", -+ st_event->executioner, st_event->origin, st_event->device); -+ return; -+ -+ } else if (st_event->result == pcmk_ok && crm_str_eq(st_event->target, fsa_our_uname, TRUE)) { - crm_crit("We were alegedly just fenced by %s for %s with %s!", st_event->executioner, - st_event->origin, st_event->device); /* Dumps blackbox if enabled */ - diff --git a/SOURCES/bz1078078-pcmk-crmd_device_isn_t_hooked_up_yet_don_t_bother_logging_it.patch b/SOURCES/bz1078078-pcmk-crmd_device_isn_t_hooked_up_yet_don_t_bother_logging_it.patch deleted file mode 100644 index 3ddd9d2..0000000 --- a/SOURCES/bz1078078-pcmk-crmd_device_isn_t_hooked_up_yet_don_t_bother_logging_it.patch +++ /dev/null @@ -1,40 +0,0 @@ -commit 4cf4c0dee7128ae0896bf5fc6cbaeffd21cfb984 -Author: Andrew Beekhof -Date: Thu Apr 10 13:20:20 2014 +1000 - - Log: crmd: device isn't hooked up yet, don't bother logging it - - (cherry picked from commit 97705f05e96dcc0f8b232f32b842ee36844a6567) - -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index b2003ba..c7260fd 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -124,20 +124,20 @@ 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) with %s", -- st_event->target, st_event->executioner, st_event->origin, -- st_event->device); /* TODO: Why is device never set? */ -+ crm_notice("%s was successfully unfenced by %s (at the request of %s)", -+ st_event->target, st_event->executioner, 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 with %s failed: %s (%d)", -- st_event->target, st_event->executioner, st_event->device, -+ crm_err("Unfencing of %s by %s failed: %s (%d)", -+ st_event->target, st_event->executioner, - 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 alegedly just fenced by %s for %s with %s!", st_event->executioner, -- st_event->origin, st_event->device); /* Dumps blackbox if enabled */ -+ crm_crit("We were alegedly just fenced by %s for %s!", -+ st_event->executioner, st_event->origin); /* Dumps blackbox if enabled */ - - qb_log_fini(); /* Try to get the above log message to disk - somehow */ - diff --git a/SOURCES/bz1078078-pcmk-crmd_do_not_erase_the_status_section_for_unfenced_nodes.patch b/SOURCES/bz1078078-pcmk-crmd_do_not_erase_the_status_section_for_unfenced_nodes.patch deleted file mode 100644 index 6b23f8b..0000000 --- a/SOURCES/bz1078078-pcmk-crmd_do_not_erase_the_status_section_for_unfenced_nodes.patch +++ /dev/null @@ -1,29 +0,0 @@ -commit de876a58b6cd80389f7f345784a15080056faf9d -Author: Andrew Beekhof -Date: Thu Apr 10 08:59:04 2014 +1000 - - Fix: crmd: Do not erase the status section for unfenced nodes - - (cherry picked from commit ac788bf0eed36eeb489e7c6e9bcf5c5ded91fd44) - - Conflicts: - crmd/te_callbacks.c - -diff --git a/crmd/te_callbacks.c b/crmd/te_callbacks.c -index 4b8aac5..ce8ae9c 100644 ---- a/crmd/te_callbacks.c -+++ b/crmd/te_callbacks.c -@@ -442,11 +442,12 @@ tengine_stonith_callback(stonith_t * stonith, stonith_callback_data_t * data) - if (rc == pcmk_ok) { - const char *target = crm_element_value(action->xml, XML_LRM_ATTR_TARGET); - const char *uuid = crm_element_value(action->xml, XML_LRM_ATTR_TARGET_UUID); -+ const char *op = crm_meta_value(action->params, "stonith_action"); - - crm_debug("Stonith operation %d for %s passed", call_id, target); - if (action->confirmed == FALSE) { - action->confirmed = TRUE; -- if (action->sent_update == FALSE) { -+ if (action->sent_update == FALSE && safe_str_neq("on", op)) { - send_stonith_update(action, target, uuid); - } - } diff --git a/SOURCES/bz1078078-pcmk-crmd_do_not_overwrite_existing_node_state_when_fencing_completes.patch b/SOURCES/bz1078078-pcmk-crmd_do_not_overwrite_existing_node_state_when_fencing_completes.patch deleted file mode 100644 index 7129505..0000000 --- a/SOURCES/bz1078078-pcmk-crmd_do_not_overwrite_existing_node_state_when_fencing_completes.patch +++ /dev/null @@ -1,155 +0,0 @@ -commit e0bcac68df1f684c1879ddb76387c47b177ece6f -Author: Andrew Beekhof -Date: Tue Feb 18 10:37:07 2014 +1100 - - Fix: crmd: Do not overwrite existing node state when fencing completes - - Let the normal membership callbacks do that. This allows us to function - correctly when a node returns before we get the fencing notification. - - (cherry picked from commit e777b1759786d0a917299399e8a1fee1242a1eef) - - Conflicts: - crmd/callbacks.c - crmd/te_utils.c - crmd/utils.c - -diff --git a/crmd/crmd_utils.h b/crmd/crmd_utils.h -index 92d14b1..ca1e177 100644 ---- a/crmd/crmd_utils.h -+++ b/crmd/crmd_utils.h -@@ -99,6 +99,7 @@ void crmd_join_phase_log(int level); - const char *get_timer_desc(fsa_timer_t * timer); - gboolean too_many_st_failures(void); - void st_fail_count_reset(const char * target); -+void crmd_peer_down(crm_node_t *peer, bool full); - - # define fsa_register_cib_callback(id, flag, data, fn) do { \ - fsa_cib_conn->cmds->register_callback( \ -diff --git a/crmd/te_actions.c b/crmd/te_actions.c -index 4e3bc22..ee66af6 100644 ---- a/crmd/te_actions.c -+++ b/crmd/te_actions.c -@@ -75,11 +75,8 @@ send_stonith_update(crm_action_t * action, const char *target, const char *uuid) - crm_info("Recording uuid '%s' for node '%s'", uuid, target); - peer->uuid = strdup(uuid); - } -- crm_update_peer_proc(__FUNCTION__, peer, crm_proc_none, NULL); -- crm_update_peer_state(__FUNCTION__, peer, CRM_NODE_LOST, 0); -- crm_update_peer_expected(__FUNCTION__, peer, CRMD_JOINSTATE_DOWN); -- crm_update_peer_join(__FUNCTION__, peer, crm_join_none); - -+ crmd_peer_down(peer, TRUE); - node_state = - do_update_node_cib(peer, - node_update_cluster | node_update_peer | node_update_join | -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index c7260fd..9edb128 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -234,11 +234,7 @@ tengine_stonith_notify(stonith_t * st, stonith_event_t * st_event) - - } - -- /* Everyone records them as safely down */ -- crm_update_peer_proc(__FUNCTION__, peer, crm_proc_none, NULL); -- crm_update_peer_state(__FUNCTION__, peer, CRM_NODE_LOST, 0); -- crm_update_peer_expected(__FUNCTION__, peer, CRMD_JOINSTATE_DOWN); -- crm_update_peer_join(__FUNCTION__, peer, crm_join_none); -+ crmd_peer_down(peer, TRUE); - } - } - -diff --git a/crmd/utils.c b/crmd/utils.c -index 07c71b2..a8516c4 100644 ---- a/crmd/utils.c -+++ b/crmd/utils.c -@@ -1091,3 +1091,13 @@ update_attrd(const char *host, const char *name, const char *value, const char * - } - } - } -+ -+void crmd_peer_down(crm_node_t *peer, bool full) -+{ -+ if(full && peer->state == NULL) { -+ crm_update_peer_state(__FUNCTION__, peer, CRM_NODE_LOST, 0); -+ crm_update_peer_proc(__FUNCTION__, peer, crm_proc_none, NULL); -+ } -+ crm_update_peer_join(__FUNCTION__, peer, crm_join_none); -+ crm_update_peer_expected(__FUNCTION__, peer, CRMD_JOINSTATE_DOWN); -+} -diff --git a/pengine/test10/whitebox-orphan-ms.pe.dot b/pengine/test10/whitebox-orphan-ms.pe.dot -deleted file mode 100644 -index 81c37eb..0000000 ---- a/pengine/test10/whitebox-orphan-ms.pe.dot -+++ /dev/null -@@ -1,69 +0,0 @@ --digraph "g" { --"FencingFail_start_0 18node1" [ style=bold color="green" fontcolor="black"] --"FencingFail_stop_0 18node3" -> "FencingFail_start_0 18node1" [ style = bold] --"FencingFail_stop_0 18node3" -> "all_stopped" [ style = bold] --"FencingFail_stop_0 18node3" [ style=bold color="green" fontcolor="black"] --"all_stopped" [ style=bold color="green" fontcolor="orange"] --"container1_delete_0 18node1" -> "container1_start_0 " [ style = dashed] --"container1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] --"container1_delete_0 18node2" -> "container1_start_0 " [ style = dashed] --"container1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] --"container1_delete_0 18node3" -> "container1_start_0 " [ style = dashed] --"container1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] --"container1_start_0 " [ style=dashed color="red" fontcolor="black"] --"container1_stop_0 18node1" -> "all_stopped" [ style = bold] --"container1_stop_0 18node1" -> "container1_delete_0 18node1" [ style = bold] --"container1_stop_0 18node1" -> "container1_delete_0 18node2" [ style = bold] --"container1_stop_0 18node1" -> "container1_delete_0 18node3" [ style = bold] --"container1_stop_0 18node1" -> "container1_start_0 " [ style = dashed] --"container1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] --"container2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] --"container2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] --"container2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] --"container2_stop_0 18node1" -> "all_stopped" [ style = bold] --"container2_stop_0 18node1" -> "container2_delete_0 18node1" [ style = bold] --"container2_stop_0 18node1" -> "container2_delete_0 18node2" [ style = bold] --"container2_stop_0 18node1" -> "container2_delete_0 18node3" [ style = bold] --"container2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] --"lxc-ms_delete_0 18node1" [ style=bold color="green" fontcolor="black"] --"lxc-ms_delete_0 18node2" [ style=bold color="green" fontcolor="black"] --"lxc-ms_delete_0 18node3" [ style=bold color="green" fontcolor="black"] --"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc1" [ style = bold] --"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc2" [ style = bold] --"lxc-ms_demote_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] --"lxc-ms_demote_0 lxc1" [ style=bold color="green" fontcolor="black"] --"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc1" [ style = bold] --"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc2" [ style = bold] --"lxc-ms_demote_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] --"lxc-ms_demote_0 lxc2" [ style=bold color="green" fontcolor="black"] --"lxc-ms_stop_0 lxc1" -> "all_stopped" [ style = bold] --"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node1" [ style = bold] --"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node2" [ style = bold] --"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node3" [ style = bold] --"lxc-ms_stop_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] --"lxc-ms_stop_0 lxc1" [ style=bold color="green" fontcolor="black"] --"lxc-ms_stop_0 lxc2" -> "all_stopped" [ style = bold] --"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node1" [ style = bold] --"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node2" [ style = bold] --"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node3" [ style = bold] --"lxc-ms_stop_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] --"lxc-ms_stop_0 lxc2" [ style=bold color="green" fontcolor="black"] --"lxc1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] --"lxc1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] --"lxc1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] --"lxc1_stop_0 18node1" -> "all_stopped" [ style = bold] --"lxc1_stop_0 18node1" -> "container1_stop_0 18node1" [ style = bold] --"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node1" [ style = bold] --"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node2" [ style = bold] --"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node3" [ style = bold] --"lxc1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] --"lxc2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] --"lxc2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] --"lxc2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] --"lxc2_stop_0 18node1" -> "all_stopped" [ style = bold] --"lxc2_stop_0 18node1" -> "container2_stop_0 18node1" [ style = bold] --"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node1" [ style = bold] --"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node2" [ style = bold] --"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node3" [ style = bold] --"lxc2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] --} diff --git a/SOURCES/bz1078078-pcmk-crmd_report_unsuccessful_unfencing_operations.patch b/SOURCES/bz1078078-pcmk-crmd_report_unsuccessful_unfencing_operations.patch deleted file mode 100644 index cddd885..0000000 --- a/SOURCES/bz1078078-pcmk-crmd_report_unsuccessful_unfencing_operations.patch +++ /dev/null @@ -1,30 +0,0 @@ -commit 2a8e1620b6a224905d6cb4e9bc444c957a85f946 -Author: Andrew Beekhof -Date: Wed Apr 9 12:17:25 2014 +1000 - - Fix: crmd: Report unsuccessful unfencing operations - - (cherry picked from commit 32f6349100e85b6a48dac01a80c967bc0134d165) - -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index 60dd21c..b2003ba 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -124,8 +124,15 @@ 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 for %s with %s", -- st_event->executioner, st_event->origin, st_event->device); -+ crm_notice("%s was successfully unfenced by %s (at the request of %s) with %s", -+ st_event->target, st_event->executioner, st_event->origin, -+ st_event->device); /* TODO: Why is device never set? */ -+ return; -+ -+ } else if (safe_str_eq("on", st_event->action)) { -+ crm_err("Unfencing of %s by %s with %s failed: %s (%d)", -+ st_event->target, st_event->executioner, st_event->device, -+ 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)) { diff --git a/SOURCES/bz1078078-pcmk-default_to_off_when_agent_does_not_advertise_reboot_in_metadata.patch b/SOURCES/bz1078078-pcmk-default_to_off_when_agent_does_not_advertise_reboot_in_metadata.patch deleted file mode 100644 index 82fbf8d..0000000 --- a/SOURCES/bz1078078-pcmk-default_to_off_when_agent_does_not_advertise_reboot_in_metadata.patch +++ /dev/null @@ -1,57 +0,0 @@ -commit ad224d149d03351fd5ff63011697b117ad661aaf -Author: David Vossel -Date: Thu Apr 17 11:37:50 2014 -0500 - - High: fencing: default to 'off' when agent does not advertise 'reboot' in metadata - - (cherry picked from commit 8383a38a478ed6473ff2179596335ed4de583cfa) - -diff --git a/fencing/commands.c b/fencing/commands.c -index b4cd862..fbbee1a 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -206,6 +206,7 @@ static gboolean - stonith_device_execute(stonith_device_t * device) - { - int exec_rc = 0; -+ const char *action_str = NULL; - async_command_t *cmd = NULL; - stonith_action_t *action = NULL; - -@@ -246,8 +247,14 @@ stonith_device_execute(stonith_device_t * device) - } - #endif - -+ action_str = cmd->action; -+ if (safe_str_eq(cmd->action, "reboot") && is_not_set(device->flags, st_device_supports_reboot)) { -+ crm_warn("Agent '%s' does not advertise support for 'reboot', performing 'off' action instead", device->agent); -+ action_str = "off"; -+ } -+ - action = stonith_action_create(device->agent, -- cmd->action, -+ action_str, - cmd->victim, - cmd->victim_nodeid, - cmd->timeout, device->params, device->aliases); -@@ -592,6 +599,8 @@ read_action_metadata(stonith_device_t *device) - set_bit(device->flags, st_device_supports_list); - } else if(safe_str_eq(action, "status")) { - set_bit(device->flags, st_device_supports_status); -+ } else if(safe_str_eq(action, "reboot")) { -+ set_bit(device->flags, st_device_supports_reboot); - } else if(safe_str_eq(action, "on") && (crm_is_true(automatic))) { - /* this setting implies required=true for unfencing */ - required = "true"; -diff --git a/fencing/internal.h b/fencing/internal.h -index 3fcad20..d94e2d6 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -16,6 +16,7 @@ enum st_device_flags - { - st_device_supports_list = 0x0001, - st_device_supports_status = 0x0002, -+ st_device_supports_reboot = 0x0004, - }; - - typedef struct stonith_device_s { diff --git a/SOURCES/bz1078078-pcmk-execute_all_required_fencing_devices_regardless_of_what_topology_level_they_are_at.patch b/SOURCES/bz1078078-pcmk-execute_all_required_fencing_devices_regardless_of_what_topology_level_they_are_at.patch deleted file mode 100644 index 6dfeeeb..0000000 --- a/SOURCES/bz1078078-pcmk-execute_all_required_fencing_devices_regardless_of_what_topology_level_they_are_at.patch +++ /dev/null @@ -1,180 +0,0 @@ -commit 7aa42a14d8b06638f3e3e175fc59e16f730979a8 -Author: David Vossel -Date: Thu Apr 17 10:52:45 2014 -0500 - - High: fencing: Execute all required fencing devices regardless of what topology level they are at - - (cherry picked from commit c922fd50f7c8deb337aad932cb0b8d1c26cbcd99) - -diff --git a/fencing/commands.c b/fencing/commands.c -index 8efb156..b4cd862 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -1297,6 +1297,10 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) - crm_xml_add(dev, "namespace", device->namespace); - crm_xml_add(dev, "agent", device->agent); - crm_xml_add_int(dev, F_STONITH_DEVICE_VERIFIED, device->verified); -+ if (is_action_required(query->action, device)) { -+ crm_xml_add_int(dev, F_STONITH_DEVICE_REQUIRED, 1); -+ } -+ crm_xml_add_int(dev, F_STONITH_DEVICE_VERIFIED, device->verified); - if (action_specific_timeout) { - crm_xml_add_int(dev, F_STONITH_ACTION_TIMEOUT, action_specific_timeout); - } -diff --git a/fencing/internal.h b/fencing/internal.h -index 971a32f..3fcad20 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -113,6 +113,10 @@ typedef struct remote_fencing_op_s { - - /*! The current topology level being executed */ - guint level; -+ -+ /*! List of required devices the topology must execute regardless of what -+ * topology level they exist at. */ -+ GListPtr required_list; - /*! The device list of all the devices at the current executing topology level. */ - GListPtr devices_list; - /*! Current entry in the topology device list */ -diff --git a/fencing/remote.c b/fencing/remote.c -index fd25025..10447e7 100644 ---- a/fencing/remote.c -+++ b/fencing/remote.c -@@ -68,6 +68,12 @@ static void report_timeout_period(remote_fencing_op_t * op, int op_timeout); - static int get_op_total_timeout(remote_fencing_op_t * op, st_query_result_t * chosen_peer, - int default_timeout); - -+static gint -+sort_strings(gconstpointer a, gconstpointer b) -+{ -+ return strcmp(a, b); -+} -+ - static void - free_remote_query(gpointer data) - { -@@ -128,6 +134,10 @@ free_remote_op(gpointer data) - g_list_free_full(op->devices_list, free); - op->devices_list = NULL; - } -+ if (op->required_list) { -+ g_list_free_full(op->required_list, free); -+ op->required_list = NULL; -+ } - free(op); - } - -@@ -400,6 +410,25 @@ topology_is_empty(stonith_topology_t *tp) - return TRUE; - } - -+static void -+add_required_device(remote_fencing_op_t * op, const char *device) -+{ -+ GListPtr match = g_list_find_custom(op->required_list, device, sort_strings); -+ if (match) { -+ /* device already marked required */ -+ return; -+ } -+ op->required_list = g_list_prepend(op->required_list, strdup(device)); -+ -+ /* make sure the required devices is in the current list of devices to be executed */ -+ if (op->devices_list) { -+ GListPtr match = g_list_find_custom(op->devices_list, device, sort_strings); -+ if (match == NULL) { -+ op->devices_list = g_list_append(op->devices_list, strdup(device)); -+ } -+ } -+} -+ - /* deep copy the device list */ - static void - set_op_device_list(remote_fencing_op_t * op, GListPtr devices) -@@ -413,6 +442,18 @@ set_op_device_list(remote_fencing_op_t * op, GListPtr devices) - for (lpc = devices; lpc != NULL; lpc = lpc->next) { - op->devices_list = g_list_append(op->devices_list, strdup(lpc->data)); - } -+ -+ /* tack on whatever required devices have not been executed -+ * to the end of the current devices list. This ensures that -+ * the required devices will get executed regardless of what topology -+ * level they exist at. */ -+ for (lpc = op->required_list; lpc != NULL; lpc = lpc->next) { -+ GListPtr match = g_list_find_custom(op->devices_list, lpc->data, sort_strings); -+ if (match == NULL) { -+ op->devices_list = g_list_append(op->devices_list, strdup(lpc->data)); -+ } -+ } -+ - op->devices = op->devices_list; - } - -@@ -714,12 +755,6 @@ initiate_remote_stonith_op(crm_client_t * client, xmlNode * request, gboolean ma - return op; - } - --static gint --sort_strings(gconstpointer a, gconstpointer b) --{ -- return strcmp(a, b); --} -- - enum find_best_peer_options { - /*! Skip checking the target peer for capable fencing devices */ - FIND_PEER_SKIP_TARGET = 0x0001, -@@ -1165,11 +1200,13 @@ process_remote_stonith_query(xmlNode * msg) - const char *device = ID(child); - int action_timeout = 0; - int verified = 0; -+ int required = 0; - - if (device) { - result->device_list = g_list_prepend(result->device_list, strdup(device)); - crm_element_value_int(child, F_STONITH_ACTION_TIMEOUT, &action_timeout); - crm_element_value_int(child, F_STONITH_DEVICE_VERIFIED, &verified); -+ crm_element_value_int(child, F_STONITH_DEVICE_REQUIRED, &required); - if (action_timeout) { - crm_trace("Peer %s with device %s returned action timeout %d", - result->host, device, action_timeout); -@@ -1181,6 +1218,13 @@ process_remote_stonith_query(xmlNode * msg) - g_hash_table_insert(result->verified_devices, - strdup(device), GINT_TO_POINTER(verified)); - } -+ if (required) { -+ crm_trace("Peer %s requires device %s to execute for action %s", -+ result->host, device, op->action); -+ /* This matters when executing a topology. Required devices will get -+ * executed regardless of their topology level. We use this for unfencing. */ -+ add_required_device(op, device); -+ } - } - } - -@@ -1312,10 +1356,14 @@ process_remote_stonith_exec(xmlNode * msg) - * Continue the topology if more devices exist at the current level, otherwise - * mark as done. */ - if (rc == pcmk_ok) { -+ GListPtr required_match = g_list_find_custom(op->required_list, device, sort_strings); - if (op->devices) { - /* Success, are there any more? */ - op->devices = op->devices->next; - } -+ if (required_match) { -+ op->required_list = g_list_remove(op->required_list, required_match->data); -+ } - /* if no more devices at this fencing level, we are done, - * else we need to contine with executing the next device in the list */ - if (op->devices == NULL) { -diff --git a/include/crm/fencing/internal.h b/include/crm/fencing/internal.h -index 2822e9a..3625cf9 100644 ---- a/include/crm/fencing/internal.h -+++ b/include/crm/fencing/internal.h -@@ -66,6 +66,8 @@ xmlNode *create_device_registration_xml(const char *id, const char *namespace, c - /*! Has this device been verified using a monitor type - * operation (monitor, list, status) */ - # define F_STONITH_DEVICE_VERIFIED "st_monitor_verified" -+/*! device is required for this action */ -+# define F_STONITH_DEVICE_REQUIRED "st_required" - # define F_STONITH_CALLBACK_TOKEN "st_async_id" - # define F_STONITH_CLIENTNAME "st_clientname" - # define F_STONITH_CLIENTNODE "st_clientnode" diff --git a/SOURCES/bz1078078-pcmk-fence_using_all_required_devices.patch b/SOURCES/bz1078078-pcmk-fence_using_all_required_devices.patch deleted file mode 100644 index 6a30090..0000000 --- a/SOURCES/bz1078078-pcmk-fence_using_all_required_devices.patch +++ /dev/null @@ -1,289 +0,0 @@ -commit 1928af7d8d2fc7d225df22caeb7ea93964f48bde -Author: David Vossel -Date: Wed Apr 16 10:28:46 2014 -0500 - - High: fencing: Fence using all required devices - - (cherry picked from commit 1f39dfe13d8cbfb5dd22f8324735319f81230fdb) - - Conflicts: - fencing/main.c - -diff --git a/fencing/commands.c b/fencing/commands.c -index 41690f7..8efb156 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -111,6 +111,20 @@ typedef struct async_command_s { - static xmlNode *stonith_construct_async_reply(async_command_t * cmd, const char *output, - xmlNode * data, int rc); - -+static gboolean -+is_action_required(const char *action, stonith_device_t *device) -+{ -+ if (device->required_actions == NULL) { -+ return FALSE; -+ } -+ -+ if (strstr(device->required_actions, action)) { -+ return TRUE; -+ } -+ -+ return FALSE; -+} -+ - static int - get_action_timeout(stonith_device_t * device, const char *action, int default_timeout) - { -@@ -318,6 +332,7 @@ free_device(gpointer data) - free_xml(device->agent_metadata); - free(device->namespace); - free(device->on_target_actions); -+ free(device->required_actions); - free(device->agent); - free(device->id); - free(device); -@@ -525,10 +540,24 @@ is_nodeid_required(xmlNode * xml) - return TRUE; - } - -+static char * -+add_action(char *actions, const char *action) -+{ -+ static size_t len = 256; -+ if (actions == NULL) { -+ actions = calloc(1, len); -+ } -+ if (strlen(actions)) { -+ g_strlcat(actions, " ", len); -+ } -+ g_strlcat(actions, action, len); -+ -+ return actions; -+} -+ - static void --get_on_target_actions(stonith_device_t *device) -+read_action_metadata(stonith_device_t *device) - { -- char *actions = NULL; - xmlXPathObjectPtr xpath = NULL; - int max = 0; - int lpc = 0; -@@ -545,40 +574,38 @@ get_on_target_actions(stonith_device_t *device) - return; - } - -- actions = calloc(1, 512); -- - for (lpc = 0; lpc < max; lpc++) { - const char *on_target = NULL; - const char *action = NULL; -+ const char *automatic = NULL; -+ const char *required = NULL; - xmlNode *match = getXpathResult(xpath, lpc); - - CRM_CHECK(match != NULL, continue); - - on_target = crm_element_value(match, "on_target"); - action = crm_element_value(match, "name"); -+ automatic = crm_element_value(match, "automatic"); -+ required = crm_element_value(match, "required"); - - if(safe_str_eq(action, "list")) { - set_bit(device->flags, st_device_supports_list); - } else if(safe_str_eq(action, "status")) { - set_bit(device->flags, st_device_supports_status); -+ } else if(safe_str_eq(action, "on") && (crm_is_true(automatic))) { -+ /* this setting implies required=true for unfencing */ -+ required = "true"; - } - - if (action && crm_is_true(on_target)) { -- if (strlen(actions)) { -- g_strlcat(actions, " ", 512); -- } -- g_strlcat(actions, action, 512); -+ device->on_target_actions = add_action(device->on_target_actions, action); -+ } -+ if (action && crm_is_true(required)) { -+ device->required_actions = add_action(device->required_actions, action); - } - } - - freeXpathObject(xpath); -- -- if (!strlen(actions)) { -- free(actions); -- actions = NULL; -- } -- -- device->on_target_actions = actions; - } - - static stonith_device_t * -@@ -603,13 +630,23 @@ build_device_from_xml(xmlNode * msg) - device->aliases = build_port_aliases(value, &(device->targets)); - - device->agent_metadata = get_agent_metadata(device->agent); -- get_on_target_actions(device); -+ read_action_metadata(device); - - value = g_hash_table_lookup(device->params, "nodeid"); - if (!value) { - device->include_nodeid = is_nodeid_required(device->agent_metadata); - } - -+ value = crm_element_value(dev, "rsc_provides"); -+ if (safe_str_eq(value, "unfencing")) { -+ /* if this agent requires unfencing, 'on' is considered a required action */ -+ device->required_actions = add_action(device->required_actions, "on"); -+ } -+ -+ if (is_action_required("on", device)) { -+ crm_info("The fencing device '%s' requires unfencing", device->id); -+ } -+ - if (device->on_target_actions) { - crm_info("The fencing device '%s' requires actions (%s) to be executed on the target node", - device->id, device->on_target_actions); -@@ -1460,6 +1497,7 @@ static void - st_child_done(GPid pid, int rc, const char *output, gpointer user_data) - { - stonith_device_t *device = NULL; -+ stonith_device_t *next_device = NULL; - async_command_t *cmd = user_data; - - GListPtr gIter = NULL; -@@ -1483,21 +1521,37 @@ st_child_done(GPid pid, int rc, const char *output, gpointer user_data) - mainloop_set_trigger(device->work); - } - -- crm_trace("Operation %s on %s completed with rc=%d (%d remaining)", -+ crm_debug("Operation '%s' on '%s' completed with rc=%d (%d remaining)", - cmd->action, cmd->device, rc, g_list_length(cmd->device_next)); - -- if (rc != 0 && cmd->device_next) { -- stonith_device_t *dev = g_hash_table_lookup(device_list, cmd->device_next->data); -- -- if (dev) { -- log_operation(cmd, rc, pid, dev->id, output); -+ if (rc == 0) { -+ GListPtr iter; -+ /* see if there are any required devices left to execute for this op */ -+ for (iter = cmd->device_next; iter != NULL; iter = iter->next) { -+ next_device = g_hash_table_lookup(device_list, iter->data); - -- cmd->device_next = cmd->device_next->next; -- schedule_stonith_command(cmd, dev); -- /* Prevent cmd from being freed */ -- cmd = NULL; -- goto done; -+ if (next_device != NULL && is_action_required(cmd->action, next_device)) { -+ cmd->device_next = iter->next; -+ break; -+ } -+ next_device = NULL; - } -+ -+ } else if (rc != 0 && cmd->device_next && (is_action_required(cmd->action, device) == FALSE)) { -+ /* if this device didn't work out, see if there are any others we can try. -+ * if the failed device was 'required', we can't pick another device. */ -+ next_device = g_hash_table_lookup(device_list, cmd->device_next->data); -+ cmd->device_next = cmd->device_next->next; -+ } -+ -+ /* this operation requires more fencing, hooray! */ -+ if (next_device) { -+ log_operation(cmd, rc, pid, device->id, output); -+ -+ schedule_stonith_command(cmd, next_device); -+ /* Prevent cmd from being freed */ -+ cmd = NULL; -+ goto done; - } - - if (rc > 0) { -diff --git a/fencing/internal.h b/fencing/internal.h -index 4e0525c..971a32f 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -25,6 +25,7 @@ typedef struct stonith_device_s { - - /*! list of actions that must execute on the target node. Used for unfencing */ - char *on_target_actions; -+ char *required_actions; - GListPtr targets; - time_t targets_age; - gboolean has_attr_map; -diff --git a/fencing/main.c b/fencing/main.c -index e002125..16713fe 100644 ---- a/fencing/main.c -+++ b/fencing/main.c -@@ -645,9 +645,13 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) - const char *name = NULL; - const char *agent = crm_element_value(rsc->xml, XML_EXPR_ATTR_TYPE); - const char *provider = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER); -+ const char *rsc_provides = NULL; - - crm_info("Device %s is allowed on %s: score=%d", rsc->id, stonith_our_uname, node->weight); - get_rsc_attributes(rsc->parameters, rsc, node, data_set); -+ get_meta_attributes(rsc->meta, rsc, node, data_set); -+ -+ rsc_provides = g_hash_table_lookup(rsc->meta, XML_RSC_ATTR_PROVIDES); - - g_hash_table_iter_init(&gIter, rsc->parameters); - while (g_hash_table_iter_next(&gIter, (gpointer *) & name, (gpointer *) & value)) { -@@ -658,7 +662,7 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) - crm_trace(" %s=%s", name, value); - } - -- data = create_device_registration_xml(rsc_name(rsc), provider, agent, params); -+ data = create_device_registration_xml(rsc_name(rsc), provider, agent, params, rsc_provides); - stonith_device_register(data, NULL, TRUE); - - stonith_key_value_freeall(params, 1, 1); -diff --git a/include/crm/fencing/internal.h b/include/crm/fencing/internal.h -index 4f30fed..2822e9a 100644 ---- a/include/crm/fencing/internal.h -+++ b/include/crm/fencing/internal.h -@@ -46,7 +46,7 @@ xmlNode *create_level_registration_xml(const char *node, int level, - stonith_key_value_t * device_list); - - xmlNode *create_device_registration_xml(const char *id, const char *namespace, const char *agent, -- stonith_key_value_t * params); -+ stonith_key_value_t * params, const char *rsc_provides); - - # define ST_LEVEL_MAX 10 - -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 2be854f..06e0726 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -178,7 +178,7 @@ stonith_connection_destroy(gpointer user_data) - - xmlNode * - create_device_registration_xml(const char *id, const char *namespace, const char *agent, -- stonith_key_value_t * params) -+ stonith_key_value_t * params, const char *rsc_provides) - { - xmlNode *data = create_xml_node(NULL, F_STONITH_DEVICE); - xmlNode *args = create_xml_node(data, XML_TAG_ATTRS); -@@ -195,6 +195,9 @@ create_device_registration_xml(const char *id, const char *namespace, const char - crm_xml_add(data, "origin", __FUNCTION__); - crm_xml_add(data, "agent", agent); - crm_xml_add(data, "namespace", namespace); -+ if (rsc_provides) { -+ crm_xml_add(data, "rsc_provides", rsc_provides); -+ } - - for (; params; params = params->next) { - hash2field((gpointer) params->key, (gpointer) params->value, args); -@@ -211,7 +214,7 @@ stonith_api_register_device(stonith_t * st, int call_options, - int rc = 0; - xmlNode *data = NULL; - -- data = create_device_registration_xml(id, namespace, agent, params); -+ data = create_device_registration_xml(id, namespace, agent, params, NULL); - - rc = stonith_send_command(st, STONITH_OP_DEVICE_ADD, data, NULL, call_options, 0); - free_xml(data); diff --git a/SOURCES/bz1078078-pcmk-fencing_automatically_switch_from_list_to_status_to_static_list_if_those_actions_are_not_advertised_in_the_metadata.patch b/SOURCES/bz1078078-pcmk-fencing_automatically_switch_from_list_to_status_to_static_list_if_those_actions_are_not_advertised_in_the_metadata.patch deleted file mode 100644 index 247d9d7..0000000 --- a/SOURCES/bz1078078-pcmk-fencing_automatically_switch_from_list_to_status_to_static_list_if_those_actions_are_not_advertised_in_the_metadata.patch +++ /dev/null @@ -1,114 +0,0 @@ -commit 0fb13527630fd308d533110ab91b7cf00538e8da -Author: Andrew Beekhof -Date: Wed Apr 9 09:05:36 2014 +1000 - - Fix: fencing: Automatically switch from 'list' to 'status' to 'static-list' if those actions are not advertised in the metadata - - (cherry picked from commit b87c249c7b862f6bac424e5d0bb5528e8f7b9c94) - -diff --git a/fencing/commands.c b/fencing/commands.c -index 909dc24..14933a5 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -524,24 +524,24 @@ is_nodeid_required(xmlNode * xml) - return TRUE; - } - --static char * --get_on_target_actions(xmlNode * xml) -+static void -+get_on_target_actions(stonith_device_t *device) - { - char *actions = NULL; - xmlXPathObjectPtr xpath = NULL; - int max = 0; - int lpc = 0; - -- if (!xml) { -- return NULL; -+ if (device->agent_metadata == NULL) { -+ return; - } - -- xpath = xpath_search(xml, "//action"); -+ xpath = xpath_search(device->agent_metadata, "//action"); - max = numXpathResults(xpath); - - if (max <= 0) { - freeXpathObject(xpath); -- return NULL; -+ return; - } - - actions = calloc(1, 512); -@@ -556,6 +556,12 @@ get_on_target_actions(xmlNode * xml) - on_target = crm_element_value(match, "on_target"); - action = crm_element_value(match, "name"); - -+ if(safe_str_eq(action, "list")) { -+ set_bit(device->flags, st_device_supports_list); -+ } else if(safe_str_eq(action, "status")) { -+ set_bit(device->flags, st_device_supports_status); -+ } -+ - if (action && crm_is_true(on_target)) { - if (strlen(actions)) { - g_strlcat(actions, " ", 512); -@@ -571,7 +577,7 @@ get_on_target_actions(xmlNode * xml) - actions = NULL; - } - -- return actions; -+ device->on_target_actions = actions; - } - - static stonith_device_t * -@@ -596,7 +602,7 @@ build_device_from_xml(xmlNode * msg) - device->aliases = build_port_aliases(value, &(device->targets)); - - device->agent_metadata = get_agent_metadata(device->agent); -- device->on_target_actions = get_on_target_actions(device->agent_metadata); -+ get_on_target_actions(device); - - value = g_hash_table_lookup(device->params, "nodeid"); - if (!value) { -@@ -627,8 +633,12 @@ target_list_type(stonith_device_t * dev) - check_type = "static-list"; - } else if (g_hash_table_lookup(dev->params, STONITH_ATTR_HOSTMAP)) { - check_type = "static-list"; -- } else { -+ } else if(is_set(dev->flags, st_device_supports_list)){ - check_type = "dynamic-list"; -+ } else if(is_set(dev->flags, st_device_supports_status)){ -+ check_type = "status"; -+ } else { -+ check_type = "none"; - } - } - -diff --git a/fencing/internal.h b/fencing/internal.h -index da510c3..4e0525c 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -12,6 +12,12 @@ - */ - gboolean stonith_check_fence_tolerance(int tolerance, const char *target, const char *action); - -+enum st_device_flags -+{ -+ st_device_supports_list = 0x0001, -+ st_device_supports_status = 0x0002, -+}; -+ - typedef struct stonith_device_s { - char *id; - char *agent; -@@ -27,6 +33,8 @@ typedef struct stonith_device_s { - guint priority; - guint active_pid; - -+ enum st_device_flags flags; -+ - GHashTable *params; - GHashTable *aliases; - GList *pending_ops; diff --git a/SOURCES/bz1078078-pcmk-fencing_correctly_record_which_peer_performed_the_fencing_operation.patch b/SOURCES/bz1078078-pcmk-fencing_correctly_record_which_peer_performed_the_fencing_operation.patch deleted file mode 100644 index b7dc219..0000000 --- a/SOURCES/bz1078078-pcmk-fencing_correctly_record_which_peer_performed_the_fencing_operation.patch +++ /dev/null @@ -1,53 +0,0 @@ -commit e40eaf4a1ba1787696a2fea3043e2620a5d98e3c -Author: Andrew Beekhof -Date: Thu Apr 10 11:50:46 2014 +1000 - - Fix: Fencing: Correctly record which peer performed the fencing operation - - (cherry picked from commit a932361589964545f76376009d7ff7a61f03cab3) - -diff --git a/fencing/commands.c b/fencing/commands.c -index abbb1ad..41690f7 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -1405,7 +1405,8 @@ stonith_send_async_reply(async_command_t * cmd, const char *output, int rc, GPid - crm_xml_add_int(notify_data, F_STONITH_RC, rc); - crm_xml_add(notify_data, F_STONITH_TARGET, cmd->victim); - crm_xml_add(notify_data, F_STONITH_OPERATION, cmd->op); -- crm_xml_add(notify_data, F_STONITH_DELEGATE, cmd->device); -+ crm_xml_add(notify_data, F_STONITH_DELEGATE, "localhost"); -+ crm_xml_add(notify_data, F_STONITH_DEVICE, cmd->device); - crm_xml_add(notify_data, F_STONITH_REMOTE_OP_ID, cmd->remote_op_id); - crm_xml_add(notify_data, F_STONITH_ORIGIN, cmd->client); - -diff --git a/fencing/remote.c b/fencing/remote.c -index 399dce5..fd25025 100644 ---- a/fencing/remote.c -+++ b/fencing/remote.c -@@ -267,7 +267,12 @@ remote_op_done(remote_fencing_op_t * op, xmlNode * data, int rc, int dup) - } - - if (!op->delegate && data) { -- op->delegate = crm_element_value_copy(data, F_ORIG); -+ xmlNode *ndata = get_xpath_object("//@" F_STONITH_DELEGATE, data, LOG_WARNING); -+ if(ndata) { -+ op->delegate = crm_element_value_copy(ndata, F_STONITH_DELEGATE); -+ } else { -+ op->delegate = crm_element_value_copy(data, F_ORIG); -+ } - } - - if (data == NULL) { -diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c -index 95ea0f7..2be854f 100644 ---- a/lib/fencing/st_client.c -+++ b/lib/fencing/st_client.c -@@ -1981,6 +1981,8 @@ xml_to_event(xmlNode * msg) - event->executioner = crm_element_value_copy(data, F_STONITH_DELEGATE); - event->id = crm_element_value_copy(data, F_STONITH_REMOTE_OP_ID); - event->client_origin = crm_element_value_copy(data, F_STONITH_CLIENTNAME); -+ event->device = crm_element_value_copy(data, F_STONITH_DEVICE); -+ - } else { - crm_err("No data for %s event", ntype); - crm_log_xml_notice(msg, "BadEvent"); diff --git a/SOURCES/bz1078078-pcmk-filter_self_fencing_at_the_peers_to_allow_unfencing_to_work_correctly.patch b/SOURCES/bz1078078-pcmk-filter_self_fencing_at_the_peers_to_allow_unfencing_to_work_correctly.patch deleted file mode 100644 index 71fca5e..0000000 --- a/SOURCES/bz1078078-pcmk-filter_self_fencing_at_the_peers_to_allow_unfencing_to_work_correctly.patch +++ /dev/null @@ -1,222 +0,0 @@ -commit 5fbd9decbca3f40a8b29e9d1ef5d158808f71cf6 -Author: Andrew Beekhof -Date: Wed Apr 9 14:40:30 2014 +1000 - - Fix: fencing: Filter self-fencing at the peers to allow unfencing to work correctly - - (cherry picked from commit e1e7d7fad2b5ade3c6e433cb1b631d071b8d5e70) - - Conflicts: - fencing/commands.c - fencing/remote.c - -diff --git a/fencing/commands.c b/fencing/commands.c -index 14933a5..abbb1ad 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -60,6 +60,7 @@ struct device_search_s { - int per_device_timeout; - int replies_needed; - int replies_received; -+ bool allow_suicide; - - void *user_data; - void (*callback) (GList * devices, void *user_data); -@@ -1072,8 +1073,17 @@ can_fence_host_with_device(stonith_device_t * dev, struct device_search_s *searc - - if (dev->on_target_actions && - search->action && -- strstr(dev->on_target_actions, search->action) && safe_str_neq(host, stonith_our_uname)) { -+ strstr(dev->on_target_actions, search->action)) { - /* this device can only execute this action on the target node */ -+ -+ if(safe_str_neq(host, stonith_our_uname)) { -+ crm_trace("%s operation with %s can only be executed for localhost not %s", -+ search->action, dev->id, host); -+ goto search_report_results; -+ } -+ -+ } else if(safe_str_eq(host, stonith_our_uname) && search->allow_suicide == FALSE) { -+ crm_trace("%s operation does not support self-fencing", search->action); - goto search_report_results; - } - -@@ -1146,7 +1156,7 @@ search_devices(gpointer key, gpointer value, gpointer user_data) - - #define DEFAULT_QUERY_TIMEOUT 20 - static void --get_capable_devices(const char *host, const char *action, int timeout, void *user_data, -+get_capable_devices(const char *host, const char *action, int timeout, bool suicide, void *user_data, - void (*callback) (GList * devices, void *user_data)) - { - struct device_search_s *search; -@@ -1199,6 +1209,7 @@ get_capable_devices(const char *host, const char *action, int timeout, void *use - * unregistered some how during the async search, we will get - * the correct number of replies. */ - search->replies_needed = g_hash_table_size(device_list); -+ search->allow_suicide = suicide; - search->callback = callback; - search->user_data = user_data; - /* kick off the search */ -@@ -1313,7 +1324,9 @@ stonith_query(xmlNode * msg, const char *remote_peer, const char *client_id, int - query->action = action ? strdup(action) : NULL; - query->call_options = call_options; - -- get_capable_devices(target, action, timeout, query, stonith_query_capable_device_cb); -+ get_capable_devices(target, action, timeout, -+ is_set(call_options, st_opt_allow_suicide), -+ query, stonith_query_capable_device_cb); - } - - #define ST_LOG_OUTPUT_MAX 512 -@@ -1632,8 +1645,10 @@ stonith_fence(xmlNode * msg) - host = node->uname; - } - } -- get_capable_devices(host, cmd->action, cmd->default_timeout, cmd, -- stonith_fence_get_devices_cb); -+ -+ /* If we get to here, then self-fencing is implicitly allowed */ -+ get_capable_devices(host, cmd->action, cmd->default_timeout, -+ TRUE, cmd, stonith_fence_get_devices_cb); - } - - return -EINPROGRESS; -diff --git a/fencing/remote.c b/fencing/remote.c -index 8c8df6d..399dce5 100644 ---- a/fencing/remote.c -+++ b/fencing/remote.c -@@ -558,6 +558,7 @@ create_remote_stonith_op(const char *client, xmlNode * request, gboolean peer) - { - remote_fencing_op_t *op = NULL; - xmlNode *dev = get_xpath_object("//@" F_STONITH_TARGET, request, LOG_TRACE); -+ int call_options = 0; - - if (remote_op_list == NULL) { - remote_op_list = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, free_remote_op); -@@ -612,7 +613,9 @@ create_remote_stonith_op(const char *client, xmlNode * request, gboolean peer) - - op->target = crm_element_value_copy(dev, F_STONITH_TARGET); - op->request = copy_xml(request); /* TODO: Figure out how to avoid this */ -- crm_element_value_int(request, F_STONITH_CALLOPTS, (int *)&(op->call_options)); -+ crm_element_value_int(request, F_STONITH_CALLOPTS, &call_options); -+ op->call_options = call_options; -+ - crm_element_value_int(request, F_STONITH_CALLID, (int *)&(op->client_callid)); - - crm_trace("%s new stonith op: %s - %s of %s for %s", -@@ -662,7 +665,7 @@ initiate_remote_stonith_op(crm_client_t * client, xmlNode * request, gboolean ma - op->target, op->id); - return op; - } -- -+ - CRM_CHECK(op->action, return NULL); - - if (stonith_topology_next(op) != pcmk_ok) { -@@ -695,6 +698,7 @@ initiate_remote_stonith_op(crm_client_t * client, xmlNode * request, gboolean ma - crm_xml_add(query, F_STONITH_CLIENTID, op->client_id); - crm_xml_add(query, F_STONITH_CLIENTNAME, op->client_name); - crm_xml_add_int(query, F_STONITH_TIMEOUT, op->base_timeout); -+ crm_xml_add_int(query, F_STONITH_CALLOPTS, op->call_options); - - send_cluster_message(NULL, crm_msg_stonith_ng, query, FALSE); - free_xml(query); -@@ -964,29 +968,30 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer) - - if (peer) { - int timeout_one = 0; -- xmlNode *query = stonith_create_op(op->client_callid, op->id, STONITH_OP_FENCE, NULL, 0); -+ xmlNode *remote_op = stonith_create_op(op->client_callid, op->id, STONITH_OP_FENCE, NULL, 0); - -- crm_xml_add(query, F_STONITH_REMOTE_OP_ID, op->id); -- crm_xml_add(query, F_STONITH_TARGET, op->target); -- crm_xml_add(query, F_STONITH_ACTION, op->action); -- crm_xml_add(query, F_STONITH_ORIGIN, op->originator); -- crm_xml_add(query, F_STONITH_CLIENTID, op->client_id); -- crm_xml_add(query, F_STONITH_CLIENTNAME, op->client_name); -- crm_xml_add_int(query, F_STONITH_TIMEOUT, timeout); -+ crm_xml_add(remote_op, F_STONITH_REMOTE_OP_ID, op->id); -+ crm_xml_add(remote_op, F_STONITH_TARGET, op->target); -+ crm_xml_add(remote_op, F_STONITH_ACTION, op->action); -+ crm_xml_add(remote_op, F_STONITH_ORIGIN, op->originator); -+ crm_xml_add(remote_op, F_STONITH_CLIENTID, op->client_id); -+ crm_xml_add(remote_op, F_STONITH_CLIENTNAME, op->client_name); -+ crm_xml_add_int(remote_op, F_STONITH_TIMEOUT, timeout); -+ crm_xml_add_int(remote_op, F_STONITH_CALLOPTS, op->call_options); - - if (device) { - timeout_one = - TIMEOUT_MULTIPLY_FACTOR * get_device_timeout(peer, device, op->base_timeout); - crm_info("Requesting that %s perform op %s %s with %s for %s (%ds)", peer->host, - op->action, op->target, device, op->client_name, timeout_one); -- crm_xml_add(query, F_STONITH_DEVICE, device); -- crm_xml_add(query, F_STONITH_MODE, "slave"); -+ crm_xml_add(remote_op, F_STONITH_DEVICE, device); -+ crm_xml_add(remote_op, F_STONITH_MODE, "slave"); - - } 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_xml_add(query, F_STONITH_MODE, "smart"); -+ crm_xml_add(remote_op, F_STONITH_MODE, "smart"); - } - - op->state = st_exec; -@@ -995,9 +1000,9 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer) - } - op->op_timer_one = g_timeout_add((1000 * timeout_one), remote_op_timeout_one, op); - -- send_cluster_message(crm_get_peer(0, peer->host), crm_msg_stonith_ng, query, FALSE); -+ send_cluster_message(crm_get_peer(0, peer->host), crm_msg_stonith_ng, remote_op, FALSE); - peer->tried = TRUE; -- free_xml(query); -+ free_xml(remote_op); - return; - - } else if (op->owner == FALSE) { -@@ -1131,24 +1136,20 @@ process_remote_stonith_query(xmlNode * msg) - - if (devices <= 0) { - /* If we're doing 'known' then we might need to fire anyway */ -- crm_trace("Query result from %s (%d devices)", host, devices); -+ crm_trace("Query result %d of %d from %s for %s/%s (%d devices) %s", -+ op->replies, op->replies_expected, host, -+ op->target, op->action, devices, id); - if(op->state == st_query && (op->replies >= op->replies_expected || op->replies >= active)) { -- crm_info("All queries have arrived, continuing (%d, %d, %d) ", op->replies_expected, active, op->replies); -+ crm_info("All queries have arrived, continuing (%d, %d, %d, %s)", -+ op->replies_expected, active, op->replies, id); - call_remote_stonith(op, NULL); - } - return pcmk_ok; -- -- } else if (host_is_target) { -- if (op->call_options & st_opt_allow_suicide) { -- crm_trace("Allowing %s to potentialy fence itself", op->target); -- } else { -- crm_info("Ignoring reply from %s, hosts are not permitted to commit suicide", -- op->target); -- return pcmk_ok; -- } - } - -- crm_info("Query result %d of %d from %s (%d devices)", op->replies, op->replies_expected, host, devices); -+ crm_info("Query result %d of %d from %s for %s/%s (%d devices) %s", -+ op->replies, op->replies_expected, host, -+ op->target, op->action, devices, id); - result = calloc(1, sizeof(st_query_result_t)); - result->host = strdup(host); - result->devices = devices; -@@ -1206,10 +1207,6 @@ process_remote_stonith_query(xmlNode * msg) - crm_trace("Found %d verified devices", g_hash_table_size(result->verified_devices)); - call_remote_stonith(op, result); - -- } else if (safe_str_eq(op->action, "on")) { -- crm_trace("Unfencing %s", op->target); -- call_remote_stonith(op, result); -- - } else if(op->replies >= op->replies_expected || op->replies >= active) { - crm_info("All queries have arrived, continuing (%d, %d, %d) ", op->replies_expected, active, op->replies); - call_remote_stonith(op, NULL); diff --git a/SOURCES/bz1078078-pcmk-logging_daemons_always_get_a_log_file_unless_explicitly_set_to_configured_none.patch b/SOURCES/bz1078078-pcmk-logging_daemons_always_get_a_log_file_unless_explicitly_set_to_configured_none.patch deleted file mode 100644 index 9e30fea..0000000 --- a/SOURCES/bz1078078-pcmk-logging_daemons_always_get_a_log_file_unless_explicitly_set_to_configured_none.patch +++ /dev/null @@ -1,40 +0,0 @@ -commit 63547179498c939dc1c3450c85fac23b3c86742c -Author: Andrew Beekhof -Date: Tue Apr 8 11:26:56 2014 +1000 - - Feature: logging: daemons always get a log file, unless explicitly set to configured 'none' - - (cherry picked from commit 8410680fbd7d5d1fea8e411fdf32f9c3ebe889cb) - -diff --git a/lib/common/logging.c b/lib/common/logging.c -index 571cd03..ad6bcfd 100644 ---- a/lib/common/logging.c -+++ b/lib/common/logging.c -@@ -696,7 +696,12 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - - crm_enable_stderr(to_stderr); - -- if (logfile) { -+ if (safe_str_eq("none", logfile)) { -+ /* No soup^Hlogs for you! */ -+ } else if(crm_is_daemon) { -+ /* The daemons always get a log file, unless explicitly set to configured 'none' */ -+ crm_add_logfile(logfile); -+ } else if(logfile) { - crm_add_logfile(logfile); - } - -@@ -718,13 +723,6 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - set_daemon_option("logfacility", facility); - } - -- if (crm_is_daemon && crm_tracing_enabled() -- && qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_STATE_GET, 0) != QB_LOG_STATE_ENABLED -- && qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_STATE_GET, 0) != QB_LOG_STATE_ENABLED) { -- /* Make sure tracing goes somewhere */ -- crm_add_logfile(NULL); -- } -- - crm_update_callsites(); - - /* Ok, now we can start logging... */ diff --git a/SOURCES/bz1078078-pcmk-logging_simplify_processing_of_logging_directives.patch b/SOURCES/bz1078078-pcmk-logging_simplify_processing_of_logging_directives.patch deleted file mode 100644 index 5a3de7a..0000000 --- a/SOURCES/bz1078078-pcmk-logging_simplify_processing_of_logging_directives.patch +++ /dev/null @@ -1,349 +0,0 @@ -commit 3cd57be790a6455b115d07c31bdb9a72767d7ee8 -Author: Andrew Beekhof -Date: Tue Apr 8 14:45:24 2014 +1000 - - Refactor: logging: Simplify processing of logging directives - - (cherry picked from commit b3b5a57bca646377f644ff91ff724062ec8ec460) - - Conflicts: - mcp/corosync.c - -diff --git a/lib/ais/utils.c b/lib/ais/utils.c -index 465e381..0a3f95e 100644 ---- a/lib/ais/utils.c -+++ b/lib/ais/utils.c -@@ -237,7 +237,7 @@ spawn_child(crm_child_t * child) - /* *INDENT-ON* */ - - if (pcmk_env.logfile) { -- setenv("HA_debugfile", pcmk_env.logfile, 1); -+ setenv("HA_logfile", pcmk_env.logfile, 1); - } - - if (use_valgrind) { -diff --git a/lib/common/logging.c b/lib/common/logging.c -index ad6bcfd..167583e 100644 ---- a/lib/common/logging.c -+++ b/lib/common/logging.c -@@ -234,6 +234,10 @@ crm_add_logfile(const char *filename) - - if (filename == NULL) { - return FALSE; /* Nothing to do */ -+ } else if(safe_str_eq(filename, "none")) { -+ return FALSE; /* Nothing to do */ -+ } else if(safe_str_eq(filename, "/dev/null")) { -+ return FALSE; /* Nothing to do */ - } - - /* Check the parent directory */ -@@ -317,6 +321,7 @@ crm_add_logfile(const char *filename) - /* Enable callsites */ - crm_update_callsites(); - have_logfile = TRUE; -+ - return TRUE; - } - -@@ -623,7 +628,8 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - int argc, char **argv, gboolean quiet) - { - int lpc = 0; -- const char *logfile = daemon_option("debugfile"); -+ int32_t qb_facility = 0; -+ const char *logfile = daemon_option("logfile"); - const char *facility = daemon_option("logfacility"); - const char *f_copy = facility; - -@@ -643,14 +649,7 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - /* and for good measure... - this enum is a bit field (!) */ - g_log_set_always_fatal((GLogLevelFlags) 0); /*value out of range */ - -- if (facility == NULL) { -- facility = "daemon"; -- -- } else if (safe_str_eq(facility, "none")) { -- facility = "daemon"; -- quiet = TRUE; -- } -- -+ /* Who do we log as */ - if (entity) { - free(crm_system_name); - crm_system_name = strdup(entity); -@@ -673,29 +672,54 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - - setenv("PCMK_service", crm_system_name, 1); - -- if (daemon_option_enabled(crm_system_name, "debug")) { -- /* Override the default setting */ -- level = LOG_DEBUG; -+ /* Should we log to syslog */ -+ if (facility == NULL) { -+ if(crm_is_daemon) { -+ facility = "daemon"; -+ } else { -+ facility = "none"; -+ } -+ set_daemon_option("logfacility", facility); - } - -- if (daemon_option_enabled(crm_system_name, "stderr")) { -+ if (safe_str_eq(facility, "none")) { -+ quiet = TRUE; -+ qb_facility = qb_log_facility2int("daemon"); -+ -+ } else { -+ qb_facility = qb_log_facility2int(facility); -+ } -+ -+ if (daemon_option_enabled(crm_system_name, "debug")) { - /* Override the default setting */ -- to_stderr = TRUE; -+ level = LOG_DEBUG; - } - -+ /* What lower threshold do we have for sending to syslog */ - crm_log_priority = crm_priority2int(daemon_option("logpriority")); - - crm_log_level = level; -- qb_log_init(crm_system_name, qb_log_facility2int(facility), level); -- qb_log_tags_stringify_fn_set(crm_quark_to_string); -+ qb_log_init(crm_system_name, qb_facility, crm_log_level); - -- /* Set default format strings */ -+ if (quiet) { -+ /* Nuke any syslog activity */ -+ qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE); -+ } -+ -+ /* Set format strings */ -+ qb_log_tags_stringify_fn_set(crm_quark_to_string); - for (lpc = QB_LOG_SYSLOG; lpc < QB_LOG_TARGET_MAX; lpc++) { - set_format_string(lpc, crm_system_name); - } - -+ /* Should we log to stderr */ -+ if (daemon_option_enabled(crm_system_name, "stderr")) { -+ /* Override the default setting */ -+ to_stderr = TRUE; -+ } - crm_enable_stderr(to_stderr); - -+ /* Should we log to a file */ - if (safe_str_eq("none", logfile)) { - /* No soup^Hlogs for you! */ - } else if(crm_is_daemon) { -@@ -709,20 +733,11 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - crm_enable_blackbox(0); - } - -+ /* Summary */ - crm_trace("Quiet: %d, facility %s", quiet, f_copy); -- daemon_option("debugfile"); -+ daemon_option("logfile"); - daemon_option("logfacility"); - -- if (quiet) { -- /* Nuke any syslog activity */ -- facility = NULL; -- qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE); -- } -- -- if (crm_is_daemon) { -- set_daemon_option("logfacility", facility); -- } -- - crm_update_callsites(); - - /* Ok, now we can start logging... */ -diff --git a/mcp/corosync.c b/mcp/corosync.c -index a97c8d8..24f5c22 100644 ---- a/mcp/corosync.c -+++ b/mcp/corosync.c -@@ -266,16 +266,9 @@ mcp_read_config(void) - { - int rc = CS_OK; - int retries = 0; -- gboolean have_log = FALSE; - - const char *const_value = NULL; - -- char *logging_debug = NULL; -- char *logging_logfile = NULL; -- char *logging_to_logfile = NULL; -- char *logging_to_syslog = NULL; -- char *logging_syslog_facility = NULL; -- - #if HAVE_CONFDB - char *value = NULL; - confdb_handle_t config = 0; -@@ -379,35 +372,83 @@ mcp_read_config(void) - #endif - - /* =::=::= Logging =::=::= */ -- get_config_opt(config, local_handle, KEY_PREFIX "debug", &logging_debug, "off"); -+ if (daemon_option("debug")) { -+ /* Syslog logging is already setup by crm_log_init() */ -+ -+ } else { -+ /* Check corosync */ -+ char *debug_enabled = NULL; -+ -+ get_config_opt(config, local_handle, KEY_PREFIX "debug", &debug_enabled, "off"); -+ -+ if (crm_is_true(debug_enabled)) { -+ set_daemon_option("debug", "1"); -+ if (get_crm_log_level() < LOG_DEBUG) { -+ set_crm_log_level(LOG_DEBUG); -+ } -+ -+ } else { -+ set_daemon_option("debug", "0"); -+ } -+ -+ free(debug_enabled); -+ } - - const_value = daemon_option("debugfile"); -- if (const_value) { -- logging_to_logfile = strdup("on"); -- logging_logfile = strdup(const_value); -- crm_trace("Using debugfile setting from the environment: %s", logging_logfile); -+ if (daemon_option("logfile")) { -+ /* File logging is already setup by crm_log_init() */ -+ -+ } else if(const_value) { -+ /* From when we cared what options heartbeat used */ -+ set_daemon_option("logfile", const_value); -+ crm_add_logfile(const_value); - - } else { -- get_config_opt(config, local_handle, KEY_PREFIX "to_logfile", &logging_to_logfile, "off"); -- get_config_opt(config, local_handle, KEY_PREFIX "logfile", &logging_logfile, -- "/var/log/pacemaker"); -- } -+ /* Check corosync */ -+ char *logfile = NULL; -+ char *logfile_enabled = NULL; -+ -+ get_config_opt(config, local_handle, KEY_PREFIX "to_logfile", &logfile_enabled, "on"); -+ get_config_opt(config, local_handle, KEY_PREFIX "logfile", &logfile, "/var/log/pacemaker.log"); -+ -+ if (crm_is_true(logfile_enabled) == FALSE) { -+ crm_trace("File logging disabled in corosync"); - -- const_value = daemon_option("logfacility"); -- if (const_value) { -- logging_syslog_facility = strdup(const_value); -- crm_trace("Using logfacility setting from the environment: %s", logging_syslog_facility); -+ } else if (crm_add_logfile(logfile)) { -+ set_daemon_option("logfile", logfile); - -- if (safe_str_eq(logging_syslog_facility, "none")) { -- logging_to_syslog = strdup("off"); - } else { -- logging_to_syslog = strdup("on"); -+ crm_err("Couldn't create logfile: %s", logfile); -+ set_daemon_option("logfile", "none"); - } - -+ free(logfile); -+ free(logfile_enabled); -+ } -+ -+ if (daemon_option("logfacility")) { -+ /* Syslog logging is already setup by crm_log_init() */ -+ - } else { -- get_config_opt(config, local_handle, KEY_PREFIX "to_syslog", &logging_to_syslog, "on"); -- get_config_opt(config, local_handle, KEY_PREFIX "syslog_facility", &logging_syslog_facility, -- "daemon"); -+ /* Check corosync */ -+ char *syslog_enabled = NULL; -+ char *syslog_facility = NULL; -+ -+ get_config_opt(config, local_handle, KEY_PREFIX "to_syslog", &syslog_enabled, "on"); -+ get_config_opt(config, local_handle, KEY_PREFIX "syslog_facility", &syslog_facility, "daemon"); -+ -+ if (crm_is_true(syslog_enabled) == FALSE) { -+ qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE); -+ set_daemon_option("logfacility", "none"); -+ -+ } else { -+ qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_FACILITY, qb_log_facility2int(syslog_facility)); -+ qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE); -+ set_daemon_option("logfacility", syslog_facility); -+ } -+ -+ free(syslog_enabled); -+ free(syslog_facility); - } - - #if HAVE_CONFDB -@@ -429,52 +470,5 @@ mcp_read_config(void) - cmap_finalize(local_handle); - #endif - -- if (daemon_option("debug")) { -- crm_trace("Using debug setting from the environment: %s", daemon_option("debug")); -- if (get_crm_log_level() < LOG_DEBUG && daemon_option_enabled("pacemakerd", "debug")) { -- set_crm_log_level(LOG_DEBUG); -- } -- -- } else if (crm_is_true(logging_debug)) { -- set_daemon_option("debug", "1"); -- if (get_crm_log_level() < LOG_DEBUG) { -- set_crm_log_level(LOG_DEBUG); -- } -- -- } else { -- set_daemon_option("debug", "0"); -- } -- -- if (crm_is_true(logging_to_logfile)) { -- if (crm_add_logfile(logging_logfile)) { -- /* What a cluster fsck, eventually we need to mandate /one/ */ -- set_daemon_option("debugfile", logging_logfile); -- set_daemon_option("DEBUGLOG", logging_logfile); -- have_log = TRUE; -- -- } else { -- crm_err("Couldn't create logfile: %s", logging_logfile); -- } -- } -- -- if (have_log && crm_is_true(logging_to_syslog) == FALSE) { -- qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE); -- free(logging_syslog_facility); -- logging_syslog_facility = strdup("none"); -- crm_info("User configured file based logging and explicitly disabled syslog."); -- -- } else if (crm_is_true(logging_to_syslog) == FALSE) { -- crm_err("Please enable some sort of logging, either 'to_logfile: on' or 'to_syslog: on'."); -- crm_err("If you use file logging, be sure to also define a value for 'logfile'"); -- } -- -- set_daemon_option("logfacility", logging_syslog_facility); -- setenv("HA_LOGFACILITY", logging_syslog_facility, 1); -- -- free(logging_debug); -- free(logging_logfile); -- free(logging_to_logfile); -- free(logging_to_syslog); -- free(logging_syslog_facility); - return TRUE; - } -diff --git a/mcp/pacemaker.sysconfig b/mcp/pacemaker.sysconfig -index 7f12111..50b4814 100644 ---- a/mcp/pacemaker.sysconfig -+++ b/mcp/pacemaker.sysconfig -@@ -14,7 +14,7 @@ - # Send INFO (and higher) messages to the named log file - # Additional messages may also appear here depending on any configured debug and trace settings - # By default Pacemaker will inherit the logfile specified in corosync.conf --# PCMK_debugfile=/var/log/pacemaker.log -+# PCMK_logfile=/var/log/pacemaker.log - - # Specify an alternate syslog target for NOTICE (and higher) messages - # Use 'none' to disable - not recommended diff --git a/SOURCES/bz1078078-pcmk-lrmd_expose_logging_variables_expected_by_ocf_agents.patch b/SOURCES/bz1078078-pcmk-lrmd_expose_logging_variables_expected_by_ocf_agents.patch deleted file mode 100644 index 31ff71b..0000000 --- a/SOURCES/bz1078078-pcmk-lrmd_expose_logging_variables_expected_by_ocf_agents.patch +++ /dev/null @@ -1,41 +0,0 @@ -commit 20d6b6e542b9814b081355ed19874f75445b0901 -Author: Andrew Beekhof -Date: Tue Apr 8 15:44:00 2014 +1000 - - Fix: lrmd: Expose logging variables expected by OCF agents - - (cherry picked from commit fa8bd56b776b97c3c845986d084c01b4aaf4063c) - -diff --git a/lrmd/main.c b/lrmd/main.c -index 38c5466..8e00f11 100644 ---- a/lrmd/main.c -+++ b/lrmd/main.c -@@ -246,6 +246,7 @@ main(int argc, char **argv) - int rc = 0; - int flag = 0; - int index = 0; -+ const char *option = NULL; - - #ifdef ENABLE_PCMK_REMOTE - crm_log_init("pacemaker_remoted", LOG_INFO, TRUE, FALSE, argc, argv, FALSE); -@@ -282,6 +283,20 @@ main(int argc, char **argv) - } - } - -+ option = daemon_option("logfacility"); -+ if(safe_str_neq(option, "none")) { -+ setenv("HA_LOGFACILITY", option, 1); /* Used by the ocf_log/ha_log OCF macro */ -+ } -+ -+ option = daemon_option("logfile"); -+ if(safe_str_neq(option, "none")) { -+ setenv("HA_LOGFILE", option, 1); /* Used by the ocf_log/ha_log OCF macro */ -+ -+ if (daemon_option_enabled(crm_system_name, "debug")) { -+ setenv("HA_DEBUGLOG", option, 1); /* Used by the ocf_log/ha_debug OCF macro */ -+ } -+ } -+ - /* Used by RAs - Leave owned by root */ - crm_build_path(CRM_RSCTMP_DIR, 0755); - diff --git a/SOURCES/bz1078078-pcmk-lrmd_provide_stderr_output_from_agents_if_available_otherwise_fall_back_to_stdout.patch b/SOURCES/bz1078078-pcmk-lrmd_provide_stderr_output_from_agents_if_available_otherwise_fall_back_to_stdout.patch deleted file mode 100644 index 9ad7774..0000000 --- a/SOURCES/bz1078078-pcmk-lrmd_provide_stderr_output_from_agents_if_available_otherwise_fall_back_to_stdout.patch +++ /dev/null @@ -1,151 +0,0 @@ -commit 2c6e6e1ad3ecbb186f9a43f89280d0d4391277e5 -Author: Andrew Beekhof -Date: Tue Apr 8 12:13:44 2014 +1000 - - Fix: lrmd: Provide stderr output from agents if available, otherwise fall back to stdout - - (cherry picked from commit d9cc751625ff3adfa158a2f769ab9038f6e317fd) - -diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c -index ac0138f..534e362 100644 ---- a/lib/services/services_linux.c -+++ b/lib/services/services_linux.c -@@ -57,34 +57,37 @@ set_fd_opts(int fd, int opts) - } - - static gboolean --read_output(int fd, svc_action_t * op) -+svc_read_output(int fd, svc_action_t * op, bool is_stderr) - { - char *data = NULL; - int rc = 0, len = 0; -- gboolean is_err = FALSE; - char buf[500]; - static const size_t buf_read_len = sizeof(buf) - 1; - -- crm_trace("%p", op); - - if (fd < 0) { -+ crm_trace("No fd for %s", op->id); - return FALSE; - } - -- if (fd == op->opaque->stderr_fd) { -- is_err = TRUE; -- if (op->stderr_data) { -- len = strlen(op->stderr_data); -- data = op->stderr_data; -- } -- } else if (op->stdout_data) { -+ if (is_stderr && op->stderr_data) { -+ len = strlen(op->stderr_data); -+ data = op->stderr_data; -+ crm_trace("Reading %s stderr into offset %d", op->id, len); -+ -+ } else if (is_stderr == FALSE && op->stdout_data) { - len = strlen(op->stdout_data); - data = op->stdout_data; -+ crm_trace("Reading %s stdout into offset %d", op->id, len); -+ -+ } else { -+ crm_trace("Reading %s %s", op->id, is_stderr?"stderr":"stdout", len); - } - - do { - rc = read(fd, buf, buf_read_len); - if (rc > 0) { -+ crm_trace("Got %d characters starting with %.20s", rc, buf); - buf[rc] = 0; - data = realloc(data, len + rc + 1); - sprintf(data + len, "%s", buf); -@@ -99,7 +102,7 @@ read_output(int fd, svc_action_t * op) - - } while (rc == buf_read_len || rc < 0); - -- if (data != NULL && is_err) { -+ if (data != NULL && is_stderr) { - op->stderr_data = data; - } else if (data != NULL) { - op->stdout_data = data; -@@ -113,7 +116,7 @@ dispatch_stdout(gpointer userdata) - { - svc_action_t *op = (svc_action_t *) userdata; - -- return read_output(op->opaque->stdout_fd, op); -+ return svc_read_output(op->opaque->stdout_fd, op, FALSE); - } - - static int -@@ -121,7 +124,7 @@ dispatch_stderr(gpointer userdata) - { - svc_action_t *op = (svc_action_t *) userdata; - -- return read_output(op->opaque->stderr_fd, op); -+ return svc_read_output(op->opaque->stderr_fd, op, TRUE); - } - - static void -@@ -264,18 +267,23 @@ operation_finished(mainloop_child_t * p, pid_t pid, int core, int signo, int exi - op->status = PCMK_LRM_OP_DONE; - CRM_ASSERT(op->pid == pid); - -+ crm_trace("%s %p %p", prefix, op->opaque->stderr_gsource, op->opaque->stdout_gsource); - if (op->opaque->stderr_gsource) { - /* Make sure we have read everything from the buffer. - * Depending on the priority mainloop gives the fd, operation_finished - * could occur before all the reads are done. Force the read now.*/ -+ crm_trace("%s dispatching stderr", prefix); - dispatch_stderr(op); -+ crm_trace("%s: %p", op->stderr_data); - } - - if (op->opaque->stdout_gsource) { - /* Make sure we have read everything from the buffer. - * Depending on the priority mainloop gives the fd, operation_finished - * could occur before all the reads are done. Force the read now.*/ -+ crm_trace("%s dispatching stdout", prefix); - dispatch_stdout(op); -+ crm_trace("%s: %p", op->stdout_data); - } - - if (signo) { -@@ -495,11 +503,11 @@ services_os_action_execute(svc_action_t * op, gboolean synchronous) - - if (poll_rc > 0) { - if (fds[0].revents & POLLIN) { -- read_output(op->opaque->stdout_fd, op); -+ svc_read_output(op->opaque->stdout_fd, op, FALSE); - } - - if (fds[1].revents & POLLIN) { -- read_output(op->opaque->stderr_fd, op); -+ svc_read_output(op->opaque->stderr_fd, op, TRUE); - } - - if (fds[2].revents & POLLIN) { -@@ -578,8 +586,8 @@ services_os_action_execute(svc_action_t * op, gboolean synchronous) - } - #endif - -- read_output(op->opaque->stdout_fd, op); -- read_output(op->opaque->stderr_fd, op); -+ svc_read_output(op->opaque->stdout_fd, op, FALSE); -+ svc_read_output(op->opaque->stderr_fd, op, TRUE); - - close(op->opaque->stdout_fd); - close(op->opaque->stderr_fd); -diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c -index 65421d0..517e98f 100644 ---- a/lrmd/lrmd.c -+++ b/lrmd/lrmd.c -@@ -599,7 +599,9 @@ action_complete(svc_action_t * action) - cmd->lrmd_op_status = action->status; - rsc = cmd->rsc_id ? g_hash_table_lookup(rsc_list, cmd->rsc_id) : NULL; - -- if (action->stdout_data) { -+ if (action->stderr_data) { -+ cmd->output = strdup(action->stderr_data); -+ } else if (action->stdout_data) { - cmd->output = strdup(action->stdout_data); - } - #if SUPPORT_NAGIOS diff --git a/SOURCES/bz1078078-pcmk-pe_automatically_re_unfence_a_node_if_the_fencing_device_definition_changes.patch b/SOURCES/bz1078078-pcmk-pe_automatically_re_unfence_a_node_if_the_fencing_device_definition_changes.patch deleted file mode 100644 index aa43324..0000000 --- a/SOURCES/bz1078078-pcmk-pe_automatically_re_unfence_a_node_if_the_fencing_device_definition_changes.patch +++ /dev/null @@ -1,577 +0,0 @@ -commit 5efd173dac6b22eee48f1f9372b2e86cb6d27282 -Author: Andrew Beekhof -Date: Thu Apr 3 16:02:23 2014 +1100 - - Feature: PE: Automatically re-unfence a node if the fencing device definition changes - - Ensures all resources that require unfencing are stopped first - If unfencing is enabled, this is the new default for resource.requires - - (cherry picked from commit 26fe2e39b9e060597cddeeb69d8b846784dfac55) - - Conflicts: - include/crm/pengine/internal.h - include/crm/pengine/status.h - lib/pengine/complex.c - -diff --git a/fencing/main.c b/fencing/main.c -index c40610e..e002125 100644 ---- a/fencing/main.c -+++ b/fencing/main.c -@@ -573,7 +573,6 @@ fencing_topology_init(xmlNode * msg) - } - - #define rsc_name(x) x->clone_name?x->clone_name:x->id --static bool have_fence_scsi = FALSE; - - static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) - { -@@ -662,34 +661,6 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) - data = create_device_registration_xml(rsc_name(rsc), provider, agent, params); - stonith_device_register(data, NULL, TRUE); - -- /* If required, unfence ourselves on cluster startup -- * -- * Make this generic/smarter if/when more than a single agent needs this -- */ -- if(have_fence_scsi == FALSE && safe_str_eq(agent, "fence_scsi")) { -- stonith_device_t *device = g_hash_table_lookup(device_list, rsc->id); -- -- if(stonith_our_uname == NULL) { -- crm_trace("Cannot unfence ourselves: no local host name"); -- -- } else if(device == NULL) { -- crm_err("Cannot unfence ourselves: no such device '%s'", rsc->id); -- -- } else { -- const char *alias = g_hash_table_lookup(device->aliases, stonith_our_uname); -- -- if (!alias) { -- alias = stonith_our_uname; -- } -- -- if (device->targets && string_in_list(device->targets, alias)) { -- have_fence_scsi = TRUE; -- crm_notice("Unfencing ourselves with %s (%s)", agent, device->id); -- schedule_internal_command(__FUNCTION__, device, "on", stonith_our_uname, 0, NULL, unfence_cb); -- } -- } -- } -- - stonith_key_value_freeall(params, 1, 1); - free_xml(data); - } -diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h -index 8575163..055f476 100644 ---- a/include/crm/msg_xml.h -+++ b/include/crm/msg_xml.h -@@ -200,6 +200,7 @@ - # define XML_RSC_ATTR_MULTIPLE "multiple-active" - # define XML_RSC_ATTR_PRIORITY "priority" - # define XML_RSC_ATTR_REQUIRES "requires" -+# define XML_RSC_ATTR_PROVIDES "provides" - # define XML_RSC_ATTR_CONTAINER "container" - # define XML_RSC_ATTR_INTERNAL_RSC "internal_rsc" - # define XML_OP_ATTR_ON_FAIL "on-fail" -diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h -index dd52e7f..657c647 100644 ---- a/include/crm/pengine/internal.h -+++ b/include/crm/pengine/internal.h -@@ -261,6 +261,7 @@ op_digest_cache_t *rsc_action_digest_cmp(resource_t * rsc, xmlNode * xml_op, nod - pe_working_set_t * data_set); - - gboolean is_remote_node(xmlNode *xml); -+void clear_bit_recursive(resource_t * rsc, unsigned long long flag); - - resource_t * rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc); - #endif -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index b74bf83..ddf9dd7 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -60,6 +60,7 @@ enum pe_find { - - # define pe_flag_stonith_enabled 0x00000010ULL - # define pe_flag_have_stonith_resource 0x00000020ULL -+# define pe_flag_enable_unfencing 0x00000040ULL - - # define pe_flag_stop_rsc_orphans 0x00000100ULL - # define pe_flag_stop_action_orphans 0x00000200ULL -@@ -165,6 +166,7 @@ struct node_s { - - # define pe_rsc_notify 0x00000010ULL - # define pe_rsc_unique 0x00000020ULL -+# define pe_rsc_fence_device 0x00000040ULL - - # define pe_rsc_provisional 0x00000100ULL - # define pe_rsc_allocating 0x00000200ULL -@@ -329,6 +331,12 @@ enum pe_ordering { - - pe_order_runnable_left = 0x100, /* 'then' requires 'first' to be runnable */ - -+ pe_order_pseudo_left = 0x200, /* 'then' can only be pseudo if 'first' is runnable */ -+ pe_order_implies_then_on_node = 0x400, /* If 'first' is required on 'nodeX', -+ * ensure instances of 'then' on 'nodeX' are too. -+ * Only really useful if 'then' is a clone and 'first' is not -+ */ -+ - pe_order_restart = 0x1000, /* 'then' is runnable if 'first' is optional or runnable */ - pe_order_stonith_stop = 0x2000, /* only applies if the action is non-pseudo */ - pe_order_serialize_only = 0x4000, /* serialize */ -diff --git a/lib/pengine/clone.c b/lib/pengine/clone.c -index c6c69e6..b13cceb 100644 ---- a/lib/pengine/clone.c -+++ b/lib/pengine/clone.c -@@ -46,7 +46,7 @@ mark_as_orphan(resource_t * rsc) - } - } - --static void -+void - clear_bit_recursive(resource_t * rsc, unsigned long long flag) - { - GListPtr gIter = rsc->children; -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 8a6049d..8b774c0 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -340,12 +340,13 @@ gboolean - common_unpack(xmlNode * xml_obj, resource_t ** rsc, - resource_t * parent, pe_working_set_t * data_set) - { -+ bool isdefault = FALSE; - xmlNode *expanded_xml = NULL; - xmlNode *ops = NULL; - resource_t *top = NULL; - const char *value = NULL; -+ const char *rclass = NULL; /* Look for this after any templates have been expanded */ - const char *id = crm_element_value(xml_obj, XML_ATTR_ID); -- const char *class = crm_element_value(xml_obj, XML_AGENT_ATTR_CLASS); - - crm_log_xml_trace(xml_obj, "Processing resource input..."); - -@@ -375,6 +376,8 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - (*rsc)->orig_xml = NULL; - } - -+ /* Do not use xml_obj from here on, use (*rsc)->xml in case templates are involved */ -+ rclass = crm_element_value((*rsc)->xml, XML_AGENT_ATTR_CLASS); - (*rsc)->parent = parent; - - ops = find_xml_node((*rsc)->xml, "operations", FALSE); -@@ -538,47 +541,67 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - } - } - -+ if (safe_str_eq(rclass, "stonith")) { -+ set_bit(data_set->flags, pe_flag_have_stonith_resource); -+ set_bit((*rsc)->flags, pe_rsc_fence_device); -+ } -+ - value = g_hash_table_lookup((*rsc)->meta, XML_RSC_ATTR_REQUIRES); -+ -+ handle_requires_pref: - if (safe_str_eq(value, "nothing")) { - - } else if (safe_str_eq(value, "quorum")) { - set_bit((*rsc)->flags, pe_rsc_needs_quorum); - - } else if (safe_str_eq(value, "unfencing")) { -- set_bit((*rsc)->flags, pe_rsc_needs_fencing); -- set_bit((*rsc)->flags, pe_rsc_needs_unfencing); -- if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -- crm_notice("%s requires (un)fencing but fencing is disabled", (*rsc)->id); -+ if (is_set((*rsc)->flags, pe_rsc_fence_device)) { -+ crm_config_warn("%s is a fencing device but requires (un)fencing", (*rsc)->id); -+ value = "quorum"; -+ isdefault = TRUE; -+ goto handle_requires_pref; -+ -+ } else if (is_not_set(data_set->flags, pe_flag_stonith_enabled)) { -+ crm_config_warn("%s requires (un)fencing but fencing is disabled", (*rsc)->id); -+ value = "quorum"; -+ isdefault = TRUE; -+ goto handle_requires_pref; -+ -+ } else { -+ set_bit((*rsc)->flags, pe_rsc_needs_fencing); -+ set_bit((*rsc)->flags, pe_rsc_needs_unfencing); - } - - } else if (safe_str_eq(value, "fencing")) { - set_bit((*rsc)->flags, pe_rsc_needs_fencing); - if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -- crm_notice("%s requires fencing but fencing is disabled", (*rsc)->id); -+ crm_config_warn("%s requires (un)fencing but fencing is disabled", (*rsc)->id); - } - - } else { - if (value) { - crm_config_err("Invalid value for %s->requires: %s%s", - (*rsc)->id, value, -- is_set(data_set->flags, -- pe_flag_stonith_enabled) ? "" : " (stonith-enabled=false)"); -+ is_set(data_set->flags, pe_flag_stonith_enabled) ? "" : " (stonith-enabled=false)"); - } - -- if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -- set_bit((*rsc)->flags, pe_rsc_needs_fencing); -- value = "fencing (default)"; -+ isdefault = TRUE; -+ if (is_set(data_set->flags, pe_flag_enable_unfencing)) { -+ value = "unfencing"; -+ -+ } else if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -+ value = "fencing"; - - } else if (data_set->no_quorum_policy == no_quorum_ignore) { -- value = "nothing (default)"; -+ value = "nothing"; - - } else { -- set_bit((*rsc)->flags, pe_rsc_needs_quorum); -- value = "quorum (default)"; -+ value = "quorum"; - } -+ goto handle_requires_pref; - } - -- pe_rsc_trace((*rsc), "\tRequired to start: %s", value); -+ pe_rsc_trace((*rsc), "\tRequired to start: %s%s", value, isdefault?" (default)":""); - - value = g_hash_table_lookup((*rsc)->meta, XML_RSC_ATTR_FAIL_TIMEOUT); - if (value != NULL) { -@@ -606,10 +629,6 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - pe_rsc_trace((*rsc), "\tAction notification: %s", - is_set((*rsc)->flags, pe_rsc_notify) ? "required" : "not required"); - -- if (safe_str_eq(class, "stonith")) { -- set_bit(data_set->flags, pe_flag_have_stonith_resource); -- } -- - (*rsc)->utilization = - g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); - -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 56ed291..39ded96 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -77,6 +77,35 @@ unpack_config(xmlNode * config, pe_working_set_t * data_set) - GHashTable *config_hash = - g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); - -+ xmlXPathObjectPtr xpathObj = NULL; -+ -+ if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -+ xpathObj = xpath_search(data_set->input, "//nvpair[@name='provides' and @value='unfencing']"); -+ if(xpathObj && numXpathResults(xpathObj) > 0) { -+ set_bit(data_set->flags, pe_flag_enable_unfencing); -+ } -+ freeXpathObject(xpathObj); -+ } -+ -+ if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -+ xpathObj = xpath_search(data_set->input, "//nvpair[@name='requires' and @value='unfencing']"); -+ if(xpathObj && numXpathResults(xpathObj) > 0) { -+ set_bit(data_set->flags, pe_flag_enable_unfencing); -+ } -+ freeXpathObject(xpathObj); -+ } -+ -+ -+#ifdef REDHAT_COMPAT_6 -+ if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -+ xpathObj = xpath_search(data_set->input, "//primitive[@type='fence_scsi']"); -+ if(xpathObj && numXpathResults(xpathObj) > 0) { -+ set_bit(data_set->flags, pe_flag_enable_unfencing); -+ } -+ freeXpathObject(xpathObj); -+ } -+#endif -+ - data_set->config_hash = config_hash; - - unpack_instance_attributes(data_set->input, config, XML_CIB_TAG_PROPSET, NULL, config_hash, -diff --git a/pengine/allocate.c b/pengine/allocate.c -index b9ce069..88258f4 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -123,6 +123,7 @@ check_rsc_parameters(resource_t * rsc, node_t * node, xmlNode * rsc_entry, - } - - changed = TRUE; -+ trigger_unfencing(rsc, node, "Device definition changed", NULL, data_set); - if (active_here) { - force_restart = TRUE; - crm_notice("Forcing restart of %s on %s, %s changed: %s -> %s", -@@ -169,6 +170,7 @@ CancelXmlOp(resource_t * rsc, xmlNode * xml_op, node_t * active_node, - crm_info("Action %s on %s will be stopped: %s", - key, active_node->details->uname, reason ? reason : "unknown"); - -+ /* TODO: This looks highly dangerous if we ever try to schedule 'key' too */ - cancel = custom_action(rsc, strdup(key), RSC_CANCEL, active_node, FALSE, TRUE, data_set); - - free(cancel->task); -@@ -227,6 +229,7 @@ check_action_definition(resource_t * rsc, node_t * active_node, xmlNode * xml_op - key = NULL; - } - -+ crm_trace("Testing %s_%s_%d on %s", rsc->id, task, interval, active_node?active_node->details->uname:"N/A"); - if (interval == 0 && safe_str_eq(task, RSC_STATUS)) { - /* Reload based on the start action not a probe */ - task = RSC_START; -@@ -252,6 +255,7 @@ check_action_definition(resource_t * rsc, node_t * active_node, xmlNode * xml_op - op_version, crm_element_value(xml_op, XML_ATTR_TRANSITION_MAGIC)); - - custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); -+ trigger_unfencing(rsc, NULL, "Device parameters changed", NULL, data_set); - - } else if ((digest_data->rc == RSC_DIGEST_ALL) || (digest_data->rc == RSC_DIGEST_UNKNOWN)) { - /* Changes that can potentially be handled by a reload */ -@@ -259,6 +263,7 @@ check_action_definition(resource_t * rsc, node_t * active_node, xmlNode * xml_op - const char *digest_all = crm_element_value(xml_op, XML_LRM_ATTR_OP_DIGEST); - - did_change = TRUE; -+ trigger_unfencing(rsc, NULL, "Device parameters changed (reload)", NULL, data_set); - crm_log_xml_info(digest_data->params_all, "params:reload"); - key = generate_op_key(rsc->id, task, interval); - pe_rsc_info(rsc, "Parameters to %s on %s changed: was %s vs. now %s (reload:%s) %s", -@@ -1262,8 +1267,40 @@ any_managed_resources(pe_working_set_t * data_set) - return FALSE; - } - -+void -+trigger_unfencing( -+ resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set) -+{ -+ if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -+ /* No resources require it */ -+ return; -+ -+ } else if (rsc != NULL && is_not_set(rsc->flags, pe_rsc_fence_device)) { -+ /* Wasnt a stonith device */ -+ return; -+ -+ } else if(node) { -+ action_t *unfence = pe_fence_op(node, "on", FALSE, data_set); -+ -+ crm_notice("Unfencing %s: %s", node->details->uname, reason); -+ if(FALSE && dependancy) { -+ order_actions(dependancy, unfence, pe_order_optional); -+ } -+ -+ } else if(rsc) { -+ GHashTableIter iter; -+ -+ g_hash_table_iter_init(&iter, rsc->allowed_nodes); -+ while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { -+ if(node->details->online && node->details->unclean == FALSE && node->details->shutdown == FALSE) { -+ trigger_unfencing(rsc, node, reason, dependancy, data_set); -+ } -+ } -+ } -+} -+ - action_t * --pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set) -+pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set) - { - char *key = NULL; - action_t *stonith_op = NULL; -@@ -1279,13 +1316,18 @@ pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set) - } - - if(stonith_op == NULL) { -- stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, FALSE, TRUE, data_set); -+ stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, optional, TRUE, data_set); - - add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); - add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); - add_hash_param(stonith_op->meta, "stonith_action", op); - } - -+ if(optional == FALSE) { -+ crm_trace("%s is no longer optional", stonith_op->uuid); -+ pe_clear_action_bit(stonith_op, pe_action_optional); -+ } -+ - return stonith_op; - } - -@@ -1323,7 +1365,7 @@ stage6(pe_working_set_t * data_set) - if (need_stonith && node->details->unclean && pe_can_fence(data_set, node)) { - pe_warn("Scheduling Node %s for STONITH", node->details->uname); - -- stonith_op = pe_fence_op(node, NULL, data_set); -+ stonith_op = pe_fence_op(node, NULL, FALSE, data_set); - - stonith_constraints(node, stonith_op, data_set); - -diff --git a/pengine/allocate.h b/pengine/allocate.h -index 042d3aa..712de60 100644 ---- a/pengine/allocate.h -+++ b/pengine/allocate.h -@@ -51,7 +51,7 @@ struct resource_alloc_functions_s { - void (*append_meta) (resource_t * rsc, xmlNode * xml); - }; - --action_t *pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set); -+action_t *pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set); - - extern GHashTable *rsc_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, - const char *attr, float factor, enum pe_weights flags); -@@ -161,6 +161,8 @@ extern void rsc_migrate_reload(resource_t * rsc, pe_working_set_t * data_set); - extern void rsc_stonith_ordering(resource_t * rsc, action_t * stonith_op, - pe_working_set_t * data_set); - -+void trigger_unfencing(resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set); -+ - extern enum pe_graph_flags native_update_actions(action_t * first, action_t * then, node_t * node, - enum pe_action_flags flags, - enum pe_action_flags filter, -diff --git a/pengine/graph.c b/pengine/graph.c -index 779f0e0..9c82d23 100644 ---- a/pengine/graph.c -+++ b/pengine/graph.c -@@ -430,11 +430,49 @@ update_action(action_t * then) - uname : "", other->type); - - if (first == other->action) { -+ /* -+ * 'first' was not expanded (ie. from 'start' to 'running'), which could mean it: -+ * - has no associated resource, -+ * - was a primitive, -+ * - was pre-expanded (ie. 'running' instead of 'start') -+ * -+ * The third argument here to graph_update_action() is a node which is used under two conditions: -+ * - Interleaving, in which case first->node and -+ * then->node are equal (and NULL) -+ * - If 'then' is a clone, to limit the scope of the -+ * constraint to instances on the supplied node -+ * -+ */ -+ int otype = other->type; -+ node_t *node = then->node; -+ -+ if(is_set(otype, pe_order_implies_then_on_node)) { -+ /* Normally we want the _whole_ 'then' clone to -+ * restart if 'first' is restarted, so then->node is -+ * needed. -+ * -+ * However for unfencing, we want to limit this to -+ * instances on the same node as 'first' (the -+ * unfencing operation), so first->node is supplied. -+ * -+ * Swap the node, from then on we can can treat it -+ * like any other 'pe_order_implies_then' -+ */ -+ -+ clear_bit(otype, pe_order_implies_then_on_node); -+ set_bit(otype, pe_order_implies_then); -+ node = first->node; -+ } - clear_bit(first_flags, pe_action_pseudo); -- changed |= graph_update_action(first, then, then->node, first_flags, other->type); -+ changed |= graph_update_action(first, then, node, first_flags, otype); - -+ /* 'first' was for a complex resource (clone, group, etc), -+ * create a new dependancy if necessary -+ */ - } else if (order_actions(first, then, other->type)) { -- /* Start again to get the new actions_before list */ -+ /* This was the first time 'first' and 'then' were associated, -+ * start again to get the new actions_before list -+ */ - changed |= (pe_graph_updated_then | pe_graph_disable); - } - -diff --git a/pengine/native.c b/pengine/native.c -index 4016a3c..d0eb950 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -1236,9 +1236,7 @@ native_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) - - resource_t *top = uber_parent(rsc); - int type = pe_order_optional | pe_order_implies_then | pe_order_restart; -- gboolean is_stonith = -- (rsc->xml && safe_str_eq(crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS), "stonith")) ? -- TRUE : FALSE; -+ gboolean is_stonith = is_set(rsc->flags, pe_rsc_fence_device); - - custom_action_order(rsc, generate_op_key(rsc->id, RSC_STOP, 0), NULL, - rsc, generate_op_key(rsc->id, RSC_START, 0), NULL, type, data_set); -@@ -1253,6 +1251,34 @@ native_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) - pe_order_runnable_left, data_set); - } - -+ if (is_stonith == FALSE -+ && is_set(data_set->flags, pe_flag_enable_unfencing) -+ && is_set(rsc->flags, pe_rsc_needs_unfencing)) { -+ /* Check if the node needs to be unfenced first */ -+ node_t *node = NULL; -+ GHashTableIter iter; -+ -+ if(rsc != top) { -+ /* Only create these constraints once, rsc is almost certainly cloned */ -+ clear_bit_recursive(top, pe_rsc_needs_unfencing); -+ } -+ -+ g_hash_table_iter_init(&iter, rsc->allowed_nodes); -+ while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { -+ action_t *unfence = pe_fence_op(node, "on", TRUE, data_set); -+ -+ custom_action_order(top, generate_op_key(top->id, top == rsc?RSC_STOP:RSC_STOPPED, 0), NULL, -+ NULL, strdup(unfence->uuid), unfence, -+ pe_order_optional, data_set); -+ -+ crm_debug("Stopping %s prior to unfencing %s", top->id, unfence->uuid); -+ -+ custom_action_order(NULL, strdup(unfence->uuid), unfence, -+ top, generate_op_key(top->id, RSC_START, 0), NULL, -+ pe_order_implies_then_on_node, data_set); -+ } -+ } -+ - if (is_not_set(rsc->flags, pe_rsc_managed)) { - pe_rsc_trace(rsc, "Skipping fencing constraints for unmanaged resource: %s", rsc->id); - return; -@@ -2456,20 +2482,9 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - probe = custom_action(rsc, key, RSC_STATUS, node, FALSE, TRUE, data_set); - update_action_flags(probe, pe_action_optional | pe_action_clear); - -- /* Check if the node needs to be unfenced first */ -- if (is_set(rsc->flags, pe_rsc_needs_unfencing)) { -- action_t *unfence = pe_fence_op(node, "on", data_set); -- -- crm_notice("Unfencing %s for %s", node->details->uname, rsc->id); -- order_actions(unfence, probe, pe_order_implies_then); -- -- /* The lack of ordering constraints on STONITH_UP would -- * traditionally mean unfencing is initiated /before/ the -- * devices are started. -- * -- * However this is a non-issue as stonithd is now smart -- * enough to be able to use devices directly from the cib -- */ -+ if(is_set(rsc->flags, pe_rsc_fence_device)) { -+ crm_crit("TODO: %s: Trigger when probing the device or the resource that needs unfencing?", rsc->id); -+ trigger_unfencing(NULL, node, "node discovery", probe, data_set); - } - - /* -diff --git a/pengine/regression.sh b/pengine/regression.sh -index aa50854..9cb6c18 100755 ---- a/pengine/regression.sh -+++ b/pengine/regression.sh -@@ -317,6 +317,11 @@ do_test bug-cl-5170 "Prevent clone from starting with on-fail=block" - do_test clone-fail-block-colocation "Move colocated group when failed clone has on-fail=block" - - echo "" -+do_test unfence-startup "Clean unfencing" -+do_test unfence-definition "Unfencing when the agent changes" -+do_test unfence-parameters "Unfencing when the agent parameters changes" -+ -+echo "" - do_test master-0 "Stopped -> Slave" - do_test master-1 "Stopped -> Promote" - do_test master-2 "Stopped -> Promote : notify" diff --git a/SOURCES/bz1078078-pcmk-pe_delay_unfencing_until_after_we_know_the_state_of_all_resources_that_require_unfencing.patch b/SOURCES/bz1078078-pcmk-pe_delay_unfencing_until_after_we_know_the_state_of_all_resources_that_require_unfencing.patch deleted file mode 100644 index 3503c88..0000000 --- a/SOURCES/bz1078078-pcmk-pe_delay_unfencing_until_after_we_know_the_state_of_all_resources_that_require_unfencing.patch +++ /dev/null @@ -1,2251 +0,0 @@ -commit cf7988cb02e96f7a278569dcee410691cb7b85e0 -Author: Andrew Beekhof -Date: Fri Apr 4 11:59:13 2014 +1100 - - Fix: PE: Delay unfencing until after we know the state of all resources that require unfencing - - (cherry picked from commit 22666466bd9e50efdd8efb6c1775c71785c900b1) - - Conflicts: - include/crm/pengine/internal.h - include/crm/pengine/status.h - lib/pengine/unpack.c - lib/pengine/utils.c - pengine/test10/unfence-definition.dot - pengine/test10/unfence-definition.exp - pengine/test10/unfence-definition.summary - pengine/test10/unfence-parameters.dot - pengine/test10/unfence-parameters.exp - pengine/test10/unfence-parameters.summary - pengine/test10/unfence-startup.dot - pengine/test10/unfence-startup.exp - pengine/test10/unfence-startup.xml - -diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h -index 657c647..b4907c1 100644 ---- a/include/crm/pengine/internal.h -+++ b/include/crm/pengine/internal.h -@@ -260,8 +260,13 @@ typedef struct op_digest_cache_s { - op_digest_cache_t *rsc_action_digest_cmp(resource_t * rsc, xmlNode * xml_op, node_t * node, - pe_working_set_t * data_set); - --gboolean is_remote_node(xmlNode *xml); -+action_t *pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set); -+void trigger_unfencing( -+ resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set); -+ -+void set_bit_recursive(resource_t * rsc, unsigned long long flag); - void clear_bit_recursive(resource_t * rsc, unsigned long long flag); - -+gboolean is_remote_node(xmlNode *xml); - resource_t * rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc); - #endif -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index ddf9dd7..6542737 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -191,6 +191,7 @@ struct node_s { - # define pe_rsc_needs_quorum 0x10000000ULL - # define pe_rsc_needs_fencing 0x20000000ULL - # define pe_rsc_needs_unfencing 0x40000000ULL -+# define pe_rsc_have_unfencing 0x80000000ULL - - enum pe_graph_flags { - pe_graph_none = 0x00000, -diff --git a/lib/pengine/clone.c b/lib/pengine/clone.c -index b13cceb..90d7eca 100644 ---- a/lib/pengine/clone.c -+++ b/lib/pengine/clone.c -@@ -47,19 +47,6 @@ mark_as_orphan(resource_t * rsc) - } - - void --clear_bit_recursive(resource_t * rsc, unsigned long long flag) --{ -- GListPtr gIter = rsc->children; -- -- clear_bit(rsc->flags, flag); -- for (; gIter != NULL; gIter = gIter->next) { -- resource_t *child_rsc = (resource_t *) gIter->data; -- -- clear_bit_recursive(child_rsc, flag); -- } --} -- --void - force_non_unique_clone(resource_t * rsc, const char *rid, pe_working_set_t * data_set) - { - if (rsc->variant == pe_clone || rsc->variant == pe_master) { -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 0f20481..a3133e7 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -575,7 +575,7 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - } else if (safe_str_eq(value, "fencing")) { - set_bit((*rsc)->flags, pe_rsc_needs_fencing); - if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -- crm_config_warn("%s requires (un)fencing but fencing is disabled", (*rsc)->id); -+ crm_config_warn("%s requires fencing but fencing is disabled", (*rsc)->id); - } - - } else { -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 39ded96..eb10bd8 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2325,6 +2325,31 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - * didnt include target_rc and liked to remap status - */ - switch (actual_rc_i) { -+ case PCMK_OCF_OK: -+ if (is_probe && target_rc == 7) { -+ task_status_i = PCMK_LRM_OP_DONE; -+ set_bit(rsc->flags, pe_rsc_unexpectedly_running); -+ -+ if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { -+ /* _Require_ unfencing after probing resources that need unfencing and was found active */ -+ crm_warn("Operation %s found resource %s active on %s: triggering unfencing", -+ task, rsc->id, node->details->uname); -+ trigger_unfencing(NULL, node, "Unexpected state", NULL, data_set); -+ -+ } else { -+ pe_rsc_info(rsc, "Operation %s found resource %s active on %s", -+ task, rsc->id, node->details->uname); -+ } -+ -+ /* legacy code for pre-0.6.5 operations */ -+ } else if (target_rc < 0 && interval > 0 && rsc->role == RSC_ROLE_MASTER) { -+ /* catch status ops that return 0 instead of 8 while they -+ * are supposed to be in master mode -+ */ -+ task_status_i = PCMK_LRM_OP_ERROR; -+ } -+ break; -+ - case PCMK_OCF_NOT_RUNNING: - if (is_probe || target_rc == actual_rc_i) { - task_status_i = PCMK_LRM_OP_DONE; -@@ -2415,23 +2440,6 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - } - break; - -- case PCMK_OCF_OK: -- if (is_probe && target_rc == 7) { -- task_status_i = PCMK_LRM_OP_DONE; -- set_bit(rsc->flags, pe_rsc_unexpectedly_running); -- pe_rsc_info(rsc, "Operation %s found resource %s active on %s", -- task, rsc->id, node->details->uname); -- -- /* legacy code for pre-0.6.5 operations */ -- } else if (target_rc < 0 && interval > 0 && rsc->role == RSC_ROLE_MASTER) { -- /* catch status ops that return 0 instead of 8 while they -- * are supposed to be in master mode -- */ -- task_status_i = PCMK_LRM_OP_ERROR; -- } -- -- break; -- - default: - if (task_status_i == PCMK_LRM_OP_DONE) { - crm_info("Remapping %s (rc=%d) on %s to an ERROR", -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 2520eeb..e84d341 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1807,3 +1807,92 @@ rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc) - return NULL; - } - -+void -+clear_bit_recursive(resource_t * rsc, unsigned long long flag) -+{ -+ GListPtr gIter = rsc->children; -+ -+ clear_bit(rsc->flags, flag); -+ for (; gIter != NULL; gIter = gIter->next) { -+ resource_t *child_rsc = (resource_t *) gIter->data; -+ -+ clear_bit_recursive(child_rsc, flag); -+ } -+} -+ -+void -+set_bit_recursive(resource_t * rsc, unsigned long long flag) -+{ -+ GListPtr gIter = rsc->children; -+ -+ set_bit(rsc->flags, flag); -+ for (; gIter != NULL; gIter = gIter->next) { -+ resource_t *child_rsc = (resource_t *) gIter->data; -+ -+ set_bit_recursive(child_rsc, flag); -+ } -+} -+ -+action_t * -+pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set) -+{ -+ char *key = NULL; -+ action_t *stonith_op = NULL; -+ -+ if(op == NULL) { -+ op = data_set->stonith_action; -+ } -+ -+ key = g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op); -+ -+ if(data_set->singletons) { -+ stonith_op = g_hash_table_lookup(data_set->singletons, key); -+ } -+ -+ if(stonith_op == NULL) { -+ stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, optional, TRUE, data_set); -+ -+ add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); -+ add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); -+ add_hash_param(stonith_op->meta, "stonith_action", op); -+ } -+ -+ if(optional == FALSE) { -+ crm_trace("%s is no longer optional", stonith_op->uuid); -+ pe_clear_action_bit(stonith_op, pe_action_optional); -+ } -+ -+ return stonith_op; -+} -+ -+void -+trigger_unfencing( -+ resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set) -+{ -+ if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -+ /* No resources require it */ -+ return; -+ -+ } else if (rsc != NULL && is_not_set(rsc->flags, pe_rsc_fence_device)) { -+ /* Wasnt a stonith device */ -+ return; -+ -+ } else if(node) { -+ action_t *unfence = pe_fence_op(node, "on", FALSE, data_set); -+ -+ crm_notice("Unfencing %s: %s", node->details->uname, reason); -+ if(FALSE && dependancy) { -+ order_actions(unfence, dependancy, pe_order_optional); -+ } -+ -+ } else if(rsc) { -+ GHashTableIter iter; -+ -+ g_hash_table_iter_init(&iter, rsc->allowed_nodes); -+ while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { -+ if(node->details->online && node->details->unclean == FALSE && node->details->shutdown == FALSE) { -+ trigger_unfencing(rsc, node, reason, dependancy, data_set); -+ } -+ } -+ } -+} -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 88258f4..3480eb9 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1267,70 +1267,6 @@ any_managed_resources(pe_working_set_t * data_set) - return FALSE; - } - --void --trigger_unfencing( -- resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set) --{ -- if(is_not_set(data_set->flags, pe_flag_enable_unfencing)) { -- /* No resources require it */ -- return; -- -- } else if (rsc != NULL && is_not_set(rsc->flags, pe_rsc_fence_device)) { -- /* Wasnt a stonith device */ -- return; -- -- } else if(node) { -- action_t *unfence = pe_fence_op(node, "on", FALSE, data_set); -- -- crm_notice("Unfencing %s: %s", node->details->uname, reason); -- if(FALSE && dependancy) { -- order_actions(dependancy, unfence, pe_order_optional); -- } -- -- } else if(rsc) { -- GHashTableIter iter; -- -- g_hash_table_iter_init(&iter, rsc->allowed_nodes); -- while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { -- if(node->details->online && node->details->unclean == FALSE && node->details->shutdown == FALSE) { -- trigger_unfencing(rsc, node, reason, dependancy, data_set); -- } -- } -- } --} -- --action_t * --pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set) --{ -- char *key = NULL; -- action_t *stonith_op = NULL; -- -- if(op == NULL) { -- op = data_set->stonith_action; -- } -- -- key = g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op); -- -- if(data_set->singletons) { -- stonith_op = g_hash_table_lookup(data_set->singletons, key); -- } -- -- if(stonith_op == NULL) { -- stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, optional, TRUE, data_set); -- -- add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); -- add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); -- add_hash_param(stonith_op->meta, "stonith_action", op); -- } -- -- if(optional == FALSE) { -- crm_trace("%s is no longer optional", stonith_op->uuid); -- pe_clear_action_bit(stonith_op, pe_action_optional); -- } -- -- return stonith_op; --} -- - /* - * Create dependancies for stonith and shutdown operations - */ -diff --git a/pengine/allocate.h b/pengine/allocate.h -index 712de60..0a352fd 100644 ---- a/pengine/allocate.h -+++ b/pengine/allocate.h -@@ -51,8 +51,6 @@ struct resource_alloc_functions_s { - void (*append_meta) (resource_t * rsc, xmlNode * xml); - }; - --action_t *pe_fence_op(node_t * node, const char *op, bool optional, pe_working_set_t * data_set); -- - extern GHashTable *rsc_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, - const char *attr, float factor, enum pe_weights flags); - -@@ -161,8 +159,6 @@ extern void rsc_migrate_reload(resource_t * rsc, pe_working_set_t * data_set); - extern void rsc_stonith_ordering(resource_t * rsc, action_t * stonith_op, - pe_working_set_t * data_set); - --void trigger_unfencing(resource_t * rsc, node_t *node, const char *reason, action_t *dependancy, pe_working_set_t * data_set); -- - extern enum pe_graph_flags native_update_actions(action_t * first, action_t * then, node_t * node, - enum pe_action_flags flags, - enum pe_action_flags filter, -diff --git a/pengine/native.c b/pengine/native.c -index d0eb950..3d75dc9 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -1253,14 +1253,15 @@ native_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) - - if (is_stonith == FALSE - && is_set(data_set->flags, pe_flag_enable_unfencing) -- && is_set(rsc->flags, pe_rsc_needs_unfencing)) { -+ && is_set(rsc->flags, pe_rsc_needs_unfencing) -+ && is_not_set(rsc->flags, pe_rsc_have_unfencing)) { - /* Check if the node needs to be unfenced first */ - node_t *node = NULL; - GHashTableIter iter; - - if(rsc != top) { - /* Only create these constraints once, rsc is almost certainly cloned */ -- clear_bit_recursive(top, pe_rsc_needs_unfencing); -+ clear_bit_recursive(top, pe_rsc_have_unfencing); - } - - g_hash_table_iter_init(&iter, rsc->allowed_nodes); -@@ -2482,9 +2483,26 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - probe = custom_action(rsc, key, RSC_STATUS, node, FALSE, TRUE, data_set); - update_action_flags(probe, pe_action_optional | pe_action_clear); - -- if(is_set(rsc->flags, pe_rsc_fence_device)) { -- crm_crit("TODO: %s: Trigger when probing the device or the resource that needs unfencing?", rsc->id); -+ /* If enabled, require unfencing before probing any fence devices -+ * but ensure it happens after any resources that require -+ * unfencing have been probed. -+ * -+ * Doing it the other way (requiring unfencing after probing -+ * resources that need it) would result in the node being -+ * unfenced, and all its resources being stopped, whenever a new -+ * resource is added. Which would be highly suboptimal. -+ * -+ * So essentially, at the point the fencing device(s) have been -+ * probed, we know the state of all resources that require -+ * unfencing and that unfencing occurred. -+ */ -+ if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { - trigger_unfencing(NULL, node, "node discovery", probe, data_set); -+ -+ } else if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { -+ action_t *unfence = pe_fence_op(node, "on", TRUE, data_set); -+ -+ order_actions(probe, unfence, pe_order_optional); - } - - /* -diff --git a/pengine/test10/unfence-definition.dot b/pengine/test10/unfence-definition.dot -new file mode 100644 -index 0000000..e737687 ---- /dev/null -+++ b/pengine/test10/unfence-definition.dot -@@ -0,0 +1,102 @@ -+digraph "g" { -+"all_stopped" -> "fencing_start_0 virt-1" [ style = bold] -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_start_0" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd_start_0 virt-1" [ style = bold] -+"clvmd-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_stop_0" -> "clvmd-clone_stopped_0" [ style = bold] -+"clvmd-clone_stop_0" -> "clvmd_stop_0 virt-1" [ style = bold] -+"clvmd-clone_stop_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_stopped_0" -> "clvmd-clone_start_0" [ style = bold] -+"clvmd-clone_stopped_0" -> "dlm-clone_stop_0" [ style = bold] -+"clvmd-clone_stopped_0" -> "stonith 'on' virt-1" [ style = bold] -+"clvmd-clone_stopped_0" -> "stonith 'on' virt-3" [ style = bold] -+"clvmd-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd:1_monitor_0 virt-2" -> "probe_complete virt-2" [ style = bold] -+"clvmd:1_monitor_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:1_start_0 virt-2" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:1_start_0 virt-2" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd:1_start_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_start_0 virt-3" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"clvmd_start_0 virt-1" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd_start_0 virt-1" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"clvmd_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"clvmd_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"clvmd_stop_0 virt-1" -> "clvmd-clone_stopped_0" [ style = bold] -+"clvmd_stop_0 virt-1" -> "clvmd_start_0 virt-1" [ style = bold] -+"clvmd_stop_0 virt-1" -> "dlm_stop_0 virt-1" [ style = bold] -+"clvmd_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"dlm-clone_running_0" -> "clvmd-clone_start_0" [ style = bold] -+"dlm-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_start_0" -> "dlm-clone_running_0" [ style = bold] -+"dlm-clone_start_0" -> "dlm:2_start_0 virt-3" [ style = bold] -+"dlm-clone_start_0" -> "dlm_start_0 virt-1" [ style = bold] -+"dlm-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_stop_0" -> "dlm-clone_stopped_0" [ style = bold] -+"dlm-clone_stop_0" -> "dlm_stop_0 virt-1" [ style = bold] -+"dlm-clone_stop_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_stopped_0" -> "dlm-clone_start_0" [ style = bold] -+"dlm-clone_stopped_0" -> "stonith 'on' virt-1" [ style = bold] -+"dlm-clone_stopped_0" -> "stonith 'on' virt-3" [ style = bold] -+"dlm-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"dlm:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm:2_start_0 virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"dlm:2_start_0 virt-3" -> "dlm-clone_running_0" [ style = bold] -+"dlm:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm_start_0 virt-1" -> "clvmd_start_0 virt-1" [ style = bold] -+"dlm_start_0 virt-1" -> "dlm-clone_running_0" [ style = bold] -+"dlm_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"dlm_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"dlm_stop_0 virt-1" -> "dlm-clone_stopped_0" [ style = bold] -+"dlm_stop_0 virt-1" -> "dlm_start_0 virt-1" [ style = bold] -+"dlm_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"fencing_delete_0 virt-1" -> "fencing_start_0 virt-1" [ style = bold] -+"fencing_delete_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"fencing_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"fencing_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"fencing_stop_0 virt-1" -> "fencing_delete_0 virt-1" [ style = bold] -+"fencing_stop_0 virt-1" -> "fencing_start_0 virt-1" [ style = bold] -+"fencing_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-1" -> "probe_complete" [ style = bold] -+"probe_complete virt-1" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-2" -> "probe_complete" [ style = bold] -+"probe_complete virt-2" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-3" -> "probe_complete" [ style = bold] -+"probe_complete virt-3" [ style=bold color="green" fontcolor="black"] -+"probe_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"probe_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"probe_complete" -> "clvmd_start_0 virt-1" [ style = bold] -+"probe_complete" -> "clvmd_stop_0 virt-1" [ style = bold] -+"probe_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"probe_complete" -> "dlm_start_0 virt-1" [ style = bold] -+"probe_complete" -> "dlm_stop_0 virt-1" [ style = bold] -+"probe_complete" -> "fencing_start_0 virt-1" [ style = bold] -+"probe_complete" -> "fencing_stop_0 virt-1" [ style = bold] -+"probe_complete" [ style=bold color="green" fontcolor="orange"] -+"stonith 'on' virt-1" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-1" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-1" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -+"stonith_complete" -> "all_stopped" [ style = bold] -+"stonith_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"stonith_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"stonith_complete" -> "clvmd_start_0 virt-1" [ style = bold] -+"stonith_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"stonith_complete" -> "dlm_start_0 virt-1" [ style = bold] -+"stonith_complete" [ style=bold color="green" fontcolor="orange"] -+} -diff --git a/pengine/test10/unfence-definition.exp b/pengine/test10/unfence-definition.exp -new file mode 100644 -index 0000000..9075347 ---- /dev/null -+++ b/pengine/test10/unfence-definition.exp -@@ -0,0 +1,495 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-definition.summary b/pengine/test10/unfence-definition.summary -new file mode 100644 -index 0000000..c954c4b ---- /dev/null -+++ b/pengine/test10/unfence-definition.summary -@@ -0,0 +1,63 @@ -+ -+Current cluster status: -+Node virt-4 (4): UNCLEAN (offline) -+Online: [ virt-1 virt-2 virt-3 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 ] -+ Stopped: [ virt-3 virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 ] -+ Stopped: [ virt-2 virt-3 virt-4 ] -+ -+Transition Summary: -+ * Restart fencing (Started virt-1) -+ * Restart dlm:0 (Started virt-1) -+ * Start dlm:2 (virt-3) -+ * Restart clvmd:0 (Started virt-1) -+ * Start clvmd:1 (virt-2) -+ * Start clvmd:2 (virt-3) -+ -+Executing cluster transition: -+ * Resource action: fencing monitor on virt-3 -+ * Resource action: dlm monitor on virt-3 -+ * Resource action: clvmd monitor on virt-2 -+ * Resource action: clvmd monitor on virt-3 -+ * Pseudo action: clvmd-clone_stop_0 -+ * Fencing virt-4 (reboot) -+ * Pseudo action: stonith_complete -+ * Pseudo action: probe_complete -+ * Resource action: fencing stop on virt-1 -+ * Resource action: clvmd stop on virt-1 -+ * Pseudo action: clvmd-clone_stopped_0 -+ * Resource action: fencing delete on virt-1 -+ * Pseudo action: dlm-clone_stop_0 -+ * Resource action: dlm stop on virt-1 -+ * Pseudo action: dlm-clone_stopped_0 -+ * Fencing virt-3 (on) -+ * Pseudo action: all_stopped -+ * Fencing virt-1 (on) -+ * Resource action: fencing start on virt-1 -+ * Pseudo action: dlm-clone_start_0 -+ * Resource action: dlm start on virt-1 -+ * Resource action: dlm start on virt-3 -+ * Pseudo action: dlm-clone_running_0 -+ * Pseudo action: clvmd-clone_start_0 -+ * Resource action: clvmd start on virt-1 -+ * Resource action: clvmd start on virt-2 -+ * Resource action: clvmd start on virt-3 -+ * Pseudo action: clvmd-clone_running_0 -+ -+Revised cluster status: -+Online: [ virt-1 virt-2 virt-3 ] -+OFFLINE: [ virt-4 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ -diff --git a/pengine/test10/unfence-parameters.dot b/pengine/test10/unfence-parameters.dot -new file mode 100644 -index 0000000..e67eb5a ---- /dev/null -+++ b/pengine/test10/unfence-parameters.dot -@@ -0,0 +1,125 @@ -+digraph "g" { -+"all_stopped" -> "fencing_start_0 virt-1" [ style = bold] -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_start_0" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd_start_0 virt-1" [ style = bold] -+"clvmd-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_stop_0" -> "clvmd-clone_stopped_0" [ style = bold] -+"clvmd-clone_stop_0" -> "clvmd_stop_0 virt-1" [ style = bold] -+"clvmd-clone_stop_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_stopped_0" -> "clvmd-clone_start_0" [ style = bold] -+"clvmd-clone_stopped_0" -> "dlm-clone_stop_0" [ style = bold] -+"clvmd-clone_stopped_0" -> "stonith 'on' virt-1" [ style = bold] -+"clvmd-clone_stopped_0" -> "stonith 'on' virt-2" [ style = bold] -+"clvmd-clone_stopped_0" -> "stonith 'on' virt-3" [ style = bold] -+"clvmd-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd:1_monitor_0 virt-2" -> "probe_complete virt-2" [ style = bold] -+"clvmd:1_monitor_0 virt-2" -> "stonith 'on' virt-2" [ style = bold] -+"clvmd:1_monitor_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:1_start_0 virt-2" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:1_start_0 virt-2" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd:1_start_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_start_0 virt-3" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:2_start_0 virt-3" -> "clvmd:3_start_0 " [ style = dashed] -+"clvmd:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"clvmd:3_start_0 " -> "clvmd-clone_running_0" [ style = dashed] -+"clvmd:3_start_0 " [ style=dashed color="red" fontcolor="black"] -+"clvmd_start_0 virt-1" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd_start_0 virt-1" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"clvmd_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"clvmd_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"clvmd_stop_0 virt-1" -> "clvmd-clone_stopped_0" [ style = bold] -+"clvmd_stop_0 virt-1" -> "clvmd_start_0 virt-1" [ style = bold] -+"clvmd_stop_0 virt-1" -> "dlm_stop_0 virt-1" [ style = bold] -+"clvmd_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"dlm-clone_running_0" -> "clvmd-clone_start_0" [ style = bold] -+"dlm-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_start_0" -> "dlm-clone_running_0" [ style = bold] -+"dlm-clone_start_0" -> "dlm:2_start_0 virt-3" [ style = bold] -+"dlm-clone_start_0" -> "dlm_start_0 virt-1" [ style = bold] -+"dlm-clone_start_0" -> "dlm_start_0 virt-2" [ style = bold] -+"dlm-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_stop_0" -> "dlm-clone_stopped_0" [ style = bold] -+"dlm-clone_stop_0" -> "dlm_stop_0 virt-1" [ style = bold] -+"dlm-clone_stop_0" -> "dlm_stop_0 virt-2" [ style = bold] -+"dlm-clone_stop_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_stopped_0" -> "dlm-clone_start_0" [ style = bold] -+"dlm-clone_stopped_0" -> "stonith 'on' virt-1" [ style = bold] -+"dlm-clone_stopped_0" -> "stonith 'on' virt-2" [ style = bold] -+"dlm-clone_stopped_0" -> "stonith 'on' virt-3" [ style = bold] -+"dlm-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"dlm:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm:2_start_0 virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"dlm:2_start_0 virt-3" -> "dlm-clone_running_0" [ style = bold] -+"dlm:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm_start_0 virt-1" -> "clvmd_start_0 virt-1" [ style = bold] -+"dlm_start_0 virt-1" -> "dlm-clone_running_0" [ style = bold] -+"dlm_start_0 virt-1" -> "dlm_start_0 virt-2" [ style = bold] -+"dlm_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"dlm_start_0 virt-2" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"dlm_start_0 virt-2" -> "clvmd:3_start_0 " [ style = dashed] -+"dlm_start_0 virt-2" -> "dlm-clone_running_0" [ style = bold] -+"dlm_start_0 virt-2" -> "dlm:2_start_0 virt-3" [ style = bold] -+"dlm_start_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"dlm_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"dlm_stop_0 virt-1" -> "dlm-clone_stopped_0" [ style = bold] -+"dlm_stop_0 virt-1" -> "dlm_start_0 virt-1" [ style = bold] -+"dlm_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"dlm_stop_0 virt-2" -> "all_stopped" [ style = bold] -+"dlm_stop_0 virt-2" -> "dlm-clone_stopped_0" [ style = bold] -+"dlm_stop_0 virt-2" -> "dlm_start_0 virt-2" [ style = bold] -+"dlm_stop_0 virt-2" -> "dlm_stop_0 virt-1" [ style = bold] -+"dlm_stop_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"fencing_start_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"fencing_stop_0 virt-1" -> "all_stopped" [ style = bold] -+"fencing_stop_0 virt-1" -> "fencing_start_0 virt-1" [ style = bold] -+"fencing_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-1" -> "probe_complete" [ style = bold] -+"probe_complete virt-1" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-2" -> "probe_complete" [ style = bold] -+"probe_complete virt-2" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-3" -> "probe_complete" [ style = bold] -+"probe_complete virt-3" [ style=bold color="green" fontcolor="black"] -+"probe_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"probe_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"probe_complete" -> "clvmd:3_start_0 " [ style = dashed] -+"probe_complete" -> "clvmd_start_0 virt-1" [ style = bold] -+"probe_complete" -> "clvmd_stop_0 virt-1" [ style = bold] -+"probe_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"probe_complete" -> "dlm_start_0 virt-1" [ style = bold] -+"probe_complete" -> "dlm_start_0 virt-2" [ style = bold] -+"probe_complete" -> "dlm_stop_0 virt-1" [ style = bold] -+"probe_complete" -> "dlm_stop_0 virt-2" [ style = bold] -+"probe_complete" -> "fencing_start_0 virt-1" [ style = bold] -+"probe_complete" -> "fencing_stop_0 virt-1" [ style = bold] -+"probe_complete" [ style=bold color="green" fontcolor="orange"] -+"stonith 'on' virt-1" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-1" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-1" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-2" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-2" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-2" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -+"stonith_complete" -> "all_stopped" [ style = bold] -+"stonith_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"stonith_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"stonith_complete" -> "clvmd_start_0 virt-1" [ style = bold] -+"stonith_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"stonith_complete" -> "dlm_start_0 virt-1" [ style = bold] -+"stonith_complete" -> "dlm_start_0 virt-2" [ style = bold] -+"stonith_complete" [ style=bold color="green" fontcolor="orange"] -+} -diff --git a/pengine/test10/unfence-parameters.exp b/pengine/test10/unfence-parameters.exp -new file mode 100644 -index 0000000..491d78e ---- /dev/null -+++ b/pengine/test10/unfence-parameters.exp -@@ -0,0 +1,562 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-parameters.summary b/pengine/test10/unfence-parameters.summary -new file mode 100644 -index 0000000..17bbc62 ---- /dev/null -+++ b/pengine/test10/unfence-parameters.summary -@@ -0,0 +1,66 @@ -+ -+Current cluster status: -+Node virt-4 (4): UNCLEAN (offline) -+Online: [ virt-1 virt-2 virt-3 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 ] -+ Stopped: [ virt-3 virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 ] -+ Stopped: [ virt-2 virt-3 virt-4 ] -+ -+Transition Summary: -+ * Restart fencing (Started virt-1) -+ * Restart dlm:0 (Started virt-1) -+ * Restart dlm:1 (Started virt-2) -+ * Start dlm:2 (virt-3) -+ * Restart clvmd:0 (Started virt-1) -+ * Start clvmd:1 (virt-2) -+ * Start clvmd:2 (virt-3) -+ -+Executing cluster transition: -+ * Resource action: fencing monitor on virt-3 -+ * Resource action: dlm monitor on virt-3 -+ * Resource action: clvmd monitor on virt-2 -+ * Resource action: clvmd monitor on virt-3 -+ * Pseudo action: clvmd-clone_stop_0 -+ * Fencing virt-4 (reboot) -+ * Pseudo action: stonith_complete -+ * Pseudo action: probe_complete -+ * Resource action: fencing stop on virt-1 -+ * Resource action: clvmd stop on virt-1 -+ * Pseudo action: clvmd-clone_stopped_0 -+ * Pseudo action: dlm-clone_stop_0 -+ * Resource action: dlm stop on virt-2 -+ * Resource action: dlm stop on virt-1 -+ * Pseudo action: dlm-clone_stopped_0 -+ * Fencing virt-3 (on) -+ * Fencing virt-2 (on) -+ * Pseudo action: all_stopped -+ * Fencing virt-1 (on) -+ * Resource action: fencing start on virt-1 -+ * Pseudo action: dlm-clone_start_0 -+ * Resource action: dlm start on virt-1 -+ * Resource action: dlm start on virt-2 -+ * Resource action: dlm start on virt-3 -+ * Pseudo action: dlm-clone_running_0 -+ * Pseudo action: clvmd-clone_start_0 -+ * Resource action: clvmd start on virt-1 -+ * Resource action: clvmd start on virt-2 -+ * Resource action: clvmd start on virt-3 -+ * Pseudo action: clvmd-clone_running_0 -+ -+Revised cluster status: -+Online: [ virt-1 virt-2 virt-3 ] -+OFFLINE: [ virt-4 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ -diff --git a/pengine/test10/unfence-startup.dot b/pengine/test10/unfence-startup.dot -new file mode 100644 -index 0000000..a5cc606 ---- /dev/null -+++ b/pengine/test10/unfence-startup.dot -@@ -0,0 +1,51 @@ -+digraph "g" { -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd-clone_start_0" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"clvmd-clone_start_0" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"clvmd:1_monitor_0 virt-2" -> "probe_complete virt-2" [ style = bold] -+"clvmd:1_monitor_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:1_start_0 virt-2" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:1_start_0 virt-2" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"clvmd:1_start_0 virt-2" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"clvmd:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"clvmd:2_start_0 virt-3" -> "clvmd-clone_running_0" [ style = bold] -+"clvmd:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm-clone_running_0" -> "clvmd-clone_start_0" [ style = bold] -+"dlm-clone_running_0" [ style=bold color="green" fontcolor="orange"] -+"dlm-clone_start_0" -> "dlm-clone_running_0" [ style = bold] -+"dlm-clone_start_0" -> "dlm:2_start_0 virt-3" [ style = bold] -+"dlm-clone_start_0" [ style=bold color="green" fontcolor="orange"] -+"dlm:2_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" -> "stonith 'on' virt-3" [ style = bold] -+"dlm:2_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"dlm:2_start_0 virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"dlm:2_start_0 virt-3" -> "dlm-clone_running_0" [ style = bold] -+"dlm:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-1" -> "probe_complete" [ style = bold] -+"probe_complete virt-1" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-2" -> "probe_complete" [ style = bold] -+"probe_complete virt-2" [ style=bold color="green" fontcolor="black"] -+"probe_complete virt-3" -> "probe_complete" [ style = bold] -+"probe_complete virt-3" [ style=bold color="green" fontcolor="black"] -+"probe_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"probe_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"probe_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"probe_complete" [ style=bold color="green" fontcolor="orange"] -+"stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -+"stonith_complete" -> "all_stopped" [ style = bold] -+"stonith_complete" -> "clvmd:1_start_0 virt-2" [ style = bold] -+"stonith_complete" -> "clvmd:2_start_0 virt-3" [ style = bold] -+"stonith_complete" -> "dlm:2_start_0 virt-3" [ style = bold] -+"stonith_complete" [ style=bold color="green" fontcolor="orange"] -+} -diff --git a/pengine/test10/unfence-startup.exp b/pengine/test10/unfence-startup.exp -new file mode 100644 -index 0000000..8a04d54 ---- /dev/null -+++ b/pengine/test10/unfence-startup.exp -@@ -0,0 +1,264 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-startup.xml b/pengine/test10/unfence-startup.xml -new file mode 100644 -index 0000000..83e9ffe ---- /dev/null -+++ b/pengine/test10/unfence-startup.xml -@@ -0,0 +1,73 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ diff --git a/SOURCES/bz1078078-pcmk-pe_do_not_unfence_nodes_that_are_offline_unclean_or_shutting_down.patch b/SOURCES/bz1078078-pcmk-pe_do_not_unfence_nodes_that_are_offline_unclean_or_shutting_down.patch deleted file mode 100644 index 6fce78c..0000000 --- a/SOURCES/bz1078078-pcmk-pe_do_not_unfence_nodes_that_are_offline_unclean_or_shutting_down.patch +++ /dev/null @@ -1,24 +0,0 @@ -commit c2fd34cb2f81e795dae211466edd270613cb6543 -Author: Andrew Beekhof -Date: Thu Apr 10 14:50:19 2014 +1000 - - Fix: PE: Do not unfence nodes that are offline, unclean or shutting down - - (cherry picked from commit 12c410557f7685366d8504e57e555624bc6f2a07) - -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 9cb744a..ccaaa3f 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1877,7 +1877,10 @@ trigger_unfencing( - /* Wasnt a stonith device */ - return; - -- } else if(node) { -+ } else if(node -+ && node->details->online -+ && node->details->unclean == FALSE -+ && node->details->shutdown == FALSE) { - action_t *unfence = pe_fence_op(node, "on", FALSE, data_set); - - crm_notice("Unfencing %s: %s", node->details->uname, reason); diff --git a/SOURCES/bz1078078-pcmk-pe_ensure_actions_like_shutdown_and_fence_have_a_unique_key.patch b/SOURCES/bz1078078-pcmk-pe_ensure_actions_like_shutdown_and_fence_have_a_unique_key.patch deleted file mode 100644 index 2a57c2b..0000000 --- a/SOURCES/bz1078078-pcmk-pe_ensure_actions_like_shutdown_and_fence_have_a_unique_key.patch +++ /dev/null @@ -1,15241 +0,0 @@ -commit 4b390749bf42df944402e2530a27521e89a45682 -Author: Andrew Beekhof -Date: Wed Apr 2 15:24:21 2014 +1100 - - Refactor: PE: Ensure actions like shutdown and fence have a unique key - - (cherry picked from commit 30bb942116c8e9a1e0ace47a98a0447889407d50) - - Conflicts: - pengine/regression.sh - pengine/test10/11-a-then-bm-b-move-a-clone-starting.exp - pengine/test10/594.exp - pengine/test10/662.exp - pengine/test10/696.exp - pengine/test10/726.exp - pengine/test10/735.exp - pengine/test10/764.exp - pengine/test10/797.exp - pengine/test10/829.exp - pengine/test10/anti-colocation-order.exp - pengine/test10/asymmetric.exp - pengine/test10/attrs1.exp - pengine/test10/attrs2.exp - pengine/test10/attrs3.exp - pengine/test10/attrs4.exp - pengine/test10/attrs5.exp - pengine/test10/attrs6.exp - pengine/test10/attrs7.exp - pengine/test10/attrs8.exp - pengine/test10/balanced.exp - pengine/test10/base-score.exp - pengine/test10/bug-1572-1.exp - pengine/test10/bug-1572-2.exp - pengine/test10/bug-1573.exp - pengine/test10/bug-1820-1.exp - pengine/test10/bug-1820.exp - pengine/test10/bug-1822.exp - pengine/test10/bug-5014-A-start-B-start.exp - pengine/test10/bug-5014-A-stopped-B-stopped.exp - pengine/test10/bug-5014-CLONE-A-start-B-start.exp - pengine/test10/bug-5014-CthenAthenB-C-stopped.exp - pengine/test10/bug-5028-detach.exp - pengine/test10/bug-lf-2160.exp - pengine/test10/bug-lf-2435.exp - pengine/test10/bug-lf-2445.exp - pengine/test10/bug-lf-2581.exp - pengine/test10/bug-lf-2606.exp - pengine/test10/bug-n-387749.exp - pengine/test10/bug-pm-11.exp - pengine/test10/clone-anon-dup.exp - pengine/test10/clone-anon-probe-1.exp - pengine/test10/clone-colocate-instance-1.exp - pengine/test10/clone-colocate-instance-2.exp - pengine/test10/clone-interleave-1.exp - pengine/test10/clone-interleave-2.exp - pengine/test10/clone-interleave-3.exp - pengine/test10/clone-no-shuffle.exp - pengine/test10/clone-order-instance.exp - pengine/test10/clone-order-primitive.exp - pengine/test10/coloc-group.exp - pengine/test10/coloc-list.exp - pengine/test10/coloc-loop.exp - pengine/test10/coloc-many-one.exp - pengine/test10/colocate-primitive-with-clone.exp - pengine/test10/comments.exp - pengine/test10/container-1.exp - pengine/test10/container-2.exp - pengine/test10/container-3.exp - pengine/test10/container-4.exp - pengine/test10/container-group-1.exp - pengine/test10/container-group-2.exp - pengine/test10/container-group-3.exp - pengine/test10/container-group-4.exp - pengine/test10/date-1.exp - pengine/test10/domain.exp - pengine/test10/group-fail.exp - pengine/test10/group-unmanaged-stopped.exp - pengine/test10/group-unmanaged.exp - pengine/test10/group1.exp - pengine/test10/group10.exp - pengine/test10/group11.exp - pengine/test10/group15.exp - pengine/test10/group2.exp - pengine/test10/group3.exp - pengine/test10/group4.exp - pengine/test10/group5.exp - pengine/test10/group6.exp - pengine/test10/group7.exp - pengine/test10/group8.exp - pengine/test10/group9.exp - pengine/test10/honor_stonith_rsc_order1.exp - pengine/test10/honor_stonith_rsc_order2.exp - pengine/test10/honor_stonith_rsc_order3.exp - pengine/test10/honor_stonith_rsc_order4.exp - pengine/test10/ignore_stonith_rsc_order1.exp - pengine/test10/ignore_stonith_rsc_order2.exp - pengine/test10/ignore_stonith_rsc_order3.exp - pengine/test10/ignore_stonith_rsc_order4.exp - pengine/test10/inc0.exp - pengine/test10/inc1.exp - pengine/test10/inc11.exp - pengine/test10/inc12.exp - pengine/test10/inc2.exp - pengine/test10/inc3.exp - pengine/test10/inc4.exp - pengine/test10/inc5.exp - pengine/test10/inc6.exp - pengine/test10/inc7.exp - pengine/test10/inc8.exp - pengine/test10/interleave-0.exp - pengine/test10/interleave-1.exp - pengine/test10/interleave-2.exp - pengine/test10/interleave-3.exp - pengine/test10/location-sets-templates.exp - pengine/test10/managed-0.exp - pengine/test10/managed-1.exp - pengine/test10/managed-2.exp - pengine/test10/master-0.exp - pengine/test10/master-1.exp - pengine/test10/master-10.exp - pengine/test10/master-11.exp - pengine/test10/master-2.exp - pengine/test10/master-3.exp - pengine/test10/master-4.exp - pengine/test10/master-5.exp - pengine/test10/master-6.exp - pengine/test10/master-7.exp - pengine/test10/master-8.exp - pengine/test10/master-9.exp - pengine/test10/master-depend.exp - pengine/test10/master-ordering.exp - pengine/test10/master-probed-score.exp - pengine/test10/master-reattach.exp - pengine/test10/master-stop.exp - pengine/test10/master-unmanaged-monitor.exp - pengine/test10/migrate-1.exp - pengine/test10/migrate-2.exp - pengine/test10/migrate-3.exp - pengine/test10/migrate-4.exp - pengine/test10/migrate-shutdown.exp - pengine/test10/migrate-start-complex.exp - pengine/test10/minimal.exp - pengine/test10/mon-rsc-1.exp - pengine/test10/mon-rsc-2.exp - pengine/test10/mon-rsc-3.exp - pengine/test10/mon-rsc-4.exp - pengine/test10/multi1.exp - pengine/test10/node-maintenance-1.exp - pengine/test10/node-maintenance-2.exp - pengine/test10/notify-0.exp - pengine/test10/notify-1.exp - pengine/test10/notify-2.exp - pengine/test10/notify-3.exp - pengine/test10/novell-239082.exp - pengine/test10/novell-252693-2.exp - pengine/test10/novell-252693-3.exp - pengine/test10/novell-252693.exp - pengine/test10/obsolete-lrm-resource.exp - pengine/test10/one-or-more-0.exp - pengine/test10/one-or-more-1.exp - pengine/test10/one-or-more-2.exp - pengine/test10/one-or-more-3.exp - pengine/test10/one-or-more-4.exp - pengine/test10/one-or-more-5.exp - pengine/test10/order-mandatory.exp - pengine/test10/order-optional-keyword.exp - pengine/test10/order-optional.exp - pengine/test10/order-required.exp - pengine/test10/order-wrong-kind.exp - pengine/test10/order1.exp - pengine/test10/order2.exp - pengine/test10/order3.exp - pengine/test10/order4.exp - pengine/test10/order5.exp - pengine/test10/order6.exp - pengine/test10/order7.exp - pengine/test10/ordered-set-basic-startup.exp - pengine/test10/orphan-0.exp - pengine/test10/orphan-1.exp - pengine/test10/orphan-2.exp - pengine/test10/params-0.exp - pengine/test10/params-1.exp - pengine/test10/params-2.exp - pengine/test10/params-4.exp - pengine/test10/params-5.exp - pengine/test10/per-node-attrs.exp - pengine/test10/placement-capacity.exp - pengine/test10/placement-location.exp - pengine/test10/placement-priority.exp - pengine/test10/placement-stickiness.exp - pengine/test10/probe-0.exp - pengine/test10/probe-1.exp - pengine/test10/probe-timeout.exp - pengine/test10/quorum-1.exp - pengine/test10/quorum-2.exp - pengine/test10/quorum-3.exp - pengine/test10/quorum-4.exp - pengine/test10/quorum-5.exp - pengine/test10/quorum-6.exp - pengine/test10/rec-node-1.exp - pengine/test10/rec-node-10.exp - pengine/test10/rec-node-11.exp - pengine/test10/rec-node-12.exp - pengine/test10/rec-node-15.exp - pengine/test10/rec-node-2.exp - pengine/test10/rec-node-3.exp - pengine/test10/rec-node-4.exp - pengine/test10/rec-node-5.exp - pengine/test10/rec-node-6.exp - pengine/test10/rec-node-7.exp - pengine/test10/rec-node-8.exp - pengine/test10/rec-node-9.exp - pengine/test10/rec-rsc-0.exp - pengine/test10/rec-rsc-1.exp - pengine/test10/rec-rsc-2.exp - pengine/test10/rec-rsc-3.exp - pengine/test10/rec-rsc-4.exp - pengine/test10/rec-rsc-5.exp - pengine/test10/rec-rsc-6.exp - pengine/test10/rec-rsc-7.exp - pengine/test10/rec-rsc-8.exp - pengine/test10/rec-rsc-9.exp - pengine/test10/remote-startup-probes.exp - pengine/test10/remote-startup.exp - pengine/test10/reprobe-target_rc.exp - pengine/test10/rsc-maintenance.exp - pengine/test10/rsc-sets-clone-1.exp - pengine/test10/rsc-sets-clone.exp - pengine/test10/rsc-sets-master.exp - pengine/test10/rsc-sets-seq-false.exp - pengine/test10/rsc-sets-seq-true.exp - pengine/test10/rsc_dep1.exp - pengine/test10/rsc_dep10.exp - pengine/test10/rsc_dep2.exp - pengine/test10/rsc_dep3.exp - pengine/test10/rsc_dep4.exp - pengine/test10/rsc_dep5.exp - pengine/test10/rsc_dep7.exp - pengine/test10/rsc_dep8.exp - pengine/test10/simple11.exp - pengine/test10/simple12.exp - pengine/test10/simple2.exp - pengine/test10/simple3.exp - pengine/test10/simple4.exp - pengine/test10/simple6.exp - pengine/test10/simple7.exp - pengine/test10/simple8.exp - pengine/test10/stonith-3.exp - pengine/test10/stop-failure-no-fencing.exp - pengine/test10/stop-failure-with-fencing.exp - pengine/test10/stopped-monitor-00.exp - pengine/test10/stopped-monitor-01.exp - pengine/test10/stopped-monitor-02.exp - pengine/test10/stopped-monitor-03.exp - pengine/test10/stopped-monitor-04.exp - pengine/test10/stopped-monitor-05.exp - pengine/test10/stopped-monitor-06.exp - pengine/test10/stopped-monitor-07.exp - pengine/test10/stopped-monitor-08.exp - pengine/test10/stopped-monitor-09.exp - pengine/test10/stopped-monitor-10.exp - pengine/test10/stopped-monitor-11.exp - pengine/test10/stopped-monitor-12.exp - pengine/test10/stopped-monitor-20.exp - pengine/test10/stopped-monitor-21.exp - pengine/test10/stopped-monitor-22.exp - pengine/test10/stopped-monitor-23.exp - pengine/test10/stopped-monitor-24.exp - pengine/test10/stopped-monitor-25.exp - pengine/test10/stopped-monitor-26.exp - pengine/test10/stopped-monitor-27.exp - pengine/test10/stopped-monitor-30.exp - pengine/test10/stopped-monitor-31.exp - pengine/test10/systemhealth2.exp - pengine/test10/systemhealth3.exp - pengine/test10/systemhealthm2.exp - pengine/test10/systemhealthm3.exp - pengine/test10/systemhealthn2.exp - pengine/test10/systemhealthn3.exp - pengine/test10/systemhealtho2.exp - pengine/test10/systemhealtho3.exp - pengine/test10/systemhealthp2.exp - pengine/test10/systemhealthp3.exp - pengine/test10/target-0.exp - pengine/test10/target-1.exp - pengine/test10/target-2.exp - pengine/test10/template-1.exp - pengine/test10/template-2.exp - pengine/test10/template-3.exp - pengine/test10/template-clone-group.exp - pengine/test10/template-clone-primitive.exp - pengine/test10/template-coloc-1.exp - pengine/test10/template-coloc-2.exp - pengine/test10/template-coloc-3.exp - pengine/test10/template-order-1.exp - pengine/test10/template-order-2.exp - pengine/test10/template-order-3.exp - pengine/test10/template-rsc-sets-1.exp - pengine/test10/template-rsc-sets-2.exp - pengine/test10/template-rsc-sets-3.exp - pengine/test10/template-rsc-sets-4.exp - pengine/test10/template-ticket.exp - pengine/test10/ticket-clone-1.exp - pengine/test10/ticket-clone-10.exp - pengine/test10/ticket-clone-11.exp - pengine/test10/ticket-clone-12.exp - pengine/test10/ticket-clone-13.exp - pengine/test10/ticket-clone-14.exp - pengine/test10/ticket-clone-15.exp - pengine/test10/ticket-clone-16.exp - pengine/test10/ticket-clone-17.exp - pengine/test10/ticket-clone-18.exp - pengine/test10/ticket-clone-19.exp - pengine/test10/ticket-clone-2.exp - pengine/test10/ticket-clone-20.exp - pengine/test10/ticket-clone-22.exp - pengine/test10/ticket-clone-23.exp - pengine/test10/ticket-clone-24.exp - pengine/test10/ticket-clone-3.exp - pengine/test10/ticket-clone-4.exp - pengine/test10/ticket-clone-5.exp - pengine/test10/ticket-clone-6.exp - pengine/test10/ticket-clone-7.exp - pengine/test10/ticket-clone-8.exp - pengine/test10/ticket-group-1.exp - pengine/test10/ticket-group-10.exp - pengine/test10/ticket-group-11.exp - pengine/test10/ticket-group-12.exp - pengine/test10/ticket-group-13.exp - pengine/test10/ticket-group-14.exp - pengine/test10/ticket-group-15.exp - pengine/test10/ticket-group-16.exp - pengine/test10/ticket-group-17.exp - pengine/test10/ticket-group-18.exp - pengine/test10/ticket-group-19.exp - pengine/test10/ticket-group-2.exp - pengine/test10/ticket-group-20.exp - pengine/test10/ticket-group-21.exp - pengine/test10/ticket-group-22.exp - pengine/test10/ticket-group-23.exp - pengine/test10/ticket-group-24.exp - pengine/test10/ticket-group-3.exp - pengine/test10/ticket-group-4.exp - pengine/test10/ticket-group-5.exp - pengine/test10/ticket-group-6.exp - pengine/test10/ticket-group-7.exp - pengine/test10/ticket-group-8.exp - pengine/test10/ticket-group-9.exp - pengine/test10/ticket-master-1.exp - pengine/test10/ticket-master-10.exp - pengine/test10/ticket-master-11.exp - pengine/test10/ticket-master-12.exp - pengine/test10/ticket-master-13.exp - pengine/test10/ticket-master-14.exp - pengine/test10/ticket-master-15.exp - pengine/test10/ticket-master-16.exp - pengine/test10/ticket-master-17.exp - pengine/test10/ticket-master-18.exp - pengine/test10/ticket-master-19.exp - pengine/test10/ticket-master-2.exp - pengine/test10/ticket-master-20.exp - pengine/test10/ticket-master-21.exp - pengine/test10/ticket-master-22.exp - pengine/test10/ticket-master-23.exp - pengine/test10/ticket-master-24.exp - pengine/test10/ticket-master-3.exp - pengine/test10/ticket-master-4.exp - pengine/test10/ticket-master-5.exp - pengine/test10/ticket-master-6.exp - pengine/test10/ticket-master-7.exp - pengine/test10/ticket-master-8.exp - pengine/test10/ticket-master-9.exp - pengine/test10/ticket-primitive-1.exp - pengine/test10/ticket-primitive-10.exp - pengine/test10/ticket-primitive-11.exp - pengine/test10/ticket-primitive-12.exp - pengine/test10/ticket-primitive-13.exp - pengine/test10/ticket-primitive-14.exp - pengine/test10/ticket-primitive-15.exp - pengine/test10/ticket-primitive-16.exp - pengine/test10/ticket-primitive-17.exp - pengine/test10/ticket-primitive-18.exp - pengine/test10/ticket-primitive-19.exp - pengine/test10/ticket-primitive-2.exp - pengine/test10/ticket-primitive-20.exp - pengine/test10/ticket-primitive-21.exp - pengine/test10/ticket-primitive-22.exp - pengine/test10/ticket-primitive-23.exp - pengine/test10/ticket-primitive-24.exp - pengine/test10/ticket-primitive-3.exp - pengine/test10/ticket-primitive-4.exp - pengine/test10/ticket-primitive-5.exp - pengine/test10/ticket-primitive-6.exp - pengine/test10/ticket-primitive-7.exp - pengine/test10/ticket-primitive-8.exp - pengine/test10/ticket-primitive-9.exp - pengine/test10/ticket-rsc-sets-1.exp - pengine/test10/ticket-rsc-sets-10.exp - pengine/test10/ticket-rsc-sets-11.exp - pengine/test10/ticket-rsc-sets-12.exp - pengine/test10/ticket-rsc-sets-13.exp - pengine/test10/ticket-rsc-sets-14.exp - pengine/test10/ticket-rsc-sets-2.exp - pengine/test10/ticket-rsc-sets-3.exp - pengine/test10/ticket-rsc-sets-4.exp - pengine/test10/ticket-rsc-sets-5.exp - pengine/test10/ticket-rsc-sets-6.exp - pengine/test10/ticket-rsc-sets-7.exp - pengine/test10/ticket-rsc-sets-8.exp - pengine/test10/ticket-rsc-sets-9.exp - pengine/test10/unmanaged-master.exp - pengine/test10/unmanaged-stop-1.exp - pengine/test10/unmanaged-stop-2.exp - pengine/test10/unmanaged-stop-3.exp - pengine/test10/unmanaged-stop-4.exp - pengine/test10/unrunnable-1.exp - pengine/test10/use-after-free-merge.exp - pengine/test10/utilization-order1.exp - pengine/test10/utilization-order2.exp - pengine/test10/utilization-order3.exp - pengine/test10/utilization.exp - pengine/test10/whitebox-ms-ordering.exp - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index a8e5412..a07fdad 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -851,14 +851,14 @@ probe_resources(pe_working_set_t * data_set) - } - - if (probed != NULL && crm_is_true(probed) == FALSE) { -- action_t *probe_op = custom_action(NULL, strdup(CRM_OP_REPROBE), -+ action_t *probe_op = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_REPROBE, node->details->uname), - CRM_OP_REPROBE, node, FALSE, TRUE, data_set); - - add_hash_param(probe_op->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); - continue; - } - -- probe_node_complete = custom_action(NULL, strdup(CRM_OP_PROBED), -+ probe_node_complete = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_PROBED, node->details->uname), - CRM_OP_PROBED, node, FALSE, TRUE, data_set); - if (crm_is_true(probed)) { - crm_trace("unset"); -@@ -1265,21 +1265,22 @@ any_managed_resources(pe_working_set_t * data_set) - action_t * - pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set) - { -+ char *key = NULL; - action_t *stonith_op = NULL; - - if(op == NULL) { - op = data_set->stonith_action; - } - -- stonith_op = custom_action( -- NULL, g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op), -- CRM_OP_FENCE, node, FALSE, TRUE, data_set); -- -- add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); -+ key = g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op); - -- add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); -+ if(stonith_op == NULL) { -+ stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, FALSE, TRUE, data_set); - -- add_hash_param(stonith_op->meta, "stonith_action", op); -+ add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); -+ add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); -+ add_hash_param(stonith_op->meta, "stonith_action", op); -+ } - - return stonith_op; - } -@@ -1338,7 +1339,7 @@ stage6(pe_working_set_t * data_set) - - crm_notice("Scheduling Node %s for shutdown", node->details->uname); - -- down_op = custom_action(NULL, strdup(CRM_OP_SHUTDOWN), -+ down_op = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_SHUTDOWN, node->details->uname), - CRM_OP_SHUTDOWN, node, FALSE, TRUE, data_set); - - shutdown_constraints(node, down_op, data_set); -@@ -1367,20 +1368,22 @@ stage6(pe_working_set_t * data_set) - } - - if (dc_down != NULL) { -- GListPtr shutdown_matches = find_actions(data_set->actions, CRM_OP_SHUTDOWN, NULL); -+ GListPtr gIter = NULL; - - crm_trace("Ordering shutdowns before %s on %s (DC)", - dc_down->task, dc_down->node->details->uname); - - add_hash_param(dc_down->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); - -- gIter = shutdown_matches; -- for (; gIter != NULL; gIter = gIter->next) { -+ for (gIter = data_set->actions; gIter != NULL; gIter = gIter->next) { - action_t *node_stop = (action_t *) gIter->data; - -- if (node_stop->node->details->is_dc) { -+ if (safe_str_neq(CRM_OP_SHUTDOWN, node_stop->task)) { -+ continue; -+ } else if (node_stop->node->details->is_dc) { - continue; - } -+ - crm_debug("Ordering shutdown on %s before %s on %s", - node_stop->node->details->uname, - dc_down->task, dc_down->node->details->uname); -@@ -1391,7 +1394,6 @@ stage6(pe_working_set_t * data_set) - if (last_stonith && dc_down != last_stonith) { - order_actions(last_stonith, dc_down, pe_order_optional); - } -- g_list_free(shutdown_matches); - } - - if (last_stonith) { -diff --git a/pengine/test10/11-a-then-bm-b-move-a-clone-starting.exp b/pengine/test10/11-a-then-bm-b-move-a-clone-starting.exp -new file mode 100644 -index 0000000..6374d93 ---- /dev/null -+++ b/pengine/test10/11-a-then-bm-b-move-a-clone-starting.exp -@@ -0,0 +1,168 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/594.exp b/pengine/test10/594.exp -index f1e77f8..357921c 100644 ---- a/pengine/test10/594.exp -+++ b/pengine/test10/594.exp -@@ -191,7 +191,7 @@ - - - -- -+ - - - -@@ -221,7 +221,7 @@ - - - -- -+ - - - -@@ -236,7 +236,7 @@ - - - -- -+ - - - -@@ -260,10 +260,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/662.exp b/pengine/test10/662.exp -index 90f8a54..910f85f 100644 ---- a/pengine/test10/662.exp -+++ b/pengine/test10/662.exp -@@ -282,7 +282,7 @@ - - - -- -+ - - - -@@ -297,7 +297,7 @@ - - - -- -+ - - - -@@ -321,7 +321,7 @@ - - - -- -+ - - - -@@ -351,7 +351,7 @@ - - - -- -+ - - - -@@ -378,7 +378,7 @@ - - - -- -+ - - - -@@ -408,16 +408,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/696.exp b/pengine/test10/696.exp -index ec6a5f6..45bf881 100644 ---- a/pengine/test10/696.exp -+++ b/pengine/test10/696.exp -@@ -309,7 +309,7 @@ - - - -- -+ - - - -@@ -330,7 +330,7 @@ - - - -- -+ - - - -@@ -351,7 +351,7 @@ - - - -- -+ - - - -@@ -387,13 +387,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/726.exp b/pengine/test10/726.exp -index 0f56ae3..0a10a6d 100644 ---- a/pengine/test10/726.exp -+++ b/pengine/test10/726.exp -@@ -531,7 +531,7 @@ - - - -- -+ - - - -@@ -552,7 +552,7 @@ - - - -- -+ - - - -@@ -585,7 +585,7 @@ - - - -- -+ - - - -@@ -621,7 +621,7 @@ - - - -- -+ - - - -@@ -663,16 +663,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/735.exp b/pengine/test10/735.exp -index fd66dfe..e4b73e5 100644 ---- a/pengine/test10/735.exp -+++ b/pengine/test10/735.exp -@@ -182,7 +182,7 @@ - - - -- -+ - - - -@@ -209,7 +209,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/764.exp b/pengine/test10/764.exp -index 890665a..bbb2d32 100644 ---- a/pengine/test10/764.exp -+++ b/pengine/test10/764.exp -@@ -156,7 +156,7 @@ - - - -- -+ - - - -@@ -177,7 +177,7 @@ - - - -- -+ - - - -@@ -204,10 +204,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/797.exp b/pengine/test10/797.exp -index cac962d..02ef70b 100644 ---- a/pengine/test10/797.exp -+++ b/pengine/test10/797.exp -@@ -324,7 +324,7 @@ - - - -- -+ - - - -@@ -342,7 +342,7 @@ - - - -- -+ - - - -@@ -363,7 +363,7 @@ - - - -- -+ - - - -@@ -381,7 +381,7 @@ - - - -- -+ - - - -@@ -414,13 +414,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/829.exp b/pengine/test10/829.exp -index 749014f..21a9ecd 100644 ---- a/pengine/test10/829.exp -+++ b/pengine/test10/829.exp -@@ -266,7 +266,7 @@ - - - -- -+ - - - -@@ -287,7 +287,7 @@ - - - -- -+ - - - -@@ -314,7 +314,7 @@ - - - -- -+ - - - -@@ -350,13 +350,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/anti-colocation-order.exp b/pengine/test10/anti-colocation-order.exp -new file mode 100644 -index 0000000..99d5f3a ---- /dev/null -+++ b/pengine/test10/anti-colocation-order.exp -@@ -0,0 +1,217 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/asymmetric.exp b/pengine/test10/asymmetric.exp -index 33850dd..52a2327 100644 ---- a/pengine/test10/asymmetric.exp -+++ b/pengine/test10/asymmetric.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -49,7 +49,7 @@ - - - -- -+ - - - -@@ -67,10 +67,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs1.exp b/pengine/test10/attrs1.exp -index 9e83487..8dd6a40 100644 ---- a/pengine/test10/attrs1.exp -+++ b/pengine/test10/attrs1.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs2.exp b/pengine/test10/attrs2.exp -index 9e83487..8dd6a40 100644 ---- a/pengine/test10/attrs2.exp -+++ b/pengine/test10/attrs2.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs3.exp b/pengine/test10/attrs3.exp -index 99b81e7..b6e55a2 100644 ---- a/pengine/test10/attrs3.exp -+++ b/pengine/test10/attrs3.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs4.exp b/pengine/test10/attrs4.exp -index 99b81e7..b6e55a2 100644 ---- a/pengine/test10/attrs4.exp -+++ b/pengine/test10/attrs4.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs5.exp b/pengine/test10/attrs5.exp -index c7f836f..5e7b2c7 100644 ---- a/pengine/test10/attrs5.exp -+++ b/pengine/test10/attrs5.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs6.exp b/pengine/test10/attrs6.exp -index 99b81e7..b6e55a2 100644 ---- a/pengine/test10/attrs6.exp -+++ b/pengine/test10/attrs6.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs7.exp b/pengine/test10/attrs7.exp -index 9e83487..8dd6a40 100644 ---- a/pengine/test10/attrs7.exp -+++ b/pengine/test10/attrs7.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/attrs8.exp b/pengine/test10/attrs8.exp -index 9e83487..8dd6a40 100644 ---- a/pengine/test10/attrs8.exp -+++ b/pengine/test10/attrs8.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/balanced.exp b/pengine/test10/balanced.exp -index e6e96d0..c188632 100644 ---- a/pengine/test10/balanced.exp -+++ b/pengine/test10/balanced.exp -@@ -69,7 +69,7 @@ - - - -- -+ - - - -@@ -84,7 +84,7 @@ - - - -- -+ - - - -@@ -105,10 +105,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/base-score.exp b/pengine/test10/base-score.exp -index b6710f5..ab71c3b 100644 ---- a/pengine/test10/base-score.exp -+++ b/pengine/test10/base-score.exp -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -62,7 +62,7 @@ - - - -- -+ - - - -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -86,7 +86,7 @@ - - - -- -+ - - - -@@ -104,16 +104,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-1572-1.exp b/pengine/test10/bug-1572-1.exp -index 2b3bf4c..c0184ae 100644 ---- a/pengine/test10/bug-1572-1.exp -+++ b/pengine/test10/bug-1572-1.exp -@@ -750,7 +750,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-1572-2.exp b/pengine/test10/bug-1572-2.exp -index ad91bab..465bf1d 100644 ---- a/pengine/test10/bug-1572-2.exp -+++ b/pengine/test10/bug-1572-2.exp -@@ -371,7 +371,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-1573.exp b/pengine/test10/bug-1573.exp -index 86eb893..39f7a61 100644 ---- a/pengine/test10/bug-1573.exp -+++ b/pengine/test10/bug-1573.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-1820-1.exp b/pengine/test10/bug-1820-1.exp -index 732ded8..2753fd0 100644 ---- a/pengine/test10/bug-1820-1.exp -+++ b/pengine/test10/bug-1820-1.exp -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -193,7 +193,7 @@ - - - -- -+ - - - -@@ -205,7 +205,7 @@ - - - -- -+ - - - -@@ -223,10 +223,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-1820.exp b/pengine/test10/bug-1820.exp -index ad98db1..434d4b6 100644 ---- a/pengine/test10/bug-1820.exp -+++ b/pengine/test10/bug-1820.exp -@@ -175,7 +175,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-1822.exp b/pengine/test10/bug-1822.exp -index 0e101b5..6dc28f8 100644 ---- a/pengine/test10/bug-1822.exp -+++ b/pengine/test10/bug-1822.exp -@@ -166,7 +166,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5014-A-start-B-start.exp b/pengine/test10/bug-5014-A-start-B-start.exp -index 63c271d..6670814 100644 ---- a/pengine/test10/bug-5014-A-start-B-start.exp -+++ b/pengine/test10/bug-5014-A-start-B-start.exp -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -95,7 +95,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5014-A-stopped-B-stopped.exp b/pengine/test10/bug-5014-A-stopped-B-stopped.exp -index e1a25cd..8814477 100644 ---- a/pengine/test10/bug-5014-A-stopped-B-stopped.exp -+++ b/pengine/test10/bug-5014-A-stopped-B-stopped.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5014-CLONE-A-start-B-start.exp b/pengine/test10/bug-5014-CLONE-A-start-B-start.exp -index 30d8952..1fc2c70 100644 ---- a/pengine/test10/bug-5014-CLONE-A-start-B-start.exp -+++ b/pengine/test10/bug-5014-CLONE-A-start-B-start.exp -@@ -127,7 +127,7 @@ - - - -- -+ - - - -@@ -148,7 +148,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5014-CthenAthenB-C-stopped.exp b/pengine/test10/bug-5014-CthenAthenB-C-stopped.exp -index 6961d8a..318ba6f 100644 ---- a/pengine/test10/bug-5014-CthenAthenB-C-stopped.exp -+++ b/pengine/test10/bug-5014-CthenAthenB-C-stopped.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5028-detach.exp b/pengine/test10/bug-5028-detach.exp -index 1c3374b..58d12ec 100644 ---- a/pengine/test10/bug-5028-detach.exp -+++ b/pengine/test10/bug-5028-detach.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2160.exp b/pengine/test10/bug-lf-2160.exp -index ed0b455..3d41f1e 100644 ---- a/pengine/test10/bug-lf-2160.exp -+++ b/pengine/test10/bug-lf-2160.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2435.exp b/pengine/test10/bug-lf-2435.exp -index 7255127..5a12601 100644 ---- a/pengine/test10/bug-lf-2435.exp -+++ b/pengine/test10/bug-lf-2435.exp -@@ -70,7 +70,7 @@ - - - -- -+ - - - -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -94,7 +94,7 @@ - - - -- -+ - - - -@@ -112,13 +112,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2445.exp b/pengine/test10/bug-lf-2445.exp -index 5733768..d8f88c3 100644 ---- a/pengine/test10/bug-lf-2445.exp -+++ b/pengine/test10/bug-lf-2445.exp -@@ -80,7 +80,7 @@ - - - -- -+ - - - -@@ -88,7 +88,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2581.exp b/pengine/test10/bug-lf-2581.exp -index 60667fc..2906613 100644 ---- a/pengine/test10/bug-lf-2581.exp -+++ b/pengine/test10/bug-lf-2581.exp -@@ -230,7 +230,7 @@ - - - -- -+ - - - -@@ -266,7 +266,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2606.exp b/pengine/test10/bug-lf-2606.exp -index 270131a..71d8457 100644 ---- a/pengine/test10/bug-lf-2606.exp -+++ b/pengine/test10/bug-lf-2606.exp -@@ -160,7 +160,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-n-387749.exp b/pengine/test10/bug-n-387749.exp -index 394f8ac..ea0cc27 100644 ---- a/pengine/test10/bug-n-387749.exp -+++ b/pengine/test10/bug-n-387749.exp -@@ -345,7 +345,7 @@ - - - -- -+ - - - -@@ -375,7 +375,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-pm-11.exp b/pengine/test10/bug-pm-11.exp -index 42d405f..bb23360 100644 ---- a/pengine/test10/bug-pm-11.exp -+++ b/pengine/test10/bug-pm-11.exp -@@ -213,7 +213,7 @@ - - - -- -+ - - - -@@ -228,7 +228,7 @@ - - - -- -+ - - - -@@ -249,10 +249,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-suse-707150.exp b/pengine/test10/bug-suse-707150.exp -index 270b3fd..ca3d57b 100644 ---- a/pengine/test10/bug-suse-707150.exp -+++ b/pengine/test10/bug-suse-707150.exp -@@ -169,7 +169,7 @@ - - - -- -+ - - - -@@ -187,7 +187,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/clone-anon-dup.exp b/pengine/test10/clone-anon-dup.exp -index 69ed601..1fea098 100644 ---- a/pengine/test10/clone-anon-dup.exp -+++ b/pengine/test10/clone-anon-dup.exp -@@ -107,7 +107,7 @@ - - - -- -+ - - - -@@ -119,7 +119,7 @@ - - - -- -+ - - - -@@ -131,7 +131,7 @@ - - - -- -+ - - - -@@ -149,13 +149,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-anon-probe-1.exp b/pengine/test10/clone-anon-probe-1.exp -index 13b8d3d..6a0b6de 100644 ---- a/pengine/test10/clone-anon-probe-1.exp -+++ b/pengine/test10/clone-anon-probe-1.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -107,10 +107,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-colocate-instance-1.exp b/pengine/test10/clone-colocate-instance-1.exp -index 0d358be..c1d4629 100644 ---- a/pengine/test10/clone-colocate-instance-1.exp -+++ b/pengine/test10/clone-colocate-instance-1.exp -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -181,10 +181,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-colocate-instance-2.exp b/pengine/test10/clone-colocate-instance-2.exp -index a02a737..34d03bd 100644 ---- a/pengine/test10/clone-colocate-instance-2.exp -+++ b/pengine/test10/clone-colocate-instance-2.exp -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -181,10 +181,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-interleave-1.exp b/pengine/test10/clone-interleave-1.exp -new file mode 100644 -index 0000000..a0d8995 ---- /dev/null -+++ b/pengine/test10/clone-interleave-1.exp -@@ -0,0 +1,231 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/clone-interleave-2.exp b/pengine/test10/clone-interleave-2.exp -new file mode 100644 -index 0000000..fa59afb ---- /dev/null -+++ b/pengine/test10/clone-interleave-2.exp -@@ -0,0 +1,176 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/clone-interleave-3.exp b/pengine/test10/clone-interleave-3.exp -new file mode 100644 -index 0000000..85f6d8b ---- /dev/null -+++ b/pengine/test10/clone-interleave-3.exp -@@ -0,0 +1,244 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/clone-no-shuffle.exp b/pengine/test10/clone-no-shuffle.exp -index c6437a6..4c9ee1b 100644 ---- a/pengine/test10/clone-no-shuffle.exp -+++ b/pengine/test10/clone-no-shuffle.exp -@@ -436,7 +436,7 @@ - - - -- -+ - - - -@@ -448,7 +448,7 @@ - - - -- -+ - - - -@@ -472,10 +472,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-order-instance.exp b/pengine/test10/clone-order-instance.exp -index dd277ae..f6c51de 100644 ---- a/pengine/test10/clone-order-instance.exp -+++ b/pengine/test10/clone-order-instance.exp -@@ -111,7 +111,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -@@ -147,10 +147,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/clone-order-primitive.exp b/pengine/test10/clone-order-primitive.exp -index aefaf50..e46f1fc 100644 ---- a/pengine/test10/clone-order-primitive.exp -+++ b/pengine/test10/clone-order-primitive.exp -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/coloc-group.exp b/pengine/test10/coloc-group.exp -index f6c95f0..04b3b49 100644 ---- a/pengine/test10/coloc-group.exp -+++ b/pengine/test10/coloc-group.exp -@@ -119,7 +119,7 @@ - - - -- -+ - - - -@@ -137,7 +137,7 @@ - - - -- -+ - - - -@@ -155,7 +155,7 @@ - - - -- -+ - - - -@@ -179,13 +179,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/coloc-list.exp b/pengine/test10/coloc-list.exp -index 673c021..ca9d78e 100644 ---- a/pengine/test10/coloc-list.exp -+++ b/pengine/test10/coloc-list.exp -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -160,7 +160,7 @@ - - - -- -+ - - - -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -205,13 +205,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/coloc-loop.exp b/pengine/test10/coloc-loop.exp -index 12e86a2..1b50bad 100644 ---- a/pengine/test10/coloc-loop.exp -+++ b/pengine/test10/coloc-loop.exp -@@ -121,7 +121,7 @@ - - - -- -+ - - - -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -181,13 +181,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/coloc-many-one.exp b/pengine/test10/coloc-many-one.exp -index 0dca637..e8503a4 100644 ---- a/pengine/test10/coloc-many-one.exp -+++ b/pengine/test10/coloc-many-one.exp -@@ -121,7 +121,7 @@ - - - -- -+ - - - -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -181,13 +181,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/colocate-primitive-with-clone.exp b/pengine/test10/colocate-primitive-with-clone.exp -index 2dacc06..44fac10 100644 ---- a/pengine/test10/colocate-primitive-with-clone.exp -+++ b/pengine/test10/colocate-primitive-with-clone.exp -@@ -133,7 +133,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/comments.exp b/pengine/test10/comments.exp -index 1ad8819..5d6abb2 100644 ---- a/pengine/test10/comments.exp -+++ b/pengine/test10/comments.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/container-1.exp b/pengine/test10/container-1.exp -index 522b0f1..e252625 100644 ---- a/pengine/test10/container-1.exp -+++ b/pengine/test10/container-1.exp -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -109,7 +109,7 @@ - - - -- -+ - - - -@@ -127,10 +127,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/container-2.exp b/pengine/test10/container-2.exp -index c5f9e9e..4b1532b 100644 ---- a/pengine/test10/container-2.exp -+++ b/pengine/test10/container-2.exp -@@ -119,7 +119,7 @@ - - - -- -+ - - - -@@ -127,7 +127,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-3.exp b/pengine/test10/container-3.exp -index 3c2703a..e1fb4d9 100644 ---- a/pengine/test10/container-3.exp -+++ b/pengine/test10/container-3.exp -@@ -104,7 +104,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-4.exp b/pengine/test10/container-4.exp -index d1da381..ed9bafa 100644 ---- a/pengine/test10/container-4.exp -+++ b/pengine/test10/container-4.exp -@@ -119,7 +119,7 @@ - - - -- -+ - - - -@@ -127,7 +127,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-1.exp b/pengine/test10/container-group-1.exp -index b14aa4c..af8a7d9 100644 ---- a/pengine/test10/container-group-1.exp -+++ b/pengine/test10/container-group-1.exp -@@ -144,7 +144,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -@@ -174,10 +174,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/container-group-2.exp b/pengine/test10/container-group-2.exp -index ce32cc3..5acdcbc 100644 ---- a/pengine/test10/container-group-2.exp -+++ b/pengine/test10/container-group-2.exp -@@ -207,7 +207,7 @@ - - - -- -+ - - - -@@ -215,7 +215,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-3.exp b/pengine/test10/container-group-3.exp -index 96d99c6..d07c9cb 100644 ---- a/pengine/test10/container-group-3.exp -+++ b/pengine/test10/container-group-3.exp -@@ -160,7 +160,7 @@ - - - -- -+ - - - -@@ -168,7 +168,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-4.exp b/pengine/test10/container-group-4.exp -index 6128599..7970a76 100644 ---- a/pengine/test10/container-group-4.exp -+++ b/pengine/test10/container-group-4.exp -@@ -207,7 +207,7 @@ - - - -- -+ - - - -@@ -215,7 +215,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/date-1.exp b/pengine/test10/date-1.exp -index 2a64721..eba26f2 100644 ---- a/pengine/test10/date-1.exp -+++ b/pengine/test10/date-1.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/domain.exp b/pengine/test10/domain.exp -index 3d9eb9a..1228dde 100644 ---- a/pengine/test10/domain.exp -+++ b/pengine/test10/domain.exp -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -62,7 +62,7 @@ - - - -- -+ - - - -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -86,7 +86,7 @@ - - - -- -+ - - - -@@ -104,16 +104,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group-fail.exp b/pengine/test10/group-fail.exp -index cf4c6eb..79ae80a 100644 ---- a/pengine/test10/group-fail.exp -+++ b/pengine/test10/group-fail.exp -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -167,7 +167,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/group-unmanaged-stopped.exp b/pengine/test10/group-unmanaged-stopped.exp -new file mode 100644 -index 0000000..3ea67ca ---- /dev/null -+++ b/pengine/test10/group-unmanaged-stopped.exp -@@ -0,0 +1,66 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/group-unmanaged.exp b/pengine/test10/group-unmanaged.exp -new file mode 100644 -index 0000000..9ccb828 ---- /dev/null -+++ b/pengine/test10/group-unmanaged.exp -@@ -0,0 +1,18 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/group1.exp b/pengine/test10/group1.exp -index e0c19fe..45e2fcc 100644 ---- a/pengine/test10/group1.exp -+++ b/pengine/test10/group1.exp -@@ -138,7 +138,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -@@ -180,10 +180,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group10.exp b/pengine/test10/group10.exp -index 4285683..7fab8b3 100644 ---- a/pengine/test10/group10.exp -+++ b/pengine/test10/group10.exp -@@ -291,7 +291,7 @@ - - - -- -+ - - - -@@ -306,7 +306,7 @@ - - - -- -+ - - - -@@ -321,7 +321,7 @@ - - - -- -+ - - - -@@ -336,7 +336,7 @@ - - - -- -+ - - - -@@ -360,16 +360,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group11.exp b/pengine/test10/group11.exp -index 5c24675..b316b01 100644 ---- a/pengine/test10/group11.exp -+++ b/pengine/test10/group11.exp -@@ -68,7 +68,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/group15.exp b/pengine/test10/group15.exp -index 421cd86..47a744a 100644 ---- a/pengine/test10/group15.exp -+++ b/pengine/test10/group15.exp -@@ -192,7 +192,7 @@ - - - -- -+ - - - -@@ -219,7 +219,7 @@ - - - -- -+ - - - -@@ -252,10 +252,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group2.exp b/pengine/test10/group2.exp -index 061798d..7df6735 100644 ---- a/pengine/test10/group2.exp -+++ b/pengine/test10/group2.exp -@@ -207,7 +207,7 @@ - - - -- -+ - - - -@@ -231,7 +231,7 @@ - - - -- -+ - - - -@@ -261,10 +261,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group3.exp b/pengine/test10/group3.exp -index 7cb477e..7cf2962 100644 ---- a/pengine/test10/group3.exp -+++ b/pengine/test10/group3.exp -@@ -279,7 +279,7 @@ - - - -- -+ - - - -@@ -306,7 +306,7 @@ - - - -- -+ - - - -@@ -339,10 +339,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group4.exp b/pengine/test10/group4.exp -index b6b275e..207a905 100644 ---- a/pengine/test10/group4.exp -+++ b/pengine/test10/group4.exp -@@ -46,7 +46,7 @@ - - - -- -+ - - - -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -84,10 +84,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group5.exp b/pengine/test10/group5.exp -index 920af4d..fa85bbe 100644 ---- a/pengine/test10/group5.exp -+++ b/pengine/test10/group5.exp -@@ -296,7 +296,7 @@ - - - -- -+ - - - -@@ -320,7 +320,7 @@ - - - -- -+ - - - -@@ -334,10 +334,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group6.exp b/pengine/test10/group6.exp -index 40d149f..d71f695 100644 ---- a/pengine/test10/group6.exp -+++ b/pengine/test10/group6.exp -@@ -420,7 +420,7 @@ - - - -- -+ - - - -@@ -447,7 +447,7 @@ - - - -- -+ - - - -@@ -461,10 +461,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group7.exp b/pengine/test10/group7.exp -index 18abb01..4834e86 100644 ---- a/pengine/test10/group7.exp -+++ b/pengine/test10/group7.exp -@@ -373,7 +373,7 @@ - - - -- -+ - - - -@@ -403,7 +403,7 @@ - - - -- -+ - - - -@@ -433,7 +433,7 @@ - - - -- -+ - - - -@@ -469,13 +469,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group8.exp b/pengine/test10/group8.exp -index 6700350..c4887dd 100644 ---- a/pengine/test10/group8.exp -+++ b/pengine/test10/group8.exp -@@ -160,7 +160,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/group9.exp b/pengine/test10/group9.exp -index cf8dfea..650dfab 100644 ---- a/pengine/test10/group9.exp -+++ b/pengine/test10/group9.exp -@@ -384,7 +384,7 @@ - - - -- -+ - - - -@@ -417,7 +417,7 @@ - - - -- -+ - - - -@@ -431,10 +431,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/honor_stonith_rsc_order1.exp b/pengine/test10/honor_stonith_rsc_order1.exp -index 66a401b..7dd0ffb 100644 ---- a/pengine/test10/honor_stonith_rsc_order1.exp -+++ b/pengine/test10/honor_stonith_rsc_order1.exp -@@ -123,7 +123,7 @@ - - - -- -+ - - - -@@ -147,7 +147,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/honor_stonith_rsc_order2.exp b/pengine/test10/honor_stonith_rsc_order2.exp -index c4b0ee2..2ceba4a 100644 ---- a/pengine/test10/honor_stonith_rsc_order2.exp -+++ b/pengine/test10/honor_stonith_rsc_order2.exp -@@ -185,7 +185,7 @@ - - - -- -+ - - - -@@ -215,7 +215,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/honor_stonith_rsc_order3.exp b/pengine/test10/honor_stonith_rsc_order3.exp -index 8c0973a..780b1ba 100644 ---- a/pengine/test10/honor_stonith_rsc_order3.exp -+++ b/pengine/test10/honor_stonith_rsc_order3.exp -@@ -212,7 +212,7 @@ - - - -- -+ - - - -@@ -242,7 +242,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/honor_stonith_rsc_order4.exp b/pengine/test10/honor_stonith_rsc_order4.exp -index 6ddf8f9..4bf90b1 100644 ---- a/pengine/test10/honor_stonith_rsc_order4.exp -+++ b/pengine/test10/honor_stonith_rsc_order4.exp -@@ -70,7 +70,7 @@ - - - -- -+ - - - -@@ -94,7 +94,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ignore_stonith_rsc_order1.exp b/pengine/test10/ignore_stonith_rsc_order1.exp -index 883ba7a..099022c 100644 ---- a/pengine/test10/ignore_stonith_rsc_order1.exp -+++ b/pengine/test10/ignore_stonith_rsc_order1.exp -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -69,7 +69,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ignore_stonith_rsc_order2.exp b/pengine/test10/ignore_stonith_rsc_order2.exp -index f25ec5a..22850b9 100644 ---- a/pengine/test10/ignore_stonith_rsc_order2.exp -+++ b/pengine/test10/ignore_stonith_rsc_order2.exp -@@ -105,7 +105,7 @@ - - - -- -+ - - - -@@ -129,7 +129,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ignore_stonith_rsc_order3.exp b/pengine/test10/ignore_stonith_rsc_order3.exp -index 2ccc016..4feaa51 100644 ---- a/pengine/test10/ignore_stonith_rsc_order3.exp -+++ b/pengine/test10/ignore_stonith_rsc_order3.exp -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ignore_stonith_rsc_order4.exp b/pengine/test10/ignore_stonith_rsc_order4.exp -index a1a840d..f6967c1 100644 ---- a/pengine/test10/ignore_stonith_rsc_order4.exp -+++ b/pengine/test10/ignore_stonith_rsc_order4.exp -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -183,7 +183,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/inc0.exp b/pengine/test10/inc0.exp -index 71cced1..2d957aa 100644 ---- a/pengine/test10/inc0.exp -+++ b/pengine/test10/inc0.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -211,7 +211,7 @@ - - - -- -+ - - - -@@ -241,10 +241,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc1.exp b/pengine/test10/inc1.exp -index 6f5d759..172ae77 100644 ---- a/pengine/test10/inc1.exp -+++ b/pengine/test10/inc1.exp -@@ -256,7 +256,7 @@ - - - -- -+ - - - -@@ -286,7 +286,7 @@ - - - -- -+ - - - -@@ -322,10 +322,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc11.exp b/pengine/test10/inc11.exp -index 54314c1..527d335 100644 ---- a/pengine/test10/inc11.exp -+++ b/pengine/test10/inc11.exp -@@ -193,7 +193,7 @@ - - - -- -+ - - - -@@ -211,7 +211,7 @@ - - - -- -+ - - - -@@ -229,7 +229,7 @@ - - - -- -+ - - - -@@ -253,13 +253,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc12.exp b/pengine/test10/inc12.exp -index 4fabf43..aa3f992 100644 ---- a/pengine/test10/inc12.exp -+++ b/pengine/test10/inc12.exp -@@ -420,7 +420,7 @@ - - - -- -+ - - - -@@ -441,7 +441,7 @@ - - - -- -+ - - - -@@ -462,7 +462,7 @@ - - - -- -+ - - - -@@ -486,7 +486,7 @@ - - - -- -+ - - - -@@ -510,31 +510,31 @@ - - - -- -+ - - - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - - - -- -+ - - - -diff --git a/pengine/test10/inc2.exp b/pengine/test10/inc2.exp -index 82474dc..f3064aa 100644 ---- a/pengine/test10/inc2.exp -+++ b/pengine/test10/inc2.exp -@@ -191,7 +191,7 @@ - - - -- -+ - - - -@@ -221,7 +221,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/inc3.exp b/pengine/test10/inc3.exp -index 653c377..5e566bb 100644 ---- a/pengine/test10/inc3.exp -+++ b/pengine/test10/inc3.exp -@@ -369,7 +369,7 @@ - - - -- -+ - - - -@@ -393,7 +393,7 @@ - - - -- -+ - - - -@@ -423,10 +423,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc4.exp b/pengine/test10/inc4.exp -index 7b73210..6a9e648 100644 ---- a/pengine/test10/inc4.exp -+++ b/pengine/test10/inc4.exp -@@ -384,7 +384,7 @@ - - - -- -+ - - - -@@ -408,7 +408,7 @@ - - - -- -+ - - - -@@ -438,10 +438,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc5.exp b/pengine/test10/inc5.exp -index f8be6e4..3b0ad75 100644 ---- a/pengine/test10/inc5.exp -+++ b/pengine/test10/inc5.exp -@@ -629,7 +629,7 @@ - - - -- -+ - - - -@@ -686,7 +686,7 @@ - - - -- -+ - - - -@@ -749,10 +749,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc6.exp b/pengine/test10/inc6.exp -index 5b347d0..3b4c8e2 100644 ---- a/pengine/test10/inc6.exp -+++ b/pengine/test10/inc6.exp -@@ -438,7 +438,7 @@ - - - -- -+ - - - -@@ -446,7 +446,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/inc7.exp b/pengine/test10/inc7.exp -index ec1c6d2..2685678 100644 ---- a/pengine/test10/inc7.exp -+++ b/pengine/test10/inc7.exp -@@ -560,7 +560,7 @@ - - - -- -+ - - - -@@ -602,7 +602,7 @@ - - - -- -+ - - - -@@ -644,7 +644,7 @@ - - - -- -+ - - - -@@ -692,13 +692,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc8.exp b/pengine/test10/inc8.exp -index e6ac6de..03f3a4c 100644 ---- a/pengine/test10/inc8.exp -+++ b/pengine/test10/inc8.exp -@@ -270,7 +270,7 @@ - - - -- -+ - - - -@@ -312,7 +312,7 @@ - - - -- -+ - - - -@@ -360,10 +360,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/interleave-0.exp b/pengine/test10/interleave-0.exp -index d5523d5..8a3c701 100644 ---- a/pengine/test10/interleave-0.exp -+++ b/pengine/test10/interleave-0.exp -@@ -1591,7 +1591,7 @@ - - - -- -+ - - - -@@ -1660,7 +1660,7 @@ - - - -- -+ - - - -@@ -1735,7 +1735,7 @@ - - - -- -+ - - - -@@ -1807,7 +1807,7 @@ - - - -- -+ - - - -@@ -1849,7 +1849,7 @@ - - - -- -+ - - - -@@ -1918,7 +1918,7 @@ - - - -- -+ - - - -@@ -1984,7 +1984,7 @@ - - - -- -+ - - - -@@ -2041,7 +2041,7 @@ - - - -- -+ - - - -@@ -2107,28 +2107,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/interleave-1.exp b/pengine/test10/interleave-1.exp -index d5523d5..8a3c701 100644 ---- a/pengine/test10/interleave-1.exp -+++ b/pengine/test10/interleave-1.exp -@@ -1591,7 +1591,7 @@ - - - -- -+ - - - -@@ -1660,7 +1660,7 @@ - - - -- -+ - - - -@@ -1735,7 +1735,7 @@ - - - -- -+ - - - -@@ -1807,7 +1807,7 @@ - - - -- -+ - - - -@@ -1849,7 +1849,7 @@ - - - -- -+ - - - -@@ -1918,7 +1918,7 @@ - - - -- -+ - - - -@@ -1984,7 +1984,7 @@ - - - -- -+ - - - -@@ -2041,7 +2041,7 @@ - - - -- -+ - - - -@@ -2107,28 +2107,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/interleave-2.exp b/pengine/test10/interleave-2.exp -index d5523d5..8a3c701 100644 ---- a/pengine/test10/interleave-2.exp -+++ b/pengine/test10/interleave-2.exp -@@ -1591,7 +1591,7 @@ - - - -- -+ - - - -@@ -1660,7 +1660,7 @@ - - - -- -+ - - - -@@ -1735,7 +1735,7 @@ - - - -- -+ - - - -@@ -1807,7 +1807,7 @@ - - - -- -+ - - - -@@ -1849,7 +1849,7 @@ - - - -- -+ - - - -@@ -1918,7 +1918,7 @@ - - - -- -+ - - - -@@ -1984,7 +1984,7 @@ - - - -- -+ - - - -@@ -2041,7 +2041,7 @@ - - - -- -+ - - - -@@ -2107,28 +2107,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/interleave-3.exp b/pengine/test10/interleave-3.exp -index d5523d5..8a3c701 100644 ---- a/pengine/test10/interleave-3.exp -+++ b/pengine/test10/interleave-3.exp -@@ -1591,7 +1591,7 @@ - - - -- -+ - - - -@@ -1660,7 +1660,7 @@ - - - -- -+ - - - -@@ -1735,7 +1735,7 @@ - - - -- -+ - - - -@@ -1807,7 +1807,7 @@ - - - -- -+ - - - -@@ -1849,7 +1849,7 @@ - - - -- -+ - - - -@@ -1918,7 +1918,7 @@ - - - -- -+ - - - -@@ -1984,7 +1984,7 @@ - - - -- -+ - - - -@@ -2041,7 +2041,7 @@ - - - -- -+ - - - -@@ -2107,28 +2107,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/location-sets-templates.exp b/pengine/test10/location-sets-templates.exp -new file mode 100644 -index 0000000..9ffacc6 ---- /dev/null -+++ b/pengine/test10/location-sets-templates.exp -@@ -0,0 +1,257 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/managed-0.exp b/pengine/test10/managed-0.exp -index 67fcacb..40f48ed 100644 ---- a/pengine/test10/managed-0.exp -+++ b/pengine/test10/managed-0.exp -@@ -730,7 +730,7 @@ - - - -- -+ - - - -@@ -772,7 +772,7 @@ - - - -- -+ - - - -@@ -823,7 +823,7 @@ - - - -- -+ - - - -@@ -871,7 +871,7 @@ - - - -- -+ - - - -@@ -889,7 +889,7 @@ - - - -- -+ - - - -@@ -934,7 +934,7 @@ - - - -- -+ - - - -@@ -976,7 +976,7 @@ - - - -- -+ - - - -@@ -1009,7 +1009,7 @@ - - - -- -+ - - - -@@ -1051,28 +1051,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/managed-1.exp b/pengine/test10/managed-1.exp -index 67fcacb..40f48ed 100644 ---- a/pengine/test10/managed-1.exp -+++ b/pengine/test10/managed-1.exp -@@ -730,7 +730,7 @@ - - - -- -+ - - - -@@ -772,7 +772,7 @@ - - - -- -+ - - - -@@ -823,7 +823,7 @@ - - - -- -+ - - - -@@ -871,7 +871,7 @@ - - - -- -+ - - - -@@ -889,7 +889,7 @@ - - - -- -+ - - - -@@ -934,7 +934,7 @@ - - - -- -+ - - - -@@ -976,7 +976,7 @@ - - - -- -+ - - - -@@ -1009,7 +1009,7 @@ - - - -- -+ - - - -@@ -1051,28 +1051,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/managed-2.exp b/pengine/test10/managed-2.exp -index 59dcdaf..5020993 100644 ---- a/pengine/test10/managed-2.exp -+++ b/pengine/test10/managed-2.exp -@@ -1036,7 +1036,7 @@ - - - -- -+ - - - -@@ -1090,7 +1090,7 @@ - - - -- -+ - - - -@@ -1147,7 +1147,7 @@ - - - -- -+ - - - -@@ -1204,7 +1204,7 @@ - - - -- -+ - - - -@@ -1246,7 +1246,7 @@ - - - -- -+ - - - -@@ -1303,7 +1303,7 @@ - - - -- -+ - - - -@@ -1357,7 +1357,7 @@ - - - -- -+ - - - -@@ -1405,7 +1405,7 @@ - - - -- -+ - - - -@@ -1459,28 +1459,28 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-0.exp b/pengine/test10/master-0.exp -index 695f274..a1423de 100644 ---- a/pengine/test10/master-0.exp -+++ b/pengine/test10/master-0.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -211,7 +211,7 @@ - - - -- -+ - - - -@@ -241,10 +241,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-1.exp b/pengine/test10/master-1.exp -index d5e0def..cb2b4a3 100644 ---- a/pengine/test10/master-1.exp -+++ b/pengine/test10/master-1.exp -@@ -227,7 +227,7 @@ - - - -- -+ - - - -@@ -251,7 +251,7 @@ - - - -- -+ - - - -@@ -281,10 +281,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-10.exp b/pengine/test10/master-10.exp -index c34c62c..45b3817 100644 ---- a/pengine/test10/master-10.exp -+++ b/pengine/test10/master-10.exp -@@ -603,7 +603,7 @@ - - - -- -+ - - - -@@ -627,7 +627,7 @@ - - - -- -+ - - - -@@ -657,10 +657,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-11.exp b/pengine/test10/master-11.exp -index ae85aa6..33d3ede 100644 ---- a/pengine/test10/master-11.exp -+++ b/pengine/test10/master-11.exp -@@ -166,7 +166,7 @@ - - - -- -+ - - - -@@ -184,7 +184,7 @@ - - - -- -+ - - - -@@ -208,10 +208,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-2.exp b/pengine/test10/master-2.exp -index ef4095b..6bb01f6 100644 ---- a/pengine/test10/master-2.exp -+++ b/pengine/test10/master-2.exp -@@ -524,7 +524,7 @@ - - - -- -+ - - - -@@ -548,7 +548,7 @@ - - - -- -+ - - - -@@ -578,10 +578,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-3.exp b/pengine/test10/master-3.exp -index d5e0def..cb2b4a3 100644 ---- a/pengine/test10/master-3.exp -+++ b/pengine/test10/master-3.exp -@@ -227,7 +227,7 @@ - - - -- -+ - - - -@@ -251,7 +251,7 @@ - - - -- -+ - - - -@@ -281,10 +281,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-4.exp b/pengine/test10/master-4.exp -index a1e61b3..8ec3c39 100644 ---- a/pengine/test10/master-4.exp -+++ b/pengine/test10/master-4.exp -@@ -302,7 +302,7 @@ - - - -- -+ - - - -@@ -335,7 +335,7 @@ - - - -- -+ - - - -@@ -365,7 +365,7 @@ - - - -- -+ - - - -@@ -392,7 +392,7 @@ - - - -- -+ - - - -@@ -425,16 +425,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-5.exp b/pengine/test10/master-5.exp -index 0196883..1312668 100644 ---- a/pengine/test10/master-5.exp -+++ b/pengine/test10/master-5.exp -@@ -244,7 +244,7 @@ - - - -- -+ - - - -@@ -277,7 +277,7 @@ - - - -- -+ - - - -@@ -307,7 +307,7 @@ - - - -- -+ - - - -@@ -334,7 +334,7 @@ - - - -- -+ - - - -@@ -367,16 +367,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-6.exp b/pengine/test10/master-6.exp -index 381bfd5..b9cdb41 100644 ---- a/pengine/test10/master-6.exp -+++ b/pengine/test10/master-6.exp -@@ -217,7 +217,7 @@ - - - -- -+ - - - -@@ -250,7 +250,7 @@ - - - -- -+ - - - -@@ -277,7 +277,7 @@ - - - -- -+ - - - -@@ -298,7 +298,7 @@ - - - -- -+ - - - -@@ -331,16 +331,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-7.exp b/pengine/test10/master-7.exp -index 4fba172..3f45706 100644 ---- a/pengine/test10/master-7.exp -+++ b/pengine/test10/master-7.exp -@@ -647,7 +647,7 @@ - - - -- -+ - - - -@@ -668,7 +668,7 @@ - - - -- -+ - - - -@@ -692,7 +692,7 @@ - - - -- -+ - - - -@@ -719,13 +719,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-8.exp b/pengine/test10/master-8.exp -index c0cd853..26ba512 100644 ---- a/pengine/test10/master-8.exp -+++ b/pengine/test10/master-8.exp -@@ -703,7 +703,7 @@ - - - -- -+ - - - -@@ -724,7 +724,7 @@ - - - -- -+ - - - -@@ -751,7 +751,7 @@ - - - -- -+ - - - -@@ -778,13 +778,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-9.exp b/pengine/test10/master-9.exp -index 333f272..989f087 100644 ---- a/pengine/test10/master-9.exp -+++ b/pengine/test10/master-9.exp -@@ -190,7 +190,7 @@ - - - -- -+ - - - -@@ -202,7 +202,7 @@ - - - -- -+ - - - -@@ -238,7 +238,7 @@ - - - -- -+ - - - -@@ -277,10 +277,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-depend.exp b/pengine/test10/master-depend.exp -index 87d7d68..d9347f2 100644 ---- a/pengine/test10/master-depend.exp -+++ b/pengine/test10/master-depend.exp -@@ -225,7 +225,7 @@ - - - -- -+ - - - -@@ -261,7 +261,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/master-ordering.exp b/pengine/test10/master-ordering.exp -index 365bb7b..de4fe7e 100644 ---- a/pengine/test10/master-ordering.exp -+++ b/pengine/test10/master-ordering.exp -@@ -446,7 +446,7 @@ - - - -- -+ - - - -@@ -500,7 +500,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/master-probed-score.exp b/pengine/test10/master-probed-score.exp -index 0992921..be0cf84 100644 ---- a/pengine/test10/master-probed-score.exp -+++ b/pengine/test10/master-probed-score.exp -@@ -2752,7 +2752,7 @@ - - - -- -+ - - - -@@ -2818,7 +2818,7 @@ - - - -- -+ - - - -@@ -2893,10 +2893,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-reattach.exp b/pengine/test10/master-reattach.exp -index afe989b..edf107e 100644 ---- a/pengine/test10/master-reattach.exp -+++ b/pengine/test10/master-reattach.exp -@@ -46,7 +46,7 @@ - - - -- -+ - - - -@@ -54,7 +54,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/master-stop.exp b/pengine/test10/master-stop.exp -new file mode 100644 -index 0000000..5d9e4c1 ---- /dev/null -+++ b/pengine/test10/master-stop.exp -@@ -0,0 +1,74 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/master-unmanaged-monitor.exp b/pengine/test10/master-unmanaged-monitor.exp -index 2f7c2da..3f650a5 100644 ---- a/pengine/test10/master-unmanaged-monitor.exp -+++ b/pengine/test10/master-unmanaged-monitor.exp -@@ -91,7 +91,7 @@ - - - -- -+ - - - -@@ -109,7 +109,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/migrate-1.exp b/pengine/test10/migrate-1.exp -index 9111b0f..7830a51 100644 ---- a/pengine/test10/migrate-1.exp -+++ b/pengine/test10/migrate-1.exp -@@ -67,7 +67,7 @@ - - - -- -+ - - - -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -93,10 +93,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/migrate-2.exp b/pengine/test10/migrate-2.exp -index 3888892..cf7f123 100644 ---- a/pengine/test10/migrate-2.exp -+++ b/pengine/test10/migrate-2.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/migrate-3.exp b/pengine/test10/migrate-3.exp -index 6c8b5af..6476943 100644 ---- a/pengine/test10/migrate-3.exp -+++ b/pengine/test10/migrate-3.exp -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -51,7 +51,7 @@ - - - -- -+ - - - -@@ -65,10 +65,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/migrate-4.exp b/pengine/test10/migrate-4.exp -index 14ce94d..8cac495 100644 ---- a/pengine/test10/migrate-4.exp -+++ b/pengine/test10/migrate-4.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/migrate-shutdown.exp b/pengine/test10/migrate-shutdown.exp -index b6a4365..e6d068a 100644 ---- a/pengine/test10/migrate-shutdown.exp -+++ b/pengine/test10/migrate-shutdown.exp -@@ -325,7 +325,7 @@ - - - -- -+ - - - -@@ -343,7 +343,7 @@ - - - -- -+ - - - -@@ -355,7 +355,7 @@ - - - -- -+ - - - -@@ -385,7 +385,7 @@ - - - -- -+ - - - -@@ -406,13 +406,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/migrate-start-complex.exp b/pengine/test10/migrate-start-complex.exp -index 7f9e3fa..33e54f6 100644 ---- a/pengine/test10/migrate-start-complex.exp -+++ b/pengine/test10/migrate-start-complex.exp -@@ -241,7 +241,7 @@ - - - -- -+ - - - -@@ -253,7 +253,7 @@ - - - -- -+ - - - -@@ -271,10 +271,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/minimal.exp b/pengine/test10/minimal.exp -index 565452b..ce47557 100644 ---- a/pengine/test10/minimal.exp -+++ b/pengine/test10/minimal.exp -@@ -69,7 +69,7 @@ - - - -- -+ - - - -@@ -84,7 +84,7 @@ - - - -- -+ - - - -@@ -105,10 +105,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/mon-rsc-1.exp b/pengine/test10/mon-rsc-1.exp -index 3b67915..c1cf031 100644 ---- a/pengine/test10/mon-rsc-1.exp -+++ b/pengine/test10/mon-rsc-1.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -57,7 +57,7 @@ - - - -- -+ - - - -@@ -75,10 +75,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/mon-rsc-2.exp b/pengine/test10/mon-rsc-2.exp -index 6a6fd07..317b84c 100644 ---- a/pengine/test10/mon-rsc-2.exp -+++ b/pengine/test10/mon-rsc-2.exp -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -60,7 +60,7 @@ - - - -- -+ - - - -@@ -78,10 +78,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/mon-rsc-3.exp b/pengine/test10/mon-rsc-3.exp -index b32054f..6d93160 100644 ---- a/pengine/test10/mon-rsc-3.exp -+++ b/pengine/test10/mon-rsc-3.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/mon-rsc-4.exp b/pengine/test10/mon-rsc-4.exp -index 2abfdec..58a64f5 100644 ---- a/pengine/test10/mon-rsc-4.exp -+++ b/pengine/test10/mon-rsc-4.exp -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -60,7 +60,7 @@ - - - -- -+ - - - -@@ -78,10 +78,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/multi1.exp b/pengine/test10/multi1.exp -index 58d9dbf..18fe162 100644 ---- a/pengine/test10/multi1.exp -+++ b/pengine/test10/multi1.exp -@@ -35,7 +35,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/node-maintenance-1.exp b/pengine/test10/node-maintenance-1.exp -index 3c73791..6a24c07 100644 ---- a/pengine/test10/node-maintenance-1.exp -+++ b/pengine/test10/node-maintenance-1.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/node-maintenance-2.exp b/pengine/test10/node-maintenance-2.exp -index 0156835..d8b15e4 100644 ---- a/pengine/test10/node-maintenance-2.exp -+++ b/pengine/test10/node-maintenance-2.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/notify-0.exp b/pengine/test10/notify-0.exp -index 3198a86..626fb59 100644 ---- a/pengine/test10/notify-0.exp -+++ b/pengine/test10/notify-0.exp -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -118,7 +118,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/notify-1.exp b/pengine/test10/notify-1.exp -index 8c290aa..ca02a84 100644 ---- a/pengine/test10/notify-1.exp -+++ b/pengine/test10/notify-1.exp -@@ -263,7 +263,7 @@ - - - -- -+ - - - -@@ -284,7 +284,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/notify-2.exp b/pengine/test10/notify-2.exp -index 8c290aa..ca02a84 100644 ---- a/pengine/test10/notify-2.exp -+++ b/pengine/test10/notify-2.exp -@@ -263,7 +263,7 @@ - - - -- -+ - - - -@@ -284,7 +284,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/notify-3.exp b/pengine/test10/notify-3.exp -index 1615df0..c5708dc 100644 ---- a/pengine/test10/notify-3.exp -+++ b/pengine/test10/notify-3.exp -@@ -438,7 +438,7 @@ - - - -- -+ - - - -@@ -456,7 +456,7 @@ - - - -- -+ - - - -@@ -477,10 +477,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/novell-239082.exp b/pengine/test10/novell-239082.exp -index 3073f7f..538eda6 100644 ---- a/pengine/test10/novell-239082.exp -+++ b/pengine/test10/novell-239082.exp -@@ -454,7 +454,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/novell-252693-2.exp b/pengine/test10/novell-252693-2.exp -index f30cf03..ca3c378 100644 ---- a/pengine/test10/novell-252693-2.exp -+++ b/pengine/test10/novell-252693-2.exp -@@ -696,7 +696,7 @@ - - - -- -+ - - - -@@ -729,7 +729,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/novell-252693-3.exp b/pengine/test10/novell-252693-3.exp -index 48be681..6ebe9a7 100644 ---- a/pengine/test10/novell-252693-3.exp -+++ b/pengine/test10/novell-252693-3.exp -@@ -800,7 +800,7 @@ - - - -- -+ - - - -@@ -833,7 +833,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/novell-252693.exp b/pengine/test10/novell-252693.exp -index 4ab727a..ca4b942 100644 ---- a/pengine/test10/novell-252693.exp -+++ b/pengine/test10/novell-252693.exp -@@ -554,7 +554,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/obsolete-lrm-resource.exp b/pengine/test10/obsolete-lrm-resource.exp -index e56e556..0939b4f 100644 ---- a/pengine/test10/obsolete-lrm-resource.exp -+++ b/pengine/test10/obsolete-lrm-resource.exp -@@ -58,7 +58,7 @@ - - - -- -+ - - - -@@ -76,7 +76,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-0.exp b/pengine/test10/one-or-more-0.exp -index 315c596..01c59c7 100644 ---- a/pengine/test10/one-or-more-0.exp -+++ b/pengine/test10/one-or-more-0.exp -@@ -98,7 +98,7 @@ - - - -- -+ - - - -@@ -125,7 +125,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-1.exp b/pengine/test10/one-or-more-1.exp -index 30e68b2..900fc5d 100644 ---- a/pengine/test10/one-or-more-1.exp -+++ b/pengine/test10/one-or-more-1.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-2.exp b/pengine/test10/one-or-more-2.exp -index d94fd9d..019b8d0 100644 ---- a/pengine/test10/one-or-more-2.exp -+++ b/pengine/test10/one-or-more-2.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -109,7 +109,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-3.exp b/pengine/test10/one-or-more-3.exp -index 2070f51..09776cd 100644 ---- a/pengine/test10/one-or-more-3.exp -+++ b/pengine/test10/one-or-more-3.exp -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -77,7 +77,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-4.exp b/pengine/test10/one-or-more-4.exp -index 002fc27..2496808 100644 ---- a/pengine/test10/one-or-more-4.exp -+++ b/pengine/test10/one-or-more-4.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -109,7 +109,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-5.exp b/pengine/test10/one-or-more-5.exp -index 67d1231..fe94627 100644 ---- a/pengine/test10/one-or-more-5.exp -+++ b/pengine/test10/one-or-more-5.exp -@@ -116,7 +116,7 @@ - - - -- -+ - - - -@@ -149,7 +149,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order-mandatory.exp b/pengine/test10/order-mandatory.exp -index 7aa18d2..166e578 100644 ---- a/pengine/test10/order-mandatory.exp -+++ b/pengine/test10/order-mandatory.exp -@@ -44,7 +44,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order-optional-keyword.exp b/pengine/test10/order-optional-keyword.exp -index d398916..aa3da4e 100644 ---- a/pengine/test10/order-optional-keyword.exp -+++ b/pengine/test10/order-optional-keyword.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order-optional.exp b/pengine/test10/order-optional.exp -index d14157b..76126ad 100644 ---- a/pengine/test10/order-optional.exp -+++ b/pengine/test10/order-optional.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order-required.exp b/pengine/test10/order-required.exp -index 2d871fa..6fc0257 100644 ---- a/pengine/test10/order-required.exp -+++ b/pengine/test10/order-required.exp -@@ -44,7 +44,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order-wrong-kind.exp b/pengine/test10/order-wrong-kind.exp -index 68796f8..426153d 100644 ---- a/pengine/test10/order-wrong-kind.exp -+++ b/pengine/test10/order-wrong-kind.exp -@@ -35,7 +35,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order1.exp b/pengine/test10/order1.exp -index 6db9031..d69e2f6 100644 ---- a/pengine/test10/order1.exp -+++ b/pengine/test10/order1.exp -@@ -100,7 +100,7 @@ - - - -- -+ - - - -@@ -118,7 +118,7 @@ - - - -- -+ - - - -@@ -142,10 +142,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order2.exp b/pengine/test10/order2.exp -index 9041ba0..9eacda0 100644 ---- a/pengine/test10/order2.exp -+++ b/pengine/test10/order2.exp -@@ -134,7 +134,7 @@ - - - -- -+ - - - -@@ -155,7 +155,7 @@ - - - -- -+ - - - -@@ -182,10 +182,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order3.exp b/pengine/test10/order3.exp -index 215b49c..0ce0585 100644 ---- a/pengine/test10/order3.exp -+++ b/pengine/test10/order3.exp -@@ -171,7 +171,7 @@ - - - -- -+ - - - -@@ -192,7 +192,7 @@ - - - -- -+ - - - -@@ -206,10 +206,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order4.exp b/pengine/test10/order4.exp -index 6db9031..d69e2f6 100644 ---- a/pengine/test10/order4.exp -+++ b/pengine/test10/order4.exp -@@ -100,7 +100,7 @@ - - - -- -+ - - - -@@ -118,7 +118,7 @@ - - - -- -+ - - - -@@ -142,10 +142,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order5.exp b/pengine/test10/order5.exp -index eceee4f..970f13a 100644 ---- a/pengine/test10/order5.exp -+++ b/pengine/test10/order5.exp -@@ -189,7 +189,7 @@ - - - -- -+ - - - -@@ -210,7 +210,7 @@ - - - -- -+ - - - -@@ -237,10 +237,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order6.exp b/pengine/test10/order6.exp -index 7ebade6..e82ec71 100644 ---- a/pengine/test10/order6.exp -+++ b/pengine/test10/order6.exp -@@ -189,7 +189,7 @@ - - - -- -+ - - - -@@ -210,7 +210,7 @@ - - - -- -+ - - - -@@ -237,10 +237,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order7.exp b/pengine/test10/order7.exp -index cc7cf86..abfbe43 100644 ---- a/pengine/test10/order7.exp -+++ b/pengine/test10/order7.exp -@@ -76,7 +76,7 @@ - - - -- -+ - - - -@@ -103,7 +103,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ordered-set-basic-startup.exp b/pengine/test10/ordered-set-basic-startup.exp -index 4704f66..22d6dbb 100644 ---- a/pengine/test10/ordered-set-basic-startup.exp -+++ b/pengine/test10/ordered-set-basic-startup.exp -@@ -68,7 +68,7 @@ - - - -- -+ - - - -@@ -101,7 +101,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/orphan-0.exp b/pengine/test10/orphan-0.exp -index afccffb..ca56f40 100644 ---- a/pengine/test10/orphan-0.exp -+++ b/pengine/test10/orphan-0.exp -@@ -118,7 +118,7 @@ - - - -- -+ - - - -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -172,7 +172,7 @@ - - - -- -+ - - - -@@ -196,16 +196,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/orphan-1.exp b/pengine/test10/orphan-1.exp -index b3a6470..6e76cba 100644 ---- a/pengine/test10/orphan-1.exp -+++ b/pengine/test10/orphan-1.exp -@@ -162,7 +162,7 @@ - - - -- -+ - - - -@@ -183,7 +183,7 @@ - - - -- -+ - - - -@@ -201,7 +201,7 @@ - - - -- -+ - - - -@@ -216,7 +216,7 @@ - - - -- -+ - - - -@@ -240,16 +240,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/orphan-2.exp b/pengine/test10/orphan-2.exp -index ad9ad59..516422c 100644 ---- a/pengine/test10/orphan-2.exp -+++ b/pengine/test10/orphan-2.exp -@@ -180,7 +180,7 @@ - - - -- -+ - - - -@@ -201,7 +201,7 @@ - - - -- -+ - - - -@@ -219,7 +219,7 @@ - - - -- -+ - - - -@@ -234,7 +234,7 @@ - - - -- -+ - - - -@@ -276,16 +276,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/params-0.exp b/pengine/test10/params-0.exp -index 1489e3e..3b036ab 100644 ---- a/pengine/test10/params-0.exp -+++ b/pengine/test10/params-0.exp -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -@@ -223,16 +223,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/params-1.exp b/pengine/test10/params-1.exp -index 09470ab..6b6ef2d 100644 ---- a/pengine/test10/params-1.exp -+++ b/pengine/test10/params-1.exp -@@ -205,7 +205,7 @@ - - - -- -+ - - - -@@ -226,7 +226,7 @@ - - - -- -+ - - - -@@ -247,7 +247,7 @@ - - - -- -+ - - - -@@ -265,7 +265,7 @@ - - - -- -+ - - - -@@ -292,16 +292,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/params-2.exp b/pengine/test10/params-2.exp -index 7dd199b..fbac4a2 100644 ---- a/pengine/test10/params-2.exp -+++ b/pengine/test10/params-2.exp -@@ -134,7 +134,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -@@ -176,7 +176,7 @@ - - - -- -+ - - - -@@ -197,13 +197,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/params-4.exp b/pengine/test10/params-4.exp -index 50d9b7f..c5987e02 100644 ---- a/pengine/test10/params-4.exp -+++ b/pengine/test10/params-4.exp -@@ -189,7 +189,7 @@ - - - -- -+ - - - -@@ -210,7 +210,7 @@ - - - -- -+ - - - -@@ -231,7 +231,7 @@ - - - -- -+ - - - -@@ -249,7 +249,7 @@ - - - -- -+ - - - -@@ -276,16 +276,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/params-5.exp b/pengine/test10/params-5.exp -index 85736b0..01231e0 100644 ---- a/pengine/test10/params-5.exp -+++ b/pengine/test10/params-5.exp -@@ -205,7 +205,7 @@ - - - -- -+ - - - -@@ -226,7 +226,7 @@ - - - -- -+ - - - -@@ -247,7 +247,7 @@ - - - -- -+ - - - -@@ -265,7 +265,7 @@ - - - -- -+ - - - -@@ -292,16 +292,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/per-node-attrs.exp b/pengine/test10/per-node-attrs.exp -index 1e38557..aff6b4f 100644 ---- a/pengine/test10/per-node-attrs.exp -+++ b/pengine/test10/per-node-attrs.exp -@@ -41,7 +41,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -65,7 +65,7 @@ - - - -- -+ - - - -@@ -83,13 +83,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/placement-capacity.exp b/pengine/test10/placement-capacity.exp -index f70c8c5..406d502 100644 ---- a/pengine/test10/placement-capacity.exp -+++ b/pengine/test10/placement-capacity.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/placement-location.exp b/pengine/test10/placement-location.exp -index f70c8c5..406d502 100644 ---- a/pengine/test10/placement-location.exp -+++ b/pengine/test10/placement-location.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/placement-priority.exp b/pengine/test10/placement-priority.exp -index c72759e..557f033 100644 ---- a/pengine/test10/placement-priority.exp -+++ b/pengine/test10/placement-priority.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/placement-stickiness.exp b/pengine/test10/placement-stickiness.exp -index f70c8c5..406d502 100644 ---- a/pengine/test10/placement-stickiness.exp -+++ b/pengine/test10/placement-stickiness.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/probe-0.exp b/pengine/test10/probe-0.exp -index c1310d9..562e855 100644 ---- a/pengine/test10/probe-0.exp -+++ b/pengine/test10/probe-0.exp -@@ -160,7 +160,7 @@ - - - -- -+ - - - -@@ -172,7 +172,7 @@ - - - -- -+ - - - -@@ -190,10 +190,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/probe-1.exp b/pengine/test10/probe-1.exp -index a62f2f3..37d49e3 100644 ---- a/pengine/test10/probe-1.exp -+++ b/pengine/test10/probe-1.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -54,7 +54,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/probe-4.exp b/pengine/test10/probe-4.exp -index 819dd5c..4f2d325 100644 ---- a/pengine/test10/probe-4.exp -+++ b/pengine/test10/probe-4.exp -@@ -33,7 +33,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/probe-timeout.exp b/pengine/test10/probe-timeout.exp -index 2458e7b..baf2440 100644 ---- a/pengine/test10/probe-timeout.exp -+++ b/pengine/test10/probe-timeout.exp -@@ -115,7 +115,7 @@ - - - -- -+ - - - -@@ -130,7 +130,7 @@ - - - -- -+ - - - -@@ -151,10 +151,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/quorum-1.exp b/pengine/test10/quorum-1.exp -index f2de2c8..97dec69 100644 ---- a/pengine/test10/quorum-1.exp -+++ b/pengine/test10/quorum-1.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -115,10 +115,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/quorum-2.exp b/pengine/test10/quorum-2.exp -index ed60d5e..ac868ff 100644 ---- a/pengine/test10/quorum-2.exp -+++ b/pengine/test10/quorum-2.exp -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -84,7 +84,7 @@ - - - -- -+ - - - -@@ -102,10 +102,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/quorum-3.exp b/pengine/test10/quorum-3.exp -index 175b11d..8ddd88c 100644 ---- a/pengine/test10/quorum-3.exp -+++ b/pengine/test10/quorum-3.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/quorum-4.exp b/pengine/test10/quorum-4.exp -index 3b90816..42ba483 100644 ---- a/pengine/test10/quorum-4.exp -+++ b/pengine/test10/quorum-4.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -54,7 +54,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/quorum-5.exp b/pengine/test10/quorum-5.exp -index b2844a9..ee9e28e 100644 ---- a/pengine/test10/quorum-5.exp -+++ b/pengine/test10/quorum-5.exp -@@ -106,7 +106,7 @@ - - - -- -+ - - - -@@ -127,7 +127,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/quorum-6.exp b/pengine/test10/quorum-6.exp -index 685a514..0c46abe 100644 ---- a/pengine/test10/quorum-6.exp -+++ b/pengine/test10/quorum-6.exp -@@ -125,7 +125,7 @@ - - - -- -+ - - - -@@ -164,7 +164,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-1.exp b/pengine/test10/rec-node-1.exp -index f26fd66..2cc4595 100644 ---- a/pengine/test10/rec-node-1.exp -+++ b/pengine/test10/rec-node-1.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-10.exp b/pengine/test10/rec-node-10.exp -index 741bcf1..60ab810 100644 ---- a/pengine/test10/rec-node-10.exp -+++ b/pengine/test10/rec-node-10.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-11.exp b/pengine/test10/rec-node-11.exp -index 173df21..f441ce8 100644 ---- a/pengine/test10/rec-node-11.exp -+++ b/pengine/test10/rec-node-11.exp -@@ -245,7 +245,7 @@ - - - -- -+ - - - -@@ -269,7 +269,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-12.exp b/pengine/test10/rec-node-12.exp -index 9732907..1ac908f 100644 ---- a/pengine/test10/rec-node-12.exp -+++ b/pengine/test10/rec-node-12.exp -@@ -534,7 +534,7 @@ - - - -- -+ - - - -@@ -570,7 +570,7 @@ - - - -- -+ - - - -@@ -606,7 +606,7 @@ - - - -- -+ - - - -@@ -648,13 +648,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-15.exp b/pengine/test10/rec-node-15.exp -index 3c79d65..e1330a6 100644 ---- a/pengine/test10/rec-node-15.exp -+++ b/pengine/test10/rec-node-15.exp -@@ -465,7 +465,7 @@ - - - -- -+ - - - -@@ -477,7 +477,7 @@ - - - -- -+ - - - -@@ -495,10 +495,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-2.exp b/pengine/test10/rec-node-2.exp -index 901eded..fd04c37 100644 ---- a/pengine/test10/rec-node-2.exp -+++ b/pengine/test10/rec-node-2.exp -@@ -266,7 +266,7 @@ - - - -- -+ - - - -@@ -302,7 +302,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-3.exp b/pengine/test10/rec-node-3.exp -index f26fd66..2cc4595 100644 ---- a/pengine/test10/rec-node-3.exp -+++ b/pengine/test10/rec-node-3.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-4.exp b/pengine/test10/rec-node-4.exp -index 1e98f4d..2cbfecb 100644 ---- a/pengine/test10/rec-node-4.exp -+++ b/pengine/test10/rec-node-4.exp -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-5.exp b/pengine/test10/rec-node-5.exp -index f26fd66..2cc4595 100644 ---- a/pengine/test10/rec-node-5.exp -+++ b/pengine/test10/rec-node-5.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-6.exp b/pengine/test10/rec-node-6.exp -index 1e98f4d..2cbfecb 100644 ---- a/pengine/test10/rec-node-6.exp -+++ b/pengine/test10/rec-node-6.exp -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-7.exp b/pengine/test10/rec-node-7.exp -index 1e98f4d..2cbfecb 100644 ---- a/pengine/test10/rec-node-7.exp -+++ b/pengine/test10/rec-node-7.exp -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-8.exp b/pengine/test10/rec-node-8.exp -index 00e58ef..1237a82 100644 ---- a/pengine/test10/rec-node-8.exp -+++ b/pengine/test10/rec-node-8.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-9.exp b/pengine/test10/rec-node-9.exp -index e2192c8..9868f6f 100644 ---- a/pengine/test10/rec-node-9.exp -+++ b/pengine/test10/rec-node-9.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-0.exp b/pengine/test10/rec-rsc-0.exp -index 93bfb15..8caa0c0 100644 ---- a/pengine/test10/rec-rsc-0.exp -+++ b/pengine/test10/rec-rsc-0.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-1.exp b/pengine/test10/rec-rsc-1.exp -index 3825203..25030c6 100644 ---- a/pengine/test10/rec-rsc-1.exp -+++ b/pengine/test10/rec-rsc-1.exp -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -51,7 +51,7 @@ - - - -- -+ - - - -@@ -65,10 +65,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-2.exp b/pengine/test10/rec-rsc-2.exp -index 7db7a0e..5f64c90 100644 ---- a/pengine/test10/rec-rsc-2.exp -+++ b/pengine/test10/rec-rsc-2.exp -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -@@ -78,10 +78,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-3.exp b/pengine/test10/rec-rsc-3.exp -index 80a6252..7faada9 100644 ---- a/pengine/test10/rec-rsc-3.exp -+++ b/pengine/test10/rec-rsc-3.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-4.exp b/pengine/test10/rec-rsc-4.exp -index 78a90db..c186199 100644 ---- a/pengine/test10/rec-rsc-4.exp -+++ b/pengine/test10/rec-rsc-4.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -@@ -36,10 +36,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-5.exp b/pengine/test10/rec-rsc-5.exp -index 69a85d1..95a3558 100644 ---- a/pengine/test10/rec-rsc-5.exp -+++ b/pengine/test10/rec-rsc-5.exp -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -156,7 +156,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-6.exp b/pengine/test10/rec-rsc-6.exp -index 58d9dbf..18fe162 100644 ---- a/pengine/test10/rec-rsc-6.exp -+++ b/pengine/test10/rec-rsc-6.exp -@@ -35,7 +35,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-7.exp b/pengine/test10/rec-rsc-7.exp -index eb2335e..1454ff3 100644 ---- a/pengine/test10/rec-rsc-7.exp -+++ b/pengine/test10/rec-rsc-7.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-8.exp b/pengine/test10/rec-rsc-8.exp -index 8b8bce3..c53091f 100644 ---- a/pengine/test10/rec-rsc-8.exp -+++ b/pengine/test10/rec-rsc-8.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-9.exp b/pengine/test10/rec-rsc-9.exp -index 4d0e70b..5a48606 100644 ---- a/pengine/test10/rec-rsc-9.exp -+++ b/pengine/test10/rec-rsc-9.exp -@@ -194,7 +194,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/remote-startup-probes.exp b/pengine/test10/remote-startup-probes.exp -new file mode 100644 -index 0000000..3c0f4e5 ---- /dev/null -+++ b/pengine/test10/remote-startup-probes.exp -@@ -0,0 +1,214 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/remote-startup.exp b/pengine/test10/remote-startup.exp -new file mode 100644 -index 0000000..82fd243 ---- /dev/null -+++ b/pengine/test10/remote-startup.exp -@@ -0,0 +1,246 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/reprobe-target_rc.exp b/pengine/test10/reprobe-target_rc.exp -index 9c09de7..f3b5a38 100644 ---- a/pengine/test10/reprobe-target_rc.exp -+++ b/pengine/test10/reprobe-target_rc.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc-maintenance.exp b/pengine/test10/rsc-maintenance.exp -new file mode 100644 -index 0000000..146519c ---- /dev/null -+++ b/pengine/test10/rsc-maintenance.exp -@@ -0,0 +1,36 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/rsc-sets-clone-1.exp b/pengine/test10/rsc-sets-clone-1.exp -index 7e441c3..c338d7a 100644 ---- a/pengine/test10/rsc-sets-clone-1.exp -+++ b/pengine/test10/rsc-sets-clone-1.exp -@@ -476,7 +476,7 @@ - - - -- -+ - - - -@@ -536,7 +536,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc-sets-clone.exp b/pengine/test10/rsc-sets-clone.exp -index 042eff5..14d9ccb 100644 ---- a/pengine/test10/rsc-sets-clone.exp -+++ b/pengine/test10/rsc-sets-clone.exp -@@ -88,7 +88,7 @@ - - - -- -+ - - - -@@ -96,7 +96,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc-sets-master.exp b/pengine/test10/rsc-sets-master.exp -index 18609c9..f801973 100644 ---- a/pengine/test10/rsc-sets-master.exp -+++ b/pengine/test10/rsc-sets-master.exp -@@ -205,7 +205,7 @@ - - - -- -+ - - - -@@ -213,7 +213,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc-sets-seq-false.exp b/pengine/test10/rsc-sets-seq-false.exp -index 36109e4..76f5156 100644 ---- a/pengine/test10/rsc-sets-seq-false.exp -+++ b/pengine/test10/rsc-sets-seq-false.exp -@@ -166,7 +166,7 @@ - - - -- -+ - - - -@@ -174,7 +174,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc-sets-seq-true.exp b/pengine/test10/rsc-sets-seq-true.exp -index be82497..c37c9a9 100644 ---- a/pengine/test10/rsc-sets-seq-true.exp -+++ b/pengine/test10/rsc-sets-seq-true.exp -@@ -168,7 +168,7 @@ - - - -- -+ - - - -@@ -176,7 +176,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep1.exp b/pengine/test10/rsc_dep1.exp -index 9b61a44..96b998a 100644 ---- a/pengine/test10/rsc_dep1.exp -+++ b/pengine/test10/rsc_dep1.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep10.exp b/pengine/test10/rsc_dep10.exp -index a8f0bdf..727e20d 100644 ---- a/pengine/test10/rsc_dep10.exp -+++ b/pengine/test10/rsc_dep10.exp -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -65,7 +65,7 @@ - - - -- -+ - - - -@@ -86,10 +86,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep2.exp b/pengine/test10/rsc_dep2.exp -index 9040091..0e861e6 100644 ---- a/pengine/test10/rsc_dep2.exp -+++ b/pengine/test10/rsc_dep2.exp -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -99,7 +99,7 @@ - - - -- -+ - - - -@@ -123,10 +123,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep3.exp b/pengine/test10/rsc_dep3.exp -index 15bf782..4c78ffc 100644 ---- a/pengine/test10/rsc_dep3.exp -+++ b/pengine/test10/rsc_dep3.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep4.exp b/pengine/test10/rsc_dep4.exp -index 6b4eb82..1ad9e3e 100644 ---- a/pengine/test10/rsc_dep4.exp -+++ b/pengine/test10/rsc_dep4.exp -@@ -110,7 +110,7 @@ - - - -- -+ - - - -@@ -131,7 +131,7 @@ - - - -- -+ - - - -@@ -152,10 +152,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep5.exp b/pengine/test10/rsc_dep5.exp -index 64ba084..9119f77 100644 ---- a/pengine/test10/rsc_dep5.exp -+++ b/pengine/test10/rsc_dep5.exp -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -99,7 +99,7 @@ - - - -- -+ - - - -@@ -123,10 +123,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep7.exp b/pengine/test10/rsc_dep7.exp -index 8da56fe..64f1140 100644 ---- a/pengine/test10/rsc_dep7.exp -+++ b/pengine/test10/rsc_dep7.exp -@@ -94,7 +94,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -136,10 +136,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rsc_dep8.exp b/pengine/test10/rsc_dep8.exp -index 9040091..0e861e6 100644 ---- a/pengine/test10/rsc_dep8.exp -+++ b/pengine/test10/rsc_dep8.exp -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -99,7 +99,7 @@ - - - -- -+ - - - -@@ -123,10 +123,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/simple11.exp b/pengine/test10/simple11.exp -index 315a7fd..f94ad53 100644 ---- a/pengine/test10/simple11.exp -+++ b/pengine/test10/simple11.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/simple12.exp b/pengine/test10/simple12.exp -index 2b0a9f8..fda3c50 100644 ---- a/pengine/test10/simple12.exp -+++ b/pengine/test10/simple12.exp -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -99,10 +99,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/simple2.exp b/pengine/test10/simple2.exp -index 99b81e7..b6e55a2 100644 ---- a/pengine/test10/simple2.exp -+++ b/pengine/test10/simple2.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -@@ -62,10 +62,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/simple3.exp b/pengine/test10/simple3.exp -index 6e4c8cb..2ff55a8 100644 ---- a/pengine/test10/simple3.exp -+++ b/pengine/test10/simple3.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/simple4.exp b/pengine/test10/simple4.exp -index 73c62e6..8702eab 100644 ---- a/pengine/test10/simple4.exp -+++ b/pengine/test10/simple4.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/simple6.exp b/pengine/test10/simple6.exp -index 79d230d..785c04c 100644 ---- a/pengine/test10/simple6.exp -+++ b/pengine/test10/simple6.exp -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -57,7 +57,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/simple7.exp b/pengine/test10/simple7.exp -index ed0c1db..5cbf960 100644 ---- a/pengine/test10/simple7.exp -+++ b/pengine/test10/simple7.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -22,7 +22,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/simple8.exp b/pengine/test10/simple8.exp -index 0344648..4e8f09b 100644 ---- a/pengine/test10/simple8.exp -+++ b/pengine/test10/simple8.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -58,7 +58,7 @@ - - - -- -+ - - - -@@ -72,10 +72,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stonith-3.exp b/pengine/test10/stonith-3.exp -index 49e6e81..c4c1e32 100644 ---- a/pengine/test10/stonith-3.exp -+++ b/pengine/test10/stonith-3.exp -@@ -137,7 +137,7 @@ - - - -- -+ - - - -@@ -158,7 +158,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stonith-4.exp b/pengine/test10/stonith-4.exp -index 2cfffc0..2be0a96 100644 ---- a/pengine/test10/stonith-4.exp -+++ b/pengine/test10/stonith-4.exp -@@ -79,13 +79,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stop-failure-no-fencing.exp b/pengine/test10/stop-failure-no-fencing.exp -index e9d94b8..52fe598 100644 ---- a/pengine/test10/stop-failure-no-fencing.exp -+++ b/pengine/test10/stop-failure-no-fencing.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stop-failure-with-fencing.exp b/pengine/test10/stop-failure-with-fencing.exp -index 335ac37..8a467b4 100644 ---- a/pengine/test10/stop-failure-with-fencing.exp -+++ b/pengine/test10/stop-failure-with-fencing.exp -@@ -72,7 +72,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-00.exp b/pengine/test10/stopped-monitor-00.exp -index 2788366..c27f870 100644 ---- a/pengine/test10/stopped-monitor-00.exp -+++ b/pengine/test10/stopped-monitor-00.exp -@@ -58,7 +58,7 @@ - - - -- -+ - - - -@@ -70,7 +70,7 @@ - - - -- -+ - - - -@@ -88,10 +88,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-01.exp b/pengine/test10/stopped-monitor-01.exp -index 04e44ee..5ca1496 100644 ---- a/pengine/test10/stopped-monitor-01.exp -+++ b/pengine/test10/stopped-monitor-01.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-02.exp b/pengine/test10/stopped-monitor-02.exp -index 236d8ec..a735b0f 100644 ---- a/pengine/test10/stopped-monitor-02.exp -+++ b/pengine/test10/stopped-monitor-02.exp -@@ -61,7 +61,7 @@ - - - -- -+ - - - -@@ -69,7 +69,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-03.exp b/pengine/test10/stopped-monitor-03.exp -index 9598ad7..92a5f57 100644 ---- a/pengine/test10/stopped-monitor-03.exp -+++ b/pengine/test10/stopped-monitor-03.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-04.exp b/pengine/test10/stopped-monitor-04.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/stopped-monitor-04.exp -+++ b/pengine/test10/stopped-monitor-04.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-05.exp b/pengine/test10/stopped-monitor-05.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/stopped-monitor-05.exp -+++ b/pengine/test10/stopped-monitor-05.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-06.exp b/pengine/test10/stopped-monitor-06.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-06.exp -+++ b/pengine/test10/stopped-monitor-06.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-07.exp b/pengine/test10/stopped-monitor-07.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-07.exp -+++ b/pengine/test10/stopped-monitor-07.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-08.exp b/pengine/test10/stopped-monitor-08.exp -index d1da812..a291c47 100644 ---- a/pengine/test10/stopped-monitor-08.exp -+++ b/pengine/test10/stopped-monitor-08.exp -@@ -61,7 +61,7 @@ - - - -- -+ - - - -@@ -69,7 +69,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-09.exp b/pengine/test10/stopped-monitor-09.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-09.exp -+++ b/pengine/test10/stopped-monitor-09.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-10.exp b/pengine/test10/stopped-monitor-10.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/stopped-monitor-10.exp -+++ b/pengine/test10/stopped-monitor-10.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-11.exp b/pengine/test10/stopped-monitor-11.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-11.exp -+++ b/pengine/test10/stopped-monitor-11.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-12.exp b/pengine/test10/stopped-monitor-12.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/stopped-monitor-12.exp -+++ b/pengine/test10/stopped-monitor-12.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-20.exp b/pengine/test10/stopped-monitor-20.exp -index 0d1c05e..d4a4076 100644 ---- a/pengine/test10/stopped-monitor-20.exp -+++ b/pengine/test10/stopped-monitor-20.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -57,7 +57,7 @@ - - - -- -+ - - - -@@ -75,10 +75,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-21.exp b/pengine/test10/stopped-monitor-21.exp -index 39054cf..0a912fe 100644 ---- a/pengine/test10/stopped-monitor-21.exp -+++ b/pengine/test10/stopped-monitor-21.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-22.exp b/pengine/test10/stopped-monitor-22.exp -index e5dc1de..5a3476e 100644 ---- a/pengine/test10/stopped-monitor-22.exp -+++ b/pengine/test10/stopped-monitor-22.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-23.exp b/pengine/test10/stopped-monitor-23.exp -index eb42407..75bfca2 100644 ---- a/pengine/test10/stopped-monitor-23.exp -+++ b/pengine/test10/stopped-monitor-23.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -44,7 +44,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-24.exp b/pengine/test10/stopped-monitor-24.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-24.exp -+++ b/pengine/test10/stopped-monitor-24.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-25.exp b/pengine/test10/stopped-monitor-25.exp -index 1cff5b2..cc62d3f 100644 ---- a/pengine/test10/stopped-monitor-25.exp -+++ b/pengine/test10/stopped-monitor-25.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-26.exp b/pengine/test10/stopped-monitor-26.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/stopped-monitor-26.exp -+++ b/pengine/test10/stopped-monitor-26.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-27.exp b/pengine/test10/stopped-monitor-27.exp -index 1cff5b2..cc62d3f 100644 ---- a/pengine/test10/stopped-monitor-27.exp -+++ b/pengine/test10/stopped-monitor-27.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-30.exp b/pengine/test10/stopped-monitor-30.exp -index 2dce65f..fb3c88f 100644 ---- a/pengine/test10/stopped-monitor-30.exp -+++ b/pengine/test10/stopped-monitor-30.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -35,7 +35,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -57,13 +57,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stopped-monitor-31.exp b/pengine/test10/stopped-monitor-31.exp -index 394cbc7..e51c78d 100644 ---- a/pengine/test10/stopped-monitor-31.exp -+++ b/pengine/test10/stopped-monitor-31.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -35,7 +35,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -57,13 +57,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealth2.exp b/pengine/test10/systemhealth2.exp -index 68b5078..95d8847 100644 ---- a/pengine/test10/systemhealth2.exp -+++ b/pengine/test10/systemhealth2.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealth3.exp b/pengine/test10/systemhealth3.exp -index 68b5078..95d8847 100644 ---- a/pengine/test10/systemhealth3.exp -+++ b/pengine/test10/systemhealth3.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm2.exp b/pengine/test10/systemhealthm2.exp -index 68b5078..95d8847 100644 ---- a/pengine/test10/systemhealthm2.exp -+++ b/pengine/test10/systemhealthm2.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm3.exp b/pengine/test10/systemhealthm3.exp -index 7246b5b..4100342 100644 ---- a/pengine/test10/systemhealthm3.exp -+++ b/pengine/test10/systemhealthm3.exp -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -72,7 +72,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn2.exp b/pengine/test10/systemhealthn2.exp -index 68b5078..95d8847 100644 ---- a/pengine/test10/systemhealthn2.exp -+++ b/pengine/test10/systemhealthn2.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn3.exp b/pengine/test10/systemhealthn3.exp -index 68b5078..95d8847 100644 ---- a/pengine/test10/systemhealthn3.exp -+++ b/pengine/test10/systemhealthn3.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealtho2.exp b/pengine/test10/systemhealtho2.exp -index 7246b5b..4100342 100644 ---- a/pengine/test10/systemhealtho2.exp -+++ b/pengine/test10/systemhealtho2.exp -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -72,7 +72,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealtho3.exp b/pengine/test10/systemhealtho3.exp -index 7246b5b..4100342 100644 ---- a/pengine/test10/systemhealtho3.exp -+++ b/pengine/test10/systemhealtho3.exp -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -72,7 +72,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthp2.exp b/pengine/test10/systemhealthp2.exp -index e3ba25d..77729c4 100644 ---- a/pengine/test10/systemhealthp2.exp -+++ b/pengine/test10/systemhealthp2.exp -@@ -106,7 +106,7 @@ - - - -- -+ - - - -@@ -130,7 +130,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthp3.exp b/pengine/test10/systemhealthp3.exp -index 7246b5b..4100342 100644 ---- a/pengine/test10/systemhealthp3.exp -+++ b/pengine/test10/systemhealthp3.exp -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -72,7 +72,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/target-0.exp b/pengine/test10/target-0.exp -index 1233c09..825d9ae 100644 ---- a/pengine/test10/target-0.exp -+++ b/pengine/test10/target-0.exp -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -157,7 +157,7 @@ - - - -- -+ - - - -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -@@ -223,16 +223,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/target-1.exp b/pengine/test10/target-1.exp -index 15d6a54..06ac73d 100644 ---- a/pengine/test10/target-1.exp -+++ b/pengine/test10/target-1.exp -@@ -122,7 +122,7 @@ - - - -- -+ - - - -@@ -140,7 +140,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -@@ -176,7 +176,7 @@ - - - -- -+ - - - -@@ -200,16 +200,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/target-2.exp b/pengine/test10/target-2.exp -index 94e1e86..a723118 100644 ---- a/pengine/test10/target-2.exp -+++ b/pengine/test10/target-2.exp -@@ -149,7 +149,7 @@ - - - -- -+ - - - -@@ -170,7 +170,7 @@ - - - -- -+ - - - -@@ -191,7 +191,7 @@ - - - -- -+ - - - -@@ -209,7 +209,7 @@ - - - -- -+ - - - -@@ -236,16 +236,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-1.exp b/pengine/test10/template-1.exp -index a65f3c5..0fef2b0 100644 ---- a/pengine/test10/template-1.exp -+++ b/pengine/test10/template-1.exp -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -102,10 +102,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-2.exp b/pengine/test10/template-2.exp -index a206d20..0fd08cb 100644 ---- a/pengine/test10/template-2.exp -+++ b/pengine/test10/template-2.exp -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -102,10 +102,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-3.exp b/pengine/test10/template-3.exp -index f76a695..6b65404 100644 ---- a/pengine/test10/template-3.exp -+++ b/pengine/test10/template-3.exp -@@ -121,7 +121,7 @@ - - - -- -+ - - - -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -157,10 +157,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-clone-group.exp b/pengine/test10/template-clone-group.exp -index 7d06925..2ec6921 100644 ---- a/pengine/test10/template-clone-group.exp -+++ b/pengine/test10/template-clone-group.exp -@@ -193,7 +193,7 @@ - - - -- -+ - - - -@@ -208,7 +208,7 @@ - - - -- -+ - - - -@@ -229,10 +229,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-clone-primitive.exp b/pengine/test10/template-clone-primitive.exp -index b631908..151edf6 100644 ---- a/pengine/test10/template-clone-primitive.exp -+++ b/pengine/test10/template-clone-primitive.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -107,10 +107,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-coloc-1.exp b/pengine/test10/template-coloc-1.exp -index 871e4e1..96fce66 100644 ---- a/pengine/test10/template-coloc-1.exp -+++ b/pengine/test10/template-coloc-1.exp -@@ -125,7 +125,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -@@ -173,10 +173,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-coloc-2.exp b/pengine/test10/template-coloc-2.exp -index 871e4e1..96fce66 100644 ---- a/pengine/test10/template-coloc-2.exp -+++ b/pengine/test10/template-coloc-2.exp -@@ -125,7 +125,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -@@ -173,10 +173,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-coloc-3.exp b/pengine/test10/template-coloc-3.exp -index 37e359b..74e9f90 100644 ---- a/pengine/test10/template-coloc-3.exp -+++ b/pengine/test10/template-coloc-3.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -214,7 +214,7 @@ - - - -- -+ - - - -@@ -247,10 +247,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-order-1.exp b/pengine/test10/template-order-1.exp -index 82c79fa..dc9ecd9 100644 ---- a/pengine/test10/template-order-1.exp -+++ b/pengine/test10/template-order-1.exp -@@ -134,7 +134,7 @@ - - - -- -+ - - - -@@ -155,7 +155,7 @@ - - - -- -+ - - - -@@ -182,10 +182,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-order-2.exp b/pengine/test10/template-order-2.exp -index 261ae44..bbf7d9c 100644 ---- a/pengine/test10/template-order-2.exp -+++ b/pengine/test10/template-order-2.exp -@@ -134,7 +134,7 @@ - - - -- -+ - - - -@@ -155,7 +155,7 @@ - - - -- -+ - - - -@@ -182,10 +182,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-order-3.exp b/pengine/test10/template-order-3.exp -index 7e2e90f..17eab13 100644 ---- a/pengine/test10/template-order-3.exp -+++ b/pengine/test10/template-order-3.exp -@@ -214,7 +214,7 @@ - - - -- -+ - - - -@@ -241,7 +241,7 @@ - - - -- -+ - - - -@@ -274,10 +274,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-rsc-sets-1.exp b/pengine/test10/template-rsc-sets-1.exp -index 0e0f6bd..5166d93 100644 ---- a/pengine/test10/template-rsc-sets-1.exp -+++ b/pengine/test10/template-rsc-sets-1.exp -@@ -168,7 +168,7 @@ - - - -- -+ - - - -@@ -192,7 +192,7 @@ - - - -- -+ - - - -@@ -222,10 +222,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-rsc-sets-2.exp b/pengine/test10/template-rsc-sets-2.exp -index 6e08aad..43c138b 100644 ---- a/pengine/test10/template-rsc-sets-2.exp -+++ b/pengine/test10/template-rsc-sets-2.exp -@@ -174,7 +174,7 @@ - - - -- -+ - - - -@@ -198,7 +198,7 @@ - - - -- -+ - - - -@@ -228,10 +228,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-rsc-sets-3.exp b/pengine/test10/template-rsc-sets-3.exp -index 0e0f6bd..5166d93 100644 ---- a/pengine/test10/template-rsc-sets-3.exp -+++ b/pengine/test10/template-rsc-sets-3.exp -@@ -168,7 +168,7 @@ - - - -- -+ - - - -@@ -192,7 +192,7 @@ - - - -- -+ - - - -@@ -222,10 +222,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-rsc-sets-4.exp b/pengine/test10/template-rsc-sets-4.exp -index f97def2..a00ac64 100644 ---- a/pengine/test10/template-rsc-sets-4.exp -+++ b/pengine/test10/template-rsc-sets-4.exp -@@ -55,7 +55,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -@@ -97,10 +97,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/template-ticket.exp b/pengine/test10/template-ticket.exp -index f97def2..a00ac64 100644 ---- a/pengine/test10/template-ticket.exp -+++ b/pengine/test10/template-ticket.exp -@@ -55,7 +55,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -@@ -97,10 +97,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-1.exp b/pengine/test10/ticket-clone-1.exp -index e3a5cb8..e127ef8 100644 ---- a/pengine/test10/ticket-clone-1.exp -+++ b/pengine/test10/ticket-clone-1.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-10.exp b/pengine/test10/ticket-clone-10.exp -index e3a5cb8..e127ef8 100644 ---- a/pengine/test10/ticket-clone-10.exp -+++ b/pengine/test10/ticket-clone-10.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-11.exp b/pengine/test10/ticket-clone-11.exp -index 9fc69df..cc7e89a 100644 ---- a/pengine/test10/ticket-clone-11.exp -+++ b/pengine/test10/ticket-clone-11.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -87,7 +87,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-12.exp b/pengine/test10/ticket-clone-12.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-clone-12.exp -+++ b/pengine/test10/ticket-clone-12.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-13.exp b/pengine/test10/ticket-clone-13.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-clone-13.exp -+++ b/pengine/test10/ticket-clone-13.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-14.exp b/pengine/test10/ticket-clone-14.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-14.exp -+++ b/pengine/test10/ticket-clone-14.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-15.exp b/pengine/test10/ticket-clone-15.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-15.exp -+++ b/pengine/test10/ticket-clone-15.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-16.exp b/pengine/test10/ticket-clone-16.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-clone-16.exp -+++ b/pengine/test10/ticket-clone-16.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-17.exp b/pengine/test10/ticket-clone-17.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-17.exp -+++ b/pengine/test10/ticket-clone-17.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-18.exp b/pengine/test10/ticket-clone-18.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-18.exp -+++ b/pengine/test10/ticket-clone-18.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-19.exp b/pengine/test10/ticket-clone-19.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-clone-19.exp -+++ b/pengine/test10/ticket-clone-19.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-2.exp b/pengine/test10/ticket-clone-2.exp -index 9fc69df..cc7e89a 100644 ---- a/pengine/test10/ticket-clone-2.exp -+++ b/pengine/test10/ticket-clone-2.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -87,7 +87,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-20.exp b/pengine/test10/ticket-clone-20.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-20.exp -+++ b/pengine/test10/ticket-clone-20.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-22.exp b/pengine/test10/ticket-clone-22.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-clone-22.exp -+++ b/pengine/test10/ticket-clone-22.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-23.exp b/pengine/test10/ticket-clone-23.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-23.exp -+++ b/pengine/test10/ticket-clone-23.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-24.exp b/pengine/test10/ticket-clone-24.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-clone-24.exp -+++ b/pengine/test10/ticket-clone-24.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-3.exp b/pengine/test10/ticket-clone-3.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-3.exp -+++ b/pengine/test10/ticket-clone-3.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-4.exp b/pengine/test10/ticket-clone-4.exp -index e3a5cb8..e127ef8 100644 ---- a/pengine/test10/ticket-clone-4.exp -+++ b/pengine/test10/ticket-clone-4.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-5.exp b/pengine/test10/ticket-clone-5.exp -index 9fc69df..cc7e89a 100644 ---- a/pengine/test10/ticket-clone-5.exp -+++ b/pengine/test10/ticket-clone-5.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -87,7 +87,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-6.exp b/pengine/test10/ticket-clone-6.exp -index f9dffd7..cd56b44 100644 ---- a/pengine/test10/ticket-clone-6.exp -+++ b/pengine/test10/ticket-clone-6.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-7.exp b/pengine/test10/ticket-clone-7.exp -index e3a5cb8..e127ef8 100644 ---- a/pengine/test10/ticket-clone-7.exp -+++ b/pengine/test10/ticket-clone-7.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-8.exp b/pengine/test10/ticket-clone-8.exp -index 9fc69df..cc7e89a 100644 ---- a/pengine/test10/ticket-clone-8.exp -+++ b/pengine/test10/ticket-clone-8.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -87,7 +87,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-1.exp b/pengine/test10/ticket-group-1.exp -index 328d7a7..15dd4eb 100644 ---- a/pengine/test10/ticket-group-1.exp -+++ b/pengine/test10/ticket-group-1.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -73,10 +73,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-10.exp b/pengine/test10/ticket-group-10.exp -index 328d7a7..15dd4eb 100644 ---- a/pengine/test10/ticket-group-10.exp -+++ b/pengine/test10/ticket-group-10.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -73,10 +73,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-11.exp b/pengine/test10/ticket-group-11.exp -index e1b6cc1..7048e97 100644 ---- a/pengine/test10/ticket-group-11.exp -+++ b/pengine/test10/ticket-group-11.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-12.exp b/pengine/test10/ticket-group-12.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-group-12.exp -+++ b/pengine/test10/ticket-group-12.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-13.exp b/pengine/test10/ticket-group-13.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-group-13.exp -+++ b/pengine/test10/ticket-group-13.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-14.exp b/pengine/test10/ticket-group-14.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-14.exp -+++ b/pengine/test10/ticket-group-14.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-15.exp b/pengine/test10/ticket-group-15.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-15.exp -+++ b/pengine/test10/ticket-group-15.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-16.exp b/pengine/test10/ticket-group-16.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-group-16.exp -+++ b/pengine/test10/ticket-group-16.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-17.exp b/pengine/test10/ticket-group-17.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-17.exp -+++ b/pengine/test10/ticket-group-17.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-18.exp b/pengine/test10/ticket-group-18.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-18.exp -+++ b/pengine/test10/ticket-group-18.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-19.exp b/pengine/test10/ticket-group-19.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-group-19.exp -+++ b/pengine/test10/ticket-group-19.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-2.exp b/pengine/test10/ticket-group-2.exp -index e1b6cc1..7048e97 100644 ---- a/pengine/test10/ticket-group-2.exp -+++ b/pengine/test10/ticket-group-2.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-20.exp b/pengine/test10/ticket-group-20.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-20.exp -+++ b/pengine/test10/ticket-group-20.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-21.exp b/pengine/test10/ticket-group-21.exp -index d85b683..c7b5b72 100644 ---- a/pengine/test10/ticket-group-21.exp -+++ b/pengine/test10/ticket-group-21.exp -@@ -84,7 +84,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-22.exp b/pengine/test10/ticket-group-22.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-group-22.exp -+++ b/pengine/test10/ticket-group-22.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-23.exp b/pengine/test10/ticket-group-23.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-23.exp -+++ b/pengine/test10/ticket-group-23.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-24.exp b/pengine/test10/ticket-group-24.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-group-24.exp -+++ b/pengine/test10/ticket-group-24.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-3.exp b/pengine/test10/ticket-group-3.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-3.exp -+++ b/pengine/test10/ticket-group-3.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-4.exp b/pengine/test10/ticket-group-4.exp -index 328d7a7..15dd4eb 100644 ---- a/pengine/test10/ticket-group-4.exp -+++ b/pengine/test10/ticket-group-4.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -73,10 +73,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-5.exp b/pengine/test10/ticket-group-5.exp -index e1b6cc1..7048e97 100644 ---- a/pengine/test10/ticket-group-5.exp -+++ b/pengine/test10/ticket-group-5.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-6.exp b/pengine/test10/ticket-group-6.exp -index 250b6ee..b3b1182 100644 ---- a/pengine/test10/ticket-group-6.exp -+++ b/pengine/test10/ticket-group-6.exp -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -64,7 +64,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-7.exp b/pengine/test10/ticket-group-7.exp -index 328d7a7..15dd4eb 100644 ---- a/pengine/test10/ticket-group-7.exp -+++ b/pengine/test10/ticket-group-7.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -73,10 +73,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-8.exp b/pengine/test10/ticket-group-8.exp -index e1b6cc1..7048e97 100644 ---- a/pengine/test10/ticket-group-8.exp -+++ b/pengine/test10/ticket-group-8.exp -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-9.exp b/pengine/test10/ticket-group-9.exp -index d85b683..c7b5b72 100644 ---- a/pengine/test10/ticket-group-9.exp -+++ b/pengine/test10/ticket-group-9.exp -@@ -84,7 +84,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-1.exp b/pengine/test10/ticket-master-1.exp -index 3a93a0e..55abf78 100644 ---- a/pengine/test10/ticket-master-1.exp -+++ b/pengine/test10/ticket-master-1.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-10.exp b/pengine/test10/ticket-master-10.exp -index 8f76f85..44cb6a0 100644 ---- a/pengine/test10/ticket-master-10.exp -+++ b/pengine/test10/ticket-master-10.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -107,10 +107,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-11.exp b/pengine/test10/ticket-master-11.exp -index d160526..c0299ae 100644 ---- a/pengine/test10/ticket-master-11.exp -+++ b/pengine/test10/ticket-master-11.exp -@@ -34,7 +34,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-12.exp b/pengine/test10/ticket-master-12.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-master-12.exp -+++ b/pengine/test10/ticket-master-12.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-13.exp b/pengine/test10/ticket-master-13.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-master-13.exp -+++ b/pengine/test10/ticket-master-13.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-14.exp b/pengine/test10/ticket-master-14.exp -index 256060e..2e1faee 100644 ---- a/pengine/test10/ticket-master-14.exp -+++ b/pengine/test10/ticket-master-14.exp -@@ -96,7 +96,7 @@ - - - -- -+ - - - -@@ -104,7 +104,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-15.exp b/pengine/test10/ticket-master-15.exp -index 256060e..2e1faee 100644 ---- a/pengine/test10/ticket-master-15.exp -+++ b/pengine/test10/ticket-master-15.exp -@@ -96,7 +96,7 @@ - - - -- -+ - - - -@@ -104,7 +104,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-16.exp b/pengine/test10/ticket-master-16.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-master-16.exp -+++ b/pengine/test10/ticket-master-16.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-17.exp b/pengine/test10/ticket-master-17.exp -index b1b51b2..47b3cd7 100644 ---- a/pengine/test10/ticket-master-17.exp -+++ b/pengine/test10/ticket-master-17.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-18.exp b/pengine/test10/ticket-master-18.exp -index b1b51b2..47b3cd7 100644 ---- a/pengine/test10/ticket-master-18.exp -+++ b/pengine/test10/ticket-master-18.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-19.exp b/pengine/test10/ticket-master-19.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-master-19.exp -+++ b/pengine/test10/ticket-master-19.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-2.exp b/pengine/test10/ticket-master-2.exp -index 967072c..c995d00 100644 ---- a/pengine/test10/ticket-master-2.exp -+++ b/pengine/test10/ticket-master-2.exp -@@ -93,7 +93,7 @@ - - - -- -+ - - - -@@ -101,7 +101,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-20.exp b/pengine/test10/ticket-master-20.exp -index b1b51b2..47b3cd7 100644 ---- a/pengine/test10/ticket-master-20.exp -+++ b/pengine/test10/ticket-master-20.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-21.exp b/pengine/test10/ticket-master-21.exp -index 1ed731c..5b21e47 100644 ---- a/pengine/test10/ticket-master-21.exp -+++ b/pengine/test10/ticket-master-21.exp -@@ -135,7 +135,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-22.exp b/pengine/test10/ticket-master-22.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-master-22.exp -+++ b/pengine/test10/ticket-master-22.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-23.exp b/pengine/test10/ticket-master-23.exp -index b1b51b2..47b3cd7 100644 ---- a/pengine/test10/ticket-master-23.exp -+++ b/pengine/test10/ticket-master-23.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-24.exp b/pengine/test10/ticket-master-24.exp -index 6d57001..641b47d 100644 ---- a/pengine/test10/ticket-master-24.exp -+++ b/pengine/test10/ticket-master-24.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-3.exp b/pengine/test10/ticket-master-3.exp -index 256060e..2e1faee 100644 ---- a/pengine/test10/ticket-master-3.exp -+++ b/pengine/test10/ticket-master-3.exp -@@ -96,7 +96,7 @@ - - - -- -+ - - - -@@ -104,7 +104,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-4.exp b/pengine/test10/ticket-master-4.exp -index 8f76f85..44cb6a0 100644 ---- a/pengine/test10/ticket-master-4.exp -+++ b/pengine/test10/ticket-master-4.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -107,10 +107,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-5.exp b/pengine/test10/ticket-master-5.exp -index d160526..c0299ae 100644 ---- a/pengine/test10/ticket-master-5.exp -+++ b/pengine/test10/ticket-master-5.exp -@@ -34,7 +34,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-6.exp b/pengine/test10/ticket-master-6.exp -index b1b51b2..47b3cd7 100644 ---- a/pengine/test10/ticket-master-6.exp -+++ b/pengine/test10/ticket-master-6.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-7.exp b/pengine/test10/ticket-master-7.exp -index 8f76f85..44cb6a0 100644 ---- a/pengine/test10/ticket-master-7.exp -+++ b/pengine/test10/ticket-master-7.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -107,10 +107,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-8.exp b/pengine/test10/ticket-master-8.exp -index d160526..c0299ae 100644 ---- a/pengine/test10/ticket-master-8.exp -+++ b/pengine/test10/ticket-master-8.exp -@@ -34,7 +34,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-9.exp b/pengine/test10/ticket-master-9.exp -index 1ed731c..5b21e47 100644 ---- a/pengine/test10/ticket-master-9.exp -+++ b/pengine/test10/ticket-master-9.exp -@@ -135,7 +135,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-1.exp b/pengine/test10/ticket-primitive-1.exp -index b532698..88a1075 100644 ---- a/pengine/test10/ticket-primitive-1.exp -+++ b/pengine/test10/ticket-primitive-1.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-10.exp b/pengine/test10/ticket-primitive-10.exp -index b532698..88a1075 100644 ---- a/pengine/test10/ticket-primitive-10.exp -+++ b/pengine/test10/ticket-primitive-10.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-11.exp b/pengine/test10/ticket-primitive-11.exp -index 2d13079..ed47627 100644 ---- a/pengine/test10/ticket-primitive-11.exp -+++ b/pengine/test10/ticket-primitive-11.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-12.exp b/pengine/test10/ticket-primitive-12.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/ticket-primitive-12.exp -+++ b/pengine/test10/ticket-primitive-12.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-13.exp b/pengine/test10/ticket-primitive-13.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-primitive-13.exp -+++ b/pengine/test10/ticket-primitive-13.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-14.exp b/pengine/test10/ticket-primitive-14.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-14.exp -+++ b/pengine/test10/ticket-primitive-14.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-15.exp b/pengine/test10/ticket-primitive-15.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-15.exp -+++ b/pengine/test10/ticket-primitive-15.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-16.exp b/pengine/test10/ticket-primitive-16.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-primitive-16.exp -+++ b/pengine/test10/ticket-primitive-16.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-17.exp b/pengine/test10/ticket-primitive-17.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-17.exp -+++ b/pengine/test10/ticket-primitive-17.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-18.exp b/pengine/test10/ticket-primitive-18.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-18.exp -+++ b/pengine/test10/ticket-primitive-18.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-19.exp b/pengine/test10/ticket-primitive-19.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-primitive-19.exp -+++ b/pengine/test10/ticket-primitive-19.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-2.exp b/pengine/test10/ticket-primitive-2.exp -index 2d13079..ed47627 100644 ---- a/pengine/test10/ticket-primitive-2.exp -+++ b/pengine/test10/ticket-primitive-2.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-20.exp b/pengine/test10/ticket-primitive-20.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-20.exp -+++ b/pengine/test10/ticket-primitive-20.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-21.exp b/pengine/test10/ticket-primitive-21.exp -index c88cf38..72fcacd 100644 ---- a/pengine/test10/ticket-primitive-21.exp -+++ b/pengine/test10/ticket-primitive-21.exp -@@ -33,7 +33,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-22.exp b/pengine/test10/ticket-primitive-22.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-primitive-22.exp -+++ b/pengine/test10/ticket-primitive-22.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-23.exp b/pengine/test10/ticket-primitive-23.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-23.exp -+++ b/pengine/test10/ticket-primitive-23.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-24.exp b/pengine/test10/ticket-primitive-24.exp -index ba6632b..0f663b1 100644 ---- a/pengine/test10/ticket-primitive-24.exp -+++ b/pengine/test10/ticket-primitive-24.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-3.exp b/pengine/test10/ticket-primitive-3.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-3.exp -+++ b/pengine/test10/ticket-primitive-3.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-4.exp b/pengine/test10/ticket-primitive-4.exp -index b532698..88a1075 100644 ---- a/pengine/test10/ticket-primitive-4.exp -+++ b/pengine/test10/ticket-primitive-4.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-5.exp b/pengine/test10/ticket-primitive-5.exp -index 2d13079..ed47627 100644 ---- a/pengine/test10/ticket-primitive-5.exp -+++ b/pengine/test10/ticket-primitive-5.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-6.exp b/pengine/test10/ticket-primitive-6.exp -index 3cb5f90..12753e9 100644 ---- a/pengine/test10/ticket-primitive-6.exp -+++ b/pengine/test10/ticket-primitive-6.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -18,7 +18,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-7.exp b/pengine/test10/ticket-primitive-7.exp -index b532698..88a1075 100644 ---- a/pengine/test10/ticket-primitive-7.exp -+++ b/pengine/test10/ticket-primitive-7.exp -@@ -19,7 +19,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -@@ -49,10 +49,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-8.exp b/pengine/test10/ticket-primitive-8.exp -index 2d13079..ed47627 100644 ---- a/pengine/test10/ticket-primitive-8.exp -+++ b/pengine/test10/ticket-primitive-8.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-9.exp b/pengine/test10/ticket-primitive-9.exp -index c88cf38..72fcacd 100644 ---- a/pengine/test10/ticket-primitive-9.exp -+++ b/pengine/test10/ticket-primitive-9.exp -@@ -33,7 +33,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-1.exp b/pengine/test10/ticket-rsc-sets-1.exp -index 20800e2..869b1e3 100644 ---- a/pengine/test10/ticket-rsc-sets-1.exp -+++ b/pengine/test10/ticket-rsc-sets-1.exp -@@ -149,7 +149,7 @@ - - - -- -+ - - - -@@ -173,7 +173,7 @@ - - - -- -+ - - - -@@ -203,10 +203,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-10.exp b/pengine/test10/ticket-rsc-sets-10.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-10.exp -+++ b/pengine/test10/ticket-rsc-sets-10.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-11.exp b/pengine/test10/ticket-rsc-sets-11.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-rsc-sets-11.exp -+++ b/pengine/test10/ticket-rsc-sets-11.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-12.exp b/pengine/test10/ticket-rsc-sets-12.exp -index 2712003..bc5c4d4 100644 ---- a/pengine/test10/ticket-rsc-sets-12.exp -+++ b/pengine/test10/ticket-rsc-sets-12.exp -@@ -65,7 +65,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-13.exp b/pengine/test10/ticket-rsc-sets-13.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-13.exp -+++ b/pengine/test10/ticket-rsc-sets-13.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-14.exp b/pengine/test10/ticket-rsc-sets-14.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-14.exp -+++ b/pengine/test10/ticket-rsc-sets-14.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-2.exp b/pengine/test10/ticket-rsc-sets-2.exp -index 5618565..0594676 100644 ---- a/pengine/test10/ticket-rsc-sets-2.exp -+++ b/pengine/test10/ticket-rsc-sets-2.exp -@@ -215,7 +215,7 @@ - - - -- -+ - - - -@@ -223,7 +223,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-3.exp b/pengine/test10/ticket-rsc-sets-3.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-3.exp -+++ b/pengine/test10/ticket-rsc-sets-3.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-4.exp b/pengine/test10/ticket-rsc-sets-4.exp -index 20800e2..869b1e3 100644 ---- a/pengine/test10/ticket-rsc-sets-4.exp -+++ b/pengine/test10/ticket-rsc-sets-4.exp -@@ -149,7 +149,7 @@ - - - -- -+ - - - -@@ -173,7 +173,7 @@ - - - -- -+ - - - -@@ -203,10 +203,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-5.exp b/pengine/test10/ticket-rsc-sets-5.exp -index 9e20a6b..206959f 100644 ---- a/pengine/test10/ticket-rsc-sets-5.exp -+++ b/pengine/test10/ticket-rsc-sets-5.exp -@@ -104,7 +104,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-6.exp b/pengine/test10/ticket-rsc-sets-6.exp -index 9bd2d3a..91ce17e 100644 ---- a/pengine/test10/ticket-rsc-sets-6.exp -+++ b/pengine/test10/ticket-rsc-sets-6.exp -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -120,7 +120,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-7.exp b/pengine/test10/ticket-rsc-sets-7.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-7.exp -+++ b/pengine/test10/ticket-rsc-sets-7.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-8.exp b/pengine/test10/ticket-rsc-sets-8.exp -index ccd7539..cf75a01 100644 ---- a/pengine/test10/ticket-rsc-sets-8.exp -+++ b/pengine/test10/ticket-rsc-sets-8.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-rsc-sets-9.exp b/pengine/test10/ticket-rsc-sets-9.exp -index 35e5a99..36b6cc9 100644 ---- a/pengine/test10/ticket-rsc-sets-9.exp -+++ b/pengine/test10/ticket-rsc-sets-9.exp -@@ -153,7 +153,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unmanaged-master.exp b/pengine/test10/unmanaged-master.exp -index 9e0f188..58311fd 100644 ---- a/pengine/test10/unmanaged-master.exp -+++ b/pengine/test10/unmanaged-master.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -diff --git a/pengine/test10/unmanaged-stop-1.exp b/pengine/test10/unmanaged-stop-1.exp -index 7845919..ed7dcfb 100644 ---- a/pengine/test10/unmanaged-stop-1.exp -+++ b/pengine/test10/unmanaged-stop-1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unmanaged-stop-2.exp b/pengine/test10/unmanaged-stop-2.exp -index 7845919..ed7dcfb 100644 ---- a/pengine/test10/unmanaged-stop-2.exp -+++ b/pengine/test10/unmanaged-stop-2.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unmanaged-stop-3.exp b/pengine/test10/unmanaged-stop-3.exp -index 2cb2435..a1db8b0 100644 ---- a/pengine/test10/unmanaged-stop-3.exp -+++ b/pengine/test10/unmanaged-stop-3.exp -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unmanaged-stop-4.exp b/pengine/test10/unmanaged-stop-4.exp -index 2cb2435..a1db8b0 100644 ---- a/pengine/test10/unmanaged-stop-4.exp -+++ b/pengine/test10/unmanaged-stop-4.exp -@@ -9,7 +9,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unrunnable-1.exp b/pengine/test10/unrunnable-1.exp -index 62a6e29..35b17ee 100644 ---- a/pengine/test10/unrunnable-1.exp -+++ b/pengine/test10/unrunnable-1.exp -@@ -120,7 +120,7 @@ - - - -- -+ - - - -@@ -168,7 +168,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/use-after-free-merge.exp b/pengine/test10/use-after-free-merge.exp -index e7052b1..178b84e 100644 ---- a/pengine/test10/use-after-free-merge.exp -+++ b/pengine/test10/use-after-free-merge.exp -@@ -144,7 +144,7 @@ - - - -- -+ - - - -@@ -165,7 +165,7 @@ - - - -- -+ - - - -@@ -192,10 +192,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/utilization-order1.exp b/pengine/test10/utilization-order1.exp -index c5e551d..40ba326 100644 ---- a/pengine/test10/utilization-order1.exp -+++ b/pengine/test10/utilization-order1.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -31,7 +31,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/utilization-order2.exp b/pengine/test10/utilization-order2.exp -index f62a8ef..dfa3f60 100644 ---- a/pengine/test10/utilization-order2.exp -+++ b/pengine/test10/utilization-order2.exp -@@ -84,7 +84,7 @@ - - - -- -+ - - - -@@ -92,7 +92,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/utilization-order3.exp b/pengine/test10/utilization-order3.exp -index 570a39e..9075052 100644 ---- a/pengine/test10/utilization-order3.exp -+++ b/pengine/test10/utilization-order3.exp -@@ -64,7 +64,7 @@ - - - -- -+ - - - -@@ -72,7 +72,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/utilization.exp b/pengine/test10/utilization.exp -index ed08a2b..f6c1b69 100644 ---- a/pengine/test10/utilization.exp -+++ b/pengine/test10/utilization.exp -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -68,7 +68,7 @@ - - - -- -+ - - - -@@ -89,10 +89,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail3.exp b/pengine/test10/whitebox-fail3.exp -index c5a6474..739d71b 100644 ---- a/pengine/test10/whitebox-fail3.exp -+++ b/pengine/test10/whitebox-fail3.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -205,7 +205,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-ms-ordering.exp b/pengine/test10/whitebox-ms-ordering.exp -new file mode 100644 -index 0000000..1ff4595 ---- /dev/null -+++ b/pengine/test10/whitebox-ms-ordering.exp -@@ -0,0 +1,503 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c -index 78cab50..2eb68f1 100644 ---- a/tools/crm_simulate.c -+++ b/tools/crm_simulate.c -@@ -760,9 +760,12 @@ create_action_name(action_t * action) - } else if (safe_str_eq(action->task, CRM_OP_FENCE)) { - action_name = g_strdup_printf("%s%s %s", prefix ? prefix : "", action->task, action_host); - -- } else if (action_host) { -+ } else if (action->rsc && action_host) { - action_name = g_strdup_printf("%s%s %s", prefix ? prefix : "", action->uuid, action_host); - -+ } else if (action_host) { -+ action_name = g_strdup_printf("%s%s %s", prefix ? prefix : "", action->task, action_host); -+ - } else { - action_name = g_strdup_printf("%s", action->uuid); - } -@@ -789,7 +792,7 @@ create_dotfile(pe_working_set_t * data_set, const char *dot_file, gboolean all_a - const char *color = "black"; - char *action_name = create_action_name(action); - -- crm_trace("Action %d: %p", action->id, action); -+ crm_trace("Action %d: %s %s %p", action->id, action_name, action->uuid, action); - - if (is_set(action->flags, pe_action_pseudo)) { - font = "orange"; -@@ -819,6 +822,8 @@ create_dotfile(pe_working_set_t * data_set, const char *dot_file, gboolean all_a - } - - set_bit(action->flags, pe_action_dumped); -+ crm_trace("\"%s\" [ style=%s color=\"%s\" fontcolor=\"%s\"]", -+ action_name, style, color, font); - fprintf(dot_strm, "\"%s\" [ style=%s color=\"%s\" fontcolor=\"%s\"]\n", - action_name, style, color, font); - dont_write: -@@ -857,6 +862,8 @@ create_dotfile(pe_working_set_t * data_set, const char *dot_file, gboolean all_a - if (all_actions || optional == FALSE) { - before_name = create_action_name(before->action); - after_name = create_action_name(action); -+ crm_trace("\"%s\" -> \"%s\" [ style = %s]", -+ before_name, after_name, style); - fprintf(dot_strm, "\"%s\" -> \"%s\" [ style = %s]\n", - before_name, after_name, style); - free(before_name); diff --git a/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_occurs_before_fencing_devices_are_re_probed.patch b/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_occurs_before_fencing_devices_are_re_probed.patch deleted file mode 100644 index b7d7017..0000000 --- a/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_occurs_before_fencing_devices_are_re_probed.patch +++ /dev/null @@ -1,311 +0,0 @@ -commit 5566c3e6b194cbe682408ef9c88ad3b6a9755f7d -Author: Andrew Beekhof -Date: Wed Apr 9 12:07:46 2014 +1000 - - Fix: PE: Ensure unfencing occurs before fencing devices are (re-)probed - - (cherry picked from commit 6be22945726c204b9c73da843bb04981e46126be) - - Conflicts: - pengine/test10/unfence-startup.summary - -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index e84d341..9cb744a 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1881,7 +1881,7 @@ trigger_unfencing( - action_t *unfence = pe_fence_op(node, "on", FALSE, data_set); - - crm_notice("Unfencing %s: %s", node->details->uname, reason); -- if(FALSE && dependancy) { -+ if(dependancy) { - order_actions(unfence, dependancy, pe_order_optional); - } - -diff --git a/pengine/native.c b/pengine/native.c -index 3d75dc9..5c723c2 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -2518,8 +2518,21 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - } - - pe_rsc_debug(rsc, "Probing %s on %s (%s)", rsc->id, node->details->uname, role2text(rsc->role)); -- order_actions(probe, complete, pe_order_implies_then); - -+ if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { -+ /* Normally rsc.start depends on probe complete which depends -+ * on rsc.probe. But this can't be the case in this scenario as -+ * it would create graph loops. -+ * -+ * So instead we explicitly order 'rsc.probe then rsc.start' -+ */ -+ custom_action_order(rsc, NULL, probe, -+ rsc, generate_op_key(rsc->id, RSC_START, 0), NULL, -+ pe_order_optional, data_set); -+ -+ } else { -+ order_actions(probe, complete, pe_order_implies_then); -+ } - return TRUE; - } - -diff --git a/pengine/test10/unfence-definition.dot b/pengine/test10/unfence-definition.dot -index e737687..6ab0e28 100644 ---- a/pengine/test10/unfence-definition.dot -+++ b/pengine/test10/unfence-definition.dot -@@ -61,7 +61,7 @@ digraph "g" { - "dlm_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] - "fencing_delete_0 virt-1" -> "fencing_start_0 virt-1" [ style = bold] - "fencing_delete_0 virt-1" [ style=bold color="green" fontcolor="black"] --"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"fencing_monitor_0 virt-3" -> "fencing_start_0 virt-1" [ style = bold] - "fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] - "fencing_start_0 virt-1" [ style=bold color="green" fontcolor="black"] - "fencing_stop_0 virt-1" -> "all_stopped" [ style = bold] -@@ -89,6 +89,7 @@ digraph "g" { - "stonith 'on' virt-1" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] - "stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "fencing_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] - "stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] - "stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -diff --git a/pengine/test10/unfence-definition.exp b/pengine/test10/unfence-definition.exp -index 9075347..0f779da 100644 ---- a/pengine/test10/unfence-definition.exp -+++ b/pengine/test10/unfence-definition.exp -@@ -19,6 +19,9 @@ - - - -+ -+ -+ - - - -@@ -28,7 +31,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -387,9 +394,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/unfence-definition.summary b/pengine/test10/unfence-definition.summary -index c954c4b..3e4b66b 100644 ---- a/pengine/test10/unfence-definition.summary -+++ b/pengine/test10/unfence-definition.summary -@@ -20,7 +20,6 @@ Transition Summary: - * Start clvmd:2 (virt-3) - - Executing cluster transition: -- * Resource action: fencing monitor on virt-3 - * Resource action: dlm monitor on virt-3 - * Resource action: clvmd monitor on virt-2 - * Resource action: clvmd monitor on virt-3 -@@ -38,8 +37,9 @@ Executing cluster transition: - * Fencing virt-3 (on) - * Pseudo action: all_stopped - * Fencing virt-1 (on) -- * Resource action: fencing start on virt-1 -+ * Resource action: fencing monitor on virt-3 - * Pseudo action: dlm-clone_start_0 -+ * Resource action: fencing start on virt-1 - * Resource action: dlm start on virt-1 - * Resource action: dlm start on virt-3 - * Pseudo action: dlm-clone_running_0 -diff --git a/pengine/test10/unfence-parameters.dot b/pengine/test10/unfence-parameters.dot -index e67eb5a..082bbe1 100644 ---- a/pengine/test10/unfence-parameters.dot -+++ b/pengine/test10/unfence-parameters.dot -@@ -78,7 +78,7 @@ digraph "g" { - "dlm_stop_0 virt-2" -> "dlm_start_0 virt-2" [ style = bold] - "dlm_stop_0 virt-2" -> "dlm_stop_0 virt-1" [ style = bold] - "dlm_stop_0 virt-2" [ style=bold color="green" fontcolor="black"] --"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] -+"fencing_monitor_0 virt-3" -> "fencing_start_0 virt-1" [ style = bold] - "fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] - "fencing_start_0 virt-1" [ style=bold color="green" fontcolor="black"] - "fencing_stop_0 virt-1" -> "all_stopped" [ style = bold] -@@ -111,6 +111,7 @@ digraph "g" { - "stonith 'on' virt-2" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] - "stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "fencing_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] - "stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] - "stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -diff --git a/pengine/test10/unfence-parameters.exp b/pengine/test10/unfence-parameters.exp -index 491d78e..d3480f3 100644 ---- a/pengine/test10/unfence-parameters.exp -+++ b/pengine/test10/unfence-parameters.exp -@@ -19,7 +19,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -36,6 +40,9 @@ - - - -+ -+ -+ - - - -@@ -433,9 +440,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/unfence-parameters.summary b/pengine/test10/unfence-parameters.summary -index 17bbc62..5276cba 100644 ---- a/pengine/test10/unfence-parameters.summary -+++ b/pengine/test10/unfence-parameters.summary -@@ -21,7 +21,6 @@ Transition Summary: - * Start clvmd:2 (virt-3) - - Executing cluster transition: -- * Resource action: fencing monitor on virt-3 - * Resource action: dlm monitor on virt-3 - * Resource action: clvmd monitor on virt-2 - * Resource action: clvmd monitor on virt-3 -@@ -40,6 +39,7 @@ Executing cluster transition: - * Fencing virt-2 (on) - * Pseudo action: all_stopped - * Fencing virt-1 (on) -+ * Resource action: fencing monitor on virt-3 - * Resource action: fencing start on virt-1 - * Pseudo action: dlm-clone_start_0 - * Resource action: dlm start on virt-1 -diff --git a/pengine/test10/unfence-startup.dot b/pengine/test10/unfence-startup.dot -index a5cc606..4dbd273 100644 ---- a/pengine/test10/unfence-startup.dot -+++ b/pengine/test10/unfence-startup.dot -@@ -26,7 +26,6 @@ digraph "g" { - "dlm:2_start_0 virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] - "dlm:2_start_0 virt-3" -> "dlm-clone_running_0" [ style = bold] - "dlm:2_start_0 virt-3" [ style=bold color="green" fontcolor="black"] --"fencing_monitor_0 virt-3" -> "probe_complete virt-3" [ style = bold] - "fencing_monitor_0 virt-3" [ style=bold color="green" fontcolor="black"] - "probe_complete virt-1" -> "probe_complete" [ style = bold] - "probe_complete virt-1" [ style=bold color="green" fontcolor="black"] -@@ -40,6 +39,7 @@ digraph "g" { - "probe_complete" [ style=bold color="green" fontcolor="orange"] - "stonith 'on' virt-3" -> "clvmd-clone_start_0" [ style = bold] - "stonith 'on' virt-3" -> "dlm-clone_start_0" [ style = bold] -+"stonith 'on' virt-3" -> "fencing_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" [ style=bold color="green" fontcolor="black"] - "stonith 'reboot' virt-4" -> "stonith_complete" [ style = bold] - "stonith 'reboot' virt-4" [ style=bold color="green" fontcolor="black"] -diff --git a/pengine/test10/unfence-startup.exp b/pengine/test10/unfence-startup.exp -index 8a04d54..7c55d2c 100644 ---- a/pengine/test10/unfence-startup.exp -+++ b/pengine/test10/unfence-startup.exp -@@ -6,7 +6,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -186,9 +190,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/unfence-startup.summary b/pengine/test10/unfence-startup.summary -new file mode 100644 -index 0000000..a03fa15 ---- /dev/null -+++ b/pengine/test10/unfence-startup.summary -@@ -0,0 +1,48 @@ -+ -+Current cluster status: -+Node virt-4 (4): UNCLEAN (offline) -+Online: [ virt-1 virt-2 virt-3 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 ] -+ Stopped: [ virt-3 virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 ] -+ Stopped: [ virt-2 virt-3 virt-4 ] -+ -+Transition Summary: -+ * Start dlm:2 (virt-3) -+ * Start clvmd:1 (virt-2) -+ * Start clvmd:2 (virt-3) -+ -+Executing cluster transition: -+ * Resource action: dlm monitor on virt-3 -+ * Resource action: clvmd monitor on virt-2 -+ * Resource action: clvmd monitor on virt-3 -+ * Fencing virt-4 (reboot) -+ * Pseudo action: stonith_complete -+ * Pseudo action: probe_complete -+ * Fencing virt-3 (on) -+ * Pseudo action: all_stopped -+ * Resource action: fencing monitor on virt-3 -+ * Pseudo action: dlm-clone_start_0 -+ * Resource action: dlm start on virt-3 -+ * Pseudo action: dlm-clone_running_0 -+ * Pseudo action: clvmd-clone_start_0 -+ * Resource action: clvmd start on virt-2 -+ * Resource action: clvmd start on virt-3 -+ * Pseudo action: clvmd-clone_running_0 -+ -+Revised cluster status: -+Online: [ virt-1 virt-2 virt-3 ] -+OFFLINE: [ virt-4 ] -+ -+ fencing (stonith:fence_scsi): Started virt-1 -+ Clone Set: dlm-clone [dlm] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ Clone Set: clvmd-clone [clvmd] -+ Started: [ virt-1 virt-2 virt-3 ] -+ Stopped: [ virt-4 ] -+ diff --git a/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_only_happens_once_even_if_the_transition_is_interrupted.patch b/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_only_happens_once_even_if_the_transition_is_interrupted.patch deleted file mode 100644 index 0cbf2b6..0000000 --- a/SOURCES/bz1078078-pcmk-pe_ensure_unfencing_only_happens_once_even_if_the_transition_is_interrupted.patch +++ /dev/null @@ -1,57 +0,0 @@ -commit 6f2e3fc12f64f317280f9cb3d65cc08489516e39 -Author: Andrew Beekhof -Date: Thu Apr 10 14:25:32 2014 +1000 - - Fix: PE: Ensure unfencing only happens once, even if the transition is interrupted - - (cherry picked from commit 76a3fe06ae8fdfa579b2ae6ba730945ef79b0ebc) - -diff --git a/pengine/native.c b/pengine/native.c -index 5c723c2..6294092 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -2498,6 +2498,7 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - */ - if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { - trigger_unfencing(NULL, node, "node discovery", probe, data_set); -+ probe->priority = INFINITY; /* Ensure this runs if unfencing succeeds */ - - } else if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { - action_t *unfence = pe_fence_op(node, "on", TRUE, data_set); -diff --git a/pengine/test10/unfence-definition.exp b/pengine/test10/unfence-definition.exp -index 0f779da..f023a0b 100644 ---- a/pengine/test10/unfence-definition.exp -+++ b/pengine/test10/unfence-definition.exp -@@ -24,7 +24,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unfence-parameters.exp b/pengine/test10/unfence-parameters.exp -index d3480f3..8ff3016 100644 ---- a/pengine/test10/unfence-parameters.exp -+++ b/pengine/test10/unfence-parameters.exp -@@ -12,7 +12,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unfence-startup.exp b/pengine/test10/unfence-startup.exp -index 7c55d2c..a0661e7 100644 ---- a/pengine/test10/unfence-startup.exp -+++ b/pengine/test10/unfence-startup.exp -@@ -1,5 +1,5 @@ - -- -+ - - - diff --git a/SOURCES/bz1078078-pcmk-pe_fencing_devices_default_to_only_requiring_quorum_in_order_to_start.patch b/SOURCES/bz1078078-pcmk-pe_fencing_devices_default_to_only_requiring_quorum_in_order_to_start.patch deleted file mode 100644 index d4831fd..0000000 --- a/SOURCES/bz1078078-pcmk-pe_fencing_devices_default_to_only_requiring_quorum_in_order_to_start.patch +++ /dev/null @@ -1,753 +0,0 @@ -commit fabf4840a335d199ec921b37692af02344e87565 -Author: Andrew Beekhof -Date: Fri Apr 4 10:14:05 2014 +1100 - - Fix: PE: Fencing devices default to only requiring quorum in order to start - - (cherry picked from commit c19b872efb9ad1007f5bf574abf1928689af9dcc) - - Conflicts: - pengine/test10/bug-5186-partial-migrate.dot - -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 8b774c0..0f20481 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -586,7 +586,10 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - } - - isdefault = TRUE; -- if (is_set(data_set->flags, pe_flag_enable_unfencing)) { -+ if(is_set((*rsc)->flags, pe_rsc_fence_device)) { -+ value = "quorum"; -+ -+ } else if (is_set(data_set->flags, pe_flag_enable_unfencing)) { - value = "unfencing"; - - } else if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -diff --git a/pengine/test10/bug-5186-partial-migrate.exp b/pengine/test10/bug-5186-partial-migrate.exp -index 7e10e3a..216d962 100644 ---- a/pengine/test10/bug-5186-partial-migrate.exp -+++ b/pengine/test10/bug-5186-partial-migrate.exp -@@ -167,9 +167,6 @@ - - - -- -- -- - - - -@@ -220,9 +217,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/bug-lf-2508.dot b/pengine/test10/bug-lf-2508.dot -index 6bef312..6e88af5 100644 ---- a/pengine/test10/bug-lf-2508.dot -+++ b/pengine/test10/bug-lf-2508.dot -@@ -24,6 +24,7 @@ digraph "g" { - "Group02_stop_0" [ style=bold color="green" fontcolor="orange" ] - "Group02_stopped_0" -> "Group02_start_0" [ style = bold] - "Group02_stopped_0" [ style=bold color="green" fontcolor="orange" ] -+"all_stopped" -> "prmStonith3-3:1_start_0 srv01" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "clnStonith1_stop_0" -> "clnStonith1_stopped_0" [ style = bold] - "clnStonith1_stop_0" -> "grpStonith1:1_stop_0" [ style = bold] -@@ -107,6 +108,5 @@ digraph "g" { - "stonith_complete" -> "Dummy01_start_0 srv01" [ style = bold] - "stonith_complete" -> "Dummy02_start_0 srv04" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "prmStonith3-3:1_start_0 srv01" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/bug-lf-2508.exp b/pengine/test10/bug-lf-2508.exp -index d56002e..0d84e9e 100644 ---- a/pengine/test10/bug-lf-2508.exp -+++ b/pengine/test10/bug-lf-2508.exp -@@ -363,10 +363,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2551.dot b/pengine/test10/bug-lf-2551.dot -index 3225e00..ed80e15 100644 ---- a/pengine/test10/bug-lf-2551.dot -+++ b/pengine/test10/bug-lf-2551.dot -@@ -80,7 +80,6 @@ digraph "g" { - "stonith 'reboot' hex-9" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "dummy1_start_0 hex-0" [ style = bold] --"stonith_complete" -> "fencing-sbd_start_0 hex-0" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - "vg1:3_stop_0 hex-9" -> "all_stopped" [ style = bold] - "vg1:3_stop_0 hex-9" -> "base-group:3_stopped_0" [ style = bold] -diff --git a/pengine/test10/bug-lf-2551.exp b/pengine/test10/bug-lf-2551.exp -index 7790199..1912812 100644 ---- a/pengine/test10/bug-lf-2551.exp -+++ b/pengine/test10/bug-lf-2551.exp -@@ -10,9 +10,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/rec-node-11.dot b/pengine/test10/rec-node-11.dot -index 2865f41..bc76888 100644 ---- a/pengine/test10/rec-node-11.dot -+++ b/pengine/test10/rec-node-11.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "group1_running_0" [ style=bold color="green" fontcolor="orange" ] - "group1_start_0" -> "group1_running_0" [ style = bold] -@@ -56,6 +57,5 @@ digraph "g" { - "stonith_complete" -> "rsc1_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc3_start_0 node2" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-11.exp b/pengine/test10/rec-node-11.exp -index f441ce8..b6f4c47 100644 ---- a/pengine/test10/rec-node-11.exp -+++ b/pengine/test10/rec-node-11.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-11.summary b/pengine/test10/rec-node-11.summary -index d2ad78a..5a37fb8 100644 ---- a/pengine/test10/rec-node-11.summary -+++ b/pengine/test10/rec-node-11.summary -@@ -22,13 +22,13 @@ Executing cluster transition: - * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on node2 - * Pseudo action: group1_stop_0 - * Pseudo action: rsc2_stop_0 - * Pseudo action: rsc1_stop_0 - * Pseudo action: group1_stopped_0 - * Resource action: rsc3 stop on node2 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on node2 - * Resource action: rsc3 start on node2 - * Pseudo action: group1_start_0 - * Resource action: rsc1 start on node2 -diff --git a/pengine/test10/rec-node-15.dot b/pengine/test10/rec-node-15.dot -index 31d0929..71062bf 100644 ---- a/pengine/test10/rec-node-15.dot -+++ b/pengine/test10/rec-node-15.dot -@@ -42,6 +42,7 @@ digraph "g" { - "LVM_22_start_0 sapcl01" -> "LVM_22_monitor_120000 sapcl01" [ style = bold] - "LVM_22_start_0 sapcl01" -> "oracle_running_0" [ style = bold] - "LVM_22_start_0 sapcl01" [ style=bold color="green" fontcolor="black" ] -+"all_stopped" -> "stonith-1_start_0 sapcl01" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "app02_running_0" [ style=bold color="green" fontcolor="orange" ] - "app02_start_0" -> "Filesystem_13_start_0 sapcl01" [ style = bold] -@@ -98,6 +99,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "oracle_24_start_0 sapcl01" [ style = bold] - "stonith_complete" -> "oralsnr_25_start_0 sapcl01" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 sapcl01" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-15.exp b/pengine/test10/rec-node-15.exp -index e1330a6..9654d34 100644 ---- a/pengine/test10/rec-node-15.exp -+++ b/pengine/test10/rec-node-15.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-15.summary b/pengine/test10/rec-node-15.summary -index 85bfed5..b44a364 100644 ---- a/pengine/test10/rec-node-15.summary -+++ b/pengine/test10/rec-node-15.summary -@@ -39,7 +39,6 @@ Executing cluster transition: - * Fencing sapcl03 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on sapcl01 - * Resource action: Filesystem_13 stop on sapcl02 - * Resource action: IPaddr_192_168_1_104 start on sapcl01 - * Resource action: LVM_22 start on sapcl01 -@@ -55,6 +54,7 @@ Executing cluster transition: - * Resource action: oralsnr_25 monitor=120000 on sapcl01 - * Resource action: IPaddr_192_168_1_102 stop on sapcl02 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on sapcl01 - * Pseudo action: app02_stopped_0 - * Pseudo action: app02_start_0 - * Resource action: IPaddr_192_168_1_102 start on sapcl01 -diff --git a/pengine/test10/rec-node-2.dot b/pengine/test10/rec-node-2.dot -index f8ba887..d889080 100644 ---- a/pengine/test10/rec-node-2.dot -+++ b/pengine/test10/rec-node-2.dot -@@ -1,6 +1,7 @@ - digraph "g" { - "all_stopped" -> "rsc1_start_0 node2" [ style = bold] - "all_stopped" -> "rsc3_start_0 node2" [ style = bold] -+"all_stopped" -> "stonith-1_start_0 node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "group1_running_0" [ style=bold color="green" fontcolor="orange" ] - "group1_start_0" -> "group1_running_0" [ style = bold] -@@ -56,6 +57,5 @@ digraph "g" { - "stonith_complete" -> "rsc4_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc5_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc6_start_0 node2" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-2.exp b/pengine/test10/rec-node-2.exp -index fd04c37..ea68e3e 100644 ---- a/pengine/test10/rec-node-2.exp -+++ b/pengine/test10/rec-node-2.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-4.dot b/pengine/test10/rec-node-4.dot -index e5b31ef..221cefe 100644 ---- a/pengine/test10/rec-node-4.dot -+++ b/pengine/test10/rec-node-4.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "probe_complete node2" -> "probe_complete" [ style = bold] - "probe_complete node2" [ style=bold color="green" fontcolor="black" ] -@@ -30,6 +31,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc1_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node2" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-4.exp b/pengine/test10/rec-node-4.exp -index 2cbfecb..4932b98 100644 ---- a/pengine/test10/rec-node-4.exp -+++ b/pengine/test10/rec-node-4.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-4.summary b/pengine/test10/rec-node-4.summary -index 295da1d..60f70fc 100644 ---- a/pengine/test10/rec-node-4.summary -+++ b/pengine/test10/rec-node-4.summary -@@ -19,10 +19,10 @@ Executing cluster transition: - * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on node2 - * Pseudo action: rsc1_stop_0 - * Pseudo action: rsc2_stop_0 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on node2 - * Resource action: rsc1 start on node2 - * Resource action: rsc2 start on node2 - -diff --git a/pengine/test10/rec-node-6.dot b/pengine/test10/rec-node-6.dot -index e5b31ef..221cefe 100644 ---- a/pengine/test10/rec-node-6.dot -+++ b/pengine/test10/rec-node-6.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "probe_complete node2" -> "probe_complete" [ style = bold] - "probe_complete node2" [ style=bold color="green" fontcolor="black" ] -@@ -30,6 +31,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc1_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node2" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-6.exp b/pengine/test10/rec-node-6.exp -index 2cbfecb..4932b98 100644 ---- a/pengine/test10/rec-node-6.exp -+++ b/pengine/test10/rec-node-6.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-6.summary b/pengine/test10/rec-node-6.summary -index 300d61b..7ae96e5 100644 ---- a/pengine/test10/rec-node-6.summary -+++ b/pengine/test10/rec-node-6.summary -@@ -19,10 +19,10 @@ Executing cluster transition: - * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on node2 - * Pseudo action: rsc1_stop_0 - * Pseudo action: rsc2_stop_0 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on node2 - * Resource action: rsc1 start on node2 - * Resource action: rsc2 start on node2 - -diff --git a/pengine/test10/rec-node-7.dot b/pengine/test10/rec-node-7.dot -index e5b31ef..221cefe 100644 ---- a/pengine/test10/rec-node-7.dot -+++ b/pengine/test10/rec-node-7.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "probe_complete node2" -> "probe_complete" [ style = bold] - "probe_complete node2" [ style=bold color="green" fontcolor="black" ] -@@ -30,6 +31,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc1_start_0 node2" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node2" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-7.exp b/pengine/test10/rec-node-7.exp -index 2cbfecb..4932b98 100644 ---- a/pengine/test10/rec-node-7.exp -+++ b/pengine/test10/rec-node-7.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-node-7.summary b/pengine/test10/rec-node-7.summary -index 295da1d..60f70fc 100644 ---- a/pengine/test10/rec-node-7.summary -+++ b/pengine/test10/rec-node-7.summary -@@ -19,10 +19,10 @@ Executing cluster transition: - * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on node2 - * Pseudo action: rsc1_stop_0 - * Pseudo action: rsc2_stop_0 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on node2 - * Resource action: rsc1 start on node2 - * Resource action: rsc2 start on node2 - -diff --git a/pengine/test10/rec-rsc-5.dot b/pengine/test10/rec-rsc-5.dot -index 53b9521..3ca51f8 100644 ---- a/pengine/test10/rec-rsc-5.dot -+++ b/pengine/test10/rec-rsc-5.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 node1" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "probe_complete node1" -> "probe_complete" [ style = bold] - "probe_complete node1" [ style=bold color="green" fontcolor="black" ] -@@ -30,6 +31,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc1_start_0 node1" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node1" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 node1" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-rsc-5.exp b/pengine/test10/rec-rsc-5.exp -index 95a3558..a99555f 100644 ---- a/pengine/test10/rec-rsc-5.exp -+++ b/pengine/test10/rec-rsc-5.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-5.summary b/pengine/test10/rec-rsc-5.summary -index 549abe6..cdb9011 100644 ---- a/pengine/test10/rec-rsc-5.summary -+++ b/pengine/test10/rec-rsc-5.summary -@@ -19,10 +19,10 @@ Executing cluster transition: - * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete -- * Resource action: stonith-1 start on node1 - * Pseudo action: rsc1_stop_0 - * Pseudo action: rsc2_stop_0 - * Pseudo action: all_stopped -+ * Resource action: stonith-1 start on node1 - * Resource action: rsc1 start on node1 - * Resource action: rsc2 start on node1 - -diff --git a/pengine/test10/stonith-3.dot b/pengine/test10/stonith-3.dot -index df5f607..86c3bd3 100644 ---- a/pengine/test10/stonith-3.dot -+++ b/pengine/test10/stonith-3.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "prmStonith:0_start_0 rh5node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "clnStonith_running_0" [ style=bold color="green" fontcolor="orange" ] - "clnStonith_start_0" -> "clnStonith_running_0" [ style = bold] -@@ -27,6 +28,5 @@ digraph "g" { - "stonith 'reboot' rh5node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "prmIpPostgreSQLDB_start_0 rh5node2" [ style = bold] --"stonith_complete" -> "prmStonith:0_start_0 rh5node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/stonith-3.exp b/pengine/test10/stonith-3.exp -index c4c1e32..4ada6ad 100644 ---- a/pengine/test10/stonith-3.exp -+++ b/pengine/test10/stonith-3.exp -@@ -73,13 +73,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/stonith-4.dot b/pengine/test10/stonith-4.dot -index 24243d8..1a7771a 100644 ---- a/pengine/test10/stonith-4.dot -+++ b/pengine/test10/stonith-4.dot -@@ -6,6 +6,7 @@ digraph "g" { - "Fencing_monitor_0 pcmk-3" -> "probe_complete pcmk-3" [ style = dashed] - "Fencing_monitor_0 pcmk-3" [ style=dashed color="red" fontcolor="black"] - "Fencing_start_0 pcmk-1" [ style=bold color="green" fontcolor="black"] -+"all_stopped" -> "Fencing_start_0 pcmk-1" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "probe_complete pcmk-11" -> "probe_complete" [ style = bold] - "probe_complete pcmk-11" [ style=dashed color="red" fontcolor="black"] -@@ -23,7 +24,6 @@ digraph "g" { - "stonith 'reboot' pcmk-7" [ style=bold color="green" fontcolor="black"] - "stonith 'reboot' pcmk-8" -> "stonith_complete" [ style = bold] - "stonith 'reboot' pcmk-8" [ style=bold color="green" fontcolor="black"] --"stonith_complete" -> "Fencing_start_0 pcmk-1" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/stonith-4.exp b/pengine/test10/stonith-4.exp -index 2be0a96..aa61f4d 100644 ---- a/pengine/test10/stonith-4.exp -+++ b/pengine/test10/stonith-4.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealth2.dot b/pengine/test10/systemhealth2.dot -index dcf49eb..1e029a6 100644 ---- a/pengine/test10/systemhealth2.dot -+++ b/pengine/test10/systemhealth2.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 hs21c" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "apache_1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "apache_1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] -@@ -24,6 +25,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "stonith_complete" -> "nfs_1_start_0 hs21c" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealth2.exp b/pengine/test10/systemhealth2.exp -index 95d8847..43ae4e3 100644 ---- a/pengine/test10/systemhealth2.exp -+++ b/pengine/test10/systemhealth2.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealth3.dot b/pengine/test10/systemhealth3.dot -index dcf49eb..1e029a6 100644 ---- a/pengine/test10/systemhealth3.dot -+++ b/pengine/test10/systemhealth3.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 hs21c" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "apache_1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "apache_1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] -@@ -24,6 +25,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "stonith_complete" -> "nfs_1_start_0 hs21c" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealth3.exp b/pengine/test10/systemhealth3.exp -index 95d8847..43ae4e3 100644 ---- a/pengine/test10/systemhealth3.exp -+++ b/pengine/test10/systemhealth3.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm2.dot b/pengine/test10/systemhealthm2.dot -index dcf49eb..1e029a6 100644 ---- a/pengine/test10/systemhealthm2.dot -+++ b/pengine/test10/systemhealthm2.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 hs21c" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "apache_1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "apache_1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] -@@ -24,6 +25,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "stonith_complete" -> "nfs_1_start_0 hs21c" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthm2.exp b/pengine/test10/systemhealthm2.exp -index 95d8847..43ae4e3 100644 ---- a/pengine/test10/systemhealthm2.exp -+++ b/pengine/test10/systemhealthm2.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn2.dot b/pengine/test10/systemhealthn2.dot -index dcf49eb..1e029a6 100644 ---- a/pengine/test10/systemhealthn2.dot -+++ b/pengine/test10/systemhealthn2.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 hs21c" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "apache_1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "apache_1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] -@@ -24,6 +25,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "stonith_complete" -> "nfs_1_start_0 hs21c" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthn2.exp b/pengine/test10/systemhealthn2.exp -index 95d8847..43ae4e3 100644 ---- a/pengine/test10/systemhealthn2.exp -+++ b/pengine/test10/systemhealthn2.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn3.dot b/pengine/test10/systemhealthn3.dot -index dcf49eb..1e029a6 100644 ---- a/pengine/test10/systemhealthn3.dot -+++ b/pengine/test10/systemhealthn3.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "stonith-1_start_0 hs21c" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange" ] - "apache_1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "apache_1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] -@@ -24,6 +25,5 @@ digraph "g" { - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "stonith_complete" -> "nfs_1_start_0 hs21c" [ style = bold] --"stonith_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthn3.exp b/pengine/test10/systemhealthn3.exp -index 95d8847..43ae4e3 100644 ---- a/pengine/test10/systemhealthn3.exp -+++ b/pengine/test10/systemhealthn3.exp -@@ -8,10 +8,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-21.dot b/pengine/test10/ticket-master-21.dot -index e1abd95..60386a8 100644 ---- a/pengine/test10/ticket-master-21.dot -+++ b/pengine/test10/ticket-master-21.dot -@@ -27,6 +27,5 @@ digraph "g" { - "stonith 'reboot' node1" -> "stonith_complete" [ style = bold] - "stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "rsc_stonith_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/ticket-master-21.exp b/pengine/test10/ticket-master-21.exp -index 5b21e47..e9482c4 100644 ---- a/pengine/test10/ticket-master-21.exp -+++ b/pengine/test10/ticket-master-21.exp -@@ -10,9 +10,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/ticket-master-9.dot b/pengine/test10/ticket-master-9.dot -index 40c2e7f..3a29836 100644 ---- a/pengine/test10/ticket-master-9.dot -+++ b/pengine/test10/ticket-master-9.dot -@@ -27,6 +27,5 @@ digraph "g" { - "stonith 'reboot' node1" -> "stonith_complete" [ style = bold] - "stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "rsc_stonith_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/ticket-master-9.exp b/pengine/test10/ticket-master-9.exp -index 5b21e47..e9482c4 100644 ---- a/pengine/test10/ticket-master-9.exp -+++ b/pengine/test10/ticket-master-9.exp -@@ -10,9 +10,6 @@ - - - -- -- -- - - - diff --git a/SOURCES/bz1078078-pcmk-pe_fix_comments_and_formatting_for_pe_ordering_enum.patch b/SOURCES/bz1078078-pcmk-pe_fix_comments_and_formatting_for_pe_ordering_enum.patch deleted file mode 100644 index f9b3516..0000000 --- a/SOURCES/bz1078078-pcmk-pe_fix_comments_and_formatting_for_pe_ordering_enum.patch +++ /dev/null @@ -1,55 +0,0 @@ -commit 75a1451ef00947f7689d42d59efa92503485b8a3 -Author: Andrew Beekhof -Date: Tue Apr 1 19:31:28 2014 +1100 - - Refactor: PE: Fix comments and formatting for pe_ordering enum - - (cherry picked from commit 43596dcacadbdd1199e1238052105914311b151c) - - Conflicts: - include/crm/pengine/status.h - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index 158a562..c81566a 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -319,28 +319,28 @@ enum pe_link_state { - - /* *INDENT-OFF* */ - enum pe_ordering { -- pe_order_none = 0x0, /* deleted */ -- pe_order_optional = 0x1, /* pure ordering, nothing implied */ -+ pe_order_none = 0x0, /* deleted */ -+ pe_order_optional = 0x1, /* pure ordering, nothing implied */ - -- pe_order_implies_first = 0x10, /* If 'first' is required, ensure 'then' is too */ -- pe_order_implies_then = 0x20, /* If 'then' is required, ensure 'first' is too */ -+ pe_order_implies_first = 0x10, /* If 'then' is required, ensure 'first' is too */ -+ pe_order_implies_then = 0x20, /* If 'first' is required, ensure 'then' is too */ - pe_order_implies_first_master = 0x40, /* Imply 'first' is required when 'then' is required and then's rsc holds Master role. */ - - pe_order_runnable_left = 0x100, /* 'then' requires 'first' to be runnable */ - - pe_order_restart = 0x1000, /* 'then' is runnable if 'first' is optional or runnable */ -- pe_order_stonith_stop = 0x2000, /* only applies if the action is non-pseudo */ -- pe_order_serialize_only = 0x4000, /* serialize */ -+ pe_order_stonith_stop = 0x2000, /* only applies if the action is non-pseudo */ -+ pe_order_serialize_only = 0x4000, /* serialize */ - - pe_order_implies_first_printed = 0x10000, /* Like ..implies_first but only ensures 'first' is printed, not manditory */ -- pe_order_implies_then_printed = 0x20000, /* Like ..implies_then but only ensures 'then' is printed, not manditory */ -+ pe_order_implies_then_printed = 0x20000, /* Like ..implies_then but only ensures 'then' is printed, not manditory */ - -- pe_order_asymmetrical = 0x100000, /* Indicates asymmetrical one way ordering constraint. */ -- pe_order_load = 0x200000, /* Only relevant if... */ -- pe_order_one_or_more = 0x400000, /* 'then' is only runnable if one or more of it's dependancies are too */ -+ pe_order_asymmetrical = 0x100000, /* Indicates asymmetrical one way ordering constraint. */ -+ pe_order_load = 0x200000, /* Only relevant if... */ -+ pe_order_one_or_more = 0x400000, /* 'then' is only runnable if one or more of it's dependancies are too */ - pe_order_anti_colocation = 0x800000, - -- pe_order_trace = 0x4000000 /* test marker */ -+ pe_order_trace = 0x4000000, /* test marker */ - }; - /* *INDENT-ON* */ - diff --git a/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_dot_graph_regression_test_results.patch b/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_dot_graph_regression_test_results.patch deleted file mode 100644 index fbc2956..0000000 --- a/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_dot_graph_regression_test_results.patch +++ /dev/null @@ -1,1092 +0,0 @@ -commit dfcfb5f354e6df601878ce6fbcc4ef7baaf8a969 -Author: Andrew Beekhof -Date: Wed Apr 2 15:30:45 2014 +1100 - - Test: PE: Include stonith operation in .dot graph regression test results - - (cherry picked from commit c1fb74e4a3fd39ee94182bfd6f26634cc7bdcdca) - - Conflicts: - pengine/test10/bug-5186-partial-migrate.dot - pengine/test10/remote-fence-unclean.dot - -diff --git a/pengine/test10/594.dot b/pengine/test10/594.dot -index 0e7a507..9e38bc6 100644 ---- a/pengine/test10/594.dot -+++ b/pengine/test10/594.dot -@@ -45,8 +45,8 @@ digraph "g" { - "rsc_hadev2_stop_0 hadev2" [ style=bold color="green" fontcolor="black" ] - "rsc_hadev3_monitor_0 hadev2" -> "probe_complete hadev2" [ style = bold] - "rsc_hadev3_monitor_0 hadev2" [ style=bold color="green" fontcolor="black" ] --"stonith hadev3" -> "stonith_complete" [ style = bold] --"stonith hadev3" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hadev3" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hadev3" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "DcIPaddr_start_0 hadev1" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_hadev2_start_0 hadev1" [ style = bold] -diff --git a/pengine/test10/829.dot b/pengine/test10/829.dot -index cb41eda..85873cf 100644 ---- a/pengine/test10/829.dot -+++ b/pengine/test10/829.dot -@@ -57,11 +57,11 @@ digraph "g" { - "rsc_c001n08_monitor_0 c001n01" [ style=bold color="green" fontcolor="black" ] - "rsc_c001n08_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] - "rsc_c001n08_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] --"stonith c001n02" -> "DoFencing_stop_0" [ style = bold] --"stonith c001n02" -> "child_DoFencing:0_stop_0 c001n02" [ style = bold] --"stonith c001n02" -> "rsc_c001n02_stop_0 c001n02" [ style = bold] --"stonith c001n02" -> "stonith_complete" [ style = bold] --"stonith c001n02" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n02" -> "DoFencing_stop_0" [ style = bold] -+"stonith 'reboot' c001n02" -> "child_DoFencing:0_stop_0 c001n02" [ style = bold] -+"stonith 'reboot' c001n02" -> "rsc_c001n02_stop_0 c001n02" [ style = bold] -+"stonith 'reboot' c001n02" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n02" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_c001n02_start_0 c001n01" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] -diff --git a/pengine/test10/bug-lf-2508.dot b/pengine/test10/bug-lf-2508.dot -index 918e4fa..6bef312 100644 ---- a/pengine/test10/bug-lf-2508.dot -+++ b/pengine/test10/bug-lf-2508.dot -@@ -91,19 +91,19 @@ digraph "g" { - "prmStonith4-3:1_stop_0 srv02" -> "grpStonith4:1_stopped_0" [ style = bold] - "prmStonith4-3:1_stop_0 srv02" -> "prmStonith4-1:1_stop_0 srv02" [ style = bold] - "prmStonith4-3:1_stop_0 srv02" [ style=bold color="green" fontcolor="orange"] --"stonith srv02" -> "Dummy02_stop_0 srv02" [ style = bold] --"stonith srv02" -> "Group02_stop_0" [ style = bold] --"stonith srv02" -> "clnStonith1_stop_0" [ style = bold] --"stonith srv02" -> "clnStonith3_stop_0" [ style = bold] --"stonith srv02" -> "clnStonith4_stop_0" [ style = bold] --"stonith srv02" -> "prmStonith1-1:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "prmStonith1-3:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "prmStonith3-1:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "prmStonith3-3:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "prmStonith4-1:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "prmStonith4-3:1_stop_0 srv02" [ style = bold] --"stonith srv02" -> "stonith_complete" [ style = bold] --"stonith srv02" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' srv02" -> "Dummy02_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "Group02_stop_0" [ style = bold] -+"stonith 'reboot' srv02" -> "clnStonith1_stop_0" [ style = bold] -+"stonith 'reboot' srv02" -> "clnStonith3_stop_0" [ style = bold] -+"stonith 'reboot' srv02" -> "clnStonith4_stop_0" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith1-1:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith1-3:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith3-1:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith3-3:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith4-1:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "prmStonith4-3:1_stop_0 srv02" [ style = bold] -+"stonith 'reboot' srv02" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' srv02" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "Dummy01_start_0 srv01" [ style = bold] - "stonith_complete" -> "Dummy02_start_0 srv04" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/bug-lf-2551.dot b/pengine/test10/bug-lf-2551.dot -index b4a69db..3225e00 100644 ---- a/pengine/test10/bug-lf-2551.dot -+++ b/pengine/test10/bug-lf-2551.dot -@@ -51,33 +51,33 @@ digraph "g" { - "ocfs2-1:3_stop_0 hex-9" -> "base-group:3_stopped_0" [ style = bold] - "ocfs2-1:3_stop_0 hex-9" -> "vg1:3_stop_0 hex-9" [ style = bold] - "ocfs2-1:3_stop_0 hex-9" [ style=bold color="green" fontcolor="orange" ] --"stonith hex-9" -> "base-clone_stop_0" [ style = bold] --"stonith hex-9" -> "clvm:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "cmirrord:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "dlm:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "dummy1_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "fencing-sbd_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "o2cb:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "ocfs2-1:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "stonith_complete" [ style = bold] --"stonith hex-9" -> "vg1:3_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-03_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-06_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-09_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-13_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-17_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-21_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-25_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-29_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-33_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-37_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-41_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-45_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-49_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-53_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-57_stop_0 hex-9" [ style = bold] --"stonith hex-9" -> "vm-61_stop_0 hex-9" [ style = bold] --"stonith hex-9" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hex-9" -> "base-clone_stop_0" [ style = bold] -+"stonith 'reboot' hex-9" -> "clvm:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "cmirrord:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "dlm:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "dummy1_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "fencing-sbd_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "o2cb:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "ocfs2-1:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hex-9" -> "vg1:3_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-03_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-06_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-09_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-13_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-17_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-21_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-25_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-29_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-33_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-37_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-41_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-45_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-49_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-53_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-57_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" -> "vm-61_stop_0 hex-9" [ style = bold] -+"stonith 'reboot' hex-9" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "dummy1_start_0 hex-0" [ style = bold] - "stonith_complete" -> "fencing-sbd_start_0 hex-0" [ style = bold] -diff --git a/pengine/test10/bug-lf-2606.dot b/pengine/test10/bug-lf-2606.dot -index 403dc1e..612bd02 100644 ---- a/pengine/test10/bug-lf-2606.dot -+++ b/pengine/test10/bug-lf-2606.dot -@@ -24,13 +24,13 @@ digraph "g" { - "rsc3:1_stop_0 node2" -> "all_stopped" [ style = bold] - "rsc3:1_stop_0 node2" -> "ms3_stopped_0" [ style = bold] - "rsc3:1_stop_0 node2" [ style=bold color="green" fontcolor="orange"] --"stonith node2" -> "ms3_stop_0" [ style = bold] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "rsc2_stop_0 node2" [ style = bold] --"stonith node2" -> "rsc3:1_demote_0 node2" [ style = bold] --"stonith node2" -> "rsc3:1_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" -> "ms3_stop_0" [ style = bold] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc2_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc3:1_demote_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc3:1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc2_start_0 node1" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] -diff --git a/pengine/test10/interleave-pseudo-stop.dot b/pengine/test10/interleave-pseudo-stop.dot -index 8c3ddd3..5b3d272 100644 ---- a/pengine/test10/interleave-pseudo-stop.dot -+++ b/pengine/test10/interleave-pseudo-stop.dot -@@ -91,19 +91,19 @@ digraph "g" { - "imagestorecloneset_stop_0" [ style=bold color="green" fontcolor="orange" ] - "imagestorecloneset_stopped_0" -> "imagestorecloneset_post_notify_stopped_0" [ style = bold] - "imagestorecloneset_stopped_0" [ style=bold color="green" fontcolor="orange" ] --"stonith node1" -> "configstoreclone:0_post_notify_stonith_0" [ style = bold] --"stonith node1" -> "configstoreclone:0_stop_0 node1" [ style = bold] --"stonith node1" -> "configstorecloneset_stop_0" [ style = bold] --"stonith node1" -> "evmsclone:0_post_notify_stonith_0" [ style = bold] --"stonith node1" -> "evmsclone:0_stop_0 node1" [ style = bold] --"stonith node1" -> "evmscloneset_stop_0" [ style = bold] --"stonith node1" -> "imagestoreclone:0_post_notify_stonith_0" [ style = bold] --"stonith node1" -> "imagestoreclone:0_stop_0 node1" [ style = bold] --"stonith node1" -> "imagestorecloneset_stop_0" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" -> "stonithclone:0_stop_0 node1" [ style = bold] --"stonith node1" -> "stonithcloneset_stop_0" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "configstoreclone:0_post_notify_stonith_0" [ style = bold] -+"stonith 'reboot' node1" -> "configstoreclone:0_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "configstorecloneset_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "evmsclone:0_post_notify_stonith_0" [ style = bold] -+"stonith 'reboot' node1" -> "evmsclone:0_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "evmscloneset_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "imagestoreclone:0_post_notify_stonith_0" [ style = bold] -+"stonith 'reboot' node1" -> "imagestoreclone:0_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "imagestorecloneset_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" -> "stonithclone:0_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonithcloneset_stop_0" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - "stonithclone:0_stop_0 node1" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/master-7.dot b/pengine/test10/master-7.dot -index ae5e08e..61b0f1c 100644 ---- a/pengine/test10/master-7.dot -+++ b/pengine/test10/master-7.dot -@@ -127,16 +127,16 @@ digraph "g" { - "rsc_c001n01_stop_0 c001n01" -> "all_stopped" [ style = bold] - "rsc_c001n01_stop_0 c001n01" -> "rsc_c001n01_start_0 c001n03" [ style = bold] - "rsc_c001n01_stop_0 c001n01" [ style=bold color="green" fontcolor="orange" ] --"stonith c001n01" -> "DcIPaddr_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "DoFencing_stop_0" [ style = bold] --"stonith c001n01" -> "child_DoFencing:0_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "master_rsc_1_stop_0" [ style = bold] --"stonith c001n01" -> "ocf_msdummy:0_demote_0 c001n01" [ style = bold] --"stonith c001n01" -> "ocf_msdummy:0_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "ocf_msdummy:4_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "rsc_c001n01_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "stonith_complete" [ style = bold] --"stonith c001n01" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n01" -> "DcIPaddr_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "DoFencing_stop_0" [ style = bold] -+"stonith 'reboot' c001n01" -> "child_DoFencing:0_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "master_rsc_1_stop_0" [ style = bold] -+"stonith 'reboot' c001n01" -> "ocf_msdummy:0_demote_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "ocf_msdummy:0_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "ocf_msdummy:4_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "rsc_c001n01_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n01" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "DcIPaddr_start_0 c001n03" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "heartbeat_192.168.100.182_start_0 c001n02" [ style = bold] -diff --git a/pengine/test10/master-8.dot b/pengine/test10/master-8.dot -index a6ed1f6..70be8f1 100644 ---- a/pengine/test10/master-8.dot -+++ b/pengine/test10/master-8.dot -@@ -137,15 +137,15 @@ digraph "g" { - "rsc_c001n01_stop_0 c001n01" -> "all_stopped" [ style = bold] - "rsc_c001n01_stop_0 c001n01" -> "rsc_c001n01_start_0 c001n03" [ style = bold] - "rsc_c001n01_stop_0 c001n01" [ style=bold color="green" fontcolor="orange" ] --"stonith c001n01" -> "DcIPaddr_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "DoFencing_stop_0" [ style = bold] --"stonith c001n01" -> "child_DoFencing:0_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "master_rsc_1_stop_0" [ style = bold] --"stonith c001n01" -> "ocf_msdummy:0_demote_0 c001n01" [ style = bold] --"stonith c001n01" -> "ocf_msdummy:0_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "rsc_c001n01_stop_0 c001n01" [ style = bold] --"stonith c001n01" -> "stonith_complete" [ style = bold] --"stonith c001n01" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n01" -> "DcIPaddr_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "DoFencing_stop_0" [ style = bold] -+"stonith 'reboot' c001n01" -> "child_DoFencing:0_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "master_rsc_1_stop_0" [ style = bold] -+"stonith 'reboot' c001n01" -> "ocf_msdummy:0_demote_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "ocf_msdummy:0_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "rsc_c001n01_stop_0 c001n01" [ style = bold] -+"stonith 'reboot' c001n01" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n01" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "DcIPaddr_start_0 c001n03" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "heartbeat_192.168.100.182_start_0 c001n02" [ style = bold] -diff --git a/pengine/test10/migrate-fencing.dot b/pengine/test10/migrate-fencing.dot -index 8dd3e3a..1aa8d3c 100644 ---- a/pengine/test10/migrate-fencing.dot -+++ b/pengine/test10/migrate-fencing.dot -@@ -107,21 +107,21 @@ digraph "g" { - "stateful-1:1_promote_0 pcmk-1" [ style=bold color="green" fontcolor="black" ] - "stateful-1:2_monitor_15000 pcmk-2" [ style=bold color="green" fontcolor="black" ] - "stateful-1:3_monitor_15000 pcmk-3" [ style=bold color="green" fontcolor="black" ] --"stonith pcmk-4" -> "Connectivity_stop_0" [ style = bold] --"stonith pcmk-4" -> "FencingChild:0_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "Fencing_stop_0" [ style = bold] --"stonith pcmk-4" -> "group-1_stop_0" [ style = bold] --"stonith pcmk-4" -> "lsb-dummy_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "master-1_stop_0" [ style = bold] --"stonith pcmk-4" -> "ping-1:0_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "r192.168.101.181_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "r192.168.101.182_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "r192.168.101.183_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "rsc_pcmk-4_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "stateful-1:0_demote_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "stateful-1:0_stop_0 pcmk-4" [ style = bold] --"stonith pcmk-4" -> "stonith_complete" [ style = bold] --"stonith pcmk-4" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' pcmk-4" -> "Connectivity_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "FencingChild:0_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "Fencing_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "group-1_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "lsb-dummy_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "master-1_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "ping-1:0_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "r192.168.101.181_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "r192.168.101.182_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "r192.168.101.183_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "rsc_pcmk-4_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "stateful-1:0_demote_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "stateful-1:0_stop_0 pcmk-4" [ style = bold] -+"stonith 'reboot' pcmk-4" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' pcmk-4" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "lsb-dummy_start_0 pcmk-1" [ style = bold] - "stonith_complete" -> "migrator_migrate_to_0 pcmk-1" [ style = bold] -diff --git a/pengine/test10/rec-node-11.dot b/pengine/test10/rec-node-11.dot -index d78cf6b..2865f41 100644 ---- a/pengine/test10/rec-node-11.dot -+++ b/pengine/test10/rec-node-11.dot -@@ -44,11 +44,11 @@ digraph "g" { - "rsc3_stop_0 node2" -> "all_stopped" [ style = bold] - "rsc3_stop_0 node2" -> "rsc3_start_0 node2" [ style = bold] - "rsc3_stop_0 node2" [ style=bold color="green" fontcolor="black" ] --"stonith node1" -> "group1_stop_0" [ style = bold] --"stonith node1" -> "rsc1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc2_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "group1_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc2_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node2" -> "probe_complete node2" [ style = bold] - "stonith-1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node2" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/rec-node-12.dot b/pengine/test10/rec-node-12.dot -index 5f79a9a..8275a2e 100644 ---- a/pengine/test10/rec-node-12.dot -+++ b/pengine/test10/rec-node-12.dot -@@ -105,8 +105,8 @@ digraph "g" { - "rsc_c001n08_monitor_5000 c001n08" [ style=bold color="green" fontcolor="black" ] - "rsc_c001n08_start_0 c001n08" -> "rsc_c001n08_monitor_5000 c001n08" [ style = bold] - "rsc_c001n08_start_0 c001n08" [ style=bold color="green" fontcolor="black" ] --"stonith c001n02" -> "stonith_complete" [ style = bold] --"stonith c001n02" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n02" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n02" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "DcIPaddr_start_0 c001n08" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_c001n01_start_0 c001n01" [ style = bold] -diff --git a/pengine/test10/rec-node-13.dot b/pengine/test10/rec-node-13.dot -index 9a55e66..094c241 100644 ---- a/pengine/test10/rec-node-13.dot -+++ b/pengine/test10/rec-node-13.dot -@@ -7,10 +7,10 @@ - "ocf_msdummy:6_stop_0 c001n04" -> "all_stopped" [ style = bold] - "ocf_msdummy:6_stop_0 c001n04" -> "master_rsc_1_stopped_0" [ style = bold] - "ocf_msdummy:6_stop_0 c001n04" [ style=bold color="green" fontcolor="orange" ] --"stonith c001n04" -> "master_rsc_1_stop_0" [ style = bold] --"stonith c001n04" -> "ocf_msdummy:6_stop_0 c001n04" [ style = bold] --"stonith c001n04" -> "stonith_complete" [ style = bold] --"stonith c001n04" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n04" -> "master_rsc_1_stop_0" [ style = bold] -+"stonith 'reboot' c001n04" -> "ocf_msdummy:6_stop_0 c001n04" [ style = bold] -+"stonith 'reboot' c001n04" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n04" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-14.dot b/pengine/test10/rec-node-14.dot -index 6f5956c..395fa89 100644 ---- a/pengine/test10/rec-node-14.dot -+++ b/pengine/test10/rec-node-14.dot -@@ -1,11 +1,11 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith node1" -> "stonith node3" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] --"stonith node2" [ style=bold color="green" fontcolor="black" ] --"stonith node3" -> "stonith node2" [ style = bold] --"stonith node3" -> "stonith_complete" [ style = bold] --"stonith node3" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "stonith 'reboot' node3" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node3" -> "stonith 'reboot' node2" [ style = bold] -+"stonith 'reboot' node3" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node3" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/rec-node-15.dot b/pengine/test10/rec-node-15.dot -index a01ffd2..31d0929 100644 ---- a/pengine/test10/rec-node-15.dot -+++ b/pengine/test10/rec-node-15.dot -@@ -82,8 +82,8 @@ digraph "g" { - "probe_complete" -> "LVM_12_stop_0 sapcl02" [ style = bold] - "probe_complete" -> "stonith-1_start_0 sapcl01" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith sapcl03" -> "stonith_complete" [ style = bold] --"stonith sapcl03" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' sapcl03" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' sapcl03" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 sapcl01" -> "probe_complete sapcl01" [ style = bold] - "stonith-1_monitor_0 sapcl01" [ style=bold color="green" fontcolor="black" ] - "stonith-1_monitor_0 sapcl02" -> "probe_complete sapcl02" [ style = bold] -diff --git a/pengine/test10/rec-node-2.dot b/pengine/test10/rec-node-2.dot -index 23b3f2f..f8ba887 100644 ---- a/pengine/test10/rec-node-2.dot -+++ b/pengine/test10/rec-node-2.dot -@@ -46,8 +46,8 @@ digraph "g" { - "rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "rsc6_start_0 node2" -> "group2_running_0" [ style = bold] - "rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node2" -> "probe_complete node2" [ style = bold] - "stonith-1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node2" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/rec-node-4.dot b/pengine/test10/rec-node-4.dot -index be10460..e5b31ef 100644 ---- a/pengine/test10/rec-node-4.dot -+++ b/pengine/test10/rec-node-4.dot -@@ -20,10 +20,10 @@ digraph "g" { - "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] - "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] --"stonith node1" -> "rsc1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc2_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "rsc1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc2_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node2" -> "probe_complete node2" [ style = bold] - "stonith-1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node2" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/rec-node-6.dot b/pengine/test10/rec-node-6.dot -index be10460..e5b31ef 100644 ---- a/pengine/test10/rec-node-6.dot -+++ b/pengine/test10/rec-node-6.dot -@@ -20,10 +20,10 @@ digraph "g" { - "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] - "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] --"stonith node1" -> "rsc1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc2_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "rsc1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc2_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node2" -> "probe_complete node2" [ style = bold] - "stonith-1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node2" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/rec-node-7.dot b/pengine/test10/rec-node-7.dot -index be10460..e5b31ef 100644 ---- a/pengine/test10/rec-node-7.dot -+++ b/pengine/test10/rec-node-7.dot -@@ -20,10 +20,10 @@ digraph "g" { - "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] - "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] --"stonith node1" -> "rsc1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc2_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "rsc1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc2_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node2" -> "probe_complete node2" [ style = bold] - "stonith-1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node2" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/rec-rsc-5.dot b/pengine/test10/rec-rsc-5.dot -index 48bad88..53b9521 100644 ---- a/pengine/test10/rec-rsc-5.dot -+++ b/pengine/test10/rec-rsc-5.dot -@@ -20,10 +20,10 @@ digraph "g" { - "rsc2_stop_0 node2" -> "all_stopped" [ style = bold] - "rsc2_stop_0 node2" -> "rsc2_start_0 node1" [ style = bold] - "rsc2_stop_0 node2" [ style=bold color="green" fontcolor="orange" ] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "rsc2_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc2_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 node1" -> "probe_complete node1" [ style = bold] - "stonith-1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 node1" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/stonith-0.dot b/pengine/test10/stonith-0.dot -index db60eb9..29cdd59 100644 ---- a/pengine/test10/stonith-0.dot -+++ b/pengine/test10/stonith-0.dot -@@ -66,19 +66,19 @@ digraph "g" { - "rsc_c001n07_stop_0 c001n03" -> "all_stopped" [ style = bold] - "rsc_c001n07_stop_0 c001n03" -> "rsc_c001n07_start_0 c001n07" [ style = bold] - "rsc_c001n07_stop_0 c001n03" [ style=bold color="green" fontcolor="orange" ] --"stonith c001n03" -> "group-1_stop_0" [ style = bold] --"stonith c001n03" -> "heartbeat_192.168.100.182_stop_0 c001n03" [ style = bold] --"stonith c001n03" -> "ocf_192.168.100.181_stop_0 c001n03" [ style = bold] --"stonith c001n03" -> "ocf_192.168.100.183_stop_0 c001n03" [ style = bold] --"stonith c001n03" -> "rsc_c001n07_stop_0 c001n03" [ style = bold] --"stonith c001n03" [ style=bold color="green" fontcolor="black" ] --"stonith c001n05" -> "group-1_stop_0" [ style = bold] --"stonith c001n05" -> "ocf_192.168.100.181_stop_0 c001n05" [ style = bold] --"stonith c001n05" -> "ocf_192.168.100.183_stop_0 c001n05" [ style = bold] --"stonith c001n05" -> "rsc_c001n05_stop_0 c001n05" [ style = bold] --"stonith c001n05" -> "stonith c001n03" [ style = bold] --"stonith c001n05" -> "stonith_complete" [ style = bold] --"stonith c001n05" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' c001n03" -> "group-1_stop_0" [ style = bold] -+"stonith 'reboot' c001n03" -> "heartbeat_192.168.100.182_stop_0 c001n03" [ style = bold] -+"stonith 'reboot' c001n03" -> "ocf_192.168.100.181_stop_0 c001n03" [ style = bold] -+"stonith 'reboot' c001n03" -> "ocf_192.168.100.183_stop_0 c001n03" [ style = bold] -+"stonith 'reboot' c001n03" -> "rsc_c001n07_stop_0 c001n03" [ style = bold] -+"stonith 'reboot' c001n03" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' c001n05" -> "group-1_stop_0" [ style = bold] -+"stonith 'reboot' c001n05" -> "ocf_192.168.100.181_stop_0 c001n05" [ style = bold] -+"stonith 'reboot' c001n05" -> "ocf_192.168.100.183_stop_0 c001n05" [ style = bold] -+"stonith 'reboot' c001n05" -> "rsc_c001n05_stop_0 c001n05" [ style = bold] -+"stonith 'reboot' c001n05" -> "stonith 'reboot' c001n03" [ style = bold] -+"stonith 'reboot' c001n05" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' c001n05" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "heartbeat_192.168.100.182_start_0 c001n02" [ style = bold] - "stonith_complete" -> "ocf_192.168.100.181_start_0 c001n02" [ style = bold] -diff --git a/pengine/test10/stonith-1.dot b/pengine/test10/stonith-1.dot -index 5ee6c1b..d64edcf 100644 ---- a/pengine/test10/stonith-1.dot -+++ b/pengine/test10/stonith-1.dot -@@ -88,15 +88,15 @@ digraph "g" { - "rsc_sles-3_stop_0 sles-3" -> "rsc_sles-3_start_0 sles-4" [ style = bold] - "rsc_sles-3_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] - "rsc_sles-4_monitor_5000 sles-4" [ style=bold color="green" fontcolor="black" ] --"stonith sles-3" -> "DoFencing_stop_0" [ style = bold] --"stonith sles-3" -> "child_DoFencing:2_stop_0 sles-3" [ style = bold] --"stonith sles-3" -> "master_rsc_1_stop_0" [ style = bold] --"stonith sles-3" -> "migrator_stop_0 sles-3" [ style = bold] --"stonith sles-3" -> "ocf_msdummy:2_stop_0 sles-3" [ style = bold] --"stonith sles-3" -> "ocf_msdummy:5_stop_0 sles-3" [ style = bold] --"stonith sles-3" -> "rsc_sles-3_stop_0 sles-3" [ style = bold] --"stonith sles-3" -> "stonith_complete" [ style = bold] --"stonith sles-3" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' sles-3" -> "DoFencing_stop_0" [ style = bold] -+"stonith 'reboot' sles-3" -> "child_DoFencing:2_stop_0 sles-3" [ style = bold] -+"stonith 'reboot' sles-3" -> "master_rsc_1_stop_0" [ style = bold] -+"stonith 'reboot' sles-3" -> "migrator_stop_0 sles-3" [ style = bold] -+"stonith 'reboot' sles-3" -> "ocf_msdummy:2_stop_0 sles-3" [ style = bold] -+"stonith 'reboot' sles-3" -> "ocf_msdummy:5_stop_0 sles-3" [ style = bold] -+"stonith 'reboot' sles-3" -> "rsc_sles-3_stop_0 sles-3" [ style = bold] -+"stonith 'reboot' sles-3" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' sles-3" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "migrator_start_0 sles-4" [ style = bold] - "stonith_complete" -> "ocf_msdummy:0_start_0 sles-4" [ style = bold] -diff --git a/pengine/test10/stonith-2.dot b/pengine/test10/stonith-2.dot -index c5626c7..2e9420b 100644 ---- a/pengine/test10/stonith-2.dot -+++ b/pengine/test10/stonith-2.dot -@@ -3,8 +3,8 @@ digraph "g" { - "rsc_sles-5_monitor_5000 sles-6" [ style=bold color="green" fontcolor="black" ] - "rsc_sles-5_start_0 sles-6" -> "rsc_sles-5_monitor_5000 sles-6" [ style = bold] - "rsc_sles-5_start_0 sles-6" [ style=bold color="green" fontcolor="black" ] --"stonith sles-5" -> "stonith_complete" [ style = bold] --"stonith sles-5" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' sles-5" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' sles-5" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_sles-5_start_0 sles-6" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] -diff --git a/pengine/test10/stonith-3.dot b/pengine/test10/stonith-3.dot -index f93ef79..df5f607 100644 ---- a/pengine/test10/stonith-3.dot -+++ b/pengine/test10/stonith-3.dot -@@ -23,8 +23,8 @@ digraph "g" { - "probe_complete" -> "prmIpPostgreSQLDB_start_0 rh5node2" [ style = bold] - "probe_complete" -> "prmStonith:0_start_0 rh5node2" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith rh5node1" -> "stonith_complete" [ style = bold] --"stonith rh5node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' rh5node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' rh5node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "prmIpPostgreSQLDB_start_0 rh5node2" [ style = bold] - "stonith_complete" -> "prmStonith:0_start_0 rh5node2" [ style = bold] -diff --git a/pengine/test10/stonith-4.dot b/pengine/test10/stonith-4.dot -index 1508fc8..24243d8 100644 ---- a/pengine/test10/stonith-4.dot -+++ b/pengine/test10/stonith-4.dot -@@ -15,14 +15,14 @@ digraph "g" { - "probe_complete pcmk-3" [ style=dashed color="red" fontcolor="black"] - "probe_complete" -> "Fencing_start_0 pcmk-1" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange"] --"stonith pcmk-10" -> "stonith pcmk-5" [ style = bold] --"stonith pcmk-10" [ style=bold color="green" fontcolor="black"] --"stonith pcmk-5" -> "stonith pcmk-7" [ style = bold] --"stonith pcmk-5" [ style=bold color="green" fontcolor="black"] --"stonith pcmk-7" -> "stonith pcmk-8" [ style = bold] --"stonith pcmk-7" [ style=bold color="green" fontcolor="black"] --"stonith pcmk-8" -> "stonith_complete" [ style = bold] --"stonith pcmk-8" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-10" -> "stonith 'reboot' pcmk-5" [ style = bold] -+"stonith 'reboot' pcmk-10" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-5" -> "stonith 'reboot' pcmk-7" [ style = bold] -+"stonith 'reboot' pcmk-5" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-7" -> "stonith 'reboot' pcmk-8" [ style = bold] -+"stonith 'reboot' pcmk-7" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-8" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' pcmk-8" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "Fencing_start_0 pcmk-1" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] -diff --git a/pengine/test10/stop-failure-no-quorum.dot b/pengine/test10/stop-failure-no-quorum.dot -index 55faa45..e00258d 100644 ---- a/pengine/test10/stop-failure-no-quorum.dot -+++ b/pengine/test10/stop-failure-no-quorum.dot -@@ -10,10 +10,10 @@ digraph "g" { - "clvm_stop_0 pcmk-2" -> "clvm-clone_stopped_0" [ style = bold] - "clvm_stop_0 pcmk-2" [ style=bold color="green" fontcolor="orange"] - "dlm_monitor_60000 pcmk-1" [ style=dashed color="red" fontcolor="black"] --"stonith pcmk-2" -> "clvm-clone_stop_0" [ style = bold] --"stonith pcmk-2" -> "clvm_stop_0 pcmk-2" [ style = bold] --"stonith pcmk-2" -> "stonith_complete" [ style = bold] --"stonith pcmk-2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-2" -> "clvm-clone_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-2" -> "clvm_stop_0 pcmk-2" [ style = bold] -+"stonith 'reboot' pcmk-2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' pcmk-2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/stop-failure-with-fencing.dot b/pengine/test10/stop-failure-with-fencing.dot -index a4dd5f8..cd5c089 100644 ---- a/pengine/test10/stop-failure-with-fencing.dot -+++ b/pengine/test10/stop-failure-with-fencing.dot -@@ -15,10 +15,10 @@ digraph "g" { - "probe_complete pcmk-1" -> "probe_complete" [ style = bold] - "probe_complete pcmk-1" [ style=bold color="green" fontcolor="black"] - "probe_complete" [ style=bold color="green" fontcolor="orange"] --"stonith pcmk-2" -> "clvm-clone_stop_0" [ style = bold] --"stonith pcmk-2" -> "clvm_stop_0 pcmk-2" [ style = bold] --"stonith pcmk-2" -> "stonith_complete" [ style = bold] --"stonith pcmk-2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' pcmk-2" -> "clvm-clone_stop_0" [ style = bold] -+"stonith 'reboot' pcmk-2" -> "clvm_stop_0 pcmk-2" [ style = bold] -+"stonith 'reboot' pcmk-2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' pcmk-2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/systemhealth1.dot b/pengine/test10/systemhealth1.dot -index c47ce24..28841b7 100644 ---- a/pengine/test10/systemhealth1.dot -+++ b/pengine/test10/systemhealth1.dot -@@ -1,9 +1,9 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21c" [ style=bold color="green" fontcolor="black" ] --"stonith hs21d" -> "stonith hs21c" [ style = bold] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21c" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' hs21d" -> "stonith 'reboot' hs21c" [ style = bold] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealth2.dot b/pengine/test10/systemhealth2.dot -index a3d05c0..dcf49eb 100644 ---- a/pengine/test10/systemhealth2.dot -+++ b/pengine/test10/systemhealth2.dot -@@ -16,8 +16,8 @@ digraph "g" { - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 hs21c" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/systemhealth3.dot b/pengine/test10/systemhealth3.dot -index a3d05c0..dcf49eb 100644 ---- a/pengine/test10/systemhealth3.dot -+++ b/pengine/test10/systemhealth3.dot -@@ -16,8 +16,8 @@ digraph "g" { - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 hs21c" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/systemhealthm1.dot b/pengine/test10/systemhealthm1.dot -index c47ce24..28841b7 100644 ---- a/pengine/test10/systemhealthm1.dot -+++ b/pengine/test10/systemhealthm1.dot -@@ -1,9 +1,9 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21c" [ style=bold color="green" fontcolor="black" ] --"stonith hs21d" -> "stonith hs21c" [ style = bold] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21c" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' hs21d" -> "stonith 'reboot' hs21c" [ style = bold] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthm2.dot b/pengine/test10/systemhealthm2.dot -index a3d05c0..dcf49eb 100644 ---- a/pengine/test10/systemhealthm2.dot -+++ b/pengine/test10/systemhealthm2.dot -@@ -16,8 +16,8 @@ digraph "g" { - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 hs21c" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/systemhealthm3.dot b/pengine/test10/systemhealthm3.dot -index 987de92..2980e3f 100644 ---- a/pengine/test10/systemhealthm3.dot -+++ b/pengine/test10/systemhealthm3.dot -@@ -7,8 +7,8 @@ digraph "g" { - "probe_complete hs21c" -> "probe_complete" [ style = bold] - "probe_complete hs21c" [ style=bold color="green" fontcolor="black" ] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/systemhealthn1.dot b/pengine/test10/systemhealthn1.dot -index c47ce24..28841b7 100644 ---- a/pengine/test10/systemhealthn1.dot -+++ b/pengine/test10/systemhealthn1.dot -@@ -1,9 +1,9 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21c" [ style=bold color="green" fontcolor="black" ] --"stonith hs21d" -> "stonith hs21c" [ style = bold] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21c" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' hs21d" -> "stonith 'reboot' hs21c" [ style = bold] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthn2.dot b/pengine/test10/systemhealthn2.dot -index a3d05c0..dcf49eb 100644 ---- a/pengine/test10/systemhealthn2.dot -+++ b/pengine/test10/systemhealthn2.dot -@@ -16,8 +16,8 @@ digraph "g" { - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 hs21c" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/systemhealthn3.dot b/pengine/test10/systemhealthn3.dot -index a3d05c0..dcf49eb 100644 ---- a/pengine/test10/systemhealthn3.dot -+++ b/pengine/test10/systemhealthn3.dot -@@ -16,8 +16,8 @@ digraph "g" { - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "stonith-1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith-1_start_0 hs21c" [ style=bold color="green" fontcolor="black" ] -diff --git a/pengine/test10/systemhealtho1.dot b/pengine/test10/systemhealtho1.dot -index c47ce24..28841b7 100644 ---- a/pengine/test10/systemhealtho1.dot -+++ b/pengine/test10/systemhealtho1.dot -@@ -1,9 +1,9 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21c" [ style=bold color="green" fontcolor="black" ] --"stonith hs21d" -> "stonith hs21c" [ style = bold] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21c" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' hs21d" -> "stonith 'reboot' hs21c" [ style = bold] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealtho2.dot b/pengine/test10/systemhealtho2.dot -index 987de92..2980e3f 100644 ---- a/pengine/test10/systemhealtho2.dot -+++ b/pengine/test10/systemhealtho2.dot -@@ -7,8 +7,8 @@ digraph "g" { - "probe_complete hs21c" -> "probe_complete" [ style = bold] - "probe_complete hs21c" [ style=bold color="green" fontcolor="black" ] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/systemhealtho3.dot b/pengine/test10/systemhealtho3.dot -index 987de92..2980e3f 100644 ---- a/pengine/test10/systemhealtho3.dot -+++ b/pengine/test10/systemhealtho3.dot -@@ -7,8 +7,8 @@ digraph "g" { - "probe_complete hs21c" -> "probe_complete" [ style = bold] - "probe_complete hs21c" [ style=bold color="green" fontcolor="black" ] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/systemhealthp1.dot b/pengine/test10/systemhealthp1.dot -index c47ce24..28841b7 100644 ---- a/pengine/test10/systemhealthp1.dot -+++ b/pengine/test10/systemhealthp1.dot -@@ -1,9 +1,9 @@ - digraph "g" { - "all_stopped" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21c" [ style=bold color="green" fontcolor="black" ] --"stonith hs21d" -> "stonith hs21c" [ style = bold] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21c" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' hs21d" -> "stonith 'reboot' hs21c" [ style = bold] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/systemhealthp2.dot b/pengine/test10/systemhealthp2.dot -index 8100587..bb9d914 100644 ---- a/pengine/test10/systemhealthp2.dot -+++ b/pengine/test10/systemhealthp2.dot -@@ -15,8 +15,8 @@ digraph "g" { - "probe_complete" -> "apache_1_start_0 hs21c" [ style = bold] - "probe_complete" -> "nfs_1_start_0 hs21c" [ style = bold] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/systemhealthp3.dot b/pengine/test10/systemhealthp3.dot -index 987de92..2980e3f 100644 ---- a/pengine/test10/systemhealthp3.dot -+++ b/pengine/test10/systemhealthp3.dot -@@ -7,8 +7,8 @@ digraph "g" { - "probe_complete hs21c" -> "probe_complete" [ style = bold] - "probe_complete hs21c" [ style=bold color="green" fontcolor="black" ] - "probe_complete" [ style=bold color="green" fontcolor="orange" ] --"stonith hs21d" -> "stonith_complete" [ style = bold] --"stonith hs21d" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' hs21d" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' hs21d" [ style=bold color="green" fontcolor="black"] - "stonith-1_monitor_0 hs21c" -> "probe_complete hs21c" [ style = bold] - "stonith-1_monitor_0 hs21c" [ style=bold color="green" fontcolor="black" ] - "stonith_complete" -> "all_stopped" [ style = bold] -diff --git a/pengine/test10/ticket-clone-21.dot b/pengine/test10/ticket-clone-21.dot -index 44a702e..c26817e 100644 ---- a/pengine/test10/ticket-clone-21.dot -+++ b/pengine/test10/ticket-clone-21.dot -@@ -13,15 +13,15 @@ digraph "g" { - "rsc1:1_stop_0 node1" [ style=bold color="green" fontcolor="orange"] - "rsc_stonith_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc_stonith_stop_0 node1" [ style=bold color="green" fontcolor="orange"] --"stonith node1" -> "clone1_stop_0" [ style = bold] --"stonith node1" -> "rsc1:1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc_stonith_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith node2" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black"] --"stonith node2" -> "clone1_stop_0" [ style = bold] --"stonith node2" -> "rsc1:0_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node1" -> "clone1_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc_stonith_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith 'reboot' node2" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" -> "clone1_stop_0" [ style = bold] -+"stonith 'reboot' node2" -> "rsc1:0_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/ticket-clone-9.dot b/pengine/test10/ticket-clone-9.dot -index 20066c8..8abddd4 100644 ---- a/pengine/test10/ticket-clone-9.dot -+++ b/pengine/test10/ticket-clone-9.dot -@@ -13,15 +13,15 @@ digraph "g" { - "rsc1:1_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] - "rsc_stonith_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc_stonith_stop_0 node1" [ style=bold color="green" fontcolor="orange"] --"stonith node1" -> "clone1_stop_0" [ style = bold] --"stonith node1" -> "rsc1:1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc_stonith_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith node2" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] --"stonith node2" -> "clone1_stop_0" [ style = bold] --"stonith node2" -> "rsc1:0_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "clone1_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc_stonith_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith 'reboot' node2" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" -> "clone1_stop_0" [ style = bold] -+"stonith 'reboot' node2" -> "rsc1:0_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/ticket-group-21.dot b/pengine/test10/ticket-group-21.dot -index aeebada..cac1fc7 100644 ---- a/pengine/test10/ticket-group-21.dot -+++ b/pengine/test10/ticket-group-21.dot -@@ -13,11 +13,11 @@ digraph "g" { - "rsc2_stop_0 node2" -> "group1_stopped_0" [ style = bold] - "rsc2_stop_0 node2" -> "rsc1_stop_0 node2" [ style = bold] - "rsc2_stop_0 node2" [ style=bold color="green" fontcolor="orange"] --"stonith node2" -> "group1_stop_0" [ style = bold] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "rsc2_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" -> "group1_stop_0" [ style = bold] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc2_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/ticket-group-9.dot b/pengine/test10/ticket-group-9.dot -index 9991946..1649e62 100644 ---- a/pengine/test10/ticket-group-9.dot -+++ b/pengine/test10/ticket-group-9.dot -@@ -13,11 +13,11 @@ digraph "g" { - "rsc2_stop_0 node2" -> "group1_stopped_0" [ style = bold] - "rsc2_stop_0 node2" -> "rsc1_stop_0 node2" [ style = bold] - "rsc2_stop_0 node2" [ style=bold color="green" fontcolor="orange" ] --"stonith node2" -> "group1_stop_0" [ style = bold] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "rsc2_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node2" -> "group1_stop_0" [ style = bold] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "rsc2_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/pengine/test10/ticket-master-21.dot b/pengine/test10/ticket-master-21.dot -index 9f04de9..e1abd95 100644 ---- a/pengine/test10/ticket-master-21.dot -+++ b/pengine/test10/ticket-master-21.dot -@@ -20,12 +20,12 @@ digraph "g" { - "rsc_stonith_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc_stonith_stop_0 node1" -> "rsc_stonith_start_0 node2" [ style = bold] - "rsc_stonith_stop_0 node1" [ style=bold color="green" fontcolor="orange"] --"stonith node1" -> "ms1_stop_0" [ style = bold] --"stonith node1" -> "rsc1:1_demote_0 node1" [ style = bold] --"stonith node1" -> "rsc1:1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc_stonith_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node1" -> "ms1_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_demote_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc_stonith_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_stonith_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] -diff --git a/pengine/test10/ticket-master-9.dot b/pengine/test10/ticket-master-9.dot -index 91a833a..40c2e7f 100644 ---- a/pengine/test10/ticket-master-9.dot -+++ b/pengine/test10/ticket-master-9.dot -@@ -20,12 +20,12 @@ digraph "g" { - "rsc_stonith_stop_0 node1" -> "all_stopped" [ style = bold] - "rsc_stonith_stop_0 node1" -> "rsc_stonith_start_0 node2" [ style = bold] - "rsc_stonith_stop_0 node1" [ style=bold color="green" fontcolor="orange"] --"stonith node1" -> "ms1_stop_0" [ style = bold] --"stonith node1" -> "rsc1:1_demote_0 node1" [ style = bold] --"stonith node1" -> "rsc1:1_stop_0 node1" [ style = bold] --"stonith node1" -> "rsc_stonith_stop_0 node1" [ style = bold] --"stonith node1" -> "stonith_complete" [ style = bold] --"stonith node1" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node1" -> "ms1_stop_0" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_demote_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc1:1_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "rsc_stonith_stop_0 node1" [ style = bold] -+"stonith 'reboot' node1" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node1" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "rsc_stonith_start_0 node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] -diff --git a/pengine/test10/ticket-primitive-21.dot b/pengine/test10/ticket-primitive-21.dot -index f54e0f0..ba07df3 100644 ---- a/pengine/test10/ticket-primitive-21.dot -+++ b/pengine/test10/ticket-primitive-21.dot -@@ -3,9 +3,9 @@ digraph "g" { - "probe_complete node1" [ style=bold color="green" fontcolor="black"] - "rsc1_stop_0 node2" -> "all_stopped" [ style = bold] - "rsc1_stop_0 node2" [ style=bold color="green" fontcolor="orange"] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/ticket-primitive-9.dot b/pengine/test10/ticket-primitive-9.dot -index 40a69d7..0036a23 100644 ---- a/pengine/test10/ticket-primitive-9.dot -+++ b/pengine/test10/ticket-primitive-9.dot -@@ -3,9 +3,9 @@ digraph "g" { - "probe_complete node1" [ style=bold color="green" fontcolor="black" ] - "rsc1_stop_0 node2" -> "all_stopped" [ style = bold] - "rsc1_stop_0 node2" [ style=bold color="green" fontcolor="orange" ] --"stonith node2" -> "rsc1_stop_0 node2" [ style = bold] --"stonith node2" -> "stonith_complete" [ style = bold] --"stonith node2" [ style=bold color="green" fontcolor="black" ] -+"stonith 'reboot' node2" -> "rsc1_stop_0 node2" [ style = bold] -+"stonith 'reboot' node2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' node2" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange" ] - } -diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c -index 2eb68f1..9d20cdd 100644 ---- a/tools/crm_simulate.c -+++ b/tools/crm_simulate.c -@@ -758,7 +758,9 @@ create_action_name(action_t * action) - free(key); - - } else if (safe_str_eq(action->task, CRM_OP_FENCE)) { -- action_name = g_strdup_printf("%s%s %s", prefix ? prefix : "", action->task, action_host); -+ const char *op = g_hash_table_lookup(action->meta, "stonith_action"); -+ -+ action_name = g_strdup_printf("%s%s '%s' %s", prefix ? prefix : "", action->task, op, action_host); - - } else if (action->rsc && action_host) { - action_name = g_strdup_printf("%s%s %s", prefix ? prefix : "", action->uuid, action_host); diff --git a/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_the_summary_results_and_handle_unfencing.patch b/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_the_summary_results_and_handle_unfencing.patch deleted file mode 100644 index a964e70..0000000 --- a/SOURCES/bz1078078-pcmk-pe_include_stonith_operation_in_the_summary_results_and_handle_unfencing.patch +++ /dev/null @@ -1,734 +0,0 @@ -commit 54c57b981935172a28eea3c1e070c408642846b1 -Author: Andrew Beekhof -Date: Wed Apr 2 15:34:26 2014 +1100 - - Test: PE: Include stonith operation in the summary results and handle unfencing - - (cherry picked from commit 8d8de0a3ec77738e5d508b7e746c1d493c9617e1) - - Conflicts: - pengine/test10/bug-5186-partial-migrate.summary - pengine/test10/remote-fence-unclean.summary - -diff --git a/pengine/test10/594.summary b/pengine/test10/594.summary -index 865b386..08de5cc 100644 ---- a/pengine/test10/594.summary -+++ b/pengine/test10/594.summary -@@ -27,7 +27,7 @@ Executing cluster transition: - * Resource action: child_DoFencing:0 monitor on hadev1 - * Resource action: child_DoFencing:2 monitor on hadev2 - * Pseudo action: DoFencing_stop_0 -- * Fencing hadev3 -+ * Fencing hadev3 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: DcIPaddr start on hadev1 -diff --git a/pengine/test10/829.summary b/pengine/test10/829.summary -index f08a30a..cf23cf0 100644 ---- a/pengine/test10/829.summary -+++ b/pengine/test10/829.summary -@@ -36,7 +36,7 @@ Executing cluster transition: - * Resource action: child_DoFencing:2 monitor on c001n03 - * Resource action: child_DoFencing:3 monitor on c001n03 - * Resource action: child_DoFencing:3 monitor on c001n01 -- * Fencing c001n02 -+ * Fencing c001n02 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: rsc_c001n02_stop_0 -diff --git a/pengine/test10/bug-lf-2508.summary b/pengine/test10/bug-lf-2508.summary -index 4435ced..7f5aed1 100644 ---- a/pengine/test10/bug-lf-2508.summary -+++ b/pengine/test10/bug-lf-2508.summary -@@ -39,7 +39,7 @@ Transition Summary: - Executing cluster transition: - * Pseudo action: Group01_start_0 - * Resource action: prmStonith3-1:1 monitor=3600000 on srv01 -- * Fencing srv02 -+ * Fencing srv02 (reboot) - * Pseudo action: stonith_complete - * Resource action: Dummy01 start on srv01 - * Pseudo action: Group02_stop_0 -diff --git a/pengine/test10/bug-lf-2551.summary b/pengine/test10/bug-lf-2551.summary -index d299ee9..d362a23 100644 ---- a/pengine/test10/bug-lf-2551.summary -+++ b/pengine/test10/bug-lf-2551.summary -@@ -102,7 +102,7 @@ Transition Summary: - Executing cluster transition: - * Resource action: dummy1 monitor=300000 on hex-8 - * Resource action: dummy1 monitor=300000 on hex-7 -- * Fencing hex-9 -+ * Fencing hex-9 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: load_stopped_hex-8 - * Pseudo action: load_stopped_hex-7 -diff --git a/pengine/test10/bug-lf-2606.summary b/pengine/test10/bug-lf-2606.summary -index c03ed6a..baa0f3b 100644 ---- a/pengine/test10/bug-lf-2606.summary -+++ b/pengine/test10/bug-lf-2606.summary -@@ -17,7 +17,7 @@ Transition Summary: - - Executing cluster transition: - * Pseudo action: ms3_demote_0 -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: rsc1_stop_0 - * Pseudo action: rsc2_stop_0 -diff --git a/pengine/test10/interleave-pseudo-stop.summary b/pengine/test10/interleave-pseudo-stop.summary -index 7ac882d..ea86c4f 100644 ---- a/pengine/test10/interleave-pseudo-stop.summary -+++ b/pengine/test10/interleave-pseudo-stop.summary -@@ -22,7 +22,7 @@ Executing cluster transition: - * Pseudo action: evmscloneset_pre_notify_stop_0 - * Pseudo action: imagestorecloneset_pre_notify_stop_0 - * Pseudo action: configstorecloneset_pre_notify_stop_0 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: stonithcloneset_stop_0 - * Resource action: evmsclone:1 notify on node2 -diff --git a/pengine/test10/master-7.summary b/pengine/test10/master-7.summary -index 5102290..81aeed7 100644 ---- a/pengine/test10/master-7.summary -+++ b/pengine/test10/master-7.summary -@@ -55,7 +55,7 @@ Executing cluster transition: - * Resource action: ocf_msdummy:7 monitor on c001n03 - * Resource action: ocf_msdummy:7 monitor on c001n02 - * Pseudo action: master_rsc_1_demote_0 -- * Fencing c001n01 -+ * Fencing c001n01 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: DcIPaddr_stop_0 -diff --git a/pengine/test10/master-8.summary b/pengine/test10/master-8.summary -index 8828bfe..e12f791 100644 ---- a/pengine/test10/master-8.summary -+++ b/pengine/test10/master-8.summary -@@ -56,7 +56,7 @@ Executing cluster transition: - * Resource action: ocf_msdummy:7 monitor on c001n03 - * Resource action: ocf_msdummy:7 monitor on c001n02 - * Pseudo action: master_rsc_1_demote_0 -- * Fencing c001n01 -+ * Fencing c001n01 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: DcIPaddr_stop_0 -diff --git a/pengine/test10/migrate-fencing.summary b/pengine/test10/migrate-fencing.summary -index 920e754..e8bcd45 100644 ---- a/pengine/test10/migrate-fencing.summary -+++ b/pengine/test10/migrate-fencing.summary -@@ -36,7 +36,7 @@ Transition Summary: - Executing cluster transition: - * Resource action: stateful-1:3 monitor=15000 on pcmk-3 - * Resource action: stateful-1:2 monitor=15000 on pcmk-2 -- * Fencing pcmk-4 -+ * Fencing pcmk-4 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: Fencing_stop_0 - * Pseudo action: rsc_pcmk-4_stop_0 -diff --git a/pengine/test10/rec-node-11.summary b/pengine/test10/rec-node-11.summary -index 5ba0c0d..d2ad78a 100644 ---- a/pengine/test10/rec-node-11.summary -+++ b/pengine/test10/rec-node-11.summary -@@ -19,7 +19,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on node2 - * Resource action: rsc1 monitor on node2 - * Resource action: rsc2 monitor on node2 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on node2 -diff --git a/pengine/test10/rec-node-12.summary b/pengine/test10/rec-node-12.summary -index eeccb53..4fd63b4 100644 ---- a/pengine/test10/rec-node-12.summary -+++ b/pengine/test10/rec-node-12.summary -@@ -53,7 +53,7 @@ Executing cluster transition: - * Resource action: child_DoFencing:3 monitor on c001n03 - * Resource action: child_DoFencing:3 monitor on c001n01 - * Pseudo action: DoFencing_start_0 -- * Fencing c001n02 -+ * Fencing c001n02 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/rec-node-13.summary b/pengine/test10/rec-node-13.summary -index 356b67d..82f210a 100644 ---- a/pengine/test10/rec-node-13.summary -+++ b/pengine/test10/rec-node-13.summary -@@ -37,7 +37,7 @@ Transition Summary: - * Stop ocf_msdummy:6 (c001n04) - - Executing cluster transition: -- * Fencing c001n04 -+ * Fencing c001n04 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: master_rsc_1_stop_0 - * Pseudo action: ocf_msdummy:6_stop_0 -diff --git a/pengine/test10/rec-node-14.summary b/pengine/test10/rec-node-14.summary -index 231decd..d97d943 100644 ---- a/pengine/test10/rec-node-14.summary -+++ b/pengine/test10/rec-node-14.summary -@@ -10,9 +10,9 @@ Node node3 (uuid3): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing node1 -- * Fencing node3 -- * Fencing node2 -+ * Fencing node1 (reboot) -+ * Fencing node3 (reboot) -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/rec-node-15.summary b/pengine/test10/rec-node-15.summary -index 570433c..85bfed5 100644 ---- a/pengine/test10/rec-node-15.summary -+++ b/pengine/test10/rec-node-15.summary -@@ -36,7 +36,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on sapcl01 - * Pseudo action: app02_stop_0 - * Pseudo action: oracle_start_0 -- * Fencing sapcl03 -+ * Fencing sapcl03 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on sapcl01 -diff --git a/pengine/test10/rec-node-2.summary b/pengine/test10/rec-node-2.summary -index 645ef46..daa2879 100644 ---- a/pengine/test10/rec-node-2.summary -+++ b/pengine/test10/rec-node-2.summary -@@ -32,7 +32,7 @@ Executing cluster transition: - * Pseudo action: group2_start_0 - * Resource action: rsc5 monitor on node2 - * Resource action: rsc6 monitor on node2 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/rec-node-4.summary b/pengine/test10/rec-node-4.summary -index 782c377..295da1d 100644 ---- a/pengine/test10/rec-node-4.summary -+++ b/pengine/test10/rec-node-4.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on node2 - * Resource action: rsc1 monitor on node2 - * Resource action: rsc2 monitor on node2 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on node2 -diff --git a/pengine/test10/rec-node-6.summary b/pengine/test10/rec-node-6.summary -index 2bd563b..300d61b 100644 ---- a/pengine/test10/rec-node-6.summary -+++ b/pengine/test10/rec-node-6.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on node2 - * Resource action: rsc1 monitor on node2 - * Resource action: rsc2 monitor on node2 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on node2 -diff --git a/pengine/test10/rec-node-7.summary b/pengine/test10/rec-node-7.summary -index 782c377..295da1d 100644 ---- a/pengine/test10/rec-node-7.summary -+++ b/pengine/test10/rec-node-7.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on node2 - * Resource action: rsc1 monitor on node2 - * Resource action: rsc2 monitor on node2 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on node2 -diff --git a/pengine/test10/rec-rsc-5.summary b/pengine/test10/rec-rsc-5.summary -index 9c9239b..549abe6 100644 ---- a/pengine/test10/rec-rsc-5.summary -+++ b/pengine/test10/rec-rsc-5.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on node1 - * Resource action: rsc1 monitor on node1 - * Resource action: rsc2 monitor on node1 -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Resource action: stonith-1 start on node1 -diff --git a/pengine/test10/stonith-0.summary b/pengine/test10/stonith-0.summary -index 9330291..4ec1ff7 100644 ---- a/pengine/test10/stonith-0.summary -+++ b/pengine/test10/stonith-0.summary -@@ -45,8 +45,8 @@ Transition Summary: - - Executing cluster transition: - * Resource action: child_DoFencing:4 monitor=20000 on c001n08 -- * Fencing c001n05 -- * Fencing c001n03 -+ * Fencing c001n05 (reboot) -+ * Fencing c001n03 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: group-1_stop_0 - * Pseudo action: ocf_192.168.100.183_stop_0 -diff --git a/pengine/test10/stonith-1.summary b/pengine/test10/stonith-1.summary -index d3e81db..ed83ad7 100644 ---- a/pengine/test10/stonith-1.summary -+++ b/pengine/test10/stonith-1.summary -@@ -44,7 +44,7 @@ Executing cluster transition: - * Resource action: lsb_dummy monitor=5000 on sles-2 - * Resource action: rsc_sles-2 monitor=5000 on sles-2 - * Resource action: rsc_sles-4 monitor=5000 on sles-4 -- * Fencing sles-3 -+ * Fencing sles-3 (reboot) - * Pseudo action: stonith_complete - * Resource action: r192.168.100.183 start on sles-1 - * Pseudo action: migrator_stop_0 -diff --git a/pengine/test10/stonith-2.summary b/pengine/test10/stonith-2.summary -index f02dd74..169f44f 100644 ---- a/pengine/test10/stonith-2.summary -+++ b/pengine/test10/stonith-2.summary -@@ -36,7 +36,7 @@ Transition Summary: - * Start rsc_sles-5 (sles-6) - - Executing cluster transition: -- * Fencing sles-5 -+ * Fencing sles-5 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - * Resource action: rsc_sles-5 start on sles-6 -diff --git a/pengine/test10/stonith-3.summary b/pengine/test10/stonith-3.summary -index b5b6d8a..095ce73 100644 ---- a/pengine/test10/stonith-3.summary -+++ b/pengine/test10/stonith-3.summary -@@ -15,7 +15,7 @@ Executing cluster transition: - * Resource action: prmIpPostgreSQLDB monitor on rh5node2 - * Resource action: prmStonith:0 monitor on rh5node2 - * Pseudo action: clnStonith_start_0 -- * Fencing rh5node1 -+ * Fencing rh5node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/stonith-4.summary b/pengine/test10/stonith-4.summary -index 1f87015..2e12deb 100644 ---- a/pengine/test10/stonith-4.summary -+++ b/pengine/test10/stonith-4.summary -@@ -17,10 +17,10 @@ Transition Summary: - * Start Fencing (pcmk-1) - - Executing cluster transition: -- * Fencing pcmk-10 -- * Fencing pcmk-5 -- * Fencing pcmk-7 -- * Fencing pcmk-8 -+ * Fencing pcmk-10 (reboot) -+ * Fencing pcmk-5 (reboot) -+ * Fencing pcmk-7 (reboot) -+ * Fencing pcmk-8 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - Transition failed: terminated -diff --git a/pengine/test10/stop-failure-no-quorum.summary b/pengine/test10/stop-failure-no-quorum.summary -index 49a0f54..d57bdc6 100644 ---- a/pengine/test10/stop-failure-no-quorum.summary -+++ b/pengine/test10/stop-failure-no-quorum.summary -@@ -22,7 +22,7 @@ Transition Summary: - * Start Fencing (pcmk-1 - blocked) - - Executing cluster transition: -- * Fencing pcmk-2 -+ * Fencing pcmk-2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: clvm-clone_stop_0 - * Pseudo action: clvm_stop_0 -diff --git a/pengine/test10/stop-failure-with-fencing.summary b/pengine/test10/stop-failure-with-fencing.summary -index 0473b80..de74dbc 100644 ---- a/pengine/test10/stop-failure-with-fencing.summary -+++ b/pengine/test10/stop-failure-with-fencing.summary -@@ -22,7 +22,7 @@ Transition Summary: - - Executing cluster transition: - * Resource action: Fencing monitor on pcmk-1 -- * Fencing pcmk-2 -+ * Fencing pcmk-2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: clvm-clone_stop_0 -diff --git a/pengine/test10/systemhealth1.summary b/pengine/test10/systemhealth1.summary -index 49c6579..bbdbcaf 100644 ---- a/pengine/test10/systemhealth1.summary -+++ b/pengine/test10/systemhealth1.summary -@@ -10,8 +10,8 @@ Node hs21d (737318c6-0f92-4592-9754-45967d45aff7): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing hs21d -- * Fencing hs21c -+ * Fencing hs21d (reboot) -+ * Fencing hs21c (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/systemhealth2.summary b/pengine/test10/systemhealth2.summary -index dfdfa02..0ca09d0 100644 ---- a/pengine/test10/systemhealth2.summary -+++ b/pengine/test10/systemhealth2.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealth3.summary b/pengine/test10/systemhealth3.summary -index dfdfa02..0ca09d0 100644 ---- a/pengine/test10/systemhealth3.summary -+++ b/pengine/test10/systemhealth3.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthm1.summary b/pengine/test10/systemhealthm1.summary -index 49c6579..bbdbcaf 100644 ---- a/pengine/test10/systemhealthm1.summary -+++ b/pengine/test10/systemhealthm1.summary -@@ -10,8 +10,8 @@ Node hs21d (737318c6-0f92-4592-9754-45967d45aff7): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing hs21d -- * Fencing hs21c -+ * Fencing hs21d (reboot) -+ * Fencing hs21c (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/systemhealthm2.summary b/pengine/test10/systemhealthm2.summary -index dfdfa02..0ca09d0 100644 ---- a/pengine/test10/systemhealthm2.summary -+++ b/pengine/test10/systemhealthm2.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthm3.summary b/pengine/test10/systemhealthm3.summary -index 6964943..7fcab05 100644 ---- a/pengine/test10/systemhealthm3.summary -+++ b/pengine/test10/systemhealthm3.summary -@@ -13,7 +13,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthn1.summary b/pengine/test10/systemhealthn1.summary -index 49c6579..bbdbcaf 100644 ---- a/pengine/test10/systemhealthn1.summary -+++ b/pengine/test10/systemhealthn1.summary -@@ -10,8 +10,8 @@ Node hs21d (737318c6-0f92-4592-9754-45967d45aff7): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing hs21d -- * Fencing hs21c -+ * Fencing hs21d (reboot) -+ * Fencing hs21c (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/systemhealthn2.summary b/pengine/test10/systemhealthn2.summary -index dfdfa02..0ca09d0 100644 ---- a/pengine/test10/systemhealthn2.summary -+++ b/pengine/test10/systemhealthn2.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthn3.summary b/pengine/test10/systemhealthn3.summary -index dfdfa02..0ca09d0 100644 ---- a/pengine/test10/systemhealthn3.summary -+++ b/pengine/test10/systemhealthn3.summary -@@ -16,7 +16,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealtho1.summary b/pengine/test10/systemhealtho1.summary -index 49c6579..bbdbcaf 100644 ---- a/pengine/test10/systemhealtho1.summary -+++ b/pengine/test10/systemhealtho1.summary -@@ -10,8 +10,8 @@ Node hs21d (737318c6-0f92-4592-9754-45967d45aff7): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing hs21d -- * Fencing hs21c -+ * Fencing hs21d (reboot) -+ * Fencing hs21c (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/systemhealtho2.summary b/pengine/test10/systemhealtho2.summary -index 6964943..7fcab05 100644 ---- a/pengine/test10/systemhealtho2.summary -+++ b/pengine/test10/systemhealtho2.summary -@@ -13,7 +13,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealtho3.summary b/pengine/test10/systemhealtho3.summary -index 6964943..7fcab05 100644 ---- a/pengine/test10/systemhealtho3.summary -+++ b/pengine/test10/systemhealtho3.summary -@@ -13,7 +13,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthp1.summary b/pengine/test10/systemhealthp1.summary -index 49c6579..bbdbcaf 100644 ---- a/pengine/test10/systemhealthp1.summary -+++ b/pengine/test10/systemhealthp1.summary -@@ -10,8 +10,8 @@ Node hs21d (737318c6-0f92-4592-9754-45967d45aff7): UNCLEAN (offline) - Transition Summary: - - Executing cluster transition: -- * Fencing hs21d -- * Fencing hs21c -+ * Fencing hs21d (reboot) -+ * Fencing hs21c (reboot) - * Pseudo action: stonith_complete - * Pseudo action: all_stopped - -diff --git a/pengine/test10/systemhealthp2.summary b/pengine/test10/systemhealthp2.summary -index f01150f..12a888c 100644 ---- a/pengine/test10/systemhealthp2.summary -+++ b/pengine/test10/systemhealthp2.summary -@@ -15,7 +15,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/systemhealthp3.summary b/pengine/test10/systemhealthp3.summary -index 6964943..7fcab05 100644 ---- a/pengine/test10/systemhealthp3.summary -+++ b/pengine/test10/systemhealthp3.summary -@@ -13,7 +13,7 @@ Executing cluster transition: - * Resource action: stonith-1 monitor on hs21c - * Resource action: apache_1 monitor on hs21c - * Resource action: nfs_1 monitor on hs21c -- * Fencing hs21d -+ * Fencing hs21d (reboot) - * Pseudo action: stonith_complete - * Pseudo action: probe_complete - * Pseudo action: all_stopped -diff --git a/pengine/test10/ticket-clone-21.summary b/pengine/test10/ticket-clone-21.summary -index 7973159..5ae23ec 100644 ---- a/pengine/test10/ticket-clone-21.summary -+++ b/pengine/test10/ticket-clone-21.summary -@@ -12,9 +12,9 @@ Transition Summary: - * Stop rsc1:1 (node2) - - Executing cluster transition: -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: rsc_stonith_stop_0 -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: clone1_stop_0 - * Pseudo action: rsc1:1_stop_0 -diff --git a/pengine/test10/ticket-clone-9.summary b/pengine/test10/ticket-clone-9.summary -index 7973159..5ae23ec 100644 ---- a/pengine/test10/ticket-clone-9.summary -+++ b/pengine/test10/ticket-clone-9.summary -@@ -12,9 +12,9 @@ Transition Summary: - * Stop rsc1:1 (node2) - - Executing cluster transition: -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: rsc_stonith_stop_0 -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: clone1_stop_0 - * Pseudo action: rsc1:1_stop_0 -diff --git a/pengine/test10/ticket-group-21.summary b/pengine/test10/ticket-group-21.summary -index c0783e0..9027d2c 100644 ---- a/pengine/test10/ticket-group-21.summary -+++ b/pengine/test10/ticket-group-21.summary -@@ -12,7 +12,7 @@ Transition Summary: - * Stop rsc2 (node2) - - Executing cluster transition: -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: group1_stop_0 - * Pseudo action: rsc2_stop_0 -diff --git a/pengine/test10/ticket-group-9.summary b/pengine/test10/ticket-group-9.summary -index c0783e0..9027d2c 100644 ---- a/pengine/test10/ticket-group-9.summary -+++ b/pengine/test10/ticket-group-9.summary -@@ -12,7 +12,7 @@ Transition Summary: - * Stop rsc2 (node2) - - Executing cluster transition: -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: group1_stop_0 - * Pseudo action: rsc2_stop_0 -diff --git a/pengine/test10/ticket-master-21.summary b/pengine/test10/ticket-master-21.summary -index ca5bf84..64a9cbe 100644 ---- a/pengine/test10/ticket-master-21.summary -+++ b/pengine/test10/ticket-master-21.summary -@@ -13,7 +13,7 @@ Transition Summary: - - Executing cluster transition: - * Pseudo action: ms1_demote_0 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: rsc_stonith_stop_0 - * Pseudo action: rsc1:1_demote_0 -diff --git a/pengine/test10/ticket-master-9.summary b/pengine/test10/ticket-master-9.summary -index ca5bf84..64a9cbe 100644 ---- a/pengine/test10/ticket-master-9.summary -+++ b/pengine/test10/ticket-master-9.summary -@@ -13,7 +13,7 @@ Transition Summary: - - Executing cluster transition: - * Pseudo action: ms1_demote_0 -- * Fencing node1 -+ * Fencing node1 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: rsc_stonith_stop_0 - * Pseudo action: rsc1:1_demote_0 -diff --git a/pengine/test10/ticket-primitive-21.summary b/pengine/test10/ticket-primitive-21.summary -index 3afd279..6c523fe 100644 ---- a/pengine/test10/ticket-primitive-21.summary -+++ b/pengine/test10/ticket-primitive-21.summary -@@ -9,7 +9,7 @@ Transition Summary: - * Stop rsc1 (node2) - - Executing cluster transition: -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: rsc1_stop_0 - * Pseudo action: all_stopped -diff --git a/pengine/test10/ticket-primitive-9.summary b/pengine/test10/ticket-primitive-9.summary -index 3afd279..6c523fe 100644 ---- a/pengine/test10/ticket-primitive-9.summary -+++ b/pengine/test10/ticket-primitive-9.summary -@@ -9,7 +9,7 @@ Transition Summary: - * Stop rsc1 (node2) - - Executing cluster transition: -- * Fencing node2 -+ * Fencing node2 (reboot) - * Pseudo action: stonith_complete - * Pseudo action: rsc1_stop_0 - * Pseudo action: all_stopped -diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c -index 9d20cdd..e81d4ee 100644 ---- a/tools/crm_simulate.c -+++ b/tools/crm_simulate.c -@@ -497,31 +497,36 @@ exec_crmd_action(crm_graph_t * graph, crm_action_t * action) - static gboolean - exec_stonith_action(crm_graph_t * graph, crm_action_t * action) - { -- int rc = 0; -- char xpath[STATUS_PATH_MAX]; -+ const char *op = crm_meta_value(action->params, "stonith_action"); - char *target = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET); -- xmlNode *cib_node = modify_node(global_cib, target, FALSE); - -- crm_xml_add(cib_node, XML_ATTR_ORIGIN, __FUNCTION__); -- CRM_ASSERT(cib_node != NULL); -+ quiet_log(" * Fencing %s (%s)\n", target, op); -+ if(safe_str_neq(op, "on")) { -+ int rc = 0; -+ char xpath[STATUS_PATH_MAX]; -+ xmlNode *cib_node = modify_node(global_cib, target, FALSE); - -- quiet_log(" * Fencing %s\n", target); -- rc = global_cib->cmds->replace(global_cib, XML_CIB_TAG_STATUS, cib_node, -+ crm_xml_add(cib_node, XML_ATTR_ORIGIN, __FUNCTION__); -+ CRM_ASSERT(cib_node != NULL); -+ -+ rc = global_cib->cmds->replace(global_cib, XML_CIB_TAG_STATUS, cib_node, - cib_sync_call | cib_scope_local); -- CRM_ASSERT(rc == pcmk_ok); -+ CRM_ASSERT(rc == pcmk_ok); - -- snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, XML_CIB_TAG_LRM); -- rc = global_cib->cmds->delete(global_cib, xpath, NULL, -- cib_xpath | cib_sync_call | cib_scope_local); -+ snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, XML_CIB_TAG_LRM); -+ rc = global_cib->cmds->delete(global_cib, xpath, NULL, -+ cib_xpath | cib_sync_call | cib_scope_local); - -- snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, -- XML_TAG_TRANSIENT_NODEATTRS); -- rc = global_cib->cmds->delete(global_cib, xpath, NULL, -- cib_xpath | cib_sync_call | cib_scope_local); -+ snprintf(xpath, STATUS_PATH_MAX, "//node_state[@uname='%s']/%s", target, -+ XML_TAG_TRANSIENT_NODEATTRS); -+ rc = global_cib->cmds->delete(global_cib, xpath, NULL, -+ cib_xpath | cib_sync_call | cib_scope_local); -+ -+ free_xml(cib_node); -+ } - - action->confirmed = TRUE; - update_graph(graph, action); -- free_xml(cib_node); - free(target); - return TRUE; - } diff --git a/SOURCES/bz1078078-pcmk-pe_indicate_the_type_of_fencing_in_the_fencing_operation_key.patch b/SOURCES/bz1078078-pcmk-pe_indicate_the_type_of_fencing_in_the_fencing_operation_key.patch deleted file mode 100644 index af405dc..0000000 --- a/SOURCES/bz1078078-pcmk-pe_indicate_the_type_of_fencing_in_the_fencing_operation_key.patch +++ /dev/null @@ -1,3230 +0,0 @@ -commit cce2536efbed5b3bed24e6ad13532dc4db55d4ae -Author: Andrew Beekhof -Date: Tue Apr 1 15:13:21 2014 +1100 - - Refactor: PE: Indicate the type of fencing in the fencing operation key - - (cherry picked from commit 22dbe7cdda718563d02f65b0009b1984497a0947) - - Conflicts: - pengine/test10/594.exp - pengine/test10/829.exp - pengine/test10/bug-5186-partial-migrate.exp - pengine/test10/bug-lf-2508.exp - pengine/test10/bug-lf-2551.exp - pengine/test10/bug-lf-2606.exp - pengine/test10/interleave-pseudo-stop.exp - pengine/test10/master-7.exp - pengine/test10/master-8.exp - pengine/test10/migrate-fencing.exp - pengine/test10/rec-node-11.exp - pengine/test10/rec-node-12.exp - pengine/test10/rec-node-13.exp - pengine/test10/rec-node-14.exp - pengine/test10/rec-node-15.exp - pengine/test10/rec-node-2.exp - pengine/test10/rec-node-4.exp - pengine/test10/rec-node-6.exp - pengine/test10/rec-node-7.exp - pengine/test10/rec-rsc-5.exp - pengine/test10/remote-fence-unclean.exp - pengine/test10/stonith-0.exp - pengine/test10/stonith-1.exp - pengine/test10/stonith-2.exp - pengine/test10/stonith-3.exp - pengine/test10/stonith-4.exp - pengine/test10/stop-failure-no-quorum.exp - pengine/test10/stop-failure-with-fencing.exp - pengine/test10/systemhealth1.exp - pengine/test10/systemhealth2.exp - pengine/test10/systemhealth3.exp - pengine/test10/systemhealthm1.exp - pengine/test10/systemhealthm2.exp - pengine/test10/systemhealthm3.exp - pengine/test10/systemhealthn1.exp - pengine/test10/systemhealthn2.exp - pengine/test10/systemhealthn3.exp - pengine/test10/systemhealtho1.exp - pengine/test10/systemhealtho2.exp - pengine/test10/systemhealtho3.exp - pengine/test10/systemhealthp1.exp - pengine/test10/systemhealthp2.exp - pengine/test10/systemhealthp3.exp - pengine/test10/ticket-clone-21.exp - pengine/test10/ticket-clone-9.exp - pengine/test10/ticket-group-21.exp - pengine/test10/ticket-group-9.exp - pengine/test10/ticket-master-21.exp - pengine/test10/ticket-master-9.exp - pengine/test10/ticket-primitive-21.exp - pengine/test10/ticket-primitive-9.exp - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index e535b84..a8e5412 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1265,15 +1265,21 @@ any_managed_resources(pe_working_set_t * data_set) - action_t * - pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set) - { -- action_t *stonith_op = -- custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_FENCE, node->details->uname), -- CRM_OP_FENCE, node, FALSE, TRUE, data_set); -+ action_t *stonith_op = NULL; -+ -+ if(op == NULL) { -+ op = data_set->stonith_action; -+ } -+ -+ stonith_op = custom_action( -+ NULL, g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op), -+ CRM_OP_FENCE, node, FALSE, TRUE, data_set); - - add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); - - add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); - -- add_hash_param(stonith_op->meta, "stonith_action", op ? op : data_set->stonith_action); -+ add_hash_param(stonith_op->meta, "stonith_action", op); - - return stonith_op; - } -diff --git a/pengine/test10/594.exp b/pengine/test10/594.exp -index 5cb6931..f1e77f8 100644 ---- a/pengine/test10/594.exp -+++ b/pengine/test10/594.exp -@@ -183,7 +183,7 @@ - - - -- -+ - - - -@@ -215,7 +215,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/829.exp b/pengine/test10/829.exp -index 4562aed..749014f 100644 ---- a/pengine/test10/829.exp -+++ b/pengine/test10/829.exp -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -240,13 +240,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -260,7 +260,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-5186-partial-migrate.exp b/pengine/test10/bug-5186-partial-migrate.exp -new file mode 100644 -index 0000000..7e10e3a ---- /dev/null -+++ b/pengine/test10/bug-5186-partial-migrate.exp -@@ -0,0 +1,425 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/bug-lf-2508.exp b/pengine/test10/bug-lf-2508.exp -index 3e54b30..d56002e 100644 ---- a/pengine/test10/bug-lf-2508.exp -+++ b/pengine/test10/bug-lf-2508.exp -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -148,7 +148,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -@@ -211,7 +211,7 @@ - - - -- -+ - - - -@@ -238,7 +238,7 @@ - - - -- -+ - - - -@@ -286,7 +286,7 @@ - - - -- -+ - - - -@@ -301,7 +301,7 @@ - - - -- -+ - - - -@@ -393,7 +393,7 @@ - - - -- -+ - - - -@@ -468,7 +468,7 @@ - - - -- -+ - - - -@@ -483,7 +483,7 @@ - - - -- -+ - - - -@@ -510,13 +510,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -530,7 +530,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2551.exp b/pengine/test10/bug-lf-2551.exp -index 5c2fd65..7790199 100644 ---- a/pengine/test10/bug-lf-2551.exp -+++ b/pengine/test10/bug-lf-2551.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -82,7 +82,7 @@ - - - -- -+ - - - -@@ -142,7 +142,7 @@ - - - -- -+ - - - -@@ -160,7 +160,7 @@ - - - -- -+ - - - -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -@@ -214,7 +214,7 @@ - - - -- -+ - - - -@@ -229,7 +229,7 @@ - - - -- -+ - - - -@@ -304,7 +304,7 @@ - - - -- -+ - - - -@@ -316,7 +316,7 @@ - - - -- -+ - - - -@@ -328,7 +328,7 @@ - - - -- -+ - - - -@@ -340,7 +340,7 @@ - - - -- -+ - - - -@@ -352,7 +352,7 @@ - - - -- -+ - - - -@@ -364,7 +364,7 @@ - - - -- -+ - - - -@@ -376,7 +376,7 @@ - - - -- -+ - - - -@@ -388,7 +388,7 @@ - - - -- -+ - - - -@@ -400,7 +400,7 @@ - - - -- -+ - - - -@@ -412,7 +412,7 @@ - - - -- -+ - - - -@@ -424,7 +424,7 @@ - - - -- -+ - - - -@@ -436,7 +436,7 @@ - - - -- -+ - - - -@@ -448,7 +448,7 @@ - - - -- -+ - - - -@@ -460,7 +460,7 @@ - - - -- -+ - - - -@@ -472,7 +472,7 @@ - - - -- -+ - - - -@@ -484,7 +484,7 @@ - - - -- -+ - - - -@@ -496,13 +496,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -516,7 +516,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2606.exp b/pengine/test10/bug-lf-2606.exp -index ae490e6..270131a 100644 ---- a/pengine/test10/bug-lf-2606.exp -+++ b/pengine/test10/bug-lf-2606.exp -@@ -7,7 +7,7 @@ - - - -- -+ - - - -@@ -48,7 +48,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -134,13 +134,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -154,7 +154,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/interleave-pseudo-stop.exp b/pengine/test10/interleave-pseudo-stop.exp -index ae5c9a6..a5e8880 100644 ---- a/pengine/test10/interleave-pseudo-stop.exp -+++ b/pengine/test10/interleave-pseudo-stop.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -93,7 +93,7 @@ - - - -- -+ - - - -@@ -114,7 +114,7 @@ - - - -- -+ - - - -@@ -203,7 +203,7 @@ - - - -- -+ - - - -@@ -259,7 +259,7 @@ - - - -- -+ - - - -@@ -274,7 +274,7 @@ - - - -- -+ - - - -@@ -357,7 +357,7 @@ - - - -- -+ - - - -@@ -413,7 +413,7 @@ - - - -- -+ - - - -@@ -428,7 +428,7 @@ - - - -- -+ - - - -@@ -511,13 +511,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -531,7 +531,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/master-7.exp b/pengine/test10/master-7.exp -index b9b246c..4fba172 100644 ---- a/pengine/test10/master-7.exp -+++ b/pengine/test10/master-7.exp -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -349,7 +349,7 @@ - - - -- -+ - - - -@@ -367,7 +367,7 @@ - - - -- -+ - - - -@@ -430,7 +430,7 @@ - - - -- -+ - - - -@@ -451,7 +451,7 @@ - - - -- -+ - - - -@@ -466,7 +466,7 @@ - - - -- -+ - - - -@@ -484,7 +484,7 @@ - - - -- -+ - - - -@@ -621,13 +621,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -641,7 +641,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/master-8.exp b/pengine/test10/master-8.exp -index e6c73a0..c0cd853 100644 ---- a/pengine/test10/master-8.exp -+++ b/pengine/test10/master-8.exp -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -349,7 +349,7 @@ - - - -- -+ - - - -@@ -367,7 +367,7 @@ - - - -- -+ - - - -@@ -430,7 +430,7 @@ - - - -- -+ - - - -@@ -489,7 +489,7 @@ - - - -- -+ - - - -@@ -504,7 +504,7 @@ - - - -- -+ - - - -@@ -647,7 +647,7 @@ - - - -- -+ - - - -@@ -683,7 +683,7 @@ - - - -- -+ - - - -@@ -697,7 +697,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/migrate-fencing.exp b/pengine/test10/migrate-fencing.exp -index 0fba419..02b70c8 100644 ---- a/pengine/test10/migrate-fencing.exp -+++ b/pengine/test10/migrate-fencing.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -212,7 +212,7 @@ - - - -- -+ - - - -@@ -262,7 +262,7 @@ - - - -- -+ - - - -@@ -303,7 +303,7 @@ - - - -- -+ - - - -@@ -347,7 +347,7 @@ - - - -- -+ - - - -@@ -429,7 +429,7 @@ - - - -- -+ - - - -@@ -456,7 +456,7 @@ - - - -- -+ - - - -@@ -474,7 +474,7 @@ - - - -- -+ - - - -@@ -489,7 +489,7 @@ - - - -- -+ - - - -@@ -620,13 +620,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -640,7 +640,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-11.exp b/pengine/test10/rec-node-11.exp -index 09aaddf..173df21 100644 ---- a/pengine/test10/rec-node-11.exp -+++ b/pengine/test10/rec-node-11.exp -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -@@ -178,7 +178,7 @@ - - - -- -+ - - - -@@ -225,7 +225,7 @@ - - - -- -+ - - - -@@ -239,7 +239,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-12.exp b/pengine/test10/rec-node-12.exp -index 07c0027..9732907 100644 ---- a/pengine/test10/rec-node-12.exp -+++ b/pengine/test10/rec-node-12.exp -@@ -514,7 +514,7 @@ - - - -- -+ - - - -@@ -528,7 +528,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-13.exp b/pengine/test10/rec-node-13.exp -index 63abd08..ae23ea5 100644 ---- a/pengine/test10/rec-node-13.exp -+++ b/pengine/test10/rec-node-13.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -37,13 +37,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -57,7 +57,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-14.exp b/pengine/test10/rec-node-14.exp -index 2ca969a..e473479 100644 ---- a/pengine/test10/rec-node-14.exp -+++ b/pengine/test10/rec-node-14.exp -@@ -1,31 +1,31 @@ - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - -@@ -39,7 +39,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-15.exp b/pengine/test10/rec-node-15.exp -index a48d8c5..3c79d65 100644 ---- a/pengine/test10/rec-node-15.exp -+++ b/pengine/test10/rec-node-15.exp -@@ -445,7 +445,7 @@ - - - -- -+ - - - -@@ -459,7 +459,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-2.exp b/pengine/test10/rec-node-2.exp -index 2785c57..901eded 100644 ---- a/pengine/test10/rec-node-2.exp -+++ b/pengine/test10/rec-node-2.exp -@@ -246,7 +246,7 @@ - - - -- -+ - - - -@@ -260,7 +260,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-4.exp b/pengine/test10/rec-node-4.exp -index bdaaa38..1e98f4d 100644 ---- a/pengine/test10/rec-node-4.exp -+++ b/pengine/test10/rec-node-4.exp -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-6.exp b/pengine/test10/rec-node-6.exp -index bdaaa38..1e98f4d 100644 ---- a/pengine/test10/rec-node-6.exp -+++ b/pengine/test10/rec-node-6.exp -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-node-7.exp b/pengine/test10/rec-node-7.exp -index bdaaa38..1e98f4d 100644 ---- a/pengine/test10/rec-node-7.exp -+++ b/pengine/test10/rec-node-7.exp -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/rec-rsc-5.exp b/pengine/test10/rec-rsc-5.exp -index 897d5f6..69a85d1 100644 ---- a/pengine/test10/rec-rsc-5.exp -+++ b/pengine/test10/rec-rsc-5.exp -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/remote-fence-unclean.exp b/pengine/test10/remote-fence-unclean.exp -new file mode 100644 -index 0000000..9b1e327 ---- /dev/null -+++ b/pengine/test10/remote-fence-unclean.exp -@@ -0,0 +1,201 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/stonith-0.exp b/pengine/test10/stonith-0.exp -index f4aed36..d664a12 100644 ---- a/pengine/test10/stonith-0.exp -+++ b/pengine/test10/stonith-0.exp -@@ -34,10 +34,10 @@ - - - -- -+ - - -- -+ - - - -@@ -123,7 +123,7 @@ - - - -- -+ - - - -@@ -141,7 +141,7 @@ - - - -- -+ - - - -@@ -203,7 +203,7 @@ - - - -- -+ - - - -@@ -256,7 +256,7 @@ - - - -- -+ - - - -@@ -271,7 +271,7 @@ - - - -- -+ - - - -@@ -312,7 +312,7 @@ - - - -- -+ - - - -@@ -353,7 +353,7 @@ - - - -- -+ - - - -@@ -368,7 +368,7 @@ - - - -- -+ - - - -@@ -376,13 +376,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -394,7 +394,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stonith-1.exp b/pengine/test10/stonith-1.exp -index 12a2839..b9798e3 100644 ---- a/pengine/test10/stonith-1.exp -+++ b/pengine/test10/stonith-1.exp -@@ -108,7 +108,7 @@ - - - -- -+ - - - -@@ -158,7 +158,7 @@ - - - -- -+ - - - -@@ -211,7 +211,7 @@ - - - -- -+ - - - -@@ -238,7 +238,7 @@ - - - -- -+ - - - -@@ -370,7 +370,7 @@ - - - -- -+ - - - -@@ -475,7 +475,7 @@ - - - -- -+ - - - -@@ -505,7 +505,7 @@ - - - -- -+ - - - -@@ -553,7 +553,7 @@ - - - -- -+ - - - -@@ -567,7 +567,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stonith-2.exp b/pengine/test10/stonith-2.exp -index dfab333..84a7fb8 100644 ---- a/pengine/test10/stonith-2.exp -+++ b/pengine/test10/stonith-2.exp -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -41,7 +41,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stonith-3.exp b/pengine/test10/stonith-3.exp -index bb15555..49e6e81 100644 ---- a/pengine/test10/stonith-3.exp -+++ b/pengine/test10/stonith-3.exp -@@ -117,7 +117,7 @@ - - - -- -+ - - - -@@ -131,7 +131,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stonith-4.exp b/pengine/test10/stonith-4.exp -index 8e5ee2c..2cfffc0 100644 ---- a/pengine/test10/stonith-4.exp -+++ b/pengine/test10/stonith-4.exp -@@ -17,43 +17,43 @@ - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - -@@ -67,7 +67,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stop-failure-no-quorum.exp b/pengine/test10/stop-failure-no-quorum.exp -index b2260c7..895d43c 100644 ---- a/pengine/test10/stop-failure-no-quorum.exp -+++ b/pengine/test10/stop-failure-no-quorum.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -37,13 +37,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -57,7 +57,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/stop-failure-with-fencing.exp b/pengine/test10/stop-failure-with-fencing.exp -index 1c22e38..335ac37 100644 ---- a/pengine/test10/stop-failure-with-fencing.exp -+++ b/pengine/test10/stop-failure-with-fencing.exp -@@ -10,7 +10,7 @@ - - - -- -+ - - - -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealth1.exp b/pengine/test10/systemhealth1.exp -index f8c698e..b090f6b 100644 ---- a/pengine/test10/systemhealth1.exp -+++ b/pengine/test10/systemhealth1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealth2.exp b/pengine/test10/systemhealth2.exp -index 9232b32..68b5078 100644 ---- a/pengine/test10/systemhealth2.exp -+++ b/pengine/test10/systemhealth2.exp -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -116,7 +116,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealth3.exp b/pengine/test10/systemhealth3.exp -index 9232b32..68b5078 100644 ---- a/pengine/test10/systemhealth3.exp -+++ b/pengine/test10/systemhealth3.exp -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -116,7 +116,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm1.exp b/pengine/test10/systemhealthm1.exp -index f8c698e..b090f6b 100644 ---- a/pengine/test10/systemhealthm1.exp -+++ b/pengine/test10/systemhealthm1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm2.exp b/pengine/test10/systemhealthm2.exp -index 9232b32..68b5078 100644 ---- a/pengine/test10/systemhealthm2.exp -+++ b/pengine/test10/systemhealthm2.exp -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -116,7 +116,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthm3.exp b/pengine/test10/systemhealthm3.exp -index 15b37be..7246b5b 100644 ---- a/pengine/test10/systemhealthm3.exp -+++ b/pengine/test10/systemhealthm3.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn1.exp b/pengine/test10/systemhealthn1.exp -index f8c698e..b090f6b 100644 ---- a/pengine/test10/systemhealthn1.exp -+++ b/pengine/test10/systemhealthn1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn2.exp b/pengine/test10/systemhealthn2.exp -index 9232b32..68b5078 100644 ---- a/pengine/test10/systemhealthn2.exp -+++ b/pengine/test10/systemhealthn2.exp -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -116,7 +116,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthn3.exp b/pengine/test10/systemhealthn3.exp -index 9232b32..68b5078 100644 ---- a/pengine/test10/systemhealthn3.exp -+++ b/pengine/test10/systemhealthn3.exp -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -116,7 +116,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealtho1.exp b/pengine/test10/systemhealtho1.exp -index f8c698e..b090f6b 100644 ---- a/pengine/test10/systemhealtho1.exp -+++ b/pengine/test10/systemhealtho1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealtho2.exp b/pengine/test10/systemhealtho2.exp -index 15b37be..7246b5b 100644 ---- a/pengine/test10/systemhealtho2.exp -+++ b/pengine/test10/systemhealtho2.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealtho3.exp b/pengine/test10/systemhealtho3.exp -index 15b37be..7246b5b 100644 ---- a/pengine/test10/systemhealtho3.exp -+++ b/pengine/test10/systemhealtho3.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthp1.exp b/pengine/test10/systemhealthp1.exp -index f8c698e..b090f6b 100644 ---- a/pengine/test10/systemhealthp1.exp -+++ b/pengine/test10/systemhealthp1.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -9,13 +9,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthp2.exp b/pengine/test10/systemhealthp2.exp -index f333166..e3ba25d 100644 ---- a/pengine/test10/systemhealthp2.exp -+++ b/pengine/test10/systemhealthp2.exp -@@ -86,7 +86,7 @@ - - - -- -+ - - - -@@ -100,7 +100,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/systemhealthp3.exp b/pengine/test10/systemhealthp3.exp -index 15b37be..7246b5b 100644 ---- a/pengine/test10/systemhealthp3.exp -+++ b/pengine/test10/systemhealthp3.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-21.exp b/pengine/test10/ticket-clone-21.exp -index ee3a383..00f136d 100644 ---- a/pengine/test10/ticket-clone-21.exp -+++ b/pengine/test10/ticket-clone-21.exp -@@ -7,7 +7,7 @@ - - - -- -+ - - - -@@ -22,7 +22,7 @@ - - - -- -+ - - - -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -67,28 +67,28 @@ - - - -- -+ - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - -@@ -102,7 +102,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-clone-9.exp b/pengine/test10/ticket-clone-9.exp -index ee3a383..00f136d 100644 ---- a/pengine/test10/ticket-clone-9.exp -+++ b/pengine/test10/ticket-clone-9.exp -@@ -7,7 +7,7 @@ - - - -- -+ - - - -@@ -22,7 +22,7 @@ - - - -- -+ - - - -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -67,28 +67,28 @@ - - - -- -+ - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - - - -- -+ - - - -@@ -102,7 +102,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-21.exp b/pengine/test10/ticket-group-21.exp -index 53e30f0..d85b683 100644 ---- a/pengine/test10/ticket-group-21.exp -+++ b/pengine/test10/ticket-group-21.exp -@@ -25,7 +25,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -58,13 +58,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-group-9.exp b/pengine/test10/ticket-group-9.exp -index 53e30f0..d85b683 100644 ---- a/pengine/test10/ticket-group-9.exp -+++ b/pengine/test10/ticket-group-9.exp -@@ -25,7 +25,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -58,13 +58,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-21.exp b/pengine/test10/ticket-master-21.exp -index 47f4257..1ed731c 100644 ---- a/pengine/test10/ticket-master-21.exp -+++ b/pengine/test10/ticket-master-21.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -41,7 +41,7 @@ - - - -- -+ - - - -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -109,13 +109,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -129,7 +129,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-master-9.exp b/pengine/test10/ticket-master-9.exp -index 47f4257..1ed731c 100644 ---- a/pengine/test10/ticket-master-9.exp -+++ b/pengine/test10/ticket-master-9.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -41,7 +41,7 @@ - - - -- -+ - - - -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -109,13 +109,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -129,7 +129,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-21.exp b/pengine/test10/ticket-primitive-21.exp -index 8e8b128..c88cf38 100644 ---- a/pengine/test10/ticket-primitive-21.exp -+++ b/pengine/test10/ticket-primitive-21.exp -@@ -7,13 +7,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/ticket-primitive-9.exp b/pengine/test10/ticket-primitive-9.exp -index 8e8b128..c88cf38 100644 ---- a/pengine/test10/ticket-primitive-9.exp -+++ b/pengine/test10/ticket-primitive-9.exp -@@ -7,13 +7,13 @@ - - - -- -+ - - - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - diff --git a/SOURCES/bz1078078-pcmk-pe_potential_memory_leak.patch b/SOURCES/bz1078078-pcmk-pe_potential_memory_leak.patch deleted file mode 100644 index 3848308..0000000 --- a/SOURCES/bz1078078-pcmk-pe_potential_memory_leak.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 566a6901e5badb712809473527f42678267460a8 -Author: Andrew Beekhof -Date: Tue Apr 1 16:00:40 2014 +1100 - - Fix: PE: Potential memory leak - - (cherry picked from commit b1474d8feb1d975f7a87b4008aabc6ff338d2349) - -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 1e827e0..410acfc 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -358,7 +358,7 @@ custom_action(resource_t * rsc, char *key, const char *task, - GListPtr possible_matches = NULL; - - CRM_CHECK(key != NULL, return NULL); -- CRM_CHECK(task != NULL, return NULL); -+ CRM_CHECK(task != NULL, free(key); return NULL); - - if (save_action && rsc != NULL) { - possible_matches = find_actions(rsc->actions, key, on_node); diff --git a/SOURCES/bz1078078-pcmk-pe_repair_regression_tests.patch b/SOURCES/bz1078078-pcmk-pe_repair_regression_tests.patch deleted file mode 100644 index fae99f7..0000000 --- a/SOURCES/bz1078078-pcmk-pe_repair_regression_tests.patch +++ /dev/null @@ -1,1309 +0,0 @@ -commit fe3e8bf6ece8eeb90c8c1c738b7961e6413762fc -Author: Andrew Beekhof -Date: Fri Apr 11 08:16:33 2014 +1000 - - PE: Repair regression tests - -diff --git a/pengine/test10/unfence-definition.exp b/pengine/test10/unfence-definition.exp -index f023a0b..392c286 100644 ---- a/pengine/test10/unfence-definition.exp -+++ b/pengine/test10/unfence-definition.exp -@@ -1,14 +1,14 @@ -- -+ - - - - -- -+ - - - - -- -+ - - - -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -41,7 +41,7 @@ - - - -- -+ - - - -@@ -54,7 +54,7 @@ - - - -- -+ - - - -@@ -67,7 +67,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -108,7 +108,7 @@ - - - -- -+ - - - -@@ -127,7 +127,7 @@ - - - -- -+ - - - -@@ -135,7 +135,7 @@ - - - -- -+ - - - -@@ -150,7 +150,7 @@ - - - -- -+ - - - -@@ -162,7 +162,7 @@ - - - -- -+ - - - -@@ -180,12 +180,12 @@ - - - -- -+ - - - - -- -+ - - - -@@ -199,7 +199,7 @@ - - - -- -+ - - - -@@ -224,7 +224,7 @@ - - - -- -+ - - - -@@ -240,7 +240,7 @@ - - - -- -+ - - - -@@ -262,7 +262,7 @@ - - - -- -+ - - - -@@ -271,7 +271,7 @@ - - - -- -+ - - - -@@ -296,7 +296,7 @@ - - - -- -+ - - - -@@ -304,7 +304,7 @@ - - - -- -+ - - - -@@ -319,7 +319,7 @@ - - - -- -+ - - - -@@ -327,7 +327,7 @@ - - - -- -+ - - - -@@ -348,12 +348,12 @@ - - - -- -+ - - - - -- -+ - - - -@@ -369,7 +369,7 @@ - - - -- -+ - - - -@@ -377,7 +377,7 @@ - - - -- -+ - - - -@@ -389,7 +389,7 @@ - - - -- -+ - - - -@@ -404,7 +404,7 @@ - - - -- -+ - - - -@@ -416,7 +416,7 @@ - - - -- -+ - - - -@@ -424,7 +424,7 @@ - - - -- -+ - - - -@@ -442,7 +442,7 @@ - - - -- -+ - - - -@@ -462,37 +462,37 @@ - - - -- -- -- -+ -+ -+ - - - -- -- -- -- -- -- -- -+ - - -- -+ - - - - - -- -- -- -+ -+ -+ - - - -- -+ - - -- -+ -+ -+ -+ -+ -+ -+ - - - -diff --git a/pengine/test10/unfence-definition.scores b/pengine/test10/unfence-definition.scores -new file mode 100644 -index 0000000..a4b5fb1 ---- /dev/null -+++ b/pengine/test10/unfence-definition.scores -@@ -0,0 +1,77 @@ -+Allocation scores: -+clone_color: clvmd-clone allocation score on virt-1: 0 -+clone_color: clvmd-clone allocation score on virt-2: 0 -+clone_color: clvmd-clone allocation score on virt-3: 0 -+clone_color: clvmd-clone allocation score on virt-4: 0 -+clone_color: clvmd:0 allocation score on virt-1: 1 -+clone_color: clvmd:0 allocation score on virt-2: 0 -+clone_color: clvmd:0 allocation score on virt-3: 0 -+clone_color: clvmd:0 allocation score on virt-4: 0 -+clone_color: clvmd:1 allocation score on virt-1: 0 -+clone_color: clvmd:1 allocation score on virt-2: 0 -+clone_color: clvmd:1 allocation score on virt-3: 0 -+clone_color: clvmd:1 allocation score on virt-4: 0 -+clone_color: clvmd:2 allocation score on virt-1: 0 -+clone_color: clvmd:2 allocation score on virt-2: 0 -+clone_color: clvmd:2 allocation score on virt-3: 0 -+clone_color: clvmd:2 allocation score on virt-4: 0 -+clone_color: clvmd:3 allocation score on virt-1: 0 -+clone_color: clvmd:3 allocation score on virt-2: 0 -+clone_color: clvmd:3 allocation score on virt-3: 0 -+clone_color: clvmd:3 allocation score on virt-4: 0 -+clone_color: dlm-clone allocation score on virt-1: 0 -+clone_color: dlm-clone allocation score on virt-2: 0 -+clone_color: dlm-clone allocation score on virt-3: 0 -+clone_color: dlm-clone allocation score on virt-4: 0 -+clone_color: dlm:0 allocation score on virt-1: 1 -+clone_color: dlm:0 allocation score on virt-2: 0 -+clone_color: dlm:0 allocation score on virt-3: 0 -+clone_color: dlm:0 allocation score on virt-4: 0 -+clone_color: dlm:1 allocation score on virt-1: 0 -+clone_color: dlm:1 allocation score on virt-2: 1 -+clone_color: dlm:1 allocation score on virt-3: 0 -+clone_color: dlm:1 allocation score on virt-4: 0 -+clone_color: dlm:2 allocation score on virt-1: 0 -+clone_color: dlm:2 allocation score on virt-2: 0 -+clone_color: dlm:2 allocation score on virt-3: 0 -+clone_color: dlm:2 allocation score on virt-4: 0 -+clone_color: dlm:3 allocation score on virt-1: 0 -+clone_color: dlm:3 allocation score on virt-2: 0 -+clone_color: dlm:3 allocation score on virt-3: 0 -+clone_color: dlm:3 allocation score on virt-4: 0 -+native_color: clvmd:0 allocation score on virt-1: 1 -+native_color: clvmd:0 allocation score on virt-2: -INFINITY -+native_color: clvmd:0 allocation score on virt-3: -INFINITY -+native_color: clvmd:0 allocation score on virt-4: -INFINITY -+native_color: clvmd:1 allocation score on virt-1: -INFINITY -+native_color: clvmd:1 allocation score on virt-2: 0 -+native_color: clvmd:1 allocation score on virt-3: -INFINITY -+native_color: clvmd:1 allocation score on virt-4: -INFINITY -+native_color: clvmd:2 allocation score on virt-1: -INFINITY -+native_color: clvmd:2 allocation score on virt-2: -INFINITY -+native_color: clvmd:2 allocation score on virt-3: 0 -+native_color: clvmd:2 allocation score on virt-4: -INFINITY -+native_color: clvmd:3 allocation score on virt-1: -INFINITY -+native_color: clvmd:3 allocation score on virt-2: -INFINITY -+native_color: clvmd:3 allocation score on virt-3: -INFINITY -+native_color: clvmd:3 allocation score on virt-4: -INFINITY -+native_color: dlm:0 allocation score on virt-1: 1 -+native_color: dlm:0 allocation score on virt-2: -INFINITY -+native_color: dlm:0 allocation score on virt-3: 0 -+native_color: dlm:0 allocation score on virt-4: -INFINITY -+native_color: dlm:1 allocation score on virt-1: 0 -+native_color: dlm:1 allocation score on virt-2: 1 -+native_color: dlm:1 allocation score on virt-3: 0 -+native_color: dlm:1 allocation score on virt-4: -INFINITY -+native_color: dlm:2 allocation score on virt-1: -INFINITY -+native_color: dlm:2 allocation score on virt-2: -INFINITY -+native_color: dlm:2 allocation score on virt-3: 0 -+native_color: dlm:2 allocation score on virt-4: -INFINITY -+native_color: dlm:3 allocation score on virt-1: -INFINITY -+native_color: dlm:3 allocation score on virt-2: -INFINITY -+native_color: dlm:3 allocation score on virt-3: -INFINITY -+native_color: dlm:3 allocation score on virt-4: -INFINITY -+native_color: fencing allocation score on virt-1: 0 -+native_color: fencing allocation score on virt-2: 0 -+native_color: fencing allocation score on virt-3: 0 -+native_color: fencing allocation score on virt-4: 0 -diff --git a/pengine/test10/unfence-definition.summary b/pengine/test10/unfence-definition.summary -index 3e4b66b..3d65029 100644 ---- a/pengine/test10/unfence-definition.summary -+++ b/pengine/test10/unfence-definition.summary -@@ -35,8 +35,8 @@ Executing cluster transition: - * Resource action: dlm stop on virt-1 - * Pseudo action: dlm-clone_stopped_0 - * Fencing virt-3 (on) -- * Pseudo action: all_stopped - * Fencing virt-1 (on) -+ * Pseudo action: all_stopped - * Resource action: fencing monitor on virt-3 - * Pseudo action: dlm-clone_start_0 - * Resource action: fencing start on virt-1 -diff --git a/pengine/test10/unfence-definition.xml b/pengine/test10/unfence-definition.xml -new file mode 100644 -index 0000000..5d77931 ---- /dev/null -+++ b/pengine/test10/unfence-definition.xml -@@ -0,0 +1,73 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-parameters.exp b/pengine/test10/unfence-parameters.exp -index 8ff3016..31b0371 100644 ---- a/pengine/test10/unfence-parameters.exp -+++ b/pengine/test10/unfence-parameters.exp -@@ -1,9 +1,9 @@ -- -+ - - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -@@ -29,12 +29,12 @@ - - - -- -+ - - - - -- -+ - - - -@@ -51,7 +51,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -@@ -95,7 +95,7 @@ - - - -- -+ - - - -@@ -120,7 +120,7 @@ - - - -- -+ - - - -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -158,7 +158,7 @@ - - - -- -+ - - - -@@ -166,7 +166,7 @@ - - - -- -+ - - - -@@ -184,7 +184,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -@@ -217,12 +217,12 @@ - - - -- -+ - - - - -- -+ - - - -@@ -239,7 +239,7 @@ - - - -- -+ - - - -@@ -264,7 +264,7 @@ - - - -- -+ - - - -@@ -280,7 +280,7 @@ - - - -- -+ - - - -@@ -305,7 +305,7 @@ - - - -- -+ - - - -@@ -314,7 +314,7 @@ - - - -- -+ - - - -@@ -339,7 +339,7 @@ - - - -- -+ - - - -@@ -347,7 +347,7 @@ - - - -- -+ - - - -@@ -362,7 +362,7 @@ - - - -- -+ - - - -@@ -370,7 +370,7 @@ - - - -- -+ - - - -@@ -391,12 +391,12 @@ - - - -- -+ - - - - -- -+ - - - -@@ -415,7 +415,7 @@ - - - -- -+ - - - -@@ -423,7 +423,7 @@ - - - -- -+ - - - -@@ -435,7 +435,7 @@ - - - -- -+ - - - -@@ -450,7 +450,7 @@ - - - -- -+ - - - -@@ -462,7 +462,7 @@ - - - -- -+ - - - -@@ -470,7 +470,7 @@ - - - -- -+ - - - -@@ -488,7 +488,7 @@ - - - -- -+ - - - -@@ -509,7 +509,7 @@ - - - -- -+ - - - -@@ -526,8 +526,23 @@ - - - -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -@@ -548,19 +563,4 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -diff --git a/pengine/test10/unfence-parameters.scores b/pengine/test10/unfence-parameters.scores -new file mode 100644 -index 0000000..a4b5fb1 ---- /dev/null -+++ b/pengine/test10/unfence-parameters.scores -@@ -0,0 +1,77 @@ -+Allocation scores: -+clone_color: clvmd-clone allocation score on virt-1: 0 -+clone_color: clvmd-clone allocation score on virt-2: 0 -+clone_color: clvmd-clone allocation score on virt-3: 0 -+clone_color: clvmd-clone allocation score on virt-4: 0 -+clone_color: clvmd:0 allocation score on virt-1: 1 -+clone_color: clvmd:0 allocation score on virt-2: 0 -+clone_color: clvmd:0 allocation score on virt-3: 0 -+clone_color: clvmd:0 allocation score on virt-4: 0 -+clone_color: clvmd:1 allocation score on virt-1: 0 -+clone_color: clvmd:1 allocation score on virt-2: 0 -+clone_color: clvmd:1 allocation score on virt-3: 0 -+clone_color: clvmd:1 allocation score on virt-4: 0 -+clone_color: clvmd:2 allocation score on virt-1: 0 -+clone_color: clvmd:2 allocation score on virt-2: 0 -+clone_color: clvmd:2 allocation score on virt-3: 0 -+clone_color: clvmd:2 allocation score on virt-4: 0 -+clone_color: clvmd:3 allocation score on virt-1: 0 -+clone_color: clvmd:3 allocation score on virt-2: 0 -+clone_color: clvmd:3 allocation score on virt-3: 0 -+clone_color: clvmd:3 allocation score on virt-4: 0 -+clone_color: dlm-clone allocation score on virt-1: 0 -+clone_color: dlm-clone allocation score on virt-2: 0 -+clone_color: dlm-clone allocation score on virt-3: 0 -+clone_color: dlm-clone allocation score on virt-4: 0 -+clone_color: dlm:0 allocation score on virt-1: 1 -+clone_color: dlm:0 allocation score on virt-2: 0 -+clone_color: dlm:0 allocation score on virt-3: 0 -+clone_color: dlm:0 allocation score on virt-4: 0 -+clone_color: dlm:1 allocation score on virt-1: 0 -+clone_color: dlm:1 allocation score on virt-2: 1 -+clone_color: dlm:1 allocation score on virt-3: 0 -+clone_color: dlm:1 allocation score on virt-4: 0 -+clone_color: dlm:2 allocation score on virt-1: 0 -+clone_color: dlm:2 allocation score on virt-2: 0 -+clone_color: dlm:2 allocation score on virt-3: 0 -+clone_color: dlm:2 allocation score on virt-4: 0 -+clone_color: dlm:3 allocation score on virt-1: 0 -+clone_color: dlm:3 allocation score on virt-2: 0 -+clone_color: dlm:3 allocation score on virt-3: 0 -+clone_color: dlm:3 allocation score on virt-4: 0 -+native_color: clvmd:0 allocation score on virt-1: 1 -+native_color: clvmd:0 allocation score on virt-2: -INFINITY -+native_color: clvmd:0 allocation score on virt-3: -INFINITY -+native_color: clvmd:0 allocation score on virt-4: -INFINITY -+native_color: clvmd:1 allocation score on virt-1: -INFINITY -+native_color: clvmd:1 allocation score on virt-2: 0 -+native_color: clvmd:1 allocation score on virt-3: -INFINITY -+native_color: clvmd:1 allocation score on virt-4: -INFINITY -+native_color: clvmd:2 allocation score on virt-1: -INFINITY -+native_color: clvmd:2 allocation score on virt-2: -INFINITY -+native_color: clvmd:2 allocation score on virt-3: 0 -+native_color: clvmd:2 allocation score on virt-4: -INFINITY -+native_color: clvmd:3 allocation score on virt-1: -INFINITY -+native_color: clvmd:3 allocation score on virt-2: -INFINITY -+native_color: clvmd:3 allocation score on virt-3: -INFINITY -+native_color: clvmd:3 allocation score on virt-4: -INFINITY -+native_color: dlm:0 allocation score on virt-1: 1 -+native_color: dlm:0 allocation score on virt-2: -INFINITY -+native_color: dlm:0 allocation score on virt-3: 0 -+native_color: dlm:0 allocation score on virt-4: -INFINITY -+native_color: dlm:1 allocation score on virt-1: 0 -+native_color: dlm:1 allocation score on virt-2: 1 -+native_color: dlm:1 allocation score on virt-3: 0 -+native_color: dlm:1 allocation score on virt-4: -INFINITY -+native_color: dlm:2 allocation score on virt-1: -INFINITY -+native_color: dlm:2 allocation score on virt-2: -INFINITY -+native_color: dlm:2 allocation score on virt-3: 0 -+native_color: dlm:2 allocation score on virt-4: -INFINITY -+native_color: dlm:3 allocation score on virt-1: -INFINITY -+native_color: dlm:3 allocation score on virt-2: -INFINITY -+native_color: dlm:3 allocation score on virt-3: -INFINITY -+native_color: dlm:3 allocation score on virt-4: -INFINITY -+native_color: fencing allocation score on virt-1: 0 -+native_color: fencing allocation score on virt-2: 0 -+native_color: fencing allocation score on virt-3: 0 -+native_color: fencing allocation score on virt-4: 0 -diff --git a/pengine/test10/unfence-parameters.summary b/pengine/test10/unfence-parameters.summary -index 5276cba..2bd499c 100644 ---- a/pengine/test10/unfence-parameters.summary -+++ b/pengine/test10/unfence-parameters.summary -@@ -37,8 +37,8 @@ Executing cluster transition: - * Pseudo action: dlm-clone_stopped_0 - * Fencing virt-3 (on) - * Fencing virt-2 (on) -- * Pseudo action: all_stopped - * Fencing virt-1 (on) -+ * Pseudo action: all_stopped - * Resource action: fencing monitor on virt-3 - * Resource action: fencing start on virt-1 - * Pseudo action: dlm-clone_start_0 -diff --git a/pengine/test10/unfence-parameters.xml b/pengine/test10/unfence-parameters.xml -new file mode 100644 -index 0000000..f660100 ---- /dev/null -+++ b/pengine/test10/unfence-parameters.xml -@@ -0,0 +1,73 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-startup.exp b/pengine/test10/unfence-startup.exp -index a0661e7..6319b13 100644 ---- a/pengine/test10/unfence-startup.exp -+++ b/pengine/test10/unfence-startup.exp -@@ -1,9 +1,9 @@ -- -+ - - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -@@ -35,7 +35,7 @@ - - - -- -+ - - - -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -58,7 +58,7 @@ - - - -- -+ - - - -@@ -71,7 +71,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -@@ -99,7 +99,7 @@ - - - -- -+ - - - -@@ -124,7 +124,7 @@ - - - -- -+ - - - -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -150,7 +150,7 @@ - - - -- -+ - - - -@@ -165,7 +165,7 @@ - - - -- -+ - - - -@@ -173,7 +173,7 @@ - - - -- -+ - - - -@@ -185,7 +185,7 @@ - - - -- -+ - - - -@@ -200,7 +200,7 @@ - - - -- -+ - - - -@@ -212,7 +212,7 @@ - - - -- -+ - - - -@@ -220,7 +220,7 @@ - - - -- -+ - - - -@@ -238,7 +238,7 @@ - - - -- -+ - - - -@@ -253,7 +253,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/unfence-startup.scores b/pengine/test10/unfence-startup.scores -new file mode 100644 -index 0000000..a4b5fb1 ---- /dev/null -+++ b/pengine/test10/unfence-startup.scores -@@ -0,0 +1,77 @@ -+Allocation scores: -+clone_color: clvmd-clone allocation score on virt-1: 0 -+clone_color: clvmd-clone allocation score on virt-2: 0 -+clone_color: clvmd-clone allocation score on virt-3: 0 -+clone_color: clvmd-clone allocation score on virt-4: 0 -+clone_color: clvmd:0 allocation score on virt-1: 1 -+clone_color: clvmd:0 allocation score on virt-2: 0 -+clone_color: clvmd:0 allocation score on virt-3: 0 -+clone_color: clvmd:0 allocation score on virt-4: 0 -+clone_color: clvmd:1 allocation score on virt-1: 0 -+clone_color: clvmd:1 allocation score on virt-2: 0 -+clone_color: clvmd:1 allocation score on virt-3: 0 -+clone_color: clvmd:1 allocation score on virt-4: 0 -+clone_color: clvmd:2 allocation score on virt-1: 0 -+clone_color: clvmd:2 allocation score on virt-2: 0 -+clone_color: clvmd:2 allocation score on virt-3: 0 -+clone_color: clvmd:2 allocation score on virt-4: 0 -+clone_color: clvmd:3 allocation score on virt-1: 0 -+clone_color: clvmd:3 allocation score on virt-2: 0 -+clone_color: clvmd:3 allocation score on virt-3: 0 -+clone_color: clvmd:3 allocation score on virt-4: 0 -+clone_color: dlm-clone allocation score on virt-1: 0 -+clone_color: dlm-clone allocation score on virt-2: 0 -+clone_color: dlm-clone allocation score on virt-3: 0 -+clone_color: dlm-clone allocation score on virt-4: 0 -+clone_color: dlm:0 allocation score on virt-1: 1 -+clone_color: dlm:0 allocation score on virt-2: 0 -+clone_color: dlm:0 allocation score on virt-3: 0 -+clone_color: dlm:0 allocation score on virt-4: 0 -+clone_color: dlm:1 allocation score on virt-1: 0 -+clone_color: dlm:1 allocation score on virt-2: 1 -+clone_color: dlm:1 allocation score on virt-3: 0 -+clone_color: dlm:1 allocation score on virt-4: 0 -+clone_color: dlm:2 allocation score on virt-1: 0 -+clone_color: dlm:2 allocation score on virt-2: 0 -+clone_color: dlm:2 allocation score on virt-3: 0 -+clone_color: dlm:2 allocation score on virt-4: 0 -+clone_color: dlm:3 allocation score on virt-1: 0 -+clone_color: dlm:3 allocation score on virt-2: 0 -+clone_color: dlm:3 allocation score on virt-3: 0 -+clone_color: dlm:3 allocation score on virt-4: 0 -+native_color: clvmd:0 allocation score on virt-1: 1 -+native_color: clvmd:0 allocation score on virt-2: -INFINITY -+native_color: clvmd:0 allocation score on virt-3: -INFINITY -+native_color: clvmd:0 allocation score on virt-4: -INFINITY -+native_color: clvmd:1 allocation score on virt-1: -INFINITY -+native_color: clvmd:1 allocation score on virt-2: 0 -+native_color: clvmd:1 allocation score on virt-3: -INFINITY -+native_color: clvmd:1 allocation score on virt-4: -INFINITY -+native_color: clvmd:2 allocation score on virt-1: -INFINITY -+native_color: clvmd:2 allocation score on virt-2: -INFINITY -+native_color: clvmd:2 allocation score on virt-3: 0 -+native_color: clvmd:2 allocation score on virt-4: -INFINITY -+native_color: clvmd:3 allocation score on virt-1: -INFINITY -+native_color: clvmd:3 allocation score on virt-2: -INFINITY -+native_color: clvmd:3 allocation score on virt-3: -INFINITY -+native_color: clvmd:3 allocation score on virt-4: -INFINITY -+native_color: dlm:0 allocation score on virt-1: 1 -+native_color: dlm:0 allocation score on virt-2: -INFINITY -+native_color: dlm:0 allocation score on virt-3: 0 -+native_color: dlm:0 allocation score on virt-4: -INFINITY -+native_color: dlm:1 allocation score on virt-1: 0 -+native_color: dlm:1 allocation score on virt-2: 1 -+native_color: dlm:1 allocation score on virt-3: 0 -+native_color: dlm:1 allocation score on virt-4: -INFINITY -+native_color: dlm:2 allocation score on virt-1: -INFINITY -+native_color: dlm:2 allocation score on virt-2: -INFINITY -+native_color: dlm:2 allocation score on virt-3: 0 -+native_color: dlm:2 allocation score on virt-4: -INFINITY -+native_color: dlm:3 allocation score on virt-1: -INFINITY -+native_color: dlm:3 allocation score on virt-2: -INFINITY -+native_color: dlm:3 allocation score on virt-3: -INFINITY -+native_color: dlm:3 allocation score on virt-4: -INFINITY -+native_color: fencing allocation score on virt-1: 0 -+native_color: fencing allocation score on virt-2: 0 -+native_color: fencing allocation score on virt-3: 0 -+native_color: fencing allocation score on virt-4: 0 diff --git a/SOURCES/bz1078078-pcmk-pe_store_non_resource_actions_in_a_hashtable_where_we_can_easily_and_cheaply_find_them_again.patch b/SOURCES/bz1078078-pcmk-pe_store_non_resource_actions_in_a_hashtable_where_we_can_easily_and_cheaply_find_them_again.patch deleted file mode 100644 index c9c10a6..0000000 --- a/SOURCES/bz1078078-pcmk-pe_store_non_resource_actions_in_a_hashtable_where_we_can_easily_and_cheaply_find_them_again.patch +++ /dev/null @@ -1,118 +0,0 @@ -commit 3544fb711731cb6ebcd48c2af808e4ec25e5eaed -Author: Andrew Beekhof -Date: Wed Apr 2 15:44:31 2014 +1100 - - Refactor: PE: Store non-resource actions in a hashtable where we can easily (and cheaply) find them again - - (cherry picked from commit a65979cbbec616f978154e95b49e8f7bcd064a14) - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index c81566a..b74bf83 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -93,6 +93,7 @@ typedef struct pe_working_set_s { - GHashTable *config_hash; - GHashTable *domains; - GHashTable *tickets; -+ GHashTable *singletons; /* Actions for which there can be only one - ie. fence nodeX */ - - GListPtr nodes; - GListPtr resources; -diff --git a/lib/pengine/status.c b/lib/pengine/status.c -index bb9dfcb..8695dae 100644 ---- a/lib/pengine/status.c -+++ b/lib/pengine/status.c -@@ -191,6 +191,10 @@ cleanup_calculations(pe_working_set_t * data_set) - g_hash_table_destroy(data_set->config_hash); - } - -+ if (data_set->singletons != NULL) { -+ g_hash_table_destroy(data_set->singletons); -+ } -+ - if (data_set->tickets) { - g_hash_table_destroy(data_set->tickets); - } -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 410acfc..2520eeb 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -362,6 +362,17 @@ custom_action(resource_t * rsc, char *key, const char *task, - - if (save_action && rsc != NULL) { - possible_matches = find_actions(rsc->actions, key, on_node); -+ } else if(save_action) { -+#if 0 -+ action = g_hash_table_lookup(data_set->singletons, key); -+#else -+ /* More expensive but takes 'node' into account */ -+ possible_matches = find_actions(data_set->actions, key, on_node); -+#endif -+ } -+ -+ if(data_set->singletons == NULL) { -+ data_set->singletons = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, NULL); - } - - if (possible_matches != NULL) { -@@ -424,6 +435,9 @@ custom_action(resource_t * rsc, char *key, const char *task, - - if (save_action) { - data_set->actions = g_list_prepend(data_set->actions, action); -+ if(rsc == NULL) { -+ g_hash_table_insert(data_set->singletons, action->uuid, action); -+ } - } - - if (rsc != NULL) { -@@ -1588,6 +1602,9 @@ order_actions(action_t * lh_action, action_t * rh_action, enum pe_ordering order - - crm_trace("Ordering Action %s before %s", lh_action->uuid, rh_action->uuid); - -+ /* Ensure we never create a dependancy on ourselves... its happened */ -+ CRM_ASSERT(lh_action != rh_action); -+ - /* Filter dups, otherwise update_action_states() has too much work to do */ - gIter = lh_action->actions_after; - for (; gIter != NULL; gIter = gIter->next) { -@@ -1624,20 +1641,12 @@ action_t * - get_pseudo_op(const char *name, pe_working_set_t * data_set) - { - action_t *op = NULL; -- const char *op_s = name; -- GListPtr possible_matches = NULL; - -- possible_matches = find_actions(data_set->actions, name, NULL); -- if (possible_matches != NULL) { -- if (g_list_length(possible_matches) > 1) { -- pe_warn("Action %s exists %d times", name, g_list_length(possible_matches)); -- } -- -- op = g_list_nth_data(possible_matches, 0); -- g_list_free(possible_matches); -- -- } else { -- op = custom_action(NULL, strdup(op_s), op_s, NULL, TRUE, TRUE, data_set); -+ if(data_set->singletons) { -+ op = g_hash_table_lookup(data_set->singletons, name); -+ } -+ if (op == NULL) { -+ op = custom_action(NULL, strdup(name), name, NULL, TRUE, TRUE, data_set); - set_bit(op->flags, pe_action_pseudo); - set_bit(op->flags, pe_action_runnable); - } -diff --git a/pengine/allocate.c b/pengine/allocate.c -index a07fdad..b9ce069 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1274,6 +1274,10 @@ pe_fence_op(node_t * node, const char *op, pe_working_set_t * data_set) - - key = g_strdup_printf("%s-%s-%s", CRM_OP_FENCE, node->details->uname, op); - -+ if(data_set->singletons) { -+ stonith_op = g_hash_table_lookup(data_set->singletons, key); -+ } -+ - if(stonith_op == NULL) { - stonith_op = custom_action(NULL, key, CRM_OP_FENCE, node, FALSE, TRUE, data_set); - diff --git a/SOURCES/bz1078078-pcmk-unfencing_is_based_on_device_probes_there_is_no_need_to_unfence_when_normal_resources_are_found_active.patch b/SOURCES/bz1078078-pcmk-unfencing_is_based_on_device_probes_there_is_no_need_to_unfence_when_normal_resources_are_found_active.patch deleted file mode 100644 index c3e1164..0000000 --- a/SOURCES/bz1078078-pcmk-unfencing_is_based_on_device_probes_there_is_no_need_to_unfence_when_normal_resources_are_found_active.patch +++ /dev/null @@ -1,32 +0,0 @@ -commit a5bc09d20ea41afe42bbda037d5e8ecb74f2bb15 -Author: Andrew Beekhof -Date: Fri Apr 11 07:39:59 2014 +1000 - - Fix: PE: Unfencing is based on device probes, there is no need to unfence when normal resources are found active - - (cherry picked from commit 7aad7cb9a5a1778dbc13ed56f976086e0393a7e3) - -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index eb10bd8..363e2bc 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2329,17 +2329,8 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - if (is_probe && target_rc == 7) { - task_status_i = PCMK_LRM_OP_DONE; - set_bit(rsc->flags, pe_rsc_unexpectedly_running); -- -- if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { -- /* _Require_ unfencing after probing resources that need unfencing and was found active */ -- crm_warn("Operation %s found resource %s active on %s: triggering unfencing", -- task, rsc->id, node->details->uname); -- trigger_unfencing(NULL, node, "Unexpected state", NULL, data_set); -- -- } else { -- pe_rsc_info(rsc, "Operation %s found resource %s active on %s", -- task, rsc->id, node->details->uname); -- } -+ pe_rsc_info(rsc, "Operation %s found resource %s active on %s", -+ task, rsc->id, node->details->uname); - - /* legacy code for pre-0.6.5 operations */ - } else if (target_rc < 0 && interval > 0 && rsc->role == RSC_ROLE_MASTER) { diff --git a/SOURCES/bz1078078-pcmk-warn_about_fencing_when_fencing_is_disabled.patch b/SOURCES/bz1078078-pcmk-warn_about_fencing_when_fencing_is_disabled.patch deleted file mode 100644 index 22440d2..0000000 --- a/SOURCES/bz1078078-pcmk-warn_about_fencing_when_fencing_is_disabled.patch +++ /dev/null @@ -1,19 +0,0 @@ -commit 583197a0748aaef3dca09fe45cdac30f75304947 -Author: Andrew Beekhof -Date: Thu Apr 10 19:55:26 2014 +1000 - - Correctly warn about fencing when fencing is disabled - -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index a3133e7..225b269 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -574,7 +574,7 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - - } else if (safe_str_eq(value, "fencing")) { - set_bit((*rsc)->flags, pe_rsc_needs_fencing); -- if (is_set(data_set->flags, pe_flag_stonith_enabled)) { -+ if (is_not_set(data_set->flags, pe_flag_stonith_enabled)) { - crm_config_warn("%s requires fencing but fencing is disabled", (*rsc)->id); - } - diff --git a/SOURCES/bz1078504-pcmk-pengine_fixes_invalid_transition_caused_by_clones_with_more_than_10_instances.patch b/SOURCES/bz1078504-pcmk-pengine_fixes_invalid_transition_caused_by_clones_with_more_than_10_instances.patch deleted file mode 100644 index 3a22f2d..0000000 --- a/SOURCES/bz1078504-pcmk-pengine_fixes_invalid_transition_caused_by_clones_with_more_than_10_instances.patch +++ /dev/null @@ -1,93 +0,0 @@ -commit ce507c2a598086b16bfbc1d937c656de4e73ffa6 -Author: David Vossel -Date: Wed Mar 19 21:43:43 2014 -0400 - - Fix: pengine: fixes invalid transition caused by clones with more than 10 instances - - (cherry picked from commit 9e0b496b269ce0e792370e9c2b22446dfaf3e64a) - -diff --git a/pengine/clone.c b/pengine/clone.c -index 9113e9d..52a84df 100644 ---- a/pengine/clone.c -+++ b/pengine/clone.c -@@ -28,6 +28,18 @@ - gint sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set); - static void append_parent_colocation(resource_t * rsc, resource_t * child, gboolean all); - -+static gint -+sort_rsc_id(gconstpointer a, gconstpointer b) -+{ -+ const resource_t *resource1 = (const resource_t *)a; -+ const resource_t *resource2 = (const resource_t *)b; -+ -+ CRM_ASSERT(resource1 != NULL); -+ CRM_ASSERT(resource2 != NULL); -+ -+ return strcmp(resource1->id, resource2->id); -+} -+ - static node_t * - parent_node_instance(const resource_t * rsc, node_t * node) - { -@@ -749,7 +761,7 @@ child_ordering_constraints(resource_t * rsc, pe_working_set_t * data_set) - action_t *start = NULL; - action_t *last_stop = NULL; - action_t *last_start = NULL; -- GListPtr gIter = rsc->children; -+ GListPtr gIter = NULL; - gboolean active_only = TRUE; /* change to false to get the old behavior */ - clone_variant_data_t *clone_data = NULL; - -@@ -758,8 +770,10 @@ child_ordering_constraints(resource_t * rsc, pe_working_set_t * data_set) - if (clone_data->ordered == FALSE) { - return; - } -+ /* we have to maintain a consistent sorted child list when building order constraints */ -+ rsc->children = g_list_sort(rsc->children, sort_rsc_id); - -- for (; gIter != NULL; gIter = gIter->next) { -+ for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { - resource_t *child = (resource_t *) gIter->data; - - key = stop_key(child); -@@ -857,7 +871,7 @@ void - clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) - { - resource_t *last_rsc = NULL; -- GListPtr gIter = rsc->children; -+ GListPtr gIter; - clone_variant_data_t *clone_data = NULL; - - get_clone_variant_data(clone_data, rsc); -@@ -872,7 +886,11 @@ clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) - new_rsc_order(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_runnable_left, data_set); - } - -- for (; gIter != NULL; gIter = gIter->next) { -+ if (clone_data->ordered) { -+ /* we have to maintain a consistent sorted child list when building order constraints */ -+ rsc->children = g_list_sort(rsc->children, sort_rsc_id); -+ } -+ for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { - resource_t *child_rsc = (resource_t *) gIter->data; - - child_rsc->cmds->internal_constraints(child_rsc, data_set); -@@ -1400,18 +1418,6 @@ clone_expand(resource_t * rsc, pe_working_set_t * data_set) - clone_data->promote_notify = NULL; - } - --static gint --sort_rsc_id(gconstpointer a, gconstpointer b) --{ -- const resource_t *resource1 = (const resource_t *)a; -- const resource_t *resource2 = (const resource_t *)b; -- -- CRM_ASSERT(resource1 != NULL); -- CRM_ASSERT(resource2 != NULL); -- -- return strcmp(resource1->id, resource2->id); --} -- - node_t * - rsc_known_on(resource_t * rsc, GListPtr * list) - { diff --git a/SOURCES/bz1115024-pcmk-handle_systemd_reporting_done_before_a_resource_is_actually_stopped.patch b/SOURCES/bz1115024-pcmk-handle_systemd_reporting_done_before_a_resource_is_actually_stopped.patch deleted file mode 100644 index cfeaf2b..0000000 --- a/SOURCES/bz1115024-pcmk-handle_systemd_reporting_done_before_a_resource_is_actually_stopped.patch +++ /dev/null @@ -1,156 +0,0 @@ -commit 0ea59c13caf51db459bfc6448ce8b7661778405d -Author: Andrew Beekhof -Date: Fri Jun 27 13:26:57 2014 +1000 - - Fix: lrmd: Handle systemd reporting 'done' before a resource is actually stopped - - (cherry picked from commit 3bd6c30adbb46891ee962cd2c1f2e191da88b808) - -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index a28ae14..f9d6d29 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -422,6 +422,8 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - - if (g_strcmp0(state, "active") == 0) { - op->rc = PCMK_OCF_OK; -+ } else if (g_strcmp0(state, "activating") == 0) { -+ op->rc = PCMK_OCF_PENDING; - } else { - op->rc = PCMK_OCF_NOT_RUNNING; - } -diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c -index 517e98f..5443fa4 100644 ---- a/lrmd/lrmd.c -+++ b/lrmd/lrmd.c -@@ -58,6 +58,7 @@ typedef struct lrmd_cmd_s { - char *origin; - char *rsc_id; - char *action; -+ char *real_action; - char *output; - char *userdata_str; - -@@ -359,7 +360,11 @@ send_cmd_complete_notify(lrmd_cmd_t * cmd) - - crm_xml_add(notify, F_LRMD_OPERATION, LRMD_OP_RSC_EXEC); - crm_xml_add(notify, F_LRMD_RSC_ID, cmd->rsc_id); -- crm_xml_add(notify, F_LRMD_RSC_ACTION, cmd->action); -+ if(cmd->real_action) { -+ crm_xml_add(notify, F_LRMD_RSC_ACTION, cmd->real_action); -+ } else { -+ crm_xml_add(notify, F_LRMD_RSC_ACTION, cmd->action); -+ } - crm_xml_add(notify, F_LRMD_RSC_USERDATA_STR, cmd->userdata_str); - crm_xml_add(notify, F_LRMD_RSC_OUTPUT, cmd->output); - -@@ -584,6 +589,8 @@ action_complete(svc_action_t * action) - lrmd_rsc_t *rsc; - lrmd_cmd_t *cmd = action->cb_data; - -+ bool goagain = false; -+ - if (!cmd) { - crm_err("LRMD action (%s) completed does not match any known operations.", action->id); - return; -@@ -604,6 +611,30 @@ action_complete(svc_action_t * action) - } else if (action->stdout_data) { - cmd->output = strdup(action->stdout_data); - } -+ -+ if (rsc && safe_str_eq(rsc->class, "systemd")) { -+ if(safe_str_eq(cmd->action, "start")) { -+ /* systemd I curse thee! -+ * -+ * systemd returns from start actions after the start _begins_ -+ * not after it completes. -+ * -+ * So we have to jump through a few hoops so that we don't -+ * report 'complete' to the rest of pacemaker until, you know, -+ * its actually done. -+ */ -+ goagain = true; -+ cmd->real_action = cmd->action; -+ cmd->action = strdup("monitor"); -+ -+ } else if(cmd->real_action) { -+ /* Ok, so this is the follow up monitor action to check if start actually completed */ -+ if(cmd->lrmd_op_status == PCMK_LRM_OP_DONE && cmd->exec_rc == PCMK_OCF_PENDING) { -+ goagain = true; -+ } -+ } -+ } -+ - #if SUPPORT_NAGIOS - if (rsc && safe_str_eq(rsc->class, "nagios")) { - if (safe_str_eq(cmd->action, "monitor") && -@@ -612,41 +643,46 @@ action_complete(svc_action_t * action) - cmd->exec_rc = PCMK_OCF_NOT_RUNNING; - - } else if (safe_str_eq(cmd->action, "start") && cmd->exec_rc != PCMK_OCF_OK) { -- int time_sum = 0; -- int timeout_left = 0; -- int delay = cmd->timeout_orig / 10; -+ goagain = true; -+ } -+ } -+#endif -+ -+ if(goagain) { -+ int time_sum = 0; -+ int timeout_left = 0; -+ int delay = cmd->timeout_orig / 10; - - # ifdef HAVE_SYS_TIMEB_H -- struct timeb now = { 0, }; -+ struct timeb now = { 0, }; - -- ftime(&now); -- time_sum = time_diff_ms(&now, &cmd->t_first_run); -- timeout_left = cmd->timeout_orig - time_sum; -- if (delay < timeout_left) { -- cmd->start_delay = delay; -- cmd->timeout = timeout_left; -+ ftime(&now); -+ time_sum = time_diff_ms(&now, &cmd->t_first_run); -+ timeout_left = cmd->timeout_orig - time_sum; -+ if (delay < timeout_left) { -+ cmd->start_delay = delay; -+ cmd->timeout = timeout_left; - -+ if(cmd->exec_rc != PCMK_OCF_OK) { - crm_notice - ("%s %s failed (rc=%d): re-scheduling (time_sum=%dms, start_delay=%dms, timeout=%dms)", - cmd->rsc_id, cmd->action, cmd->exec_rc, time_sum, cmd->start_delay, - cmd->timeout); -+ } - -- cmd->lrmd_op_status = 0; -- cmd->last_pid = 0; -- memset(&cmd->t_run, 0, sizeof(cmd->t_run)); -- memset(&cmd->t_queue, 0, sizeof(cmd->t_queue)); -- free(cmd->output); -- cmd->output = NULL; -+ cmd->lrmd_op_status = 0; -+ cmd->last_pid = 0; -+ memset(&cmd->t_run, 0, sizeof(cmd->t_run)); -+ memset(&cmd->t_queue, 0, sizeof(cmd->t_queue)); -+ free(cmd->output); -+ cmd->output = NULL; - -- rsc->active = NULL; -- schedule_lrmd_cmd(rsc, cmd); -- return; -- } --# endif -+ rsc->active = NULL; -+ schedule_lrmd_cmd(rsc, cmd); -+ return; - } -+# endif - } --#endif -- - cmd_finalize(cmd, rsc); - } - diff --git a/SOURCES/bz1117341-remote-imply-stop-on-fence.patch b/SOURCES/bz1117341-remote-imply-stop-on-fence.patch new file mode 100644 index 0000000..9b3676a --- /dev/null +++ b/SOURCES/bz1117341-remote-imply-stop-on-fence.patch @@ -0,0 +1,1399 @@ +diff --git a/pengine/native.c b/pengine/native.c +index 62639d0..3f1807e 100644 +--- a/pengine/native.c ++++ b/pengine/native.c +@@ -2913,6 +2913,39 @@ native_start_constraints(resource_t * rsc, action_t * stonith_op, gboolean is_st + } + } + ++static GListPtr ++find_fence_target_node_actions(GListPtr search_list, const char *key, node_t *fence_target, pe_working_set_t *data_set) ++{ ++ GListPtr gIter = NULL; ++ GListPtr result_list = find_actions(search_list, key, fence_target); ++ ++ /* find stop actions for this rsc on any container nodes running on ++ * the fencing target node */ ++ for (gIter = fence_target->details->running_rsc; gIter != NULL; gIter = gIter->next) { ++ GListPtr iter = NULL; ++ GListPtr tmp_list = NULL; ++ resource_t *tmp_rsc = (resource_t *) gIter->data; ++ node_t *container_node = NULL; ++ ++ /* found a container node that lives on the host node ++ * that is getting fenced. Find stop for our rsc that live on ++ * the container node as well. These stop operations are also ++ * implied by fencing of the host cluster node. */ ++ if (tmp_rsc->is_remote_node && tmp_rsc->container != NULL) { ++ container_node = pe_find_node(data_set->nodes, tmp_rsc->id); ++ } ++ if (container_node) { ++ tmp_list = find_actions(search_list, key, container_node); ++ } ++ for (iter = tmp_list; iter != NULL; iter = iter->next) { ++ result_list = g_list_prepend(result_list, (action_t *) iter->data); ++ } ++ g_list_free(tmp_list); ++ } ++ ++ return result_list; ++} ++ + static void + native_stop_constraints(resource_t * rsc, action_t * stonith_op, gboolean is_stonith, + pe_working_set_t * data_set) +@@ -2923,7 +2956,7 @@ native_stop_constraints(resource_t * rsc, action_t * stonith_op, gboolean is_sto + resource_t *top = uber_parent(rsc); + + key = stop_key(rsc); +- action_list = find_actions(rsc->actions, key, stonith_op->node); ++ action_list = find_fence_target_node_actions(rsc->actions, key, stonith_op->node, data_set); + free(key); + + /* add the stonith OP as a stop pre-req and the mark the stop +@@ -3032,7 +3065,7 @@ native_stop_constraints(resource_t * rsc, action_t * stonith_op, gboolean is_sto + g_list_free(action_list); + + key = demote_key(rsc); +- action_list = find_actions(rsc->actions, key, stonith_op->node); ++ action_list = find_fence_target_node_actions(rsc->actions, key, stonith_op->node, data_set); + free(key); + + for (gIter = action_list; gIter != NULL; gIter = gIter->next) { +diff --git a/pengine/regression.sh b/pengine/regression.sh +index c2bc7fb..9172acb 100755 +--- a/pengine/regression.sh ++++ b/pengine/regression.sh +@@ -768,6 +768,7 @@ do_test whitebox-orphaned "Properly shutdown orphaned whitebox container" + do_test whitebox-orphan-ms "Properly tear down orphan ms resources on remote-nodes" + do_test whitebox-unexpectedly-running "Recover container nodes the cluster did not start." + do_test whitebox-migrate1 "Migrate both container and connection resource" ++do_test whitebox-imply-stop-on-fence "imply stop action on container node rsc when host node is fenced" + + echo "" + do_test remote-startup-probes "Baremetal remote-node startup probes" +diff --git a/pengine/test10/whitebox-imply-stop-on-fence.dot b/pengine/test10/whitebox-imply-stop-on-fence.dot +new file mode 100644 +index 0000000..66700b8 +--- /dev/null ++++ b/pengine/test10/whitebox-imply-stop-on-fence.dot +@@ -0,0 +1,93 @@ ++ digraph "g" { ++"R-lxc-01_kiff-01_monitor_10000 kiff-02" [ style=bold color="green" fontcolor="black"] ++"R-lxc-01_kiff-01_start_0 kiff-02" -> "R-lxc-01_kiff-01_monitor_10000 kiff-02" [ style = bold] ++"R-lxc-01_kiff-01_start_0 kiff-02" -> "lxc-01_kiff-01_start_0 kiff-02" [ style = bold] ++"R-lxc-01_kiff-01_start_0 kiff-02" [ style=bold color="green" fontcolor="black"] ++"R-lxc-01_kiff-01_stop_0 kiff-01" -> "R-lxc-01_kiff-01_start_0 kiff-02" [ style = bold] ++"R-lxc-01_kiff-01_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"R-lxc-01_kiff-01_stop_0 kiff-01" -> "shared0-clone_stop_0" [ style = bold] ++"R-lxc-01_kiff-01_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"R-lxc-02_kiff-01_monitor_10000 kiff-02" [ style=bold color="green" fontcolor="black"] ++"R-lxc-02_kiff-01_start_0 kiff-02" -> "R-lxc-02_kiff-01_monitor_10000 kiff-02" [ style = bold] ++"R-lxc-02_kiff-01_start_0 kiff-02" -> "lxc-02_kiff-01_start_0 kiff-02" [ style = bold] ++"R-lxc-02_kiff-01_start_0 kiff-02" [ style=bold color="green" fontcolor="black"] ++"R-lxc-02_kiff-01_stop_0 kiff-01" -> "R-lxc-02_kiff-01_start_0 kiff-02" [ style = bold] ++"R-lxc-02_kiff-01_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"R-lxc-02_kiff-01_stop_0 kiff-01" -> "shared0-clone_stop_0" [ style = bold] ++"R-lxc-02_kiff-01_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"clvmd-clone_stop_0" -> "clvmd-clone_stopped_0" [ style = bold] ++"clvmd-clone_stop_0" -> "clvmd_stop_0 kiff-01" [ style = bold] ++"clvmd-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"clvmd-clone_stopped_0" -> "dlm-clone_stop_0" [ style = bold] ++"clvmd-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"clvmd_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"clvmd_stop_0 kiff-01" -> "clvmd-clone_stopped_0" [ style = bold] ++"clvmd_stop_0 kiff-01" -> "dlm_stop_0 kiff-01" [ style = bold] ++"clvmd_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"dlm-clone_stop_0" -> "dlm-clone_stopped_0" [ style = bold] ++"dlm-clone_stop_0" -> "dlm_stop_0 kiff-01" [ style = bold] ++"dlm-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"dlm-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"dlm_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"dlm_stop_0 kiff-01" -> "dlm-clone_stopped_0" [ style = bold] ++"dlm_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"fence-kiff-02_monitor_60000 kiff-02" [ style=bold color="green" fontcolor="black"] ++"fence-kiff-02_start_0 kiff-02" -> "fence-kiff-02_monitor_60000 kiff-02" [ style = bold] ++"fence-kiff-02_start_0 kiff-02" [ style=bold color="green" fontcolor="black"] ++"fence-kiff-02_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"fence-kiff-02_stop_0 kiff-01" -> "fence-kiff-02_start_0 kiff-02" [ style = bold] ++"fence-kiff-02_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"lxc-01_kiff-01_monitor_30000 kiff-02" [ style=bold color="green" fontcolor="black"] ++"lxc-01_kiff-01_start_0 kiff-02" -> "lxc-01_kiff-01_monitor_30000 kiff-02" [ style = bold] ++"lxc-01_kiff-01_start_0 kiff-02" -> "vm-fs_monitor_20000 lxc-01_kiff-01" [ style = bold] ++"lxc-01_kiff-01_start_0 kiff-02" -> "vm-fs_start_0 lxc-01_kiff-01" [ style = bold] ++"lxc-01_kiff-01_start_0 kiff-02" [ style=bold color="green" fontcolor="black"] ++"lxc-01_kiff-01_stop_0 kiff-01" -> "R-lxc-01_kiff-01_stop_0 kiff-01" [ style = bold] ++"lxc-01_kiff-01_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"lxc-01_kiff-01_stop_0 kiff-01" -> "lxc-01_kiff-01_start_0 kiff-02" [ style = bold] ++"lxc-01_kiff-01_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"lxc-02_kiff-01_monitor_30000 kiff-02" [ style=bold color="green" fontcolor="black"] ++"lxc-02_kiff-01_start_0 kiff-02" -> "lxc-02_kiff-01_monitor_30000 kiff-02" [ style = bold] ++"lxc-02_kiff-01_start_0 kiff-02" [ style=bold color="green" fontcolor="black"] ++"lxc-02_kiff-01_stop_0 kiff-01" -> "R-lxc-02_kiff-01_stop_0 kiff-01" [ style = bold] ++"lxc-02_kiff-01_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"lxc-02_kiff-01_stop_0 kiff-01" -> "lxc-02_kiff-01_start_0 kiff-02" [ style = bold] ++"lxc-02_kiff-01_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"shared0-clone_stop_0" -> "shared0-clone_stopped_0" [ style = bold] ++"shared0-clone_stop_0" -> "shared0_stop_0 kiff-01" [ style = bold] ++"shared0-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"shared0-clone_stopped_0" -> "clvmd-clone_stop_0" [ style = bold] ++"shared0-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"shared0_stop_0 kiff-01" -> "all_stopped" [ style = bold] ++"shared0_stop_0 kiff-01" -> "clvmd_stop_0 kiff-01" [ style = bold] ++"shared0_stop_0 kiff-01" -> "shared0-clone_stopped_0" [ style = bold] ++"shared0_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] ++"stonith 'reboot' kiff-01" -> "R-lxc-01_kiff-01_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "R-lxc-02_kiff-01_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "clvmd-clone_stop_0" [ style = bold] ++"stonith 'reboot' kiff-01" -> "clvmd_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "dlm-clone_stop_0" [ style = bold] ++"stonith 'reboot' kiff-01" -> "dlm_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "fence-kiff-02_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "lxc-01_kiff-01_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "lxc-02_kiff-01_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "shared0-clone_stop_0" [ style = bold] ++"stonith 'reboot' kiff-01" -> "shared0_stop_0 kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" -> "stonith_complete" [ style = bold] ++"stonith 'reboot' kiff-01" -> "vm-fs_stop_0 lxc-01_kiff-01" [ style = bold] ++"stonith 'reboot' kiff-01" [ style=bold color="green" fontcolor="black"] ++"stonith_complete" -> "R-lxc-01_kiff-01_start_0 kiff-02" [ style = bold] ++"stonith_complete" -> "R-lxc-02_kiff-01_start_0 kiff-02" [ style = bold] ++"stonith_complete" -> "all_stopped" [ style = bold] ++"stonith_complete" -> "lxc-01_kiff-01_start_0 kiff-02" [ style = bold] ++"stonith_complete" -> "lxc-02_kiff-01_start_0 kiff-02" [ style = bold] ++"stonith_complete" -> "vm-fs_start_0 lxc-01_kiff-01" [ style = bold] ++"stonith_complete" [ style=bold color="green" fontcolor="orange"] ++"vm-fs_monitor_20000 lxc-01_kiff-01" [ style=bold color="green" fontcolor="black"] ++"vm-fs_start_0 lxc-01_kiff-01" -> "vm-fs_monitor_20000 lxc-01_kiff-01" [ style = bold] ++"vm-fs_start_0 lxc-01_kiff-01" [ style=bold color="green" fontcolor="black"] ++"vm-fs_stop_0 lxc-01_kiff-01" -> "all_stopped" [ style = bold] ++"vm-fs_stop_0 lxc-01_kiff-01" -> "vm-fs_start_0 lxc-01_kiff-01" [ style = bold] ++"vm-fs_stop_0 lxc-01_kiff-01" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/whitebox-imply-stop-on-fence.exp b/pengine/test10/whitebox-imply-stop-on-fence.exp +new file mode 100644 +index 0000000..d13c25f +--- /dev/null ++++ b/pengine/test10/whitebox-imply-stop-on-fence.exp +@@ -0,0 +1,466 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/whitebox-imply-stop-on-fence.scores b/pengine/test10/whitebox-imply-stop-on-fence.scores +new file mode 100644 +index 0000000..e50f077 +--- /dev/null ++++ b/pengine/test10/whitebox-imply-stop-on-fence.scores +@@ -0,0 +1,301 @@ ++Allocation scores: ++clone_color: clvmd-clone allocation score on kiff-01: 0 ++clone_color: clvmd-clone allocation score on kiff-02: 0 ++clone_color: clvmd-clone allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd-clone allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd-clone allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd-clone allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:0 allocation score on kiff-01: 1 ++clone_color: clvmd:0 allocation score on kiff-02: 0 ++clone_color: clvmd:0 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:0 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:0 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:0 allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:1 allocation score on kiff-01: 0 ++clone_color: clvmd:1 allocation score on kiff-02: 1 ++clone_color: clvmd:1 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:1 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:1 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:1 allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:2 allocation score on kiff-01: 0 ++clone_color: clvmd:2 allocation score on kiff-02: 0 ++clone_color: clvmd:2 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:2 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:2 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:2 allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:3 allocation score on kiff-01: 0 ++clone_color: clvmd:3 allocation score on kiff-02: 0 ++clone_color: clvmd:3 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:3 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:3 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:3 allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:4 allocation score on kiff-01: 0 ++clone_color: clvmd:4 allocation score on kiff-02: 0 ++clone_color: clvmd:4 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:4 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:4 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:4 allocation score on lxc-02_kiff-02: 0 ++clone_color: clvmd:5 allocation score on kiff-01: 0 ++clone_color: clvmd:5 allocation score on kiff-02: 0 ++clone_color: clvmd:5 allocation score on lxc-01_kiff-01: 0 ++clone_color: clvmd:5 allocation score on lxc-01_kiff-02: 0 ++clone_color: clvmd:5 allocation score on lxc-02_kiff-01: 0 ++clone_color: clvmd:5 allocation score on lxc-02_kiff-02: 0 ++clone_color: dlm-clone allocation score on kiff-01: 0 ++clone_color: dlm-clone allocation score on kiff-02: 0 ++clone_color: dlm-clone allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm-clone allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm-clone allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm-clone allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:0 allocation score on kiff-01: 1 ++clone_color: dlm:0 allocation score on kiff-02: 0 ++clone_color: dlm:0 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:0 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:0 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:0 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:1 allocation score on kiff-01: 0 ++clone_color: dlm:1 allocation score on kiff-02: 1 ++clone_color: dlm:1 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:1 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:1 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:1 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:2 allocation score on kiff-01: 0 ++clone_color: dlm:2 allocation score on kiff-02: 0 ++clone_color: dlm:2 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:2 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:2 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:2 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:3 allocation score on kiff-01: 0 ++clone_color: dlm:3 allocation score on kiff-02: 0 ++clone_color: dlm:3 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:3 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:3 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:3 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:4 allocation score on kiff-01: 0 ++clone_color: dlm:4 allocation score on kiff-02: 0 ++clone_color: dlm:4 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:4 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:4 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:4 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: dlm:5 allocation score on kiff-01: 0 ++clone_color: dlm:5 allocation score on kiff-02: 0 ++clone_color: dlm:5 allocation score on lxc-01_kiff-01: -INFINITY ++clone_color: dlm:5 allocation score on lxc-01_kiff-02: -INFINITY ++clone_color: dlm:5 allocation score on lxc-02_kiff-01: -INFINITY ++clone_color: dlm:5 allocation score on lxc-02_kiff-02: -INFINITY ++clone_color: shared0-clone allocation score on kiff-01: 0 ++clone_color: shared0-clone allocation score on kiff-02: 0 ++clone_color: shared0-clone allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0-clone allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0-clone allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0-clone allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:0 allocation score on kiff-01: 1 ++clone_color: shared0:0 allocation score on kiff-02: 0 ++clone_color: shared0:0 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:0 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:0 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:0 allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:1 allocation score on kiff-01: 0 ++clone_color: shared0:1 allocation score on kiff-02: 1 ++clone_color: shared0:1 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:1 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:1 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:1 allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:2 allocation score on kiff-01: 0 ++clone_color: shared0:2 allocation score on kiff-02: 0 ++clone_color: shared0:2 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:2 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:2 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:2 allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:3 allocation score on kiff-01: 0 ++clone_color: shared0:3 allocation score on kiff-02: 0 ++clone_color: shared0:3 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:3 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:3 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:3 allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:4 allocation score on kiff-01: 0 ++clone_color: shared0:4 allocation score on kiff-02: 0 ++clone_color: shared0:4 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:4 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:4 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:4 allocation score on lxc-02_kiff-02: 0 ++clone_color: shared0:5 allocation score on kiff-01: 0 ++clone_color: shared0:5 allocation score on kiff-02: 0 ++clone_color: shared0:5 allocation score on lxc-01_kiff-01: 0 ++clone_color: shared0:5 allocation score on lxc-01_kiff-02: 0 ++clone_color: shared0:5 allocation score on lxc-02_kiff-01: 0 ++clone_color: shared0:5 allocation score on lxc-02_kiff-02: 0 ++native_color: R-lxc-01_kiff-01 allocation score on kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-01 allocation score on kiff-02: 0 ++native_color: R-lxc-01_kiff-01 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-01 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: R-lxc-01_kiff-01 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-01 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: R-lxc-01_kiff-02 allocation score on kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-02 allocation score on kiff-02: 100 ++native_color: R-lxc-01_kiff-02 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-02 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: R-lxc-01_kiff-02 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: R-lxc-01_kiff-02 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: R-lxc-02_kiff-01 allocation score on kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-01 allocation score on kiff-02: 0 ++native_color: R-lxc-02_kiff-01 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-01 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: R-lxc-02_kiff-01 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-01 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: R-lxc-02_kiff-02 allocation score on kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-02 allocation score on kiff-02: 100 ++native_color: R-lxc-02_kiff-02 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-02 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: R-lxc-02_kiff-02 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: R-lxc-02_kiff-02 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:0 allocation score on kiff-01: -INFINITY ++native_color: clvmd:0 allocation score on kiff-02: -INFINITY ++native_color: clvmd:0 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:0 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:0 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:0 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:1 allocation score on kiff-01: -INFINITY ++native_color: clvmd:1 allocation score on kiff-02: 1 ++native_color: clvmd:1 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:1 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:1 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:1 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:2 allocation score on kiff-01: -INFINITY ++native_color: clvmd:2 allocation score on kiff-02: -INFINITY ++native_color: clvmd:2 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:2 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:2 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:2 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:3 allocation score on kiff-01: -INFINITY ++native_color: clvmd:3 allocation score on kiff-02: -INFINITY ++native_color: clvmd:3 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:3 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:3 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:3 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:4 allocation score on kiff-01: -INFINITY ++native_color: clvmd:4 allocation score on kiff-02: -INFINITY ++native_color: clvmd:4 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:4 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:4 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:4 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: clvmd:5 allocation score on kiff-01: -INFINITY ++native_color: clvmd:5 allocation score on kiff-02: -INFINITY ++native_color: clvmd:5 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: clvmd:5 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: clvmd:5 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: clvmd:5 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:0 allocation score on kiff-01: -INFINITY ++native_color: dlm:0 allocation score on kiff-02: -INFINITY ++native_color: dlm:0 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:0 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:0 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:0 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:1 allocation score on kiff-01: -INFINITY ++native_color: dlm:1 allocation score on kiff-02: 1 ++native_color: dlm:1 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:1 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:1 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:1 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:2 allocation score on kiff-01: -INFINITY ++native_color: dlm:2 allocation score on kiff-02: -INFINITY ++native_color: dlm:2 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:2 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:2 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:2 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:3 allocation score on kiff-01: -INFINITY ++native_color: dlm:3 allocation score on kiff-02: -INFINITY ++native_color: dlm:3 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:3 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:3 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:3 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:4 allocation score on kiff-01: -INFINITY ++native_color: dlm:4 allocation score on kiff-02: -INFINITY ++native_color: dlm:4 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:4 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:4 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:4 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: dlm:5 allocation score on kiff-01: -INFINITY ++native_color: dlm:5 allocation score on kiff-02: -INFINITY ++native_color: dlm:5 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: dlm:5 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: dlm:5 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: dlm:5 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: fence-kiff-01 allocation score on kiff-01: 0 ++native_color: fence-kiff-01 allocation score on kiff-02: 0 ++native_color: fence-kiff-01 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: fence-kiff-01 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: fence-kiff-01 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: fence-kiff-01 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: fence-kiff-02 allocation score on kiff-01: 0 ++native_color: fence-kiff-02 allocation score on kiff-02: 0 ++native_color: fence-kiff-02 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: fence-kiff-02 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: fence-kiff-02 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: fence-kiff-02 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: lxc-01_kiff-01 allocation score on kiff-01: -INFINITY ++native_color: lxc-01_kiff-01 allocation score on kiff-02: 0 ++native_color: lxc-01_kiff-01 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: lxc-01_kiff-01 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: lxc-01_kiff-01 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: lxc-01_kiff-01 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: lxc-01_kiff-02 allocation score on kiff-01: -INFINITY ++native_color: lxc-01_kiff-02 allocation score on kiff-02: 0 ++native_color: lxc-01_kiff-02 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: lxc-01_kiff-02 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: lxc-01_kiff-02 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: lxc-01_kiff-02 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: lxc-02_kiff-01 allocation score on kiff-01: -INFINITY ++native_color: lxc-02_kiff-01 allocation score on kiff-02: 0 ++native_color: lxc-02_kiff-01 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: lxc-02_kiff-01 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: lxc-02_kiff-01 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: lxc-02_kiff-01 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: lxc-02_kiff-02 allocation score on kiff-01: -INFINITY ++native_color: lxc-02_kiff-02 allocation score on kiff-02: 0 ++native_color: lxc-02_kiff-02 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: lxc-02_kiff-02 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: lxc-02_kiff-02 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: lxc-02_kiff-02 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:0 allocation score on kiff-01: -INFINITY ++native_color: shared0:0 allocation score on kiff-02: -INFINITY ++native_color: shared0:0 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:0 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:0 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:0 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:1 allocation score on kiff-01: -INFINITY ++native_color: shared0:1 allocation score on kiff-02: 1 ++native_color: shared0:1 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:1 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:1 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:1 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:2 allocation score on kiff-01: -INFINITY ++native_color: shared0:2 allocation score on kiff-02: -INFINITY ++native_color: shared0:2 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:2 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:2 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:2 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:3 allocation score on kiff-01: -INFINITY ++native_color: shared0:3 allocation score on kiff-02: -INFINITY ++native_color: shared0:3 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:3 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:3 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:3 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:4 allocation score on kiff-01: -INFINITY ++native_color: shared0:4 allocation score on kiff-02: -INFINITY ++native_color: shared0:4 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:4 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:4 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:4 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: shared0:5 allocation score on kiff-01: -INFINITY ++native_color: shared0:5 allocation score on kiff-02: -INFINITY ++native_color: shared0:5 allocation score on lxc-01_kiff-01: -INFINITY ++native_color: shared0:5 allocation score on lxc-01_kiff-02: -INFINITY ++native_color: shared0:5 allocation score on lxc-02_kiff-01: -INFINITY ++native_color: shared0:5 allocation score on lxc-02_kiff-02: -INFINITY ++native_color: vm-fs allocation score on kiff-01: 0 ++native_color: vm-fs allocation score on kiff-02: 0 ++native_color: vm-fs allocation score on lxc-01_kiff-01: 0 ++native_color: vm-fs allocation score on lxc-01_kiff-02: 0 ++native_color: vm-fs allocation score on lxc-02_kiff-01: 0 ++native_color: vm-fs allocation score on lxc-02_kiff-02: 0 +diff --git a/pengine/test10/whitebox-imply-stop-on-fence.summary b/pengine/test10/whitebox-imply-stop-on-fence.summary +new file mode 100644 +index 0000000..79e77de +--- /dev/null ++++ b/pengine/test10/whitebox-imply-stop-on-fence.summary +@@ -0,0 +1,88 @@ ++ ++Current cluster status: ++Node kiff-01 (1): UNCLEAN (offline) ++Online: [ kiff-02 ] ++Containers: [ lxc-01_kiff-01:R-lxc-01_kiff-01 lxc-01_kiff-02:R-lxc-01_kiff-02 lxc-02_kiff-01:R-lxc-02_kiff-01 lxc-02_kiff-02:R-lxc-02_kiff-02 ] ++ ++ fence-kiff-01 (stonith:fence_ipmilan): Started kiff-02 ++ fence-kiff-02 (stonith:fence_ipmilan): Started kiff-01 ++ Clone Set: dlm-clone [dlm] ++ Started: [ kiff-01 kiff-02 ] ++ Stopped: [ lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ Clone Set: clvmd-clone [clvmd] ++ Started: [ kiff-01 kiff-02 ] ++ Stopped: [ lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ Clone Set: shared0-clone [shared0] ++ Started: [ kiff-01 kiff-02 ] ++ Stopped: [ lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ R-lxc-01_kiff-01 (ocf::heartbeat:VirtualDomain): Started kiff-01 ++ R-lxc-02_kiff-01 (ocf::heartbeat:VirtualDomain): Started kiff-01 ++ R-lxc-01_kiff-02 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ R-lxc-02_kiff-02 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ vm-fs (ocf::heartbeat:Filesystem): Started lxc-01_kiff-01 ++ ++Transition Summary: ++ * Move fence-kiff-02 (Started kiff-01 -> kiff-02) ++ * Stop dlm:0 (kiff-01) ++ * Stop clvmd:0 (kiff-01) ++ * Stop shared0:0 (kiff-01) ++ * Move R-lxc-01_kiff-01 (Started kiff-01 -> kiff-02) ++ * Move R-lxc-02_kiff-01 (Started kiff-01 -> kiff-02) ++ * Restart vm-fs (Started lxc-01_kiff-01) ++ * Move lxc-01_kiff-01 (Started kiff-01 -> kiff-02) ++ * Move lxc-02_kiff-01 (Started kiff-01 -> kiff-02) ++ ++Executing cluster transition: ++ * Fencing kiff-01 (reboot) ++ * Pseudo action: stonith_complete ++ * Pseudo action: fence-kiff-02_stop_0 ++ * Pseudo action: vm-fs_stop_0 ++ * Pseudo action: lxc-01_kiff-01_stop_0 ++ * Pseudo action: lxc-02_kiff-01_stop_0 ++ * Resource action: fence-kiff-02 start on kiff-02 ++ * Pseudo action: R-lxc-01_kiff-01_stop_0 ++ * Pseudo action: R-lxc-02_kiff-01_stop_0 ++ * Resource action: fence-kiff-02 monitor=60000 on kiff-02 ++ * Pseudo action: shared0-clone_stop_0 ++ * Resource action: R-lxc-01_kiff-01 start on kiff-02 ++ * Resource action: R-lxc-02_kiff-01 start on kiff-02 ++ * Resource action: lxc-01_kiff-01 start on kiff-02 ++ * Resource action: lxc-02_kiff-01 start on kiff-02 ++ * Pseudo action: shared0_stop_0 ++ * Pseudo action: shared0-clone_stopped_0 ++ * Resource action: R-lxc-01_kiff-01 monitor=10000 on kiff-02 ++ * Resource action: R-lxc-02_kiff-01 monitor=10000 on kiff-02 ++ * Resource action: vm-fs start on lxc-01_kiff-01 ++ * Resource action: vm-fs monitor=20000 on lxc-01_kiff-01 ++ * Resource action: lxc-01_kiff-01 monitor=30000 on kiff-02 ++ * Resource action: lxc-02_kiff-01 monitor=30000 on kiff-02 ++ * Pseudo action: clvmd-clone_stop_0 ++ * Pseudo action: clvmd_stop_0 ++ * Pseudo action: clvmd-clone_stopped_0 ++ * Pseudo action: dlm-clone_stop_0 ++ * Pseudo action: dlm_stop_0 ++ * Pseudo action: dlm-clone_stopped_0 ++ * Pseudo action: all_stopped ++ ++Revised cluster status: ++Online: [ kiff-02 ] ++OFFLINE: [ kiff-01 ] ++Containers: [ lxc-01_kiff-01:R-lxc-01_kiff-01 lxc-01_kiff-02:R-lxc-01_kiff-02 lxc-02_kiff-01:R-lxc-02_kiff-01 lxc-02_kiff-02:R-lxc-02_kiff-02 ] ++ ++ fence-kiff-01 (stonith:fence_ipmilan): Started kiff-02 ++ fence-kiff-02 (stonith:fence_ipmilan): Started kiff-02 ++ Clone Set: dlm-clone [dlm] ++ Started: [ kiff-02 ] ++ Stopped: [ kiff-01 lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ Clone Set: clvmd-clone [clvmd] ++ Started: [ kiff-02 ] ++ Stopped: [ kiff-01 lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ Clone Set: shared0-clone [shared0] ++ Started: [ kiff-02 ] ++ Stopped: [ kiff-01 lxc-01_kiff-01 lxc-01_kiff-02 lxc-02_kiff-01 lxc-02_kiff-02 ] ++ R-lxc-01_kiff-01 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ R-lxc-02_kiff-01 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ R-lxc-01_kiff-02 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ R-lxc-02_kiff-02 (ocf::heartbeat:VirtualDomain): Started kiff-02 ++ vm-fs (ocf::heartbeat:Filesystem): Started lxc-01_kiff-01 ++ +diff --git a/pengine/test10/whitebox-imply-stop-on-fence.xml b/pengine/test10/whitebox-imply-stop-on-fence.xml +new file mode 100644 +index 0000000..609b281 +--- /dev/null ++++ b/pengine/test10/whitebox-imply-stop-on-fence.xml +@@ -0,0 +1,347 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ diff --git a/SOURCES/bz1139701-pcmk-unref_reply_to_prevent_systemd_action_timeouts.patch b/SOURCES/bz1139701-pcmk-unref_reply_to_prevent_systemd_action_timeouts.patch deleted file mode 100644 index bf1fc88..0000000 --- a/SOURCES/bz1139701-pcmk-unref_reply_to_prevent_systemd_action_timeouts.patch +++ /dev/null @@ -1,18 +0,0 @@ -commit c6c626c0f4f322b520d2600f8338b6b683ee365a -Author: Andrew Beekhof -Date: Tue Sep 23 09:17:34 2014 +1000 - - Fix: Bug rhbz#1139701 - Unref reply to prevent systemd action timeouts - -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index b424c0b..fce258f 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -286,6 +286,7 @@ pcmk_dbus_get_property( - - - crm_trace("Property %s[%s] is '%s'", obj, name, output); -+ dbus_message_unref(reply); - return output; - } - diff --git a/SOURCES/bz1162727-pcmk-membership-cleanup.patch b/SOURCES/bz1162727-pcmk-membership-cleanup.patch new file mode 100644 index 0000000..910b2d7 --- /dev/null +++ b/SOURCES/bz1162727-pcmk-membership-cleanup.patch @@ -0,0 +1,897 @@ +diff --git a/attrd/commands.c b/attrd/commands.c +index 12771ee..c5badc5 100644 +--- a/attrd/commands.c ++++ b/attrd/commands.c +@@ -377,7 +377,17 @@ attrd_peer_message(crm_node_t *peer, xmlNode *xml) + attrd_peer_sync(peer, xml); + + } else if(safe_str_eq(op, "peer-remove")) { +- attrd_peer_remove(0, host, TRUE, peer->uname); ++ int host_id = 0; ++ char *endptr = NULL; ++ ++ host_id = strtol(host, &endptr, 10); ++ if (errno != 0 || endptr == host || *endptr != '\0') { ++ host_id = 0; ++ } else { ++ host = NULL; ++ } ++ attrd_peer_remove(host_id, host, TRUE, peer->uname); ++ + + } else if(safe_str_eq(op, "sync-response") + && safe_str_neq(peer->uname, attrd_cluster->uname)) { +diff --git a/attrd/legacy.c b/attrd/legacy.c +index d4733ec..d7ed53e 100644 +--- a/attrd/legacy.c ++++ b/attrd/legacy.c +@@ -768,6 +768,9 @@ attrd_local_callback(xmlNode * msg) + crm_notice("Sending full refresh (origin=%s)", from); + g_hash_table_foreach(attr_hash, update_for_hash_entry, NULL); + return; ++ } else if(safe_str_eq(op, "peer-remove")) { ++ /* The legacy code didn't understand this command - swallow silently */ ++ return; + } + + if (host != NULL && safe_str_neq(host, attrd_uname)) { +diff --git a/cib/main.c b/cib/main.c +index 00fca9b..69a957c 100644 +--- a/cib/main.c ++++ b/cib/main.c +@@ -439,6 +439,11 @@ cib_peer_update_callback(enum crm_status_type type, crm_node_t * node, const voi + crm_info("No more peers"); + terminate_cib(__FUNCTION__, FALSE); + } ++ ++ if(type == crm_status_nstate && node->id && safe_str_eq(node->state, CRM_NODE_LOST)) { ++ /* Avoid conflicts, keep the membership list to active members */ ++ reap_crm_member(node->id, NULL); ++ } + } + + #if SUPPORT_HEARTBEAT +diff --git a/crmd/messages.c b/crmd/messages.c +index d38f2a3..eea4f7b 100644 +--- a/crmd/messages.c ++++ b/crmd/messages.c +@@ -39,6 +39,7 @@ + GListPtr fsa_message_queue = NULL; + extern void crm_shutdown(int nsig); + ++extern crm_ipc_t *attrd_ipc; + void handle_response(xmlNode * stored_msg); + enum crmd_fsa_input handle_request(xmlNode * stored_msg, enum crmd_fsa_cause cause); + enum crmd_fsa_input handle_shutdown_request(xmlNode * stored_msg); +diff --git a/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt b/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt +index 0cbfeec..5852e7e 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ap-Configuration.txt +@@ -19,7 +19,7 @@ ifdef::pcs[] + Started: [ pcmk-1 pcmk-2 ] + Clone Set: WebSite-clone [WebSite] + Started: [ pcmk-1 pcmk-2 ] +-# pcs resource defaults ++# pcs resource rsc defaults + resource-stickiness: 100 + # pcs resource op defaults + timeout: 240s +@@ -303,7 +303,7 @@ ifdef::pcs[] + * resource-stickiness - Specify the aversion to moving resources to other machines + [source,C] + ---- +-# pcs resource defaults ++# pcs resource rsc defaults + resource-stickiness: 100 + ---- + endif::[] +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt b/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt +index 5943c19..714a0d3 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Active-Active.txt +@@ -222,7 +222,7 @@ ifdef::pcs[] + WebFS (ocf::heartbeat:Filesystem) Stopped + Clone Set: dlm-clone [dlm] + Stopped: [ dlm:0 dlm:1 ] +-# pcs cluster cib-push dlm_cfg ++# pcs cluster push cib dlm_cfg + CIB updated + # pcs status + +@@ -695,7 +695,7 @@ shell and watching the cluster's response + ifdef::pcs[] + [source,C] + ----- +-# pcs cluster cib-push active_cfg ++# pcs cluster push cib active_cfg + # pcs resource enable WebFS + ----- + +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt b/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt +index c91647b..7da8fca 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Active-Passive.txt +@@ -656,8 +656,8 @@ resource, but it is often sufficient to change the default. + ifdef::pcs[] + [source,C] + ---- +-# pcs resource defaults resource-stickiness=100 +-# pcs resource defaults ++# pcs resource rsc defaults resource-stickiness=100 ++# pcs resource rsc defaults + resource-stickiness: 100 + ---- + endif::[] +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt b/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt +index 71777db..236bb77 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Apache.txt +@@ -125,7 +125,7 @@ it fails, the resource agent used by Pacemaker assumes the server-status + URL is available. Look for the following in '/etc/httpd/conf/httpd.conf' + and make sure it is not disabled or commented out: + +-[source,Apache Configuration] ++[source,C] + ----- + + SetHandler server-status +@@ -601,7 +601,7 @@ WebSite will be forced to move to pcmk-1. + [source,C] + ----- + # pcs constraint location WebSite prefers pcmk-1=INFINITY +-# pcs constraint --full ++# pcs constraint all + Location Constraints: + Resource: WebSite + Enabled on: pcmk-1 (score:INFINITY) (id:location-WebSite-pcmk-1-INFINITY) +@@ -708,7 +708,7 @@ Ordering Constraints: + start ClusterIP then start WebSite (Mandatory) (id:order-ClusterIP-WebSite-mandatory) + Colocation Constraints: + WebSite with ClusterIP (INFINITY) (id:colocation-WebSite-ClusterIP-INFINITY) +-# pcs constraint remove location-WebSite-pcmk-1-INFINITY ++# pcs constraint rm location-WebSite-pcmk-1-INFINITY + # pcs constraint + Location Constraints: + Ordering Constraints: +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt b/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt +index cf47602..aa0b4b9 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Installation.txt +@@ -210,11 +210,23 @@ outside world. + ---- + # setenforce 0 + # sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config ++# systemctl disable firewalld.service ++# systemctl stop firewalld.service ++---- ++ ++or (on older Fedora) ++ ++[source,C] ++---- ++# setenforce 0 ++# sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config + # systemctl disable iptables.service + # rm '/etc/systemd/system/basic.target.wants/iptables.service' + # systemctl stop iptables.service + ---- + ++ ++ + === Short Node Names === + + During installation, we filled in the machine's fully qualified domain +@@ -538,7 +550,7 @@ Password: + pcmk-1: Authorized + pcmk-2: Authorized + +-# pcs cluster setup --name mycluster pcmk-1 pcmk-2 ++# pcs cluster setup mycluster pcmk-1 pcmk-2 + pcmk-1: Succeeded + pcmk-2: Succeeded + ---- +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt b/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt +index cc2cec6..f6b50d9 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Shared-Storage.txt +@@ -334,7 +334,7 @@ cib. + + [source,C] + ---- +-# pcs cluster cib-push drbd_cfg ++# pcs cluster push cib drbd_cfg + CIB updated + + # pcs status +@@ -594,7 +594,7 @@ cluster put it into effect. + ifdef::pcs[] + [source,C] + ---- +-# pcs cluster cib-push fs_cfg ++# pcs cluster push cib fs_cfg + CIB updated + # pcs status + Last updated: Fri Aug 10 12:47:01 2012 +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Stonith.txt b/doc/Clusters_from_Scratch/en-US/Ch-Stonith.txt +index 9518fc2..123bd4b 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Stonith.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Stonith.txt +@@ -81,7 +81,7 @@ ifdef::crmsh[] + endif::[] + + ifdef::pcs[] +-. Commit the new configuration. +pcs cluster cib-push stonith_cfg+ ++. Commit the new configuration. +pcs cluster push cib stonith_cfg+ + endif::[] + + . Once the stonith resource is running, you can test it by executing: +@@ -261,7 +261,7 @@ Now push the configuration into the cluster. + ifdef::pcs[] + [source,C] + ---- +-# pcs cluster cib-push stonith_cfg ++# pcs cluster push cib stonith_cfg + ---- + endif::[] + +diff --git a/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt b/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt +index 530e37b..c62cae4 100644 +--- a/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt ++++ b/doc/Clusters_from_Scratch/en-US/Ch-Verification.txt +@@ -217,6 +217,13 @@ Next, check for any ERRORs during startup - there shouldn't be any. + # grep -i error /var/log/messages + ---- + ++or (on Fedora 20) ++ ++[source,C] ++---- ++# journalctl | grep -i error ++---- ++ + Repeat these checks on the other node. The results should be the same. + + endif::[] +diff --git a/doc/Clusters_from_Scratch/zh-CN/Ch-Active-Passive.po b/doc/Clusters_from_Scratch/zh-CN/Ch-Active-Passive.po +index f9cc723..daefc41 100644 +--- a/doc/Clusters_from_Scratch/zh-CN/Ch-Active-Passive.po ++++ b/doc/Clusters_from_Scratch/zh-CN/Ch-Active-Passive.po +@@ -379,7 +379,7 @@ msgstr "当有半数以上的节点在线时,这个集群就认为自己拥有 + #. Tag: literallayout + #, no-c-format + msgid "total_nodes < 2 * active_nodes" +-msgstr "总节点数 < 2 * 活跃节点数" ++msgstr "" + + #. Tag: para + #, no-c-format +diff --git a/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt b/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt +index 8498ce0..b4eaf49 100644 +--- a/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt ++++ b/doc/Pacemaker_Explained/en-US/Ch-Constraints.txt +@@ -36,28 +36,33 @@ nothing able to run anywhere and selectively enable allowed nodes. + === Options === + + .Options for Simple Location Constraints +-[width="95%",cols="2m,5<",options="header",align="center"] ++[width="95%",cols="2m,1,5<",options="header",align="center"] + |========================================================= + + |Field ++|Default + |Description + + |id ++| + |A unique name for the constraint + indexterm:[id,Location Constraints] + indexterm:[Constraints,Location,id] + + |rsc ++| + |A resource name + indexterm:[rsc,Location Constraints] + indexterm:[Constraints,Location,rsc] + + |node ++| + |A node's name + indexterm:[node,Location Constraints] + indexterm:[Constraints,Location,node] + + |score ++| + |Positive values indicate the resource should run on this + node. Negative values indicate the resource should not run on this + node. +@@ -67,6 +72,30 @@ indexterm:[Constraints,Location,node] + indexterm:[score,Location Constraints] + indexterm:[Constraints,Location,score] + ++|resource-discovery ++|+always+ ++|Indicates whether or not Pacemaker should perform resource discovery ++on this node for the specified resource. Limiting resource discovery to ++a subset of nodes the resource is physically capable of running on ++can significantly boost performance when a large set of nodes are preset. ++When pacemaker_remote is in use to expand the node count into the 100s of ++nodes range, this option should be considered. ++ ++* 'always' - Always perform resource discovery for the specified resource on this node. ++ ++* 'never' - Never perform resource discovery for the specified resource on this node. ++ This option should generally be used with a -INFINITY score. Although that is not strictly ++ required. ++ ++* 'exclusive' - Only perform resource discovery for the specified resource on this node. Multiple ++ location constraints using 'exclusive' discovery for the same resource across different nodes ++ creates a subset of nodes resource-discovery is exclusive to. If a resource is marked ++ for 'exclusive' discovery on one or more nodes, that resource is only allowed to be placed ++ within that subset of nodes. ++ ++indexterm:[Resource Discovery,Location Constraints] ++indexterm:[Constraints,Location,Resource Discovery] ++ + |========================================================= + + === Asymmetrical "Opt-In" Clusters === +diff --git a/fencing/commands.c b/fencing/commands.c +index 577ea95..c193a9d 100644 +--- a/fencing/commands.c ++++ b/fencing/commands.c +@@ -2109,6 +2109,14 @@ handle_request(crm_client_t * client, uint32_t id, uint32_t flags, xmlNode * req + free_async_command(cmd); + free_xml(reply); + ++ } else if(safe_str_eq(op, CRM_OP_RM_NODE_CACHE)) { ++ int id = 0; ++ const char *name = NULL; ++ ++ crm_element_value_int(request, XML_ATTR_ID, &id); ++ name = crm_element_value(request, XML_ATTR_UNAME); ++ reap_crm_member(id, name); ++ + } else { + crm_err("Unknown %s from %s", op, client ? client->name : remote_peer); + crm_log_xml_warn(request, "UnknownOp"); +diff --git a/fencing/main.c b/fencing/main.c +index 2694452..70b5bde 100644 +--- a/fencing/main.c ++++ b/fencing/main.c +@@ -97,6 +97,7 @@ st_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) + int call_options = 0; + xmlNode *request = NULL; + crm_client_t *c = crm_client_get(qbc); ++ const char *op = NULL; + + if (c == NULL) { + crm_info("Invalid client: %p", qbc); +@@ -109,6 +110,20 @@ st_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) + return 0; + } + ++ ++ op = crm_element_value(request, F_CRM_TASK); ++ if(safe_str_eq(op, CRM_OP_RM_NODE_CACHE)) { ++ crm_xml_add(request, F_TYPE, T_STONITH_NG); ++ crm_xml_add(request, F_STONITH_OPERATION, op); ++ crm_xml_add(request, F_STONITH_CLIENTID, c->id); ++ crm_xml_add(request, F_STONITH_CLIENTNAME, crm_client_name(c)); ++ crm_xml_add(request, F_STONITH_CLIENTNODE, stonith_our_uname); ++ ++ send_cluster_message(NULL, crm_msg_stonith_ng, request, FALSE); ++ free_xml(request); ++ return 0; ++ } ++ + if (c->name == NULL) { + const char *value = crm_element_value(request, F_STONITH_CLIENTNAME); + +@@ -1099,6 +1114,7 @@ stonith_cleanup(void) + static struct crm_option long_options[] = { + {"stand-alone", 0, 0, 's'}, + {"stand-alone-w-cpg", 0, 0, 'c'}, ++ {"logfile", 1, 0, 'l'}, + {"verbose", 0, 0, 'V'}, + {"version", 0, 0, '$'}, + {"help", 0, 0, '?'}, +@@ -1200,6 +1216,9 @@ main(int argc, char **argv) + case 'V': + crm_bump_log_level(argc, argv); + break; ++ case 'l': ++ crm_add_logfile(optarg); ++ break; + case 's': + stand_alone = TRUE; + break; +diff --git a/fencing/regression.py.in b/fencing/regression.py.in +index c4cb2d8..fe6d418 100644 +--- a/fencing/regression.py.in ++++ b/fencing/regression.py.in +@@ -82,24 +82,34 @@ class Test: + test.wait() + + if self.verbose: ++ self.stonith_options = self.stonith_options + " -V" + print "Starting stonithd with %s" % self.stonith_options + ++ if os.path.exists("/tmp/stonith-regression.log"): ++ os.remove('/tmp/stonith-regression.log') ++ + self.stonith_process = subprocess.Popen( +- shlex.split("@CRM_DAEMON_DIR@/stonithd %s -V" % self.stonith_options), +- stdout=subprocess.PIPE, +- stderr=subprocess.PIPE) ++ shlex.split("@CRM_DAEMON_DIR@/stonithd %s -l /tmp/stonith-regression.log" % self.stonith_options)) + + time.sleep(1) + + def clean_environment(self): + if self.stonith_process: + self.stonith_process.terminate() ++ self.stonith_process.wait() + +- self.stonith_output = self.stonith_process.communicate()[1] ++ self.stonith_output = "" + self.stonith_process = None + ++ f = open('/tmp/stonith-regression.log', 'r') ++ for line in f.readlines(): ++ self.stonith_output = self.stonith_output + line ++ + if self.verbose: ++ print "Daemon Output Start" + print self.stonith_output ++ print "Daemon Output End" ++ os.remove('/tmp/stonith-regression.log') + + def add_stonith_log_pattern(self, pattern): + self.stonith_patterns.append(pattern) +@@ -953,7 +963,7 @@ if __name__ == "__main__": + self.stop_corosync() + + if self.verbose and os.path.exists('/var/log/corosync.log'): +- print "Daemon output" ++ print "Corosync output" + f = open('/var/log/corosync.log', 'r') + for line in f.readlines(): + print line.strip() +diff --git a/lib/cib/cib_remote.c b/lib/cib/cib_remote.c +index d9dde9b..9b98892 100644 +--- a/lib/cib/cib_remote.c ++++ b/lib/cib/cib_remote.c +@@ -226,6 +226,8 @@ cib_tls_signon(cib_t * cib, crm_remote_t * connection, gboolean event_channel) + return -ENOTCONN; + } + ++ connection->tcp_socket = sock; ++ + if (private->encrypted) { + /* initialize GnuTls lib */ + #ifdef HAVE_GNUTLS_GNUTLS_H +@@ -250,8 +252,6 @@ cib_tls_signon(cib_t * cib, crm_remote_t * connection, gboolean event_channel) + #else + return -EPROTONOSUPPORT; + #endif +- } else { +- connection->tcp_socket = sock; + } + + /* login to server */ +diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c +index 24700e5..70a0321 100644 +--- a/lib/cluster/membership.c ++++ b/lib/cluster/membership.c +@@ -389,9 +389,15 @@ crm_find_peer(unsigned int id, const char *uname) + } + + } else if(uname && by_id->uname) { +- crm_dump_peer_hash(LOG_INFO, __FUNCTION__); +- crm_warn("Node '%s' and '%s' share the same cluster nodeid: %u %s", by_id->uname, by_name->uname, id, uname); +- crm_abort(__FILE__, __FUNCTION__, __LINE__, "member weirdness", TRUE, TRUE); ++ if(safe_str_eq(uname, by_id->uname)) { ++ crm_notice("Node '%s' has changed its ID from %u to %u", by_id->uname, by_name->id, by_id->id); ++ g_hash_table_foreach_remove(crm_peer_cache, crm_hash_find_by_data, by_name); ++ ++ } else { ++ crm_warn("Node '%s' and '%s' share the same cluster nodeid: %u %s", by_id->uname, by_name->uname, id, uname); ++ crm_dump_peer_hash(LOG_INFO, __FUNCTION__); ++ crm_abort(__FILE__, __FUNCTION__, __LINE__, "member weirdness", TRUE, TRUE); ++ } + + } else if(id && by_name->id) { + crm_warn("Node %u and %u share the same name: '%s'", by_id->id, by_name->id, uname); +diff --git a/lib/common/remote.c b/lib/common/remote.c +index e2492b9..f11ebcd 100644 +--- a/lib/common/remote.c ++++ b/lib/common/remote.c +@@ -308,13 +308,16 @@ crm_remote_sendv(crm_remote_t * remote, struct iovec * iov, int iovs) + int rc = -ESOCKTNOSUPPORT; + + for(; lpc < iovs; lpc++) { +- if (remote->tcp_socket) { +- rc = crm_send_plaintext(remote->tcp_socket, iov[lpc].iov_base, iov[lpc].iov_len); +-#ifdef HAVE_GNUTLS_GNUTLS_H + +- } else if (remote->tls_session) { ++#ifdef HAVE_GNUTLS_GNUTLS_H ++ if (remote->tls_session) { + rc = crm_send_tls(remote->tls_session, iov[lpc].iov_base, iov[lpc].iov_len); ++ } else if (remote->tcp_socket) { ++#else ++ if (remote->tcp_socket) { + #endif ++ rc = crm_send_plaintext(remote->tcp_socket, iov[lpc].iov_base, iov[lpc].iov_len); ++ + } else { + crm_err("Unsupported connection type"); + } +@@ -448,14 +451,16 @@ crm_remote_ready(crm_remote_t * remote, int timeout /* ms */ ) + int rc = 0; + time_t start; + +- if (remote->tcp_socket) { +- sock = remote->tcp_socket; + #ifdef HAVE_GNUTLS_GNUTLS_H +- } else if (remote->tls_session) { ++ if (remote->tls_session) { + void *sock_ptr = gnutls_transport_get_ptr(*remote->tls_session); + + sock = GPOINTER_TO_INT(sock_ptr); ++ } else if (remote->tcp_socket) { ++#else ++ if (remote->tcp_socket) { + #endif ++ sock = remote->tcp_socket; + } else { + crm_err("Unsupported connection type"); + } +@@ -519,17 +524,8 @@ crm_remote_recv_once(crm_remote_t * remote) + CRM_ASSERT(remote->buffer != NULL); + } + +- if (remote->tcp_socket) { +- errno = 0; +- rc = read(remote->tcp_socket, +- remote->buffer + remote->buffer_offset, +- remote->buffer_size - remote->buffer_offset); +- if(rc < 0) { +- rc = -errno; +- } +- + #ifdef HAVE_GNUTLS_GNUTLS_H +- } else if (remote->tls_session) { ++ if (remote->tls_session) { + rc = gnutls_record_recv(*(remote->tls_session), + remote->buffer + remote->buffer_offset, + remote->buffer_size - remote->buffer_offset); +@@ -541,7 +537,18 @@ crm_remote_recv_once(crm_remote_t * remote) + crm_debug("TLS receive failed: %s (%d)", gnutls_strerror(rc), rc); + rc = -pcmk_err_generic; + } ++ } else if (remote->tcp_socket) { ++#else ++ if (remote->tcp_socket) { + #endif ++ errno = 0; ++ rc = read(remote->tcp_socket, ++ remote->buffer + remote->buffer_offset, ++ remote->buffer_size - remote->buffer_offset); ++ if(rc < 0) { ++ rc = -errno; ++ } ++ + } else { + crm_err("Unsupported connection type"); + return -ESOCKTNOSUPPORT; +diff --git a/lib/common/xml.c b/lib/common/xml.c +index 58d0a00..e63a582 100644 +--- a/lib/common/xml.c ++++ b/lib/common/xml.c +@@ -1281,7 +1281,10 @@ __xml_build_changes(xmlNode * xml, xmlNode *patchset) + for (pIter = crm_first_attr(xml); pIter != NULL; pIter = pIter->next) { + const char *value = crm_element_value(xml, (const char *)pIter->name); + +- crm_xml_add(result, (const char *)pIter->name, value); ++ p = pIter->_private; ++ if (is_not_set(p->flags, xpf_deleted)) { ++ crm_xml_add(result, (const char *)pIter->name, value); ++ } + } + } + +@@ -5715,7 +5718,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g + } + + } else { +- crm_notice("Upgrading %s-style configuration to %s with %s", ++ crm_debug("Upgrading %s-style configuration to %s with %s", + known_schemas[lpc].name, known_schemas[next].name, + known_schemas[lpc].transform ? known_schemas[lpc].transform : "no-op"); + +@@ -5746,7 +5749,7 @@ update_validation(xmlNode ** xml_blob, int *best, int max, gboolean transform, g + } + + if (*best > match) { +- crm_notice("%s the configuration from %s to %s", ++ crm_info("%s the configuration from %s to %s", + transform?"Transformed":"Upgraded", + value ? value : "", known_schemas[*best].name); + crm_xml_add(xml, XML_ATTR_VALIDATION, known_schemas[*best].name); +diff --git a/lib/services/services.c b/lib/services/services.c +index 582fbe1..c7b6c89 100644 +--- a/lib/services/services.c ++++ b/lib/services/services.c +@@ -305,6 +305,7 @@ services_action_create_generic(const char *exec, const char *args[]) + void + services_action_cleanup(svc_action_t * op) + { ++#if SUPPORT_DBUS + if(op->opaque->timerid != 0) { + crm_trace("Removing timer for call %s to %s", op->action, op->rsc); + g_source_remove(op->opaque->timerid); +@@ -330,6 +331,7 @@ services_action_cleanup(svc_action_t * op) + mainloop_del_fd(op->opaque->stdout_gsource); + op->opaque->stdout_gsource = NULL; + } ++#endif + } + + void +diff --git a/lrmd/regression.py.in b/lrmd/regression.py.in +index 649c984..50e975e 100755 +--- a/lrmd/regression.py.in ++++ b/lrmd/regression.py.in +@@ -435,14 +435,13 @@ if __name__ == "__main__": + os.system("cp %s/extra/resources/%s @OCF_RA_DIR@/pacemaker/%s" % (build_dir, ra, ra)) + os.system("chmod a+x @OCF_RA_DIR@/pacemaker/%s" % (ra)) + +- else: +- # Assume it's installed +- print "Using @datadir@/@PACKAGE@/tests/cts/LSBDummy" +- os.system("cp @datadir@/@PACKAGE@/tests/cts/LSBDummy /etc/init.d/LSBDummy") +- +- os.system("chmod a+x /etc/init.d/LSBDummy") +- os.system("ls -al /etc/init.d/LSBDummy") ++ else: ++ # Assume it's installed ++ print "Using @datadir@/@PACKAGE@/tests/cts/LSBDummy" ++ os.system("cp @datadir@/@PACKAGE@/tests/cts/LSBDummy /etc/init.d/LSBDummy") + ++ os.system("chmod a+x /etc/init.d/LSBDummy") ++ os.system("ls -al /etc/init.d/LSBDummy") + os.system("mkdir -p @CRM_CORE_DIR@/root") + + if os.path.exists("/bin/systemctl"): +diff --git a/pengine/constraints.c b/pengine/constraints.c +index 88e382b..a2ce9c4 100644 +--- a/pengine/constraints.c ++++ b/pengine/constraints.c +@@ -52,6 +52,8 @@ enum pe_order_kind { + enum pe_ordering get_flags(const char *id, enum pe_order_kind kind, + const char *action_first, const char *action_then, gboolean invert); + enum pe_ordering get_asymmetrical_flags(enum pe_order_kind kind); ++static rsc_to_node_t *generate_location_rule(resource_t * rsc, xmlNode * rule_xml, ++ const char *discovery, pe_working_set_t * data_set); + + gboolean + unpack_constraints(xmlNode * xml_constraints, pe_working_set_t * data_set) +@@ -687,7 +689,7 @@ unpack_rsc_location(xmlNode * xml_obj, resource_t * rsc_lh, const char * role, + if (crm_str_eq((const char *)rule_xml->name, XML_TAG_RULE, TRUE)) { + empty = FALSE; + crm_trace("Unpacking %s/%s", id, ID(rule_xml)); +- generate_location_rule(rsc_lh, rule_xml, data_set); ++ generate_location_rule(rsc_lh, rule_xml, discovery, data_set); + } + } + +@@ -917,8 +919,8 @@ get_node_score(const char *rule, const char *score, gboolean raw, node_t * node) + return score_f; + } + +-rsc_to_node_t * +-generate_location_rule(resource_t * rsc, xmlNode * rule_xml, pe_working_set_t * data_set) ++static rsc_to_node_t * ++generate_location_rule(resource_t * rsc, xmlNode * rule_xml, const char *discovery, pe_working_set_t * data_set) + { + const char *rule_id = NULL; + const char *score = NULL; +@@ -960,7 +962,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, NULL, data_set); ++ location_rule = rsc2node_new(rule_id, rsc, 0, discovery, NULL, data_set); + + if (location_rule == NULL) { + return NULL; +diff --git a/pengine/test10/resource-discovery.xml b/pengine/test10/resource-discovery.xml +index 8b517df..1692cdb 100644 +--- a/pengine/test10/resource-discovery.xml ++++ b/pengine/test10/resource-discovery.xml +@@ -97,7 +97,13 @@ + + + +- ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/pengine/utils.h b/pengine/utils.h +index 5142e68..270d32a 100644 +--- a/pengine/utils.h ++++ b/pengine/utils.h +@@ -39,9 +39,6 @@ extern gboolean rsc_ticket_new(const char *id, resource_t * rsc_lh, ticket_t * t + const char *state_lh, const char *loss_policy, + pe_working_set_t * data_set); + +-extern rsc_to_node_t *generate_location_rule(resource_t * rsc, xmlNode * location_rule, +- pe_working_set_t * data_set); +- + extern gint sort_node_weight(gconstpointer a, gconstpointer b, gpointer data_set); + + extern gboolean can_run_resources(const node_t * node); +diff --git a/tools/crm_node.c b/tools/crm_node.c +index 98847f3..5932f98 100644 +--- a/tools/crm_node.c ++++ b/tools/crm_node.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + int command = 0; + int ccm_fd = 0; +@@ -92,7 +93,7 @@ cib_remove_node(uint32_t id, const char *name) + crm_trace("Removing %s from the CIB", name); + + /* TODO: Use 'id' instead */ +- if(name == NULL) { ++ if(name == NULL && id == 0) { + return -ENOTUNIQ; + } + +@@ -101,17 +102,24 @@ cib_remove_node(uint32_t id, const char *name) + + crm_xml_add(node, XML_ATTR_UNAME, name); + crm_xml_add(node_state, XML_ATTR_UNAME, name); ++ if(id) { ++ char buffer[64]; ++ if(snprintf(buffer, 63, "%u", id) > 0) { ++ crm_xml_add(node, XML_ATTR_ID, buffer); ++ crm_xml_add(node_state, XML_ATTR_ID, buffer); ++ } ++ } + + cib = cib_new(); + cib->cmds->signon(cib, crm_system_name, cib_command); + + rc = cib->cmds->delete(cib, XML_CIB_TAG_NODES, node, cib_sync_call); + if (rc != pcmk_ok) { +- printf("Could not remove %s from " XML_CIB_TAG_NODES ": %s", name, pcmk_strerror(rc)); ++ printf("Could not remove %s/%u from " XML_CIB_TAG_NODES ": %s", name, id, pcmk_strerror(rc)); + } + rc = cib->cmds->delete(cib, XML_CIB_TAG_STATUS, node_state, cib_sync_call); + if (rc != pcmk_ok) { +- printf("Could not remove %s from " XML_CIB_TAG_STATUS ": %s", name, pcmk_strerror(rc)); ++ printf("Could not remove %s/%u from " XML_CIB_TAG_STATUS ": %s", name, id, pcmk_strerror(rc)); + } + + cib->cmds->signoff(cib); +@@ -156,6 +164,7 @@ int tools_remove_node_cache(const char *node, const char *target) + } + } + ++ + errno = 0; + n = strtol(node, &endptr, 10); + if (errno != 0 || endptr == node || *endptr != '\0') { +@@ -166,21 +175,39 @@ int tools_remove_node_cache(const char *node, const char *target) + name = get_node_name(n); + } + +- crm_trace("Removing %s aka. %s from the membership cache", name, node); ++ crm_trace("Removing %s aka. %s (%u) from the membership cache", name, node, n); + +- cmd = create_request(CRM_OP_RM_NODE_CACHE, +- NULL, NULL, target, "crm_node", admin_uuid); ++ if(safe_str_eq(target, T_ATTRD)) { ++ cmd = create_xml_node(NULL, __FUNCTION__); + +- if (n) { +- char buffer[64]; ++ crm_xml_add(cmd, F_TYPE, T_ATTRD); ++ crm_xml_add(cmd, F_ORIG, crm_system_name); + +- if(snprintf(buffer, 63, "%u", n) > 0) { +- crm_xml_add(cmd, XML_ATTR_ID, buffer); ++ crm_xml_add(cmd, F_ATTRD_TASK, "peer-remove"); ++ crm_xml_add(cmd, F_ATTRD_HOST, name); ++ ++ if (n) { ++ char buffer[64]; ++ if(snprintf(buffer, 63, "%u", n) > 0) { ++ crm_xml_add(cmd, F_ATTRD_HOST_ID, buffer); ++ } ++ } ++ ++ } else { ++ cmd = create_request(CRM_OP_RM_NODE_CACHE, ++ NULL, NULL, target, crm_system_name, admin_uuid); ++ if (n) { ++ char buffer[64]; ++ if(snprintf(buffer, 63, "%u", n) > 0) { ++ crm_xml_add(cmd, XML_ATTR_ID, buffer); ++ } + } ++ crm_xml_add(cmd, XML_ATTR_UNAME, name); + } +- crm_xml_add(cmd, XML_ATTR_UNAME, name); + + rc = crm_ipc_send(conn, cmd, 0, 0, NULL); ++ crm_debug("%s peer cache cleanup for %s (%u): %d", target, name, n, rc); ++ + if (rc > 0) { + rc = cib_remove_node(n, name); + } +@@ -189,8 +216,8 @@ int tools_remove_node_cache(const char *node, const char *target) + crm_ipc_close(conn); + crm_ipc_destroy(conn); + } +- free_xml(cmd); + free(admin_uuid); ++ free_xml(cmd); + free(name); + return rc > 0 ? 0 : rc; + } +@@ -649,6 +676,12 @@ try_corosync(int command, enum cluster_type_e stack) + + mainloop_io_t *ipc = NULL; + GMainLoop *amainloop = NULL; ++ const char *daemons[] = { ++ CRM_SYSTEM_CRMD, ++ "stonith-ng", ++ T_ATTRD, ++ CRM_SYSTEM_MCP, ++ }; + + struct ipc_client_callbacks node_callbacks = { + .dispatch = node_mcp_dispatch, +@@ -657,13 +690,11 @@ try_corosync(int command, enum cluster_type_e stack) + + switch (command) { + case 'R': +- if (tools_remove_node_cache(target_uname, CRM_SYSTEM_CRMD)) { +- crm_err("Failed to connect to "CRM_SYSTEM_CRMD" to remove node '%s'", target_uname); +- crm_exit(pcmk_err_generic); +- } +- if (tools_remove_node_cache(target_uname, CRM_SYSTEM_MCP)) { +- crm_err("Failed to connect to "CRM_SYSTEM_MCP" to remove node '%s'", target_uname); +- crm_exit(pcmk_err_generic); ++ for(rc = 0; rc < DIMOF(daemons); rc++) { ++ if (tools_remove_node_cache(target_uname, daemons[rc])) { ++ crm_err("Failed to connect to %s to remove node '%s'", daemons[rc], target_uname); ++ crm_exit(pcmk_err_generic); ++ } + } + crm_exit(pcmk_ok); + break; +@@ -834,8 +865,8 @@ main(int argc, char **argv) + force_flag = TRUE; + break; + case 'R': +- dangerous_cmd = TRUE; + command = flag; ++ dangerous_cmd = TRUE; + target_uname = optarg; + break; + case 'N': diff --git a/SOURCES/bz1165423-pcmk-coverity.patch b/SOURCES/bz1165423-pcmk-coverity.patch new file mode 100644 index 0000000..7207679 --- /dev/null +++ b/SOURCES/bz1165423-pcmk-coverity.patch @@ -0,0 +1,25 @@ +diff --git a/lib/common/xml.c b/lib/common/xml.c +index 0effd47..f7779f5 100644 +--- a/lib/common/xml.c ++++ b/lib/common/xml.c +@@ -2759,7 +2759,7 @@ create_xml_node(xmlNode * parent, const char *name) + xmlNode *node = NULL; + + if (name == NULL || name[0] == 0) { +- CRM_CHECK(name != NULL || name[0] == 0, return NULL); ++ CRM_CHECK(name != NULL && name[0] == 0, return NULL); + return NULL; + } + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index 236d43c..968683a 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -1430,7 +1430,6 @@ update_dataset(cib_t *cib, pe_working_set_t * data_set, bool simulate) + goto cleanup; + } + +- free(pid); + rc = write_xml_file(cib_xml_copy, shadow_file, FALSE); + + if (rc < 0) { diff --git a/SOURCES/bz1165423-pcmk-long-systemd-stop.patch b/SOURCES/bz1165423-pcmk-long-systemd-stop.patch new file mode 100644 index 0000000..0a22ae9 --- /dev/null +++ b/SOURCES/bz1165423-pcmk-long-systemd-stop.patch @@ -0,0 +1,709 @@ +diff --git a/GNUmakefile b/GNUmakefile +index f28dea8..7a4c929 100644 +--- a/GNUmakefile ++++ b/GNUmakefile +@@ -325,7 +325,7 @@ clang: + test -e $(CLANG_analyzer) + scan-build $(CLANG_checkers:%=-enable-checker %) make + +-# V3 = scandir unsetenv alphasort ++# V3 = scandir unsetenv alphasort xalloc + # V2 = setenv strerror strchrnul strndup + # http://www.gnu.org/software/gnulib/manual/html_node/Initial-import.html#Initial-import + GNU_MODS = crypto/md5 +diff --git a/crmd/lrm.c b/crmd/lrm.c +index b68f657..8315f6f 100644 +--- a/crmd/lrm.c ++++ b/crmd/lrm.c +@@ -630,7 +630,7 @@ append_restart_list(lrmd_rsc_info_t * rsc, lrmd_event_data_t * op, xmlNode * upd + crm_xml_add(restart, param, value); + } + len += strlen(param) + 2; +- list = realloc(list, len + 1); ++ list = realloc_safe(list, len + 1); + sprintf(list + start, " %s ", param); + } + +diff --git a/cts/CIB.py b/cts/CIB.py +index d26efdb..7922d8b 100644 +--- a/cts/CIB.py ++++ b/cts/CIB.py +@@ -298,7 +298,28 @@ class CIB11(ConfigBase): + # Group Resource + g = Group(self.Factory, "group-1") + g.add_child(self.NewIP()) +- g.add_child(self.NewIP()) ++ ++ if self.CM.Env["have_systemd"]: ++ dummy_service_file = """ ++[Unit] ++Description=Dummy resource that takes a while to start ++ ++[Service] ++Type=notify ++ExecStart=/usr/bin/python -c 'import time; import systemd.daemon;time.sleep(10); systemd.daemon.notify("READY=1"); time.sleep(3600)' ++ExecStop=sleep 10 ++ExecStop=/bin/kill -KILL $MAINPID ++""" ++ ++ os.system("cat <<-END >/tmp/DummySD.service\n%s\nEND" % (dummy_service_file)) ++ ++ self.CM.install_helper("DummySD.service", destdir="/usr/lib/systemd/system/", sourcedir="/tmp") ++ sysd = Resource(self.Factory, "petulant", "DummySD", "service") ++ sysd.add_op("monitor", "P10S") ++ g.add_child(sysd) ++ else: ++ g.add_child(self.NewIP()) ++ + g.add_child(self.NewIP()) + + # Group with the master +diff --git a/cts/environment.py b/cts/environment.py +index d741452..2b2a343 100644 +--- a/cts/environment.py ++++ b/cts/environment.py +@@ -283,9 +283,9 @@ class Environment: + break; + self["cts-master"] = master + +- if self.has_key("have_systemd"): +- self["have_systemd"] = not rsh(discover, "systemctl list-units") +- ++ if not self.has_key("have_systemd"): ++ self["have_systemd"] = not self.rsh(self.target, "systemctl list-units") ++ + self.detect_syslog() + self.detect_at_boot() + self.detect_ip_offset() +diff --git a/fencing/standalone_config.c b/fencing/standalone_config.c +index 01c22b6..4319c4a 100644 +--- a/fencing/standalone_config.c ++++ b/fencing/standalone_config.c +@@ -170,7 +170,7 @@ standalone_cfg_add_node(const char *node, const char *device, const char *ports) + + if (tmp) { + offset = strlen(tmp); +- tmp = realloc(tmp, len + offset + 1); ++ tmp = realloc_safe(tmp, len + offset + 1); + } else { + tmp = malloc(len); + } +diff --git a/include/crm_internal.h b/include/crm_internal.h +index 3eb88de..169d6d3 100644 +--- a/include/crm_internal.h ++++ b/include/crm_internal.h +@@ -341,4 +341,16 @@ void cib_ipc_servers_destroy(qb_ipcs_service_t *ipcs_ro, + qb_ipcs_service_t *ipcs_rw, + qb_ipcs_service_t *ipcs_shm); + ++static inline void *realloc_safe(void *ptr, size_t size) ++{ ++ void *ret = realloc(ptr, size); ++ ++ if(ret == NULL) { ++ abort(); ++ } ++ ++ return ret; ++} ++ ++ + #endif /* CRM_INTERNAL__H */ +diff --git a/lib/ais/plugin.c b/lib/ais/plugin.c +index 3d4f369..ab534fa 100644 +--- a/lib/ais/plugin.c ++++ b/lib/ais/plugin.c +@@ -1214,7 +1214,7 @@ pcmk_generate_membership_data(void) + + g_hash_table_foreach(membership_list, member_loop_fn, &data); + size = strlen(data.string); +- data.string = realloc(data.string, size + 9); /* 9 = + nul */ ++ data.string = realloc_safe(data.string, size + 9); /* 9 = + nul */ + sprintf(data.string + size, ""); + return data.string; + } +diff --git a/lib/ais/utils.c b/lib/ais/utils.c +index e56fb6d..94a2505 100644 +--- a/lib/ais/utils.c ++++ b/lib/ais/utils.c +@@ -409,7 +409,7 @@ append_member(char *data, crm_node_t * node) + if (node->version) { + size += (9 + strlen(node->version)); + } +- data = realloc(data, size); ++ data = realloc_safe(data, size); + + offset += snprintf(data + offset, size - offset, "id); + if (node->uname) { +diff --git a/lib/cluster/cpg.c b/lib/cluster/cpg.c +index 6c86e83..cda6326 100644 +--- a/lib/cluster/cpg.c ++++ b/lib/cluster/cpg.c +@@ -584,7 +584,7 @@ send_cluster_text(int class, const char *data, + msg->header.size = sizeof(AIS_Message) + msg->size; + + if (msg->size < CRM_BZ2_THRESHOLD) { +- msg = realloc(msg, msg->header.size); ++ msg = realloc_safe(msg, msg->header.size); + memcpy(msg->data, data, msg->size); + + } else { +@@ -595,14 +595,14 @@ send_cluster_text(int class, const char *data, + if (crm_compress_string(uncompressed, msg->size, 0, &compressed, &new_size)) { + + msg->header.size = sizeof(AIS_Message) + new_size; +- msg = realloc(msg, msg->header.size); ++ msg = realloc_safe(msg, msg->header.size); + memcpy(msg->data, compressed, new_size); + + msg->is_compressed = TRUE; + msg->compressed_size = new_size; + + } else { +- msg = realloc(msg, msg->header.size); ++ msg = realloc_safe(msg, msg->header.size); + memcpy(msg->data, data, msg->size); + } + +diff --git a/lib/cluster/heartbeat.c b/lib/cluster/heartbeat.c +index a801c8e..6f6a388 100644 +--- a/lib/cluster/heartbeat.c ++++ b/lib/cluster/heartbeat.c +@@ -106,7 +106,7 @@ convert_ha_field(xmlNode * parent, void *msg_v, int lpc) + + crm_trace("Trying to decompress %d bytes", (int)orig_len); + retry: +- uncompressed = realloc(uncompressed, size); ++ uncompressed = realloc_safe(uncompressed, size); + memset(uncompressed, 0, size); + used = size - 1; /* always leave room for a trailing '\0' + * BZ2_bzBuffToBuffDecompress wont say anything if +diff --git a/lib/common/logging.c b/lib/common/logging.c +index d64b77a..f211d80 100644 +--- a/lib/common/logging.c ++++ b/lib/common/logging.c +@@ -956,7 +956,7 @@ crm_log_args(int argc, char **argv) + } + + len = 2 + strlen(argv[lpc]); /* +1 space, +1 EOS */ +- arg_string = realloc(arg_string, len + existing_len); ++ arg_string = realloc_safe(arg_string, len + existing_len); + existing_len += sprintf(arg_string + existing_len, "%s ", argv[lpc]); + } + +diff --git a/lib/common/remote.c b/lib/common/remote.c +index f11ebcd..2a5b449 100644 +--- a/lib/common/remote.c ++++ b/lib/common/remote.c +@@ -520,7 +520,7 @@ crm_remote_recv_once(crm_remote_t * remote) + remote->buffer_size = 2 * read_len; + crm_trace("Expanding buffer to %u bytes", remote->buffer_size); + +- remote->buffer = realloc(remote->buffer, remote->buffer_size + 1); ++ remote->buffer = realloc_safe(remote->buffer, remote->buffer_size + 1); + CRM_ASSERT(remote->buffer != NULL); + } + +diff --git a/lib/common/utils.c b/lib/common/utils.c +index eacd8e9..d70778d 100644 +--- a/lib/common/utils.c ++++ b/lib/common/utils.c +@@ -1712,7 +1712,7 @@ crm_create_long_opts(struct crm_option *long_options) + * This dummy entry allows us to differentiate between the two in crm_get_option() + * and exit with the correct error code + */ +- long_opts = realloc(long_opts, (index + 1) * sizeof(struct option)); ++ long_opts = realloc_safe(long_opts, (index + 1) * sizeof(struct option)); + long_opts[index].name = "__dummmy__"; + long_opts[index].has_arg = 0; + long_opts[index].flag = 0; +@@ -1724,7 +1724,7 @@ crm_create_long_opts(struct crm_option *long_options) + continue; + } + +- long_opts = realloc(long_opts, (index + 1) * sizeof(struct option)); ++ long_opts = realloc_safe(long_opts, (index + 1) * sizeof(struct option)); + /*fprintf(stderr, "Creating %d %s = %c\n", index, + * long_options[lpc].name, long_options[lpc].val); */ + long_opts[index].name = long_options[lpc].name; +@@ -1735,7 +1735,7 @@ crm_create_long_opts(struct crm_option *long_options) + } + + /* Now create the list terminator */ +- long_opts = realloc(long_opts, (index + 1) * sizeof(struct option)); ++ long_opts = realloc_safe(long_opts, (index + 1) * sizeof(struct option)); + long_opts[index].name = NULL; + long_opts[index].has_arg = 0; + long_opts[index].flag = 0; +@@ -1759,7 +1759,7 @@ crm_set_options(const char *short_options, const char *app_usage, struct crm_opt + + for (lpc = 0; long_options[lpc].name != NULL; lpc++) { + if (long_options[lpc].val && long_options[lpc].val != '-' && long_options[lpc].val < UCHAR_MAX) { +- local_short_options = realloc(local_short_options, opt_string_len + 4); ++ local_short_options = realloc_safe(local_short_options, opt_string_len + 4); + local_short_options[opt_string_len++] = long_options[lpc].val; + /* getopt(3) says: Two colons mean an option takes an optional arg; */ + if (long_options[lpc].has_arg == optional_argument) { +@@ -2517,7 +2517,7 @@ add_list_element(char *list, const char *value) + } + len = last + 2; /* +1 space, +1 EOS */ + len += strlen(value); +- list = realloc(list, len); ++ list = realloc_safe(list, len); + sprintf(list + last, " %s", value); + return list; + } +diff --git a/lib/common/xml.c b/lib/common/xml.c +index e63a582..0effd47 100644 +--- a/lib/common/xml.c ++++ b/lib/common/xml.c +@@ -206,7 +206,7 @@ static inline bool TRACKING_CHANGES(xmlNode *xml) + } else if(rc >= ((max) - (offset))) { \ + char *tmp = NULL; \ + (max) = QB_MAX(CHUNK_SIZE, (max) * 2); \ +- tmp = realloc((buffer), (max) + 1); \ ++ tmp = realloc_safe((buffer), (max) + 1); \ + CRM_ASSERT(tmp); \ + (buffer) = tmp; \ + } else { \ +@@ -223,7 +223,7 @@ insert_prefix(int options, char **buffer, int *offset, int *max, int depth) + + if ((*buffer) == NULL || spaces >= ((*max) - (*offset))) { + (*max) = QB_MAX(CHUNK_SIZE, (*max) * 2); +- (*buffer) = realloc((*buffer), (*max) + 1); ++ (*buffer) = realloc_safe((*buffer), (*max) + 1); + } + memset((*buffer) + (*offset), ' ', spaces); + (*offset) += spaces; +@@ -305,7 +305,7 @@ static void __xml_schema_add( + int last = xml_schema_max; + + xml_schema_max++; +- known_schemas = realloc(known_schemas, xml_schema_max*sizeof(struct schema_s)); ++ known_schemas = realloc_safe(known_schemas, xml_schema_max*sizeof(struct schema_s)); + CRM_ASSERT(known_schemas != NULL); + memset(known_schemas+last, 0, sizeof(struct schema_s)); + known_schemas[last].type = type; +@@ -2759,6 +2759,7 @@ create_xml_node(xmlNode * parent, const char *name) + xmlNode *node = NULL; + + if (name == NULL || name[0] == 0) { ++ CRM_CHECK(name != NULL || name[0] == 0, return NULL); + return NULL; + } + +@@ -2905,7 +2906,7 @@ crm_xml_err(void *ctx, const char *msg, ...) + buf = NULL; + + } else { +- buffer = realloc(buffer, 1 + buffer_len + len); ++ buffer = realloc_safe(buffer, 1 + buffer_len + len); + memcpy(buffer + buffer_len, buf, len); + buffer_len += len; + buffer[buffer_len] = 0; +@@ -2997,7 +2998,7 @@ stdin2xml(void) + break; + } + +- xml_buffer = realloc(xml_buffer, next); ++ xml_buffer = realloc_safe(xml_buffer, next); + read_chars = fread(xml_buffer + data_length, 1, XML_BUFFER_SIZE, stdin); + data_length += read_chars; + } while (read_chars > 0); +@@ -3043,7 +3044,7 @@ decompress_file(const char *filename) + + rc = BZ_OK; + while (rc == BZ_OK) { +- buffer = realloc(buffer, XML_BUFFER_SIZE + length + 1); ++ buffer = realloc_safe(buffer, XML_BUFFER_SIZE + length + 1); + read_len = BZ2_bzRead(&rc, bz_file, buffer + length, XML_BUFFER_SIZE); + + crm_trace("Read %ld bytes from file: %d", (long)read_len, rc); +@@ -3301,7 +3302,7 @@ crm_xml_escape_shuffle(char *text, int start, int *length, const char *replace) + int offset = strlen(replace) - 1; /* We have space for 1 char already */ + + *length += offset; +- text = realloc(text, *length); ++ text = realloc_safe(text, *length); + + for (lpc = (*length) - 1; lpc > (start + offset); lpc--) { + text[lpc] = text[lpc - offset]; +@@ -5369,7 +5370,7 @@ crm_xml_init(void) + if(init) { + init = FALSE; + /* The default allocator XML_BUFFER_ALLOC_EXACT does far too many +- * realloc()s and it can take upwards of 18 seconds (yes, seconds) ++ * realloc_safe()s and it can take upwards of 18 seconds (yes, seconds) + * to dump a 28kb tree which XML_BUFFER_ALLOC_DOUBLEIT can do in + * less than 1 second. + */ +@@ -5987,7 +5988,7 @@ get_xpath_object_relative(const char *xpath, xmlNode * xml_obj, int error_level) + len += strlen(xpath); + + xpath_full = strdup(xpath_prefix); +- xpath_full = realloc(xpath_full, len + 1); ++ xpath_full = realloc_safe(xpath_full, len + 1); + strncat(xpath_full, xpath, len); + + result = get_xpath_object(xpath_full, xml_obj, error_level); +diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c +index 06b9492..e51d673 100644 +--- a/lib/fencing/st_client.c ++++ b/lib/fencing/st_client.c +@@ -308,7 +308,7 @@ append_arg(gpointer key, gpointer value, gpointer user_data) + last = strlen(*args); + } + +- *args = realloc(*args, last + len); ++ *args = realloc_safe(*args, last + len); + crm_trace("Appending: %s=%s", (char *)key, (char *)value); + sprintf((*args) + last, "%s=%s\n", (char *)key, (char *)value); + } +@@ -627,7 +627,7 @@ read_output(int fd) + * 'more' is always less than our buffer size + */ + crm_trace("Got %d more bytes: %.200s...", more, buffer); +- output = realloc(output, len + more + 1); ++ output = realloc_safe(output, len + more + 1); + snprintf(output + len, more + 1, "%s", buffer); + len += more; + } +diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c +index 8d6f450..de29706 100644 +--- a/lib/services/services_linux.c ++++ b/lib/services/services_linux.c +@@ -94,7 +94,7 @@ svc_read_output(int fd, svc_action_t * op, bool is_stderr) + if (rc > 0) { + crm_trace("Got %d characters starting with %.20s", rc, buf); + buf[rc] = 0; +- data = realloc(data, len + rc + 1); ++ data = realloc_safe(data, len + rc + 1); + len += sprintf(data + len, "%s", buf); + + } else if (errno != EINTR) { +diff --git a/lib/services/systemd.c b/lib/services/systemd.c +index a8bf1b4..c0a1721 100644 +--- a/lib/services/systemd.c ++++ b/lib/services/systemd.c +@@ -462,10 +462,11 @@ systemd_async_dispatch(DBusPendingCall *pending, void *user_data) + if(op) { + crm_trace("Got result: %p for %p for %s, %s", reply, pending, op->rsc, op->action); + op->opaque->pending = NULL; ++ systemd_exec_result(reply, op); ++ + } else { + crm_trace("Got result: %p for %p", reply, pending); + } +- systemd_exec_result(reply, op); + + if(pending) { + dbus_pending_call_unref(pending); +@@ -491,6 +492,8 @@ systemd_unit_check(const char *name, const char *state, void *userdata) + op->rc = PCMK_OCF_OK; + } else if (g_strcmp0(state, "activating") == 0) { + op->rc = PCMK_OCF_PENDING; ++ } else if (g_strcmp0(state, "deactivating") == 0) { ++ op->rc = PCMK_OCF_PENDING; + } else { + op->rc = PCMK_OCF_NOT_RUNNING; + } +diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c +index d3ede18..0f5f529 100644 +--- a/lrmd/lrmd.c ++++ b/lrmd/lrmd.c +@@ -790,10 +790,30 @@ action_complete(svc_action_t * action) + cmd->real_action = cmd->action; + cmd->action = strdup("monitor"); + ++ } else if(cmd->exec_rc == PCMK_OCF_OK && safe_str_eq(cmd->action, "stop")) { ++ goagain = true; ++ cmd->real_action = cmd->action; ++ cmd->action = strdup("monitor"); ++ + } else if(cmd->real_action) { + /* Ok, so this is the follow up monitor action to check if start actually completed */ + if(cmd->lrmd_op_status == PCMK_LRM_OP_DONE && cmd->exec_rc == PCMK_OCF_PENDING) { + goagain = true; ++ ++ } else { ++ int time_sum = 0; ++ int timeout_left = 0; ++ struct timeb now = { 0, }; ++ ++ ftime(&now); ++ time_sum = time_diff_ms(&now, &cmd->t_first_run); ++ timeout_left = cmd->timeout_orig - time_sum; ++ crm_debug("%s %s is now complete (elapsed=%dms, remaining=%dms): %s (%d)", ++ cmd->rsc_id, cmd->real_action, time_sum, timeout_left, services_ocf_exitcode_str(cmd->exec_rc), cmd->exec_rc); ++ ++ if(cmd->lrmd_op_status == PCMK_LRM_OP_DONE && cmd->exec_rc == PCMK_OCF_NOT_RUNNING && safe_str_eq(cmd->real_action, "stop")) { ++ cmd->exec_rc = PCMK_OCF_OK; ++ } + } + } + } +@@ -827,13 +847,22 @@ action_complete(svc_action_t * action) + delay = timeout_left/2; + } + ++ delay = QB_MIN(2000, delay); + if (delay < timeout_left) { + cmd->start_delay = delay; + cmd->timeout = timeout_left; + +- if(cmd->exec_rc != PCMK_OCF_OK) { +- crm_info("%s %s failed (rc=%d): re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", +- cmd->rsc_id, cmd->action, cmd->exec_rc, time_sum, timeout_left, delay); ++ if(cmd->exec_rc == PCMK_OCF_OK) { ++ crm_debug("%s %s may still be in progress: re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", ++ cmd->rsc_id, cmd->real_action, time_sum, timeout_left, delay); ++ ++ } else if(cmd->exec_rc == PCMK_OCF_PENDING) { ++ crm_info("%s %s is still in progress: re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", ++ cmd->rsc_id, cmd->action, time_sum, timeout_left, delay); ++ ++ } else { ++ crm_notice("%s %s failed '%s' (%d): re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", ++ cmd->rsc_id, cmd->action, services_ocf_exitcode_str(cmd->exec_rc), cmd->exec_rc, time_sum, timeout_left, delay); + } + + cmd_reset(cmd); +diff --git a/pengine/allocate.c b/pengine/allocate.c +index 45e2212..748ca54 100644 +--- a/pengine/allocate.c ++++ b/pengine/allocate.c +@@ -1913,7 +1913,7 @@ expand_list(GListPtr list, char **rsc_list, char **node_list) + } + + crm_trace("Adding %s (%dc) at offset %d", rsc_id, len - 2, existing_len); +- *rsc_list = realloc(*rsc_list, len + existing_len); ++ *rsc_list = realloc_safe(*rsc_list, len + existing_len); + sprintf(*rsc_list + existing_len, "%s ", rsc_id); + } + +@@ -1930,7 +1930,7 @@ expand_list(GListPtr list, char **rsc_list, char **node_list) + } + + crm_trace("Adding %s (%dc) at offset %d", uname, len - 2, existing_len); +- *node_list = realloc(*node_list, len + existing_len); ++ *node_list = realloc_safe(*node_list, len + existing_len); + sprintf(*node_list + existing_len, "%s ", uname); + } + } +diff --git a/replace/scandir.c b/replace/scandir.c +index 7a8efea..0011630 100644 +--- a/replace/scandir.c ++++ b/replace/scandir.c +@@ -202,7 +202,7 @@ scandir(const char *directory_name, + if (counter + 1 == allocated) { + allocated <<= 1; + array = (struct dirent **) +- realloc((char *)array, allocated * sizeof(struct dirent *)); ++ realloc_safe((char *)array, allocated * sizeof(struct dirent *)); + if (array == NULL) { + closedir(directory); + free(array); +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index 6e510e1..236d43c 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -1399,16 +1399,20 @@ static void display_list(GList *items, const char *tag) + static int + update_dataset(cib_t *cib, pe_working_set_t * data_set, bool simulate) + { ++ char *pid = NULL; ++ char *shadow_file = NULL; ++ cib_t *shadow_cib = NULL; + xmlNode *cib_xml_copy = NULL; + int rc = cib->cmds->query(cib, NULL, &cib_xml_copy, cib_scope_local | cib_sync_call); + + if(rc != pcmk_ok) { + fprintf(stdout, "Could not obtain the current CIB: %s (%d)\n", pcmk_strerror(rc), rc); +- return crm_exit(rc); ++ goto cleanup; + + } else if (cli_config_update(&cib_xml_copy, NULL, FALSE) == FALSE) { + fprintf(stderr, "Could not upgrade the current CIB\n"); +- return -ENOKEY; ++ rc = -ENOKEY; ++ goto cleanup; + } + + set_working_set_defaults(data_set); +@@ -1416,70 +1420,103 @@ update_dataset(cib_t *cib, pe_working_set_t * data_set, bool simulate) + data_set->now = crm_time_new(NULL); + + if(simulate) { +- char *pid = crm_itoa(getpid()); +- cib_t *shadow_cib = cib_shadow_new(pid); +- char *shadow_file = get_shadow_file(pid); ++ pid = crm_itoa(getpid()); ++ shadow_cib = cib_shadow_new(pid); ++ shadow_file = get_shadow_file(pid); + + if (shadow_cib == NULL) { + fprintf(stderr, "Could not create shadow cib: '%s'\n", pid); +- crm_exit(-ENXIO); ++ rc = -ENXIO; ++ goto cleanup; + } + ++ free(pid); + rc = write_xml_file(cib_xml_copy, shadow_file, FALSE); + + if (rc < 0) { + fprintf(stderr, "Could not populate shadow cib: %s (%d)\n", pcmk_strerror(rc), rc); +- free_xml(cib_xml_copy); +- return rc; ++ goto cleanup; + } + + rc = shadow_cib->cmds->signon(shadow_cib, crm_system_name, cib_command); + if(rc != pcmk_ok) { + fprintf(stderr, "Could not connect to shadow cib: %s (%d)\n", pcmk_strerror(rc), rc); +- free_xml(cib_xml_copy); +- return rc; ++ goto cleanup; + } + + do_calculations(data_set, cib_xml_copy, NULL); + run_simulation(data_set, shadow_cib, NULL, TRUE); + rc = update_dataset(shadow_cib, data_set, FALSE); + +- cib_delete(shadow_cib); +- /* unlink(shadow_file); */ +- free(shadow_file); +- + } else { + cluster_status(data_set); + } + ++ cleanup: ++ cib_delete(shadow_cib); ++ free_xml(cib_xml_copy); ++ free(pid); ++ ++ if(shadow_file) { ++ unlink(shadow_file); ++ free(shadow_file); ++ } ++ + return rc; + } + + static int +-max_delay_in(pe_working_set_t * data_set, GList *resources) ++max_delay_for_resource(pe_working_set_t * data_set, resource_t *rsc) + { ++ int delay = 0; + int max_delay = 0; +- GList *item = NULL; + +- for (item = resources; item != NULL; item = item->next) { +- resource_t *rsc = pe_find_resource(data_set->resources, (const char *)item->data); ++ if(rsc && rsc->children) { ++ GList *iter = NULL; + +- if(rsc) { +- char *key = g_strdup_printf("%s_%s_0", rsc->id, RSC_STOP); +- action_t *stop = custom_action(rsc, key, RSC_STOP, NULL, TRUE, FALSE, data_set); +- const char *value = g_hash_table_lookup(stop->meta, XML_ATTR_TIMEOUT); +- int delay = crm_int_helper(value, NULL); ++ for(iter = rsc->children; iter; iter = iter->next) { ++ resource_t *child = (resource_t *)iter->data; + ++ delay = max_delay_for_resource(data_set, child); + if(delay > max_delay) { +- crm_trace("Calculated new delay of %s ms due to %s", value, rsc->id); ++ double seconds = delay / 1000; ++ crm_trace("Calculated new delay of %.1fs due to %s", seconds, child->id); + max_delay = delay; + } +- +- pe_free_action(stop); + } ++ ++ } else if(rsc) { ++ char *key = g_strdup_printf("%s_%s_0", rsc->id, RSC_STOP); ++ action_t *stop = custom_action(rsc, key, RSC_STOP, NULL, TRUE, FALSE, data_set); ++ const char *value = g_hash_table_lookup(stop->meta, XML_ATTR_TIMEOUT); ++ ++ max_delay = crm_int_helper(value, NULL); ++ pe_free_action(stop); + } + + ++ return max_delay; ++} ++ ++static int ++max_delay_in(pe_working_set_t * data_set, GList *resources) ++{ ++ int max_delay = 0; ++ GList *item = NULL; ++ ++ for (item = resources; item != NULL; item = item->next) { ++ int delay = 0; ++ resource_t *rsc = pe_find_resource(data_set->resources, (const char *)item->data); ++ ++ delay = max_delay_for_resource(data_set, rsc); ++ ++ if(delay > max_delay) { ++ double seconds = delay / 1000; ++ crm_trace("Calculated new delay of %.1fs due to %s", seconds, rsc->id); ++ max_delay = delay; ++ } ++ } ++ + return 5 + (max_delay / 1000); + } + +@@ -1507,7 +1544,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + return -ENXIO; + } + +- ++ attr_set_type = XML_TAG_META_SETS; + rsc_id = strdup(rsc->id); + if(rsc->variant > pe_group) { + is_clone = TRUE; +@@ -1536,6 +1573,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + rc = update_dataset(cib, &data_set, FALSE); + if(rc != pcmk_ok) { + fprintf(stdout, "Could not get new resource list: %s (%d)\n", pcmk_strerror(rc), rc); ++ free(rsc_id); + return rc; + } + +@@ -1553,6 +1591,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + } + if(rc != pcmk_ok) { + fprintf(stderr, "Could not set target-role for %s: %s (%d)\n", rsc_id, pcmk_strerror(rc), rc); ++ free(rsc_id); + return crm_exit(rc); + } + +@@ -1615,6 +1654,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + + if(rc != pcmk_ok) { + fprintf(stderr, "Could not unset target-role for %s: %s (%d)\n", rsc_id, pcmk_strerror(rc), rc); ++ free(rsc_id); + return crm_exit(rc); + } + +@@ -1659,6 +1699,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + + } while(g_list_length(list_delta) > 0); + ++ free(rsc_id); + return pcmk_ok; + + failure: +@@ -1668,6 +1709,7 @@ resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib + } else { + delete_resource_attr(rsc_id, NULL, NULL, XML_RSC_ATTR_TARGET_ROLE, cib, &data_set); + } ++ free(rsc_id); + return rc; + } + diff --git a/SOURCES/bz1176210-handle-orphaned-remote-nodes.patch b/SOURCES/bz1176210-handle-orphaned-remote-nodes.patch new file mode 100644 index 0000000..9331bab --- /dev/null +++ b/SOURCES/bz1176210-handle-orphaned-remote-nodes.patch @@ -0,0 +1,816 @@ +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index bdd6450..39756b1 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1828,7 +1828,7 @@ process_rsc_state(resource_t * rsc, node_t * node, + + should_fence = TRUE; + } else if (is_set(data_set->flags, pe_flag_stonith_enabled)) { +- if (is_baremetal_remote_node(node) && is_not_set(node->details->remote_rsc->flags, pe_rsc_failed)) { ++ if (is_baremetal_remote_node(node) && node->details->remote_rsc && is_not_set(node->details->remote_rsc->flags, pe_rsc_failed)) { + /* setting unseen = true means that fencing of the remote node will + * only occur if the connection resource is not going to start somewhere. + * This allows connection resources on a failed cluster-node to move to +diff --git a/pengine/allocate.c b/pengine/allocate.c +index 3241273..7dd70f1 100644 +--- a/pengine/allocate.c ++++ b/pengine/allocate.c +@@ -1636,6 +1636,7 @@ apply_remote_node_ordering(pe_working_set_t *data_set) + + if (action->node == NULL || + is_remote_node(action->node) == FALSE || ++ action->node->details->remote_rsc == NULL || + action->rsc == NULL || + is_set(action->flags, pe_action_pseudo)) { + continue; +diff --git a/pengine/regression.sh b/pengine/regression.sh +index 9172acb..93d4de1 100755 +--- a/pengine/regression.sh ++++ b/pengine/regression.sh +@@ -778,6 +778,7 @@ do_test remote-fence-unclean2 "Fence baremetal remote-node after cluster node f + do_test remote-move "Move remote-node connection resource" + do_test remote-disable "Disable a baremetal remote-node" + do_test remote-orphaned "Properly shutdown orphaned connection resource" ++do_test remote-orphaned2 "verify we can handle orphaned remote connections with active resources on the remote" + 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" + do_test remote-partial-migrate "Make sure partial migrations are handled before ops on the remote node." +diff --git a/pengine/test10/remote-orphaned2.dot b/pengine/test10/remote-orphaned2.dot +new file mode 100644 +index 0000000..d8f1c9f +--- /dev/null ++++ b/pengine/test10/remote-orphaned2.dot +@@ -0,0 +1,2 @@ ++ digraph "g" { ++} +diff --git a/pengine/test10/remote-orphaned2.exp b/pengine/test10/remote-orphaned2.exp +new file mode 100644 +index 0000000..56e315f +--- /dev/null ++++ b/pengine/test10/remote-orphaned2.exp +@@ -0,0 +1 @@ ++ +diff --git a/pengine/test10/remote-orphaned2.scores b/pengine/test10/remote-orphaned2.scores +new file mode 100644 +index 0000000..98853b1 +--- /dev/null ++++ b/pengine/test10/remote-orphaned2.scores +@@ -0,0 +1 @@ ++Allocation scores: +diff --git a/pengine/test10/remote-orphaned2.summary b/pengine/test10/remote-orphaned2.summary +new file mode 100644 +index 0000000..f4e5e17 +--- /dev/null ++++ b/pengine/test10/remote-orphaned2.summary +@@ -0,0 +1,27 @@ ++ ++Current cluster status: ++RemoteNode mrg-02: UNCLEAN (offline) ++RemoteNode mrg-03: UNCLEAN (offline) ++RemoteNode mrg-04: UNCLEAN (offline) ++Online: [ host-026 host-027 host-028 ] ++ ++ neutron-openvswitch-agent-compute (ocf::heartbeat:Dummy): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ libvirtd-compute (systemd:libvirtd): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ ceilometer-compute (systemd:openstack-ceilometer-compute): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ nova-compute (systemd:openstack-nova-compute): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ ++Transition Summary: ++ ++Executing cluster transition: ++ ++Revised cluster status: ++RemoteNode mrg-02: UNCLEAN (offline) ++RemoteNode mrg-03: UNCLEAN (offline) ++RemoteNode mrg-04: UNCLEAN (offline) ++Online: [ host-026 host-027 host-028 ] ++ ++ neutron-openvswitch-agent-compute (ocf::heartbeat:Dummy): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ libvirtd-compute (systemd:libvirtd): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ ceilometer-compute (systemd:openstack-ceilometer-compute): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ nova-compute (systemd:openstack-nova-compute): ORPHANED Started [ mrg-03 mrg-02 mrg-04 ] ++ +diff --git a/pengine/test10/remote-orphaned2.xml b/pengine/test10/remote-orphaned2.xml +new file mode 100644 +index 0000000..0bf6d33 +--- /dev/null ++++ b/pengine/test10/remote-orphaned2.xml +@@ -0,0 +1,718 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ diff --git a/SOURCES/bz1176210-require-all.patch b/SOURCES/bz1176210-require-all.patch new file mode 100644 index 0000000..21fbac5 --- /dev/null +++ b/SOURCES/bz1176210-require-all.patch @@ -0,0 +1,5799 @@ +diff --git a/include/crm/crm.h b/include/crm/crm.h +index 41279b0..37bc5ce 100644 +--- a/include/crm/crm.h ++++ b/include/crm/crm.h +@@ -133,6 +133,7 @@ extern char *crm_system_name; + # define CRM_OP_REPROBE "probe_again" + # define CRM_OP_CLEAR_FAILCOUNT "clear_failcount" + # define CRM_OP_RELAXED_SET "one-or-more" ++# define CRM_OP_RELAXED_CLONE "clone-one-or-more" + # define CRM_OP_RM_NODE_CACHE "rm_node_cache" + + # define CRMD_JOINSTATE_DOWN "down" +diff --git a/pengine/constraints.c b/pengine/constraints.c +index a2ce9c4..7054a8e 100644 +--- a/pengine/constraints.c ++++ b/pengine/constraints.c +@@ -255,6 +255,7 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) + resource_t *rsc_then = NULL; + resource_t *rsc_first = NULL; + gboolean invert_bool = TRUE; ++ gboolean require_all = TRUE; + enum pe_order_kind kind = pe_order_kind_mandatory; + enum pe_ordering cons_weight = pe_order_optional; + +@@ -264,6 +265,7 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) + const char *action_first = NULL; + const char *instance_then = NULL; + const char *instance_first = NULL; ++ const char *require_all_s = NULL; + + const char *id = crm_element_value(xml_obj, XML_ATTR_ID); + const char *invert = crm_element_value(xml_obj, XML_CONS_ATTR_SYMMETRICAL); +@@ -343,6 +345,14 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) + } + } + ++ require_all_s = crm_element_value(xml_obj, "require-all"); ++ if (require_all_s ++ && crm_is_true(require_all_s) == FALSE ++ && rsc_first->variant >= pe_clone) { ++ ++ require_all = FALSE; ++ } ++ + cons_weight = pe_order_optional; + kind = get_ordering_type(xml_obj); + +@@ -356,7 +366,29 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) + } else { + cons_weight |= get_flags(id, kind, action_first, action_then, FALSE); + } +- order_id = new_rsc_order(rsc_first, action_first, rsc_then, action_then, cons_weight, data_set); ++ ++ if (require_all == FALSE) { ++ GListPtr rIter = NULL; ++ char *task = crm_concat(CRM_OP_RELAXED_CLONE, id, ':'); ++ action_t *unordered_action = get_pseudo_op(task, data_set); ++ free(task); ++ ++ update_action_flags(unordered_action, pe_action_requires_any); ++ ++ for (rIter = rsc_first->children; id && rIter; rIter = rIter->next) { ++ resource_t *child = rIter->data; ++ ++ custom_action_order(child, generate_op_key(child->id, action_first, 0), NULL, ++ NULL, NULL, unordered_action, ++ pe_order_one_or_more | pe_order_implies_then_printed, data_set); ++ } ++ ++ order_id = custom_action_order(NULL, NULL, unordered_action, ++ rsc_then, generate_op_key(rsc_then->id, action_then, 0), NULL, ++ cons_weight | pe_order_runnable_left, data_set); ++ } else { ++ order_id = new_rsc_order(rsc_first, action_first, rsc_then, action_then, cons_weight, data_set); ++ } + + pe_rsc_trace(rsc_first, "order-%d (%s): %s_%s before %s_%s flags=0x%.6x", + order_id, id, rsc_first->id, action_first, rsc_then->id, action_then, cons_weight); +@@ -387,6 +419,7 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) + } + + cons_weight |= get_flags(id, kind, action_first, action_then, TRUE); ++ + order_id = new_rsc_order(rsc_then, action_then, rsc_first, action_first, cons_weight, data_set); + + pe_rsc_trace(rsc_then, "order-%d (%s): %s_%s before %s_%s flags=0x%.6x", +diff --git a/pengine/regression.sh b/pengine/regression.sh +index 3a244d7..c2bc7fb 100755 +--- a/pengine/regression.sh ++++ b/pengine/regression.sh +@@ -126,6 +126,16 @@ do_test one-or-more-5 "Start A and F even though C and D are stopped" + do_test one-or-more-6 "Leave A running even though B is stopped" + do_test one-or-more-7 "Leave A running even though C is stopped" + do_test bug-5140-require-all-false "Allow basegrp:0 to stop" ++do_test clone-require-all-1 "clone B starts node 3 and 4" ++do_test clone-require-all-2 "clone B remains stopped everywhere" ++do_test clone-require-all-3 "clone B stops everywhere because A stops everywhere" ++do_test clone-require-all-4 "clone B remains on node 3 and 4 with only one instance of A remaining." ++do_test clone-require-all-5 "clone B starts on node 1 3 and 4" ++do_test clone-require-all-6 "clone B remains active after shutting down instances of A" ++do_test clone-require-all-7 "clone A and B both start at the same time. all instances of A start before B." ++do_test clone-require-all-no-interleave-1 "C starts everywhere after A and B" ++do_test clone-require-all-no-interleave-2 "C starts on nodes 1, 2, and 4 with only one active instance of B" ++do_test clone-require-all-no-interleave-3 "C remains active when instance of B is stopped on one node and started on another." + + echo "" + do_test order1 "Order start 1 " +diff --git a/pengine/test10/clone-require-all-1.dot b/pengine/test10/clone-require-all-1.dot +new file mode 100644 +index 0000000..9856969 +--- /dev/null ++++ b/pengine/test10/clone-require-all-1.dot +@@ -0,0 +1,15 @@ ++ digraph "g" { ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B:1_start_0 rhel7-auto4" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto3" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B:1_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B:1_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = bold] ++"B:1_start_0 rhel7-auto4" -> "B:1_monitor_10000 rhel7-auto4" [ style = bold] ++"B:1_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto3" -> "B_monitor_10000 rhel7-auto3" [ style = bold] ++"B_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/clone-require-all-1.exp b/pengine/test10/clone-require-all-1.exp +new file mode 100644 +index 0000000..c2d1abd +--- /dev/null ++++ b/pengine/test10/clone-require-all-1.exp +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-1.scores b/pengine/test10/clone-require-all-1.scores +new file mode 100644 +index 0000000..fe3ce21 +--- /dev/null ++++ b/pengine/test10/clone-require-all-1.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 1 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: 1 ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: 0 ++native_color: A:1 allocation score on rhel7-auto2: 1 ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: 0 ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-1.summary b/pengine/test10/clone-require-all-1.summary +new file mode 100644 +index 0000000..2cbb97d +--- /dev/null ++++ b/pengine/test10/clone-require-all-1.summary +@@ -0,0 +1,34 @@ ++ ++Current cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Start B:0 (rhel7-auto3) ++ * Start B:1 (rhel7-auto4) ++ ++Executing cluster transition: ++ * Pseudo action: B-clone_start_0 ++ * Resource action: B start on rhel7-auto3 ++ * Resource action: B start on rhel7-auto4 ++ * Pseudo action: B-clone_running_0 ++ * Resource action: B monitor=10000 on rhel7-auto3 ++ * Resource action: B monitor=10000 on rhel7-auto4 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 ] ++ +diff --git a/pengine/test10/clone-require-all-1.xml b/pengine/test10/clone-require-all-1.xml +new file mode 100644 +index 0000000..724fac1 +--- /dev/null ++++ b/pengine/test10/clone-require-all-1.xml +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-2.dot b/pengine/test10/clone-require-all-2.dot +new file mode 100644 +index 0000000..4f830ce +--- /dev/null ++++ b/pengine/test10/clone-require-all-2.dot +@@ -0,0 +1,42 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=dashed color="red" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = dashed] ++"A-clone_start_0" -> "A_start_0 " [ style = dashed] ++"A-clone_start_0" [ style=dashed color="red" fontcolor="orange"] ++"A-clone_stop_0" -> "A-clone_stopped_0" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto1" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto2" [ style = bold] ++"A-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stopped_0" -> "A-clone_start_0" [ style = dashed] ++"A-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"A_start_0 " -> "A-clone_running_0" [ style = dashed] ++"A_start_0 " [ style=dashed color="red" fontcolor="black"] ++"A_stop_0 rhel7-auto1" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto1" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"A_stop_0 rhel7-auto2" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto2" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto2" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=dashed color="red" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = dashed] ++"B-clone_start_0" -> "B:1_start_0 rhel7-auto3" [ style = dashed] ++"B-clone_start_0" -> "B_start_0 rhel7-auto4" [ style = dashed] ++"B-clone_start_0" [ style=dashed color="red" fontcolor="orange"] ++"B:1_monitor_10000 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] ++"B:1_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = dashed] ++"B:1_start_0 rhel7-auto3" -> "B:1_monitor_10000 rhel7-auto3" [ style = dashed] ++"B:1_start_0 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] ++"B_monitor_10000 rhel7-auto4" [ style=dashed color="red" fontcolor="black"] ++"B_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = dashed] ++"B_start_0 rhel7-auto4" -> "B_monitor_10000 rhel7-auto4" [ style = dashed] ++"B_start_0 rhel7-auto4" [ style=dashed color="red" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"shooter_monitor_60000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"shooter_start_0 rhel7-auto3" -> "shooter_monitor_60000 rhel7-auto3" [ style = bold] ++"shooter_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"shooter_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"shooter_stop_0 rhel7-auto1" -> "shooter_start_0 rhel7-auto3" [ style = bold] ++"shooter_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/clone-require-all-2.exp b/pengine/test10/clone-require-all-2.exp +new file mode 100644 +index 0000000..a5ad63f +--- /dev/null ++++ b/pengine/test10/clone-require-all-2.exp +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-2.scores b/pengine/test10/clone-require-all-2.scores +new file mode 100644 +index 0000000..cdbf611 +--- /dev/null ++++ b/pengine/test10/clone-require-all-2.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 1 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: 0 ++native_color: B:1 allocation score on rhel7-auto4: -INFINITY ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-2.summary b/pengine/test10/clone-require-all-2.summary +new file mode 100644 +index 0000000..d4b2519 +--- /dev/null ++++ b/pengine/test10/clone-require-all-2.summary +@@ -0,0 +1,41 @@ ++ ++Current cluster status: ++Node rhel7-auto1 (1): standby ++Node rhel7-auto2 (2): standby ++Online: [ rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Move shooter (Started rhel7-auto1 -> rhel7-auto3) ++ * Stop A:0 (rhel7-auto1) ++ * Stop A:1 (rhel7-auto2) ++ * Start B:0 (rhel7-auto4 - blocked) ++ * Start B:1 (rhel7-auto3 - blocked) ++ ++Executing cluster transition: ++ * Resource action: shooter stop on rhel7-auto1 ++ * Pseudo action: A-clone_stop_0 ++ * Resource action: shooter start on rhel7-auto3 ++ * Resource action: A stop on rhel7-auto1 ++ * Resource action: A stop on rhel7-auto2 ++ * Pseudo action: A-clone_stopped_0 ++ * Pseudo action: all_stopped ++ * Resource action: shooter monitor=60000 on rhel7-auto3 ++ ++Revised cluster status: ++Node rhel7-auto1 (1): standby ++Node rhel7-auto2 (2): standby ++Online: [ rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto3 ++ Clone Set: A-clone [A] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ +diff --git a/pengine/test10/clone-require-all-2.xml b/pengine/test10/clone-require-all-2.xml +new file mode 100644 +index 0000000..1fd9576 +--- /dev/null ++++ b/pengine/test10/clone-require-all-2.xml +@@ -0,0 +1,160 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-3.dot b/pengine/test10/clone-require-all-3.dot +new file mode 100644 +index 0000000..d93693d +--- /dev/null ++++ b/pengine/test10/clone-require-all-3.dot +@@ -0,0 +1,57 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=dashed color="red" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = dashed] ++"A-clone_start_0" -> "A_start_0 " [ style = dashed] ++"A-clone_start_0" [ style=dashed color="red" fontcolor="orange"] ++"A-clone_stop_0" -> "A-clone_stopped_0" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto1" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto2" [ style = bold] ++"A-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stopped_0" -> "A-clone_start_0" [ style = dashed] ++"A-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"A_start_0 " -> "A-clone_running_0" [ style = dashed] ++"A_start_0 " [ style=dashed color="red" fontcolor="black"] ++"A_stop_0 rhel7-auto1" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto1" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"A_stop_0 rhel7-auto2" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto2" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto2" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=dashed color="red" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = dashed] ++"B-clone_start_0" -> "B_start_0 rhel7-auto3" [ style = dashed] ++"B-clone_start_0" -> "B_start_0 rhel7-auto4" [ style = dashed] ++"B-clone_start_0" [ style=dashed color="red" fontcolor="orange"] ++"B-clone_stop_0" -> "B-clone_stopped_0" [ style = bold] ++"B-clone_stop_0" -> "B_stop_0 rhel7-auto3" [ style = bold] ++"B-clone_stop_0" -> "B_stop_0 rhel7-auto4" [ style = bold] ++"B-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_stopped_0" -> "A-clone_stop_0" [ style = bold] ++"B-clone_stopped_0" -> "B-clone_start_0" [ style = dashed] ++"B-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"B_monitor_10000 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] ++"B_monitor_10000 rhel7-auto4" [ style=dashed color="red" fontcolor="black"] ++"B_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = dashed] ++"B_start_0 rhel7-auto3" -> "B_monitor_10000 rhel7-auto3" [ style = dashed] ++"B_start_0 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] ++"B_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = dashed] ++"B_start_0 rhel7-auto4" -> "B_monitor_10000 rhel7-auto4" [ style = dashed] ++"B_start_0 rhel7-auto4" [ style=dashed color="red" fontcolor="black"] ++"B_stop_0 rhel7-auto3" -> "B-clone_stopped_0" [ style = bold] ++"B_stop_0 rhel7-auto3" -> "B_start_0 rhel7-auto3" [ style = dashed] ++"B_stop_0 rhel7-auto3" -> "all_stopped" [ style = bold] ++"B_stop_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_stop_0 rhel7-auto4" -> "B-clone_stopped_0" [ style = bold] ++"B_stop_0 rhel7-auto4" -> "B_start_0 rhel7-auto4" [ style = dashed] ++"B_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"B_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"shooter_monitor_60000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"shooter_start_0 rhel7-auto3" -> "shooter_monitor_60000 rhel7-auto3" [ style = bold] ++"shooter_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"shooter_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"shooter_stop_0 rhel7-auto1" -> "shooter_start_0 rhel7-auto3" [ style = bold] ++"shooter_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/clone-require-all-3.exp b/pengine/test10/clone-require-all-3.exp +new file mode 100644 +index 0000000..02eea7a +--- /dev/null ++++ b/pengine/test10/clone-require-all-3.exp +@@ -0,0 +1,169 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-3.scores b/pengine/test10/clone-require-all-3.scores +new file mode 100644 +index 0000000..814a972 +--- /dev/null ++++ b/pengine/test10/clone-require-all-3.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 1 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 1 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 1 ++clone_color: B:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 1 ++native_color: B:0 allocation score on rhel7-auto4: -INFINITY ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: 0 ++native_color: B:1 allocation score on rhel7-auto4: 1 ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-3.summary b/pengine/test10/clone-require-all-3.summary +new file mode 100644 +index 0000000..68191b1 +--- /dev/null ++++ b/pengine/test10/clone-require-all-3.summary +@@ -0,0 +1,46 @@ ++ ++Current cluster status: ++Node rhel7-auto1 (1): standby ++Node rhel7-auto2 (2): standby ++Online: [ rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 ] ++ ++Transition Summary: ++ * Move shooter (Started rhel7-auto1 -> rhel7-auto3) ++ * Stop A:0 (rhel7-auto1) ++ * Stop A:1 (rhel7-auto2) ++ * Stop B:0 (Started rhel7-auto3) ++ * Stop B:1 (Started rhel7-auto4) ++ ++Executing cluster transition: ++ * Resource action: shooter stop on rhel7-auto1 ++ * Pseudo action: B-clone_stop_0 ++ * Resource action: shooter start on rhel7-auto3 ++ * Resource action: B stop on rhel7-auto3 ++ * Resource action: B stop on rhel7-auto4 ++ * Pseudo action: B-clone_stopped_0 ++ * Resource action: shooter monitor=60000 on rhel7-auto3 ++ * Pseudo action: A-clone_stop_0 ++ * Resource action: A stop on rhel7-auto1 ++ * Resource action: A stop on rhel7-auto2 ++ * Pseudo action: A-clone_stopped_0 ++ * Pseudo action: all_stopped ++ ++Revised cluster status: ++Node rhel7-auto1 (1): standby ++Node rhel7-auto2 (2): standby ++Online: [ rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto3 ++ Clone Set: A-clone [A] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ +diff --git a/pengine/test10/clone-require-all-3.xml b/pengine/test10/clone-require-all-3.xml +new file mode 100644 +index 0000000..b04f0e2 +--- /dev/null ++++ b/pengine/test10/clone-require-all-3.xml +@@ -0,0 +1,160 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-4.dot b/pengine/test10/clone-require-all-4.dot +new file mode 100644 +index 0000000..4b9521f +--- /dev/null ++++ b/pengine/test10/clone-require-all-4.dot +@@ -0,0 +1,24 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 " [ style = dashed] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stop_0" -> "A-clone_stopped_0" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto1" [ style = bold] ++"A-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stopped_0" -> "A-clone_start_0" [ style = bold] ++"A-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"A_start_0 " -> "A-clone_running_0" [ style = dashed] ++"A_start_0 " [ style=dashed color="red" fontcolor="black"] ++"A_stop_0 rhel7-auto1" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto1" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"shooter_monitor_60000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"shooter_start_0 rhel7-auto2" -> "shooter_monitor_60000 rhel7-auto2" [ style = bold] ++"shooter_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"shooter_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"shooter_stop_0 rhel7-auto1" -> "shooter_start_0 rhel7-auto2" [ style = bold] ++"shooter_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/clone-require-all-4.exp b/pengine/test10/clone-require-all-4.exp +new file mode 100644 +index 0000000..53c1529 +--- /dev/null ++++ b/pengine/test10/clone-require-all-4.exp +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-4.scores b/pengine/test10/clone-require-all-4.scores +new file mode 100644 +index 0000000..c602a1d +--- /dev/null ++++ b/pengine/test10/clone-require-all-4.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 1 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 1 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 1 ++clone_color: B:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: 1 ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 1 ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: 1 ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-4.summary b/pengine/test10/clone-require-all-4.summary +new file mode 100644 +index 0000000..49ae3bd +--- /dev/null ++++ b/pengine/test10/clone-require-all-4.summary +@@ -0,0 +1,40 @@ ++ ++Current cluster status: ++Node rhel7-auto1 (1): standby ++Online: [ rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 ] ++ ++Transition Summary: ++ * Move shooter (Started rhel7-auto1 -> rhel7-auto2) ++ * Stop A:0 (rhel7-auto1) ++ ++Executing cluster transition: ++ * Resource action: shooter stop on rhel7-auto1 ++ * Pseudo action: A-clone_stop_0 ++ * Resource action: shooter start on rhel7-auto2 ++ * Resource action: A stop on rhel7-auto1 ++ * Pseudo action: A-clone_stopped_0 ++ * Pseudo action: A-clone_start_0 ++ * Pseudo action: all_stopped ++ * Resource action: shooter monitor=60000 on rhel7-auto2 ++ * Pseudo action: A-clone_running_0 ++ ++Revised cluster status: ++Node rhel7-auto1 (1): standby ++Online: [ rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto2 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto2 ] ++ Stopped: [ rhel7-auto1 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 ] ++ +diff --git a/pengine/test10/clone-require-all-4.xml b/pengine/test10/clone-require-all-4.xml +new file mode 100644 +index 0000000..8bfd27f +--- /dev/null ++++ b/pengine/test10/clone-require-all-4.xml +@@ -0,0 +1,156 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-5.dot b/pengine/test10/clone-require-all-5.dot +new file mode 100644 +index 0000000..ce5a593 +--- /dev/null ++++ b/pengine/test10/clone-require-all-5.dot +@@ -0,0 +1,31 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 rhel7-auto3" [ style = bold] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"A_start_0 rhel7-auto3" -> "A-clone_running_0" [ style = bold] ++"A_start_0 rhel7-auto3" -> "A_monitor_10000 rhel7-auto3" [ style = bold] ++"A_start_0 rhel7-auto3" -> "clone-one-or-more:order-A-clone-B-clone-mandatory" [ style = bold] ++"A_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B:1_start_0 rhel7-auto3" [ style = bold] ++"B-clone_start_0" -> "B:2_start_0 rhel7-auto1" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto4" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B:1_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B:1_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = bold] ++"B:1_start_0 rhel7-auto3" -> "B:1_monitor_10000 rhel7-auto3" [ style = bold] ++"B:1_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B:2_monitor_10000 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"B:2_start_0 rhel7-auto1" -> "B-clone_running_0" [ style = bold] ++"B:2_start_0 rhel7-auto1" -> "B:2_monitor_10000 rhel7-auto1" [ style = bold] ++"B:2_start_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"B_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto4" -> "B_monitor_10000 rhel7-auto4" [ style = bold] ++"B_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"clone-one-or-more:order-A-clone-B-clone-mandatory" -> "B-clone_start_0" [ style = bold] ++"clone-one-or-more:order-A-clone-B-clone-mandatory" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-5.exp b/pengine/test10/clone-require-all-5.exp +new file mode 100644 +index 0000000..abb4d25 +--- /dev/null ++++ b/pengine/test10/clone-require-all-5.exp +@@ -0,0 +1,174 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-5.scores b/pengine/test10/clone-require-all-5.scores +new file mode 100644 +index 0000000..cca6739 +--- /dev/null ++++ b/pengine/test10/clone-require-all-5.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: 0 ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 1 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: 0 ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: 0 ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: 0 ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: 0 ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: 0 ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: 0 ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: 0 ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: 0 ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: 0 ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: 1 ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: 0 ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: 0 ++native_color: A:1 allocation score on rhel7-auto2: 1 ++native_color: A:1 allocation score on rhel7-auto3: 0 ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: 0 ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: 0 ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: 0 ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: 0 ++native_color: B:1 allocation score on rhel7-auto4: -INFINITY ++native_color: B:2 allocation score on rhel7-auto1: 0 ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-5.summary b/pengine/test10/clone-require-all-5.summary +new file mode 100644 +index 0000000..2820093 +--- /dev/null ++++ b/pengine/test10/clone-require-all-5.summary +@@ -0,0 +1,43 @@ ++ ++Current cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Start A:2 (rhel7-auto3) ++ * Start B:0 (rhel7-auto4) ++ * Start B:1 (rhel7-auto3) ++ * Start B:2 (rhel7-auto1) ++ ++Executing cluster transition: ++ * Pseudo action: A-clone_start_0 ++ * Resource action: A start on rhel7-auto3 ++ * Pseudo action: A-clone_running_0 ++ * Pseudo action: clone-one-or-more:order-A-clone-B-clone-mandatory ++ * Resource action: A monitor=10000 on rhel7-auto3 ++ * Pseudo action: B-clone_start_0 ++ * Resource action: B start on rhel7-auto4 ++ * Resource action: B start on rhel7-auto3 ++ * Resource action: B start on rhel7-auto1 ++ * Pseudo action: B-clone_running_0 ++ * Resource action: B monitor=10000 on rhel7-auto4 ++ * Resource action: B monitor=10000 on rhel7-auto3 ++ * Resource action: B monitor=10000 on rhel7-auto1 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Stopped: [ rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto1 rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto2 ] ++ +diff --git a/pengine/test10/clone-require-all-5.xml b/pengine/test10/clone-require-all-5.xml +new file mode 100644 +index 0000000..1079dae +--- /dev/null ++++ b/pengine/test10/clone-require-all-5.xml +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-6.dot b/pengine/test10/clone-require-all-6.dot +new file mode 100644 +index 0000000..3ee5c89 +--- /dev/null ++++ b/pengine/test10/clone-require-all-6.dot +@@ -0,0 +1,23 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 " [ style = dashed] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stop_0" -> "A-clone_stopped_0" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto1" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto3" [ style = bold] ++"A-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stopped_0" -> "A-clone_start_0" [ style = bold] ++"A-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"A_start_0 " -> "A-clone_running_0" [ style = dashed] ++"A_start_0 " [ style=dashed color="red" fontcolor="black"] ++"A_stop_0 rhel7-auto1" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto1" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"A_stop_0 rhel7-auto3" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto3" -> "A_start_0 " [ style = dashed] ++"A_stop_0 rhel7-auto3" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-6.exp b/pengine/test10/clone-require-all-6.exp +new file mode 100644 +index 0000000..8cc4c57 +--- /dev/null ++++ b/pengine/test10/clone-require-all-6.exp +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-6.scores b/pengine/test10/clone-require-all-6.scores +new file mode 100644 +index 0000000..4e8ee5a +--- /dev/null ++++ b/pengine/test10/clone-require-all-6.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto2: 1 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: 0 ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: 1 ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: 0 ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 1 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: 0 ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 1 ++clone_color: B:3 allocation score on rhel7-auto1: 0 ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: 1 ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: 1 ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: -INFINITY ++native_color: B:0 allocation score on rhel7-auto4: -INFINITY ++native_color: B:1 allocation score on rhel7-auto1: 0 ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: 1 ++native_color: B:1 allocation score on rhel7-auto4: 0 ++native_color: B:2 allocation score on rhel7-auto1: 0 ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: 1 ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-6.summary b/pengine/test10/clone-require-all-6.summary +new file mode 100644 +index 0000000..6561ea3 +--- /dev/null ++++ b/pengine/test10/clone-require-all-6.summary +@@ -0,0 +1,36 @@ ++ ++Current cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Stopped: [ rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto1 rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto2 ] ++ ++Transition Summary: ++ * Stop A:0 (rhel7-auto1) ++ * Stop A:2 (rhel7-auto3) ++ ++Executing cluster transition: ++ * Pseudo action: A-clone_stop_0 ++ * Resource action: A stop on rhel7-auto1 ++ * Resource action: A stop on rhel7-auto3 ++ * Pseudo action: A-clone_stopped_0 ++ * Pseudo action: A-clone_start_0 ++ * Pseudo action: all_stopped ++ * Pseudo action: A-clone_running_0 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto2 ] ++ Stopped: [ rhel7-auto1 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto1 rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto2 ] ++ +diff --git a/pengine/test10/clone-require-all-6.xml b/pengine/test10/clone-require-all-6.xml +new file mode 100644 +index 0000000..5222b33 +--- /dev/null ++++ b/pengine/test10/clone-require-all-6.xml +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-7.dot b/pengine/test10/clone-require-all-7.dot +new file mode 100644 +index 0000000..baa87a2 +--- /dev/null ++++ b/pengine/test10/clone-require-all-7.dot +@@ -0,0 +1,51 @@ ++ digraph "g" { ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A:0_start_0 rhel7-auto2" [ style = bold] ++"A-clone_start_0" -> "A:1_start_0 rhel7-auto1" [ style = bold] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A:0_monitor_0 rhel7-auto2" -> "probe_complete rhel7-auto2" [ style = bold] ++"A:0_monitor_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"A:0_monitor_0 rhel7-auto3" -> "probe_complete rhel7-auto3" [ style = bold] ++"A:0_monitor_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"A:0_monitor_0 rhel7-auto4" -> "probe_complete rhel7-auto4" [ style = bold] ++"A:0_monitor_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"A:0_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"A:0_start_0 rhel7-auto2" -> "A-clone_running_0" [ style = bold] ++"A:0_start_0 rhel7-auto2" -> "A:0_monitor_10000 rhel7-auto2" [ style = bold] ++"A:0_start_0 rhel7-auto2" -> "clone-one-or-more:order-A-clone-B-clone-mandatory" [ style = bold] ++"A:0_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"A:1_monitor_0 rhel7-auto1" -> "probe_complete rhel7-auto1" [ style = bold] ++"A:1_monitor_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"A:1_monitor_10000 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"A:1_start_0 rhel7-auto1" -> "A-clone_running_0" [ style = bold] ++"A:1_start_0 rhel7-auto1" -> "A:1_monitor_10000 rhel7-auto1" [ style = bold] ++"A:1_start_0 rhel7-auto1" -> "clone-one-or-more:order-A-clone-B-clone-mandatory" [ style = bold] ++"A:1_start_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B:1_start_0 rhel7-auto4" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto3" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B:1_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B:1_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = bold] ++"B:1_start_0 rhel7-auto4" -> "B:1_monitor_10000 rhel7-auto4" [ style = bold] ++"B:1_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto3" -> "B_monitor_10000 rhel7-auto3" [ style = bold] ++"B_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"clone-one-or-more:order-A-clone-B-clone-mandatory" -> "B-clone_start_0" [ style = bold] ++"clone-one-or-more:order-A-clone-B-clone-mandatory" [ style=bold color="green" fontcolor="orange"] ++"probe_complete rhel7-auto1" -> "probe_complete" [ style = bold] ++"probe_complete rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"probe_complete rhel7-auto2" -> "probe_complete" [ style = bold] ++"probe_complete rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"probe_complete rhel7-auto3" -> "probe_complete" [ style = bold] ++"probe_complete rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"probe_complete rhel7-auto4" -> "probe_complete" [ style = bold] ++"probe_complete rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"probe_complete" -> "A:0_start_0 rhel7-auto2" [ style = bold] ++"probe_complete" -> "A:1_start_0 rhel7-auto1" [ style = bold] ++"probe_complete" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-7.exp b/pengine/test10/clone-require-all-7.exp +new file mode 100644 +index 0000000..d37a82f +--- /dev/null ++++ b/pengine/test10/clone-require-all-7.exp +@@ -0,0 +1,288 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-7.scores b/pengine/test10/clone-require-all-7.scores +new file mode 100644 +index 0000000..8c61fd1 +--- /dev/null ++++ b/pengine/test10/clone-require-all-7.scores +@@ -0,0 +1,77 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: 0 ++clone_color: A-clone allocation score on rhel7-auto2: 0 ++clone_color: A-clone allocation score on rhel7-auto3: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto4: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto1: 0 ++clone_color: A:0 allocation score on rhel7-auto2: 0 ++clone_color: A:0 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto1: 0 ++clone_color: A:1 allocation score on rhel7-auto2: 0 ++clone_color: A:1 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto1: 0 ++clone_color: A:2 allocation score on rhel7-auto2: 0 ++clone_color: A:2 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto4: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto1: 0 ++clone_color: A:3 allocation score on rhel7-auto2: 0 ++clone_color: A:3 allocation score on rhel7-auto3: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto4: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: 0 ++native_color: A:0 allocation score on rhel7-auto2: 0 ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: 0 ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: 0 ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-7.summary b/pengine/test10/clone-require-all-7.summary +new file mode 100644 +index 0000000..411f738 +--- /dev/null ++++ b/pengine/test10/clone-require-all-7.summary +@@ -0,0 +1,47 @@ ++ ++Current cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Start A:0 (rhel7-auto2) ++ * Start A:1 (rhel7-auto1) ++ * Start B:0 (rhel7-auto3) ++ * Start B:1 (rhel7-auto4) ++ ++Executing cluster transition: ++ * Resource action: A:0 monitor on rhel7-auto4 ++ * Resource action: A:0 monitor on rhel7-auto3 ++ * Resource action: A:0 monitor on rhel7-auto2 ++ * Resource action: A:1 monitor on rhel7-auto1 ++ * Pseudo action: A-clone_start_0 ++ * Pseudo action: probe_complete ++ * Resource action: A:0 start on rhel7-auto2 ++ * Resource action: A:1 start on rhel7-auto1 ++ * Pseudo action: A-clone_running_0 ++ * Pseudo action: clone-one-or-more:order-A-clone-B-clone-mandatory ++ * Resource action: A:0 monitor=10000 on rhel7-auto2 ++ * Resource action: A:1 monitor=10000 on rhel7-auto1 ++ * Pseudo action: B-clone_start_0 ++ * Resource action: B start on rhel7-auto3 ++ * Resource action: B start on rhel7-auto4 ++ * Pseudo action: B-clone_running_0 ++ * Resource action: B monitor=10000 on rhel7-auto3 ++ * Resource action: B monitor=10000 on rhel7-auto4 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto1 rhel7-auto2 ] ++ Stopped: [ rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 ] ++ +diff --git a/pengine/test10/clone-require-all-7.xml b/pengine/test10/clone-require-all-7.xml +new file mode 100644 +index 0000000..6aea47b +--- /dev/null ++++ b/pengine/test10/clone-require-all-7.xml +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-1.dot b/pengine/test10/clone-require-all-no-interleave-1.dot +new file mode 100644 +index 0000000..d03703b +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-1.dot +@@ -0,0 +1,40 @@ ++ digraph "g" { ++"A-clone_running_0" -> "B-clone_start_0" [ style = bold] ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 rhel7-auto3" [ style = bold] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"A_start_0 rhel7-auto3" -> "A-clone_running_0" [ style = bold] ++"A_start_0 rhel7-auto3" -> "A_monitor_10000 rhel7-auto3" [ style = bold] ++"A_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto3" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto3" -> "B_monitor_10000 rhel7-auto3" [ style = bold] ++"B_start_0 rhel7-auto3" -> "clone-one-or-more:order-B-clone-C-clone-mandatory" [ style = bold] ++"B_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"C-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"C-clone_start_0" -> "C-clone_running_0" [ style = bold] ++"C-clone_start_0" -> "C:1_start_0 rhel7-auto1" [ style = bold] ++"C-clone_start_0" -> "C:2_start_0 rhel7-auto3" [ style = bold] ++"C-clone_start_0" -> "C_start_0 rhel7-auto2" [ style = bold] ++"C-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"C:1_monitor_10000 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"C:1_start_0 rhel7-auto1" -> "C-clone_running_0" [ style = bold] ++"C:1_start_0 rhel7-auto1" -> "C:1_monitor_10000 rhel7-auto1" [ style = bold] ++"C:1_start_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"C:2_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"C:2_start_0 rhel7-auto3" -> "C-clone_running_0" [ style = bold] ++"C:2_start_0 rhel7-auto3" -> "C:2_monitor_10000 rhel7-auto3" [ style = bold] ++"C:2_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"C_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"C_start_0 rhel7-auto2" -> "C-clone_running_0" [ style = bold] ++"C_start_0 rhel7-auto2" -> "C_monitor_10000 rhel7-auto2" [ style = bold] ++"C_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" -> "C-clone_start_0" [ style = bold] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-no-interleave-1.exp b/pengine/test10/clone-require-all-no-interleave-1.exp +new file mode 100644 +index 0000000..7048f51 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-1.exp +@@ -0,0 +1,227 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-1.scores b/pengine/test10/clone-require-all-no-interleave-1.scores +new file mode 100644 +index 0000000..f6d3232 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-1.scores +@@ -0,0 +1,113 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto3: 0 ++clone_color: A-clone allocation score on rhel7-auto4: 0 ++clone_color: A:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto3: 0 ++clone_color: A:0 allocation score on rhel7-auto4: 0 ++clone_color: A:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto3: 0 ++clone_color: A:1 allocation score on rhel7-auto4: 0 ++clone_color: A:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto3: 0 ++clone_color: A:2 allocation score on rhel7-auto4: 0 ++clone_color: A:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto3: 0 ++clone_color: A:3 allocation score on rhel7-auto4: 0 ++clone_color: B-clone allocation score on rhel7-auto1: 0 ++clone_color: B-clone allocation score on rhel7-auto2: 0 ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: 0 ++clone_color: B:0 allocation score on rhel7-auto2: 0 ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: 0 ++clone_color: B:1 allocation score on rhel7-auto2: 0 ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: 0 ++clone_color: B:2 allocation score on rhel7-auto2: 0 ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: 0 ++clone_color: B:3 allocation score on rhel7-auto2: 0 ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++clone_color: C-clone allocation score on rhel7-auto1: 0 ++clone_color: C-clone allocation score on rhel7-auto2: 0 ++clone_color: C-clone allocation score on rhel7-auto3: 0 ++clone_color: C-clone allocation score on rhel7-auto4: 0 ++clone_color: C:0 allocation score on rhel7-auto1: 0 ++clone_color: C:0 allocation score on rhel7-auto2: 0 ++clone_color: C:0 allocation score on rhel7-auto3: 0 ++clone_color: C:0 allocation score on rhel7-auto4: 0 ++clone_color: C:1 allocation score on rhel7-auto1: 0 ++clone_color: C:1 allocation score on rhel7-auto2: 0 ++clone_color: C:1 allocation score on rhel7-auto3: 0 ++clone_color: C:1 allocation score on rhel7-auto4: 0 ++clone_color: C:2 allocation score on rhel7-auto1: 0 ++clone_color: C:2 allocation score on rhel7-auto2: 0 ++clone_color: C:2 allocation score on rhel7-auto3: 0 ++clone_color: C:2 allocation score on rhel7-auto4: 0 ++clone_color: C:3 allocation score on rhel7-auto1: 0 ++clone_color: C:3 allocation score on rhel7-auto2: 0 ++clone_color: C:3 allocation score on rhel7-auto3: 0 ++clone_color: C:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: 0 ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: -INFINITY ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: -INFINITY ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: C:0 allocation score on rhel7-auto1: 0 ++native_color: C:0 allocation score on rhel7-auto2: 0 ++native_color: C:0 allocation score on rhel7-auto3: 0 ++native_color: C:0 allocation score on rhel7-auto4: -INFINITY ++native_color: C:1 allocation score on rhel7-auto1: 0 ++native_color: C:1 allocation score on rhel7-auto2: -INFINITY ++native_color: C:1 allocation score on rhel7-auto3: 0 ++native_color: C:1 allocation score on rhel7-auto4: -INFINITY ++native_color: C:2 allocation score on rhel7-auto1: -INFINITY ++native_color: C:2 allocation score on rhel7-auto2: -INFINITY ++native_color: C:2 allocation score on rhel7-auto3: 0 ++native_color: C:2 allocation score on rhel7-auto4: -INFINITY ++native_color: C:3 allocation score on rhel7-auto1: -INFINITY ++native_color: C:3 allocation score on rhel7-auto2: -INFINITY ++native_color: C:3 allocation score on rhel7-auto3: -INFINITY ++native_color: C:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-no-interleave-1.summary b/pengine/test10/clone-require-all-no-interleave-1.summary +new file mode 100644 +index 0000000..dd4bc99 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-1.summary +@@ -0,0 +1,54 @@ ++ ++Current cluster status: ++Node rhel7-auto4 (4): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: C-clone [C] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Start A:0 (rhel7-auto3) ++ * Start B:0 (rhel7-auto3) ++ * Start C:0 (rhel7-auto2) ++ * Start C:1 (rhel7-auto1) ++ * Start C:2 (rhel7-auto3) ++ ++Executing cluster transition: ++ * Pseudo action: A-clone_start_0 ++ * Resource action: A start on rhel7-auto3 ++ * Pseudo action: A-clone_running_0 ++ * Pseudo action: B-clone_start_0 ++ * Resource action: A monitor=10000 on rhel7-auto3 ++ * Resource action: B start on rhel7-auto3 ++ * Pseudo action: B-clone_running_0 ++ * Pseudo action: clone-one-or-more:order-B-clone-C-clone-mandatory ++ * Resource action: B monitor=10000 on rhel7-auto3 ++ * Pseudo action: C-clone_start_0 ++ * Resource action: C start on rhel7-auto2 ++ * Resource action: C start on rhel7-auto1 ++ * Resource action: C start on rhel7-auto3 ++ * Pseudo action: C-clone_running_0 ++ * Resource action: C monitor=10000 on rhel7-auto2 ++ * Resource action: C monitor=10000 on rhel7-auto1 ++ * Resource action: C monitor=10000 on rhel7-auto3 ++ ++Revised cluster status: ++Node rhel7-auto4 (4): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto3 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Clone Set: C-clone [C] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Stopped: [ rhel7-auto4 ] ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-1.xml b/pengine/test10/clone-require-all-no-interleave-1.xml +new file mode 100644 +index 0000000..4630f96 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-1.xml +@@ -0,0 +1,177 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-2.dot b/pengine/test10/clone-require-all-no-interleave-2.dot +new file mode 100644 +index 0000000..1d7f8be +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-2.dot +@@ -0,0 +1,40 @@ ++ digraph "g" { ++"A-clone_running_0" -> "B-clone_start_0" [ style = bold] ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 rhel7-auto4" [ style = bold] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"A_start_0 rhel7-auto4" -> "A-clone_running_0" [ style = bold] ++"A_start_0 rhel7-auto4" -> "A_monitor_10000 rhel7-auto4" [ style = bold] ++"A_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto4" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto4" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto4" -> "B_monitor_10000 rhel7-auto4" [ style = bold] ++"B_start_0 rhel7-auto4" -> "clone-one-or-more:order-B-clone-C-clone-mandatory" [ style = bold] ++"B_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"C-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"C-clone_start_0" -> "C-clone_running_0" [ style = bold] ++"C-clone_start_0" -> "C:1_start_0 rhel7-auto1" [ style = bold] ++"C-clone_start_0" -> "C:2_start_0 rhel7-auto4" [ style = bold] ++"C-clone_start_0" -> "C_start_0 rhel7-auto2" [ style = bold] ++"C-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"C:1_monitor_10000 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"C:1_start_0 rhel7-auto1" -> "C-clone_running_0" [ style = bold] ++"C:1_start_0 rhel7-auto1" -> "C:1_monitor_10000 rhel7-auto1" [ style = bold] ++"C:1_start_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"C:2_monitor_10000 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"C:2_start_0 rhel7-auto4" -> "C-clone_running_0" [ style = bold] ++"C:2_start_0 rhel7-auto4" -> "C:2_monitor_10000 rhel7-auto4" [ style = bold] ++"C:2_start_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"C_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"C_start_0 rhel7-auto2" -> "C-clone_running_0" [ style = bold] ++"C_start_0 rhel7-auto2" -> "C_monitor_10000 rhel7-auto2" [ style = bold] ++"C_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" -> "C-clone_start_0" [ style = bold] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-no-interleave-2.exp b/pengine/test10/clone-require-all-no-interleave-2.exp +new file mode 100644 +index 0000000..35a2df6 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-2.exp +@@ -0,0 +1,227 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-2.scores b/pengine/test10/clone-require-all-no-interleave-2.scores +new file mode 100644 +index 0000000..50e054e +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-2.scores +@@ -0,0 +1,113 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto3: 0 ++clone_color: A-clone allocation score on rhel7-auto4: 0 ++clone_color: A:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto3: 0 ++clone_color: A:0 allocation score on rhel7-auto4: 0 ++clone_color: A:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto3: 0 ++clone_color: A:1 allocation score on rhel7-auto4: 0 ++clone_color: A:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto3: 0 ++clone_color: A:2 allocation score on rhel7-auto4: 0 ++clone_color: A:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto3: 0 ++clone_color: A:3 allocation score on rhel7-auto4: 0 ++clone_color: B-clone allocation score on rhel7-auto1: 0 ++clone_color: B-clone allocation score on rhel7-auto2: 0 ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: 0 ++clone_color: B:0 allocation score on rhel7-auto2: 0 ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 0 ++clone_color: B:1 allocation score on rhel7-auto1: 0 ++clone_color: B:1 allocation score on rhel7-auto2: 0 ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: 0 ++clone_color: B:2 allocation score on rhel7-auto2: 0 ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: 0 ++clone_color: B:3 allocation score on rhel7-auto2: 0 ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++clone_color: C-clone allocation score on rhel7-auto1: 0 ++clone_color: C-clone allocation score on rhel7-auto2: 0 ++clone_color: C-clone allocation score on rhel7-auto3: 0 ++clone_color: C-clone allocation score on rhel7-auto4: 0 ++clone_color: C:0 allocation score on rhel7-auto1: 0 ++clone_color: C:0 allocation score on rhel7-auto2: 0 ++clone_color: C:0 allocation score on rhel7-auto3: 0 ++clone_color: C:0 allocation score on rhel7-auto4: 0 ++clone_color: C:1 allocation score on rhel7-auto1: 0 ++clone_color: C:1 allocation score on rhel7-auto2: 0 ++clone_color: C:1 allocation score on rhel7-auto3: 0 ++clone_color: C:1 allocation score on rhel7-auto4: 0 ++clone_color: C:2 allocation score on rhel7-auto1: 0 ++clone_color: C:2 allocation score on rhel7-auto2: 0 ++clone_color: C:2 allocation score on rhel7-auto3: 0 ++clone_color: C:2 allocation score on rhel7-auto4: 0 ++clone_color: C:3 allocation score on rhel7-auto1: 0 ++clone_color: C:3 allocation score on rhel7-auto2: 0 ++clone_color: C:3 allocation score on rhel7-auto3: 0 ++clone_color: C:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: -INFINITY ++native_color: A:0 allocation score on rhel7-auto4: 0 ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: -INFINITY ++native_color: B:0 allocation score on rhel7-auto4: 0 ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: -INFINITY ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: C:0 allocation score on rhel7-auto1: 0 ++native_color: C:0 allocation score on rhel7-auto2: 0 ++native_color: C:0 allocation score on rhel7-auto3: -INFINITY ++native_color: C:0 allocation score on rhel7-auto4: 0 ++native_color: C:1 allocation score on rhel7-auto1: 0 ++native_color: C:1 allocation score on rhel7-auto2: -INFINITY ++native_color: C:1 allocation score on rhel7-auto3: -INFINITY ++native_color: C:1 allocation score on rhel7-auto4: 0 ++native_color: C:2 allocation score on rhel7-auto1: -INFINITY ++native_color: C:2 allocation score on rhel7-auto2: -INFINITY ++native_color: C:2 allocation score on rhel7-auto3: -INFINITY ++native_color: C:2 allocation score on rhel7-auto4: 0 ++native_color: C:3 allocation score on rhel7-auto1: -INFINITY ++native_color: C:3 allocation score on rhel7-auto2: -INFINITY ++native_color: C:3 allocation score on rhel7-auto3: -INFINITY ++native_color: C:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-no-interleave-2.summary b/pengine/test10/clone-require-all-no-interleave-2.summary +new file mode 100644 +index 0000000..f16be9b +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-2.summary +@@ -0,0 +1,54 @@ ++ ++Current cluster status: ++Node rhel7-auto3 (3): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ Clone Set: C-clone [C] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 rhel7-auto4 ] ++ ++Transition Summary: ++ * Start A:0 (rhel7-auto4) ++ * Start B:0 (rhel7-auto4) ++ * Start C:0 (rhel7-auto2) ++ * Start C:1 (rhel7-auto1) ++ * Start C:2 (rhel7-auto4) ++ ++Executing cluster transition: ++ * Pseudo action: A-clone_start_0 ++ * Resource action: A start on rhel7-auto4 ++ * Pseudo action: A-clone_running_0 ++ * Pseudo action: B-clone_start_0 ++ * Resource action: A monitor=10000 on rhel7-auto4 ++ * Resource action: B start on rhel7-auto4 ++ * Pseudo action: B-clone_running_0 ++ * Pseudo action: clone-one-or-more:order-B-clone-C-clone-mandatory ++ * Resource action: B monitor=10000 on rhel7-auto4 ++ * Pseudo action: C-clone_start_0 ++ * Resource action: C start on rhel7-auto2 ++ * Resource action: C start on rhel7-auto1 ++ * Resource action: C start on rhel7-auto4 ++ * Pseudo action: C-clone_running_0 ++ * Resource action: C monitor=10000 on rhel7-auto2 ++ * Resource action: C monitor=10000 on rhel7-auto1 ++ * Resource action: C monitor=10000 on rhel7-auto4 ++ ++Revised cluster status: ++Node rhel7-auto3 (3): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Clone Set: C-clone [C] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Stopped: [ rhel7-auto3 ] ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-2.xml b/pengine/test10/clone-require-all-no-interleave-2.xml +new file mode 100644 +index 0000000..214a7c7 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-2.xml +@@ -0,0 +1,179 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-3.dot b/pengine/test10/clone-require-all-no-interleave-3.dot +new file mode 100644 +index 0000000..58f97a5 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-3.dot +@@ -0,0 +1,60 @@ ++ digraph "g" { ++"A-clone_running_0" -> "B-clone_start_0" [ style = bold] ++"A-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_start_0" -> "A-clone_running_0" [ style = bold] ++"A-clone_start_0" -> "A_start_0 rhel7-auto3" [ style = bold] ++"A-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stop_0" -> "A-clone_stopped_0" [ style = bold] ++"A-clone_stop_0" -> "A_stop_0 rhel7-auto4" [ style = bold] ++"A-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"A-clone_stopped_0" -> "A-clone_start_0" [ style = bold] ++"A-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"A_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"A_start_0 rhel7-auto3" -> "A-clone_running_0" [ style = bold] ++"A_start_0 rhel7-auto3" -> "A_monitor_10000 rhel7-auto3" [ style = bold] ++"A_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"A_stop_0 rhel7-auto4" -> "A-clone_stopped_0" [ style = bold] ++"A_stop_0 rhel7-auto4" -> "A_start_0 rhel7-auto3" [ style = bold] ++"A_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"A_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"B-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_start_0" -> "B-clone_running_0" [ style = bold] ++"B-clone_start_0" -> "B_start_0 rhel7-auto3" [ style = bold] ++"B-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_stop_0" -> "B-clone_stopped_0" [ style = bold] ++"B-clone_stop_0" -> "B_stop_0 rhel7-auto4" [ style = bold] ++"B-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"B-clone_stopped_0" -> "A-clone_stop_0" [ style = bold] ++"B-clone_stopped_0" -> "B-clone_start_0" [ style = bold] ++"B-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"B_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_start_0 rhel7-auto3" -> "B-clone_running_0" [ style = bold] ++"B_start_0 rhel7-auto3" -> "B_monitor_10000 rhel7-auto3" [ style = bold] ++"B_start_0 rhel7-auto3" -> "clone-one-or-more:order-B-clone-C-clone-mandatory" [ style = bold] ++"B_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"B_stop_0 rhel7-auto4" -> "B-clone_stopped_0" [ style = bold] ++"B_stop_0 rhel7-auto4" -> "B_start_0 rhel7-auto3" [ style = bold] ++"B_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"B_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"C-clone_running_0" [ style=bold color="green" fontcolor="orange"] ++"C-clone_start_0" -> "C-clone_running_0" [ style = bold] ++"C-clone_start_0" -> "C_start_0 rhel7-auto3" [ style = bold] ++"C-clone_start_0" [ style=bold color="green" fontcolor="orange"] ++"C-clone_stop_0" -> "C-clone_stopped_0" [ style = bold] ++"C-clone_stop_0" -> "C_stop_0 rhel7-auto4" [ style = bold] ++"C-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"C-clone_stopped_0" -> "B-clone_stop_0" [ style = bold] ++"C-clone_stopped_0" -> "C-clone_start_0" [ style = bold] ++"C-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"C_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"C_start_0 rhel7-auto3" -> "C-clone_running_0" [ style = bold] ++"C_start_0 rhel7-auto3" -> "C_monitor_10000 rhel7-auto3" [ style = bold] ++"C_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"C_stop_0 rhel7-auto4" -> "C-clone_stopped_0" [ style = bold] ++"C_stop_0 rhel7-auto4" -> "C_start_0 rhel7-auto3" [ style = bold] ++"C_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"C_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" -> "C-clone_start_0" [ style = bold] ++"clone-one-or-more:order-B-clone-C-clone-mandatory" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/clone-require-all-no-interleave-3.exp b/pengine/test10/clone-require-all-no-interleave-3.exp +new file mode 100644 +index 0000000..8aba35e +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-3.exp +@@ -0,0 +1,322 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-3.scores b/pengine/test10/clone-require-all-no-interleave-3.scores +new file mode 100644 +index 0000000..70dd2d1 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-3.scores +@@ -0,0 +1,113 @@ ++Allocation scores: ++clone_color: A-clone allocation score on rhel7-auto1: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto2: -INFINITY ++clone_color: A-clone allocation score on rhel7-auto3: 0 ++clone_color: A-clone allocation score on rhel7-auto4: 0 ++clone_color: A:0 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:0 allocation score on rhel7-auto3: 0 ++clone_color: A:0 allocation score on rhel7-auto4: 1 ++clone_color: A:1 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:1 allocation score on rhel7-auto3: 0 ++clone_color: A:1 allocation score on rhel7-auto4: 0 ++clone_color: A:2 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:2 allocation score on rhel7-auto3: 0 ++clone_color: A:2 allocation score on rhel7-auto4: 0 ++clone_color: A:3 allocation score on rhel7-auto1: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto2: -INFINITY ++clone_color: A:3 allocation score on rhel7-auto3: 0 ++clone_color: A:3 allocation score on rhel7-auto4: 0 ++clone_color: B-clone allocation score on rhel7-auto1: 0 ++clone_color: B-clone allocation score on rhel7-auto2: 0 ++clone_color: B-clone allocation score on rhel7-auto3: 0 ++clone_color: B-clone allocation score on rhel7-auto4: 0 ++clone_color: B:0 allocation score on rhel7-auto1: 0 ++clone_color: B:0 allocation score on rhel7-auto2: 0 ++clone_color: B:0 allocation score on rhel7-auto3: 0 ++clone_color: B:0 allocation score on rhel7-auto4: 1 ++clone_color: B:1 allocation score on rhel7-auto1: 0 ++clone_color: B:1 allocation score on rhel7-auto2: 0 ++clone_color: B:1 allocation score on rhel7-auto3: 0 ++clone_color: B:1 allocation score on rhel7-auto4: 0 ++clone_color: B:2 allocation score on rhel7-auto1: 0 ++clone_color: B:2 allocation score on rhel7-auto2: 0 ++clone_color: B:2 allocation score on rhel7-auto3: 0 ++clone_color: B:2 allocation score on rhel7-auto4: 0 ++clone_color: B:3 allocation score on rhel7-auto1: 0 ++clone_color: B:3 allocation score on rhel7-auto2: 0 ++clone_color: B:3 allocation score on rhel7-auto3: 0 ++clone_color: B:3 allocation score on rhel7-auto4: 0 ++clone_color: C-clone allocation score on rhel7-auto1: 0 ++clone_color: C-clone allocation score on rhel7-auto2: 0 ++clone_color: C-clone allocation score on rhel7-auto3: 0 ++clone_color: C-clone allocation score on rhel7-auto4: 0 ++clone_color: C:0 allocation score on rhel7-auto1: 0 ++clone_color: C:0 allocation score on rhel7-auto2: 0 ++clone_color: C:0 allocation score on rhel7-auto3: 0 ++clone_color: C:0 allocation score on rhel7-auto4: 1 ++clone_color: C:1 allocation score on rhel7-auto1: 1 ++clone_color: C:1 allocation score on rhel7-auto2: 0 ++clone_color: C:1 allocation score on rhel7-auto3: 0 ++clone_color: C:1 allocation score on rhel7-auto4: 0 ++clone_color: C:2 allocation score on rhel7-auto1: 0 ++clone_color: C:2 allocation score on rhel7-auto2: 1 ++clone_color: C:2 allocation score on rhel7-auto3: 0 ++clone_color: C:2 allocation score on rhel7-auto4: 0 ++clone_color: C:3 allocation score on rhel7-auto1: 0 ++clone_color: C:3 allocation score on rhel7-auto2: 0 ++clone_color: C:3 allocation score on rhel7-auto3: 0 ++clone_color: C:3 allocation score on rhel7-auto4: 0 ++native_color: A:0 allocation score on rhel7-auto1: -INFINITY ++native_color: A:0 allocation score on rhel7-auto2: -INFINITY ++native_color: A:0 allocation score on rhel7-auto3: 0 ++native_color: A:0 allocation score on rhel7-auto4: -INFINITY ++native_color: A:1 allocation score on rhel7-auto1: -INFINITY ++native_color: A:1 allocation score on rhel7-auto2: -INFINITY ++native_color: A:1 allocation score on rhel7-auto3: -INFINITY ++native_color: A:1 allocation score on rhel7-auto4: -INFINITY ++native_color: A:2 allocation score on rhel7-auto1: -INFINITY ++native_color: A:2 allocation score on rhel7-auto2: -INFINITY ++native_color: A:2 allocation score on rhel7-auto3: -INFINITY ++native_color: A:2 allocation score on rhel7-auto4: -INFINITY ++native_color: A:3 allocation score on rhel7-auto1: -INFINITY ++native_color: A:3 allocation score on rhel7-auto2: -INFINITY ++native_color: A:3 allocation score on rhel7-auto3: -INFINITY ++native_color: A:3 allocation score on rhel7-auto4: -INFINITY ++native_color: B:0 allocation score on rhel7-auto1: -INFINITY ++native_color: B:0 allocation score on rhel7-auto2: -INFINITY ++native_color: B:0 allocation score on rhel7-auto3: 0 ++native_color: B:0 allocation score on rhel7-auto4: -INFINITY ++native_color: B:1 allocation score on rhel7-auto1: -INFINITY ++native_color: B:1 allocation score on rhel7-auto2: -INFINITY ++native_color: B:1 allocation score on rhel7-auto3: -INFINITY ++native_color: B:1 allocation score on rhel7-auto4: -INFINITY ++native_color: B:2 allocation score on rhel7-auto1: -INFINITY ++native_color: B:2 allocation score on rhel7-auto2: -INFINITY ++native_color: B:2 allocation score on rhel7-auto3: -INFINITY ++native_color: B:2 allocation score on rhel7-auto4: -INFINITY ++native_color: B:3 allocation score on rhel7-auto1: -INFINITY ++native_color: B:3 allocation score on rhel7-auto2: -INFINITY ++native_color: B:3 allocation score on rhel7-auto3: -INFINITY ++native_color: B:3 allocation score on rhel7-auto4: -INFINITY ++native_color: C:0 allocation score on rhel7-auto1: -INFINITY ++native_color: C:0 allocation score on rhel7-auto2: -INFINITY ++native_color: C:0 allocation score on rhel7-auto3: 0 ++native_color: C:0 allocation score on rhel7-auto4: -INFINITY ++native_color: C:1 allocation score on rhel7-auto1: 1 ++native_color: C:1 allocation score on rhel7-auto2: -INFINITY ++native_color: C:1 allocation score on rhel7-auto3: 0 ++native_color: C:1 allocation score on rhel7-auto4: -INFINITY ++native_color: C:2 allocation score on rhel7-auto1: 0 ++native_color: C:2 allocation score on rhel7-auto2: 1 ++native_color: C:2 allocation score on rhel7-auto3: 0 ++native_color: C:2 allocation score on rhel7-auto4: -INFINITY ++native_color: C:3 allocation score on rhel7-auto1: -INFINITY ++native_color: C:3 allocation score on rhel7-auto2: -INFINITY ++native_color: C:3 allocation score on rhel7-auto3: -INFINITY ++native_color: C:3 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: 0 +diff --git a/pengine/test10/clone-require-all-no-interleave-3.summary b/pengine/test10/clone-require-all-no-interleave-3.summary +new file mode 100644 +index 0000000..4379644 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-3.summary +@@ -0,0 +1,61 @@ ++ ++Current cluster status: ++Node rhel7-auto4 (4): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto4 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Clone Set: C-clone [C] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Stopped: [ rhel7-auto3 ] ++ ++Transition Summary: ++ * Move A:0 (Started rhel7-auto4 -> rhel7-auto3) ++ * Move B:0 (Started rhel7-auto4 -> rhel7-auto3) ++ * Move C:0 (Started rhel7-auto4 -> rhel7-auto3) ++ ++Executing cluster transition: ++ * Pseudo action: C-clone_stop_0 ++ * Resource action: C stop on rhel7-auto4 ++ * Pseudo action: C-clone_stopped_0 ++ * Pseudo action: B-clone_stop_0 ++ * Resource action: B stop on rhel7-auto4 ++ * Pseudo action: B-clone_stopped_0 ++ * Pseudo action: A-clone_stop_0 ++ * Resource action: A stop on rhel7-auto4 ++ * Pseudo action: A-clone_stopped_0 ++ * Pseudo action: A-clone_start_0 ++ * Pseudo action: all_stopped ++ * Resource action: A start on rhel7-auto3 ++ * Pseudo action: A-clone_running_0 ++ * Pseudo action: B-clone_start_0 ++ * Resource action: A monitor=10000 on rhel7-auto3 ++ * Resource action: B start on rhel7-auto3 ++ * Pseudo action: B-clone_running_0 ++ * Pseudo action: clone-one-or-more:order-B-clone-C-clone-mandatory ++ * Resource action: B monitor=10000 on rhel7-auto3 ++ * Pseudo action: C-clone_start_0 ++ * Resource action: C start on rhel7-auto3 ++ * Pseudo action: C-clone_running_0 ++ * Resource action: C monitor=10000 on rhel7-auto3 ++ ++Revised cluster status: ++Node rhel7-auto4 (4): standby ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ Clone Set: A-clone [A] ++ Started: [ rhel7-auto3 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Clone Set: B-clone [B] ++ Started: [ rhel7-auto3 ] ++ Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto4 ] ++ Clone Set: C-clone [C] ++ Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ Stopped: [ rhel7-auto4 ] ++ +diff --git a/pengine/test10/clone-require-all-no-interleave-3.xml b/pengine/test10/clone-require-all-no-interleave-3.xml +new file mode 100644 +index 0000000..8a9bea8 +--- /dev/null ++++ b/pengine/test10/clone-require-all-no-interleave-3.xml +@@ -0,0 +1,179 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/xml/constraints-2.3.rng b/xml/constraints-2.3.rng +new file mode 100644 +index 0000000..d9a4701 +--- /dev/null ++++ b/xml/constraints-2.3.rng +@@ -0,0 +1,252 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ group ++ listed ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ stop ++ demote ++ fence ++ freeze ++ ++ ++ ++ ++ ++ ++ ++ ++ always ++ never ++ exclusive ++ ++ ++ ++ ++ ++ start ++ promote ++ demote ++ stop ++ ++ ++ ++ ++ ++ Stopped ++ Started ++ Master ++ Slave ++ ++ ++ ++ ++ ++ Optional ++ Mandatory ++ Serialize ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/xml/constraints-next.rng b/xml/constraints-next.rng +index 0defe8f..9d11003 100644 +--- a/xml/constraints-next.rng ++++ b/xml/constraints-next.rng +@@ -154,6 +154,9 @@ + + + ++ ++ ++ + + + diff --git a/SOURCES/bz720543-pcmk-cib_allow_values_to_be_added_updated_and_removed_in_a_single_update.patch b/SOURCES/bz720543-pcmk-cib_allow_values_to_be_added_updated_and_removed_in_a_single_update.patch deleted file mode 100644 index 5ca2615..0000000 --- a/SOURCES/bz720543-pcmk-cib_allow_values_to_be_added_updated_and_removed_in_a_single_update.patch +++ /dev/null @@ -1,51 +0,0 @@ -commit fc48cd10b4daca72217d7be42cd8eb71984d454a -Author: Andrew Beekhof -Date: Fri Aug 30 17:51:06 2013 +1000 - - Feature: cib: Allow values to be added/updated and removed in a single update - - (cherry picked from commit 9819039f15277c05011c6100934167227cfd135d) - - Conflicts: - attrd/commands.c - -diff --git a/include/crm/cib.h b/include/crm/cib.h -index 7a694ac..5ff57eb 100644 ---- a/include/crm/cib.h -+++ b/include/crm/cib.h -@@ -63,6 +63,7 @@ enum cib_call_options { - cib_discard_reply = 0x00000010, - cib_no_children = 0x00000020, - cib_xpath_address = 0x00000040, -+ cib_mixed_update = 0x00000080, - cib_scope_local = 0x00000100, - cib_dryrun = 0x00000200, - cib_sync_call = 0x00001000, -diff --git a/lib/cib/cib_ops.c b/lib/cib/cib_ops.c -index 4e1196b..26ae373 100644 ---- a/lib/cib/cib_ops.c -+++ b/lib/cib/cib_ops.c -@@ -354,6 +354,23 @@ cib_process_modify(const char *op, int options, const char *section, xmlNode * r - } - } - -+ if(options & cib_mixed_update) { -+ int max = 0, lpc; -+ xmlXPathObjectPtr xpathObj = xpath_search(*result_cib, "//@__delete__"); -+ -+ if (xpathObj) { -+ max = numXpathResults(xpathObj); -+ crm_log_xml_info(*result_cib, "Mixed result"); -+ } -+ -+ for (lpc = 0; lpc < max; lpc++) { -+ xmlNode *match = getXpathResult(xpathObj, lpc); -+ crm_debug("Destroying %s", (char *)xmlGetNodePath(match)); -+ free_xml(match); -+ } -+ -+ freeXpathObject(xpathObj); -+ } - return pcmk_ok; - } - diff --git a/SOURCES/bz720543-pcmk-cli_do_not_enabled_blackbox_for_cli_tools.patch b/SOURCES/bz720543-pcmk-cli_do_not_enabled_blackbox_for_cli_tools.patch deleted file mode 100644 index b11e0d8..0000000 --- a/SOURCES/bz720543-pcmk-cli_do_not_enabled_blackbox_for_cli_tools.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 32a30ee51d3d16e4ad33c329c047030f3060afe0 -Author: Andrew Beekhof -Date: Thu Oct 3 21:01:38 2013 +1000 - - Fix: cli: Do not enabled blackbox for cli tools - - (cherry picked from commit ab0f2fede2a8ddfa250a8ea5e57fea0b79348edb) - -diff --git a/lib/common/logging.c b/lib/common/logging.c -index 84884ac..0b85093 100644 ---- a/lib/common/logging.c -+++ b/lib/common/logging.c -@@ -697,7 +697,7 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - crm_add_logfile(logfile); - } - -- if (daemon_option_enabled(crm_system_name, "blackbox")) { -+ if (crm_is_daemon && daemon_option_enabled(crm_system_name, "blackbox")) { - crm_enable_blackbox(0); - } - diff --git a/SOURCES/bz720543-pcmk-command_line_tools_should_stop_after_an_assertion_failure.patch b/SOURCES/bz720543-pcmk-command_line_tools_should_stop_after_an_assertion_failure.patch deleted file mode 100644 index b442646..0000000 --- a/SOURCES/bz720543-pcmk-command_line_tools_should_stop_after_an_assertion_failure.patch +++ /dev/null @@ -1,96 +0,0 @@ -commit 5a743a9378faf251d03f19f37facd2ddfc19989b -Author: Andrew Beekhof -Date: Tue Aug 6 13:36:45 2013 +1000 - - Fix: Command-line tools should stop after an assertion failure - - (cherry picked from commit 912db519b293ab18840c36e0b5d91b3ee6e205dd) - -diff --git a/lib/common/logging.c b/lib/common/logging.c -index 0b85093..571cd03 100644 ---- a/lib/common/logging.c -+++ b/lib/common/logging.c -@@ -46,6 +46,7 @@ unsigned int crm_log_priority = LOG_NOTICE; - unsigned int crm_log_level = LOG_INFO; - static gboolean crm_tracing_enabled(void); - unsigned int crm_trace_nonlog = 0; -+bool crm_is_daemon = 0; - - #ifdef HAVE_G_LOG_SET_DEFAULT_HANDLER - GLogFunc glib_log_default; -@@ -626,6 +627,8 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - const char *facility = daemon_option("logfacility"); - const char *f_copy = facility; - -+ crm_is_daemon = daemon; -+ - if (crm_trace_nonlog == 0) { - crm_trace_nonlog = g_quark_from_static_string("Pacemaker non-logging tracepoint"); - } -@@ -711,11 +714,11 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE); - } - -- if (daemon) { -+ if (crm_is_daemon) { - set_daemon_option("logfacility", facility); - } - -- if (daemon && crm_tracing_enabled() -+ if (crm_is_daemon && crm_tracing_enabled() - && qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_STATE_GET, 0) != QB_LOG_STATE_ENABLED - && qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_STATE_GET, 0) != QB_LOG_STATE_ENABLED) { - /* Make sure tracing goes somewhere */ -@@ -725,20 +728,20 @@ crm_log_init(const char *entity, int level, gboolean daemon, gboolean to_stderr, - crm_update_callsites(); - - /* Ok, now we can start logging... */ -- if (quiet == FALSE && daemon == FALSE) { -+ if (quiet == FALSE && crm_is_daemon == FALSE) { - crm_log_args(argc, argv); - } - -- if (daemon) { -+ if (crm_is_daemon) { - const char *user = getenv("USER"); - - if (user != NULL && safe_str_neq(user, "root") && safe_str_neq(user, CRM_DAEMON_USER)) { - crm_trace("Not switching to corefile directory for %s", user); -- daemon = FALSE; -+ crm_is_daemon = FALSE; - } - } - -- if (daemon) { -+ if (crm_is_daemon) { - int user = getuid(); - const char *base = CRM_CORE_DIR; - struct passwd *pwent = getpwuid(user); -diff --git a/lib/common/utils.c b/lib/common/utils.c -index 069b5c8..527c9e0 100644 ---- a/lib/common/utils.c -+++ b/lib/common/utils.c -@@ -1085,6 +1085,8 @@ filter_reload_parameters(xmlNode * param_set, const char *restart_string) - } - } - -+extern bool crm_is_daemon; -+ - /* coverity[+kill] */ - void - crm_abort(const char *file, const char *function, int line, -@@ -1097,6 +1099,14 @@ crm_abort(const char *file, const char *function, int line, - /* Implied by the parent's error logging below */ - /* crm_write_blackbox(0); */ - -+ if(crm_is_daemon == FALSE) { -+ /* This is a command line tool - do not fork */ -+ -+ /* crm_add_logfile(NULL); * Record it to a file? */ -+ crm_enable_stderr(TRUE); /* Make sure stderr is enabled so we can tell the caller */ -+ do_fork = FALSE; /* Just crash if needed */ -+ } -+ - if (do_core == FALSE) { - crm_err("%s: Triggered assert at %s:%d : %s", function, file, line, assert_condition); - return; diff --git a/SOURCES/bz720543-pcmk-corosync_attempt_to_retrieve_a_peer_s_node_name_if_it_is_not_already_known.patch b/SOURCES/bz720543-pcmk-corosync_attempt_to_retrieve_a_peer_s_node_name_if_it_is_not_already_known.patch deleted file mode 100644 index f07c89d..0000000 --- a/SOURCES/bz720543-pcmk-corosync_attempt_to_retrieve_a_peer_s_node_name_if_it_is_not_already_known.patch +++ /dev/null @@ -1,41 +0,0 @@ -commit bcd7ef60b00462c6a55ae1ce2f3ea45391059368 -Author: Andrew Beekhof -Date: Thu Nov 14 11:25:20 2013 +1100 - - Bug cl#5179 - Corosync: Attempt to retrieve a peer's node name if it is not already known - - (cherry picked from commit 441978e42a41fcfca3f4b41a1458d8a9c171dd63) - -diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c -index e7d5b69..b4c8ba7 100644 ---- a/lib/cluster/membership.c -+++ b/lib/cluster/membership.c -@@ -270,6 +270,7 @@ crm_get_peer(unsigned int id, const char *uname) - crm_node_t *node = NULL; - crm_node_t *by_id = NULL; - crm_node_t *by_name = NULL; -+ char *uname_lookup = NULL; - - CRM_ASSERT(id > 0 || uname != NULL); - -@@ -357,6 +358,12 @@ crm_get_peer(unsigned int id, const char *uname) - g_hash_table_replace(crm_peer_cache, uniqueid, node); - } - -+ if(id && uname == NULL && node->uname == NULL) { -+ uname_lookup = get_node_name(id); -+ uname = uname_lookup; -+ crm_trace("Inferred a name of '%s' for node %u", uname, id); -+ } -+ - if(id > 0 && uname && (node->id == 0 || node->uname == NULL)) { - crm_info("Node %u is now known as %s", id, uname); - } -@@ -393,6 +400,7 @@ crm_get_peer(unsigned int id, const char *uname) - } - } - -+ free(uname_lookup); - return node; - } - diff --git a/SOURCES/bz720543-pcmk-crm_report_do_not_print_garbage_when_collecting_from_the_local_node.patch b/SOURCES/bz720543-pcmk-crm_report_do_not_print_garbage_when_collecting_from_the_local_node.patch deleted file mode 100644 index ec44c63..0000000 --- a/SOURCES/bz720543-pcmk-crm_report_do_not_print_garbage_when_collecting_from_the_local_node.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 9b488a436dcdba49bd3b5e5365eb9ac44719d308 -Author: Andrew Beekhof -Date: Wed Sep 4 14:46:23 2013 +1000 - - Fix: crm_report: Do not print garbage when collecting from the local node - - (cherry picked from commit 2c78ded0c66dc2f113ed1620efeaef51fdb489e5) - -diff --git a/tools/report.collector b/tools/report.collector -index 1667364..62cbe8b 100644 ---- a/tools/report.collector -+++ b/tools/report.collector -@@ -748,8 +748,6 @@ done - - if [ -e $REPORT_HOME/.env ]; then - debug "Localhost: $REPORT_MASTER $REPORT_TARGET" -- # Need to send something back or tar on the caller will complain -- (cd $REPORT_HOME && tar cf - .env) - - elif [ "$REPORT_MASTER" != "$REPORT_TARGET" ]; then - debug "Streaming report back to $REPORT_MASTER" diff --git a/SOURCES/bz720543-pcmk-crm_report_record_the_output_of_the_collector.patch b/SOURCES/bz720543-pcmk-crm_report_record_the_output_of_the_collector.patch deleted file mode 100644 index 91e5000..0000000 --- a/SOURCES/bz720543-pcmk-crm_report_record_the_output_of_the_collector.patch +++ /dev/null @@ -1,42 +0,0 @@ -commit c3fb9d983fbbcc7f19908c384cd29656e0620ec3 -Author: Andrew Beekhof -Date: Wed Sep 4 12:54:37 2013 +1000 - - Feature: crm_report: Record the output of the collector - - (cherry picked from commit 494a01897f07327ec475a86957b8fc7fd3ad362c) - -diff --git a/tools/report.common.in b/tools/report.common.in -index c4023a8..9742f1c 100644 ---- a/tools/report.common.in -+++ b/tools/report.common.in -@@ -72,15 +72,29 @@ glibc - # - # keep the user posted - # -+record() { -+ if [ x != x"$REPORT_HOME" -a -d "${REPORT_HOME}/$shorthost" ]; then -+ rec="${REPORT_HOME}/$shorthost/report.out" -+ -+ elif [ x != x"${l_base}" ]; then -+ rec="${l_base}/report.summary" -+ -+ else -+ rec="/dev/null" -+ fi -+ printf "%-10s $*\n" "$shorthost:" 2>&1 >> "${rec}" -+} - - log() { - printf "%-10s $*\n" "$shorthost:" 1>&2 -+ record "$*" - } - - debug() { - if [ $verbose -gt 0 ]; then - log "Debug: $*" - fi -+ record "Debug: $*" - } - - info() { diff --git a/SOURCES/bz720543-pcmk-crm_resource_wait_for_all_replies_when_cleaning_up_resources.patch b/SOURCES/bz720543-pcmk-crm_resource_wait_for_all_replies_when_cleaning_up_resources.patch deleted file mode 100644 index ff7c066..0000000 --- a/SOURCES/bz720543-pcmk-crm_resource_wait_for_all_replies_when_cleaning_up_resources.patch +++ /dev/null @@ -1,36 +0,0 @@ -commit 8da149c887c80b1bcf778089268b060e014159ef -Author: Andrew Beekhof -Date: Thu Oct 3 17:01:38 2013 +1000 - - Fix: crm_resource: Wait for all replies when cleaning up resources - - (cherry picked from commit 62e59ab2ad211cef798792632ad7df4f8a5c3418) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 44d96b0..c03501d 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -801,11 +801,15 @@ delete_lrm_rsc(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname - - 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); -+ - 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->details->remote_rsc == NULL) { -+ crmd_replies_needed++; -+ } - if (rsc->clone_name) { - id = rsc->clone_name; - } -@@ -2165,6 +2169,7 @@ main(int argc, char **argv) - - crm_debug("Re-checking the state of %s on %s", rsc_id, host_uname); - if(rsc) { -+ crmd_replies_needed = 0; - rc = delete_lrm_rsc(cib_conn, crmd_channel, host_uname, rsc, &data_set); - } else { - rc = -ENODEV; diff --git a/SOURCES/bz720543-pcmk-crmd_cache_rsc_info_retrieved_from_lrmd_and_pacemaker_remoted.patch b/SOURCES/bz720543-pcmk-crmd_cache_rsc_info_retrieved_from_lrmd_and_pacemaker_remoted.patch deleted file mode 100644 index 9d12301..0000000 --- a/SOURCES/bz720543-pcmk-crmd_cache_rsc_info_retrieved_from_lrmd_and_pacemaker_remoted.patch +++ /dev/null @@ -1,112 +0,0 @@ -commit 701e10aba853afb4cd1ab4a1e4e3dd64ea96e907 -Author: David Vossel -Date: Thu Oct 10 17:22:29 2013 -0500 - - Low: crmd: Cache rsc_info retrieved from lrmd and pacemaker_remoted - - (cherry picked from commit d65b2703d2107665365b0db06cff67386981e346) - -diff --git a/crmd/crmd_lrm.h b/crmd/crmd_lrm.h -index d0ca58c..2239638 100644 ---- a/crmd/crmd_lrm.h -+++ b/crmd/crmd_lrm.h -@@ -56,6 +56,8 @@ typedef struct lrm_state_s { - GHashTable *pending_ops; - GHashTable *deletion_ops; - -+ GHashTable *rsc_info_cache; -+ - int num_lrm_register_fails; - } lrm_state_t; - -diff --git a/crmd/lrm_state.c b/crmd/lrm_state.c -index b1b1b7f..57eb87e 100644 ---- a/crmd/lrm_state.c -+++ b/crmd/lrm_state.c -@@ -60,6 +60,13 @@ history_cache_destroy(gpointer data) - free(entry->id); - free(entry); - } -+static void -+free_rsc_info(gpointer value) -+{ -+ lrmd_rsc_info_t *rsc_info = value; -+ -+ lrmd_free_rsc_info(rsc_info); -+} - - static void - free_deletion_op(gpointer value) -@@ -99,6 +106,9 @@ lrm_state_create(const char *node_name) - - state->node_name = strdup(node_name); - -+ state->rsc_info_cache = g_hash_table_new_full(crm_str_hash, -+ g_str_equal, NULL, free_rsc_info); -+ - state->deletion_ops = g_hash_table_new_full(crm_str_hash, - g_str_equal, g_hash_destroy_str, free_deletion_op); - -@@ -146,6 +156,10 @@ internal_lrm_state_destroy(gpointer data) - remote_ra_cleanup(lrm_state); - lrmd_api_delete(lrm_state->conn); - -+ if (lrm_state->rsc_info_cache) { -+ crm_trace("Destroying rsc info cache with %d members", g_hash_table_size(lrm_state->rsc_info_cache)); -+ g_hash_table_destroy(lrm_state->rsc_info_cache); -+ } - if (lrm_state->resource_history) { - crm_trace("Destroying history op cache with %d members", g_hash_table_size(lrm_state->resource_history)); - g_hash_table_destroy(lrm_state->resource_history); -@@ -181,6 +195,11 @@ lrm_state_reset_tables(lrm_state_t * lrm_state) - g_hash_table_size(lrm_state->pending_ops)); - g_hash_table_remove_all(lrm_state->pending_ops); - } -+ if (lrm_state->rsc_info_cache) { -+ crm_trace("Re-setting rsc info cache with %d members", -+ g_hash_table_size(lrm_state->rsc_info_cache)); -+ g_hash_table_remove_all(lrm_state->rsc_info_cache); -+ } - } - - static void -@@ -590,16 +609,28 @@ lrm_state_cancel(lrm_state_t * lrm_state, const char *rsc_id, const char *action - lrmd_rsc_info_t * - lrm_state_get_rsc_info(lrm_state_t * lrm_state, const char *rsc_id, enum lrmd_call_options options) - { -+ lrmd_rsc_info_t *rsc = NULL; -+ - if (!lrm_state->conn) { - return NULL; - } -- /* optimize this... this function is a synced round trip from client to daemon. -- * It should be possible to cache the resource info in the lrmd client to prevent this. */ - if (is_remote_lrmd_ra(NULL, NULL, rsc_id)) { - return remote_ra_get_rsc_info(lrm_state, rsc_id); - } - -- return ((lrmd_t *) lrm_state->conn)->cmds->get_rsc_info(lrm_state->conn, rsc_id, options); -+ rsc = g_hash_table_lookup(lrm_state->rsc_info_cache, rsc_id); -+ if (rsc == NULL) { -+ /* only contact the lrmd if we don't already have a cached rsc info */ -+ rsc = ((lrmd_t *) lrm_state->conn)->cmds->get_rsc_info(lrm_state->conn, rsc_id, options); -+ if (rsc == NULL) { -+ return NULL; -+ } -+ /* cache the result */ -+ g_hash_table_insert(lrm_state->rsc_info_cache, rsc->id, rsc); -+ } -+ -+ return lrmd_copy_rsc_info(rsc); -+ - } - - int -@@ -667,5 +698,7 @@ lrm_state_unregister_rsc(lrm_state_t * lrm_state, - return pcmk_ok; - } - -+ g_hash_table_remove(lrm_state->rsc_info_cache, rsc_id); -+ - return ((lrmd_t *) lrm_state->conn)->cmds->unregister_rsc(lrm_state->conn, rsc_id, options); - } diff --git a/SOURCES/bz720543-pcmk-crmd_correctly_update_expected_state_when_the_previous_dc_shuts_down.patch b/SOURCES/bz720543-pcmk-crmd_correctly_update_expected_state_when_the_previous_dc_shuts_down.patch deleted file mode 100644 index 9854a8f..0000000 --- a/SOURCES/bz720543-pcmk-crmd_correctly_update_expected_state_when_the_previous_dc_shuts_down.patch +++ /dev/null @@ -1,88 +0,0 @@ -commit 4443e76aaccb60fb49f7c32eb2c0a34e0965a291 -Author: Andrew Beekhof -Date: Wed Oct 2 09:00:39 2013 +1000 - - Fix: crmd: Correctly update expected state when the previous DC shuts down - - (cherry picked from commit 25ebce69ecc07799b50cf6e0ca4704345e7cf336) - -diff --git a/crmd/join_dc.c b/crmd/join_dc.c -index b45fff2..5e6c827 100644 ---- a/crmd/join_dc.c -+++ b/crmd/join_dc.c -@@ -103,17 +103,19 @@ initialize_join(gboolean before) - static void - join_make_offer(gpointer key, gpointer value, gpointer user_data) - { -- const char *join_to = NULL; -- const crm_node_t *member = value; -+ xmlNode *offer = NULL; -+ crm_node_t *member = (crm_node_t *)value; - - CRM_ASSERT(member != NULL); - if (crm_is_peer_active(member) == FALSE) { -- crm_trace("Not making an offer to %s: not active", member->uname); -+ crm_info("Not making an offer to %s: not active (%s)", member->uname, member->state); -+ if(member->expected == NULL && safe_str_eq(member->state, CRM_NODE_LOST)) { -+ crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_DOWN); -+ } - return; - } - -- join_to = member->uname; -- if (join_to == NULL) { -+ if (member->uname == NULL) { - crm_err("No recipient for welcome message"); - return; - } -@@ -130,26 +132,18 @@ join_make_offer(gpointer key, gpointer value, gpointer user_data) - - crm_update_peer_join(__FUNCTION__, (crm_node_t*)member, crm_join_none); - -- if (crm_is_peer_active(member)) { -- crm_node_t *peer = crm_get_peer(0, join_to); -- xmlNode *offer = create_request(CRM_OP_JOIN_OFFER, NULL, join_to, -- CRM_SYSTEM_CRMD, CRM_SYSTEM_DC, NULL); -- -- crm_xml_add_int(offer, F_CRM_JOIN_ID, current_join_id); -- /* send the welcome */ -- crm_info("join-%d: Sending offer to %s", current_join_id, join_to); -+ offer = create_request(CRM_OP_JOIN_OFFER, NULL, member->uname, -+ CRM_SYSTEM_CRMD, CRM_SYSTEM_DC, NULL); - -- send_cluster_message(peer, crm_msg_crmd, offer, TRUE); -- free_xml(offer); -+ crm_xml_add_int(offer, F_CRM_JOIN_ID, current_join_id); -+ /* send the welcome */ -+ crm_info("join-%d: Sending offer to %s", current_join_id, member->uname); - -- crm_update_peer_join(__FUNCTION__, peer, crm_join_welcomed); -- /* crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_PENDING); */ -- -- } else { -- crm_info("Peer process on %s is not active (yet?): %.8lx %d", -- join_to, (long)member->processes, g_hash_table_size(crm_peer_cache)); -- } -+ send_cluster_message(member, crm_msg_crmd, offer, TRUE); -+ free_xml(offer); - -+ crm_update_peer_join(__FUNCTION__, member, crm_join_welcomed); -+ /* crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_PENDING); */ - } - - /* A_DC_JOIN_OFFER_ALL */ -diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c -index e3082b4..e7d5b69 100644 ---- a/lib/cluster/membership.c -+++ b/lib/cluster/membership.c -@@ -532,8 +532,8 @@ crm_update_peer_expected(const char *source, crm_node_t * node, const char *expe - } - - if (changed) { -- crm_info("%s: Node %s[%u] - expected state is now %s", source, node->uname, node->id, -- expected); -+ crm_info("%s: Node %s[%u] - expected state is now %s (was %s)", source, node->uname, node->id, -+ expected, last); - free(last); - } else { - crm_trace("%s: Node %s[%u] - expected state is unchanged (%s)", source, node->uname, diff --git a/SOURCES/bz720543-pcmk-crmd_don_t_add_node_state_to_cib_if_we_have_not_seen_or_fenced_this_node_yet.patch b/SOURCES/bz720543-pcmk-crmd_don_t_add_node_state_to_cib_if_we_have_not_seen_or_fenced_this_node_yet.patch deleted file mode 100644 index a4d8612..0000000 --- a/SOURCES/bz720543-pcmk-crmd_don_t_add_node_state_to_cib_if_we_have_not_seen_or_fenced_this_node_yet.patch +++ /dev/null @@ -1,30 +0,0 @@ -commit e03e4f32fca5857618603e3e1c9500dbf3d348ef -Author: Lars Ellenberg -Date: Fri Aug 2 14:33:57 2013 +1000 - - Fix: crmd: Don't add node_state to cib, if we have not seen or fenced this node yet - - Also fixes the incredibly dangerous option: startup-fencing=false - - (cherry picked from commit ac7aa1c94f317fc1d4024fbc09b012bc9f1b229e) - -diff --git a/crmd/membership.c b/crmd/membership.c -index e2bcd45..d102db0 100644 ---- a/crmd/membership.c -+++ b/crmd/membership.c -@@ -131,8 +131,14 @@ xmlNode * - do_update_node_cib(crm_node_t * node, int flags, xmlNode * parent, const char *source) - { - const char *value = NULL; -- xmlNode *node_state = create_xml_node(parent, XML_CIB_TAG_STATE); -+ xmlNode *node_state; - -+ if (!node->state) { -+ crm_info("Node update for %s cancelled: no state, not seen yet", node->uname); -+ return NULL; -+ } -+ -+ node_state = create_xml_node(parent, XML_CIB_TAG_STATE); - set_uuid(node_state, XML_ATTR_UUID, node); - - if (crm_element_value(node_state, XML_ATTR_UUID) == NULL) { diff --git a/SOURCES/bz720543-pcmk-crmd_pad_internal_lrmd_rsc_info_and_metadata_retrieval_timeout.patch b/SOURCES/bz720543-pcmk-crmd_pad_internal_lrmd_rsc_info_and_metadata_retrieval_timeout.patch deleted file mode 100644 index 732e869..0000000 --- a/SOURCES/bz720543-pcmk-crmd_pad_internal_lrmd_rsc_info_and_metadata_retrieval_timeout.patch +++ /dev/null @@ -1,30 +0,0 @@ -commit 21172ada434f549515d4480e821872b8cbd12566 -Author: David Vossel -Date: Thu Oct 10 17:30:40 2013 -0500 - - Low: crmd: Pad internal lrmd rsc_info and metadata retrieval timeout - - (cherry picked from commit 5c21a6b6e7789da50111f3d955593c7fbda1ddc2) - -diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c -index e577293..d037022 100644 ---- a/lib/lrmd/lrmd_client.c -+++ b/lib/lrmd/lrmd_client.c -@@ -1437,7 +1437,7 @@ lrmd_api_get_rsc_info(lrmd_t * lrmd, const char *rsc_id, enum lrmd_call_options - - crm_xml_add(data, F_LRMD_ORIGIN, __FUNCTION__); - crm_xml_add(data, F_LRMD_RSC_ID, rsc_id); -- lrmd_send_command(lrmd, LRMD_OP_RSC_INFO, data, &output, 0, options, TRUE); -+ lrmd_send_command(lrmd, LRMD_OP_RSC_INFO, data, &output, 30000, options, TRUE); - free_xml(data); - - if (!output) { -@@ -1743,7 +1743,7 @@ generic_get_metadata(const char *standard, const char *provider, const char *typ - type, - "meta-data", - 0, -- 5000, -+ 30000, - NULL); - - if (!(services_action_sync(action))) { diff --git a/SOURCES/bz720543-pcmk-fencing_allow_fencing_for_node_after_topology_entries_are_deleted.patch b/SOURCES/bz720543-pcmk-fencing_allow_fencing_for_node_after_topology_entries_are_deleted.patch deleted file mode 100644 index b01bc8e..0000000 --- a/SOURCES/bz720543-pcmk-fencing_allow_fencing_for_node_after_topology_entries_are_deleted.patch +++ /dev/null @@ -1,45 +0,0 @@ -commit ca9ea8de96463d137f64977a01517bf794d1f4e4 -Author: David Vossel -Date: Tue Oct 1 18:26:56 2013 -0500 - - Fix: fencing: Allow fencing for node after topology entries are deleted - - (cherry picked from commit 57de742c237ac5c01b4a7ead70003cbaffed9a3e) - -diff --git a/fencing/remote.c b/fencing/remote.c -index 525f1d7..af4fb9e 100644 ---- a/fencing/remote.c -+++ b/fencing/remote.c -@@ -374,6 +374,23 @@ remote_op_query_timeout(gpointer data) - return FALSE; - } - -+static gboolean -+topology_is_empty(stonith_topology_t *tp) -+{ -+ int i; -+ -+ if (tp == NULL) { -+ return TRUE; -+ } -+ -+ for (i = 0; i < ST_LEVEL_MAX; i++) { -+ if (tp->levels[i] != NULL) { -+ return FALSE; -+ } -+ } -+ return TRUE; -+} -+ - static int - stonith_topology_next(remote_fencing_op_t * op) - { -@@ -383,7 +400,7 @@ stonith_topology_next(remote_fencing_op_t * op) - /* Queries don't have a target set */ - tp = g_hash_table_lookup(topology, op->target); - } -- if (tp == NULL) { -+ if (topology_is_empty(tp)) { - return pcmk_ok; - } - diff --git a/SOURCES/bz720543-pcmk-fencing_deep_copy_current_topology_level_list_on_remote_op.patch b/SOURCES/bz720543-pcmk-fencing_deep_copy_current_topology_level_list_on_remote_op.patch deleted file mode 100644 index 99f1ed7..0000000 --- a/SOURCES/bz720543-pcmk-fencing_deep_copy_current_topology_level_list_on_remote_op.patch +++ /dev/null @@ -1,68 +0,0 @@ -commit 5cc40550ed6f385eb25042b1ab14339a760de1e8 -Author: David Vossel -Date: Thu Oct 17 20:34:48 2013 -0500 - - Fix: fencing: Deep copy current topology level list on remote op - - (cherry picked from commit ef29a502e0e0506fd52fc60e51e06ffd6c375f4a) - -diff --git a/fencing/internal.h b/fencing/internal.h -index 11a8c58..da510c3 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -105,6 +105,8 @@ typedef struct remote_fencing_op_s { - /*! The current topology level being executed */ - guint level; - /*! The device list of all the devices at the current executing topology level. */ -+ GListPtr devices_list; -+ /*! Current entry in the topology device list */ - GListPtr devices; - - /*! List of duplicate operations attached to this operation. Once this operation -diff --git a/fencing/remote.c b/fencing/remote.c -index af4fb9e..8c8df6d 100644 ---- a/fencing/remote.c -+++ b/fencing/remote.c -@@ -124,6 +124,10 @@ free_remote_op(gpointer data) - free_xml(op->request); - op->request = NULL; - } -+ if (op->devices_list) { -+ g_list_free_full(op->devices_list, free); -+ op->devices_list = NULL; -+ } - free(op); - } - -@@ -391,6 +395,22 @@ topology_is_empty(stonith_topology_t *tp) - return TRUE; - } - -+/* deep copy the device list */ -+static void -+set_op_device_list(remote_fencing_op_t * op, GListPtr devices) -+{ -+ GListPtr lpc = NULL; -+ -+ if (op->devices_list) { -+ g_list_free_full(op->devices_list, free); -+ op->devices_list = NULL; -+ } -+ for (lpc = devices; lpc != NULL; lpc = lpc->next) { -+ op->devices_list = g_list_append(op->devices_list, strdup(lpc->data)); -+ } -+ op->devices = op->devices_list; -+} -+ - static int - stonith_topology_next(remote_fencing_op_t * op) - { -@@ -415,7 +435,7 @@ stonith_topology_next(remote_fencing_op_t * op) - crm_trace("Attempting fencing level %d for %s (%d devices) - %s@%s.%.8s", - op->level, op->target, g_list_length(tp->levels[op->level]), - op->client_name, op->originator, op->id); -- op->devices = tp->levels[op->level]; -+ set_op_device_list(op, tp->levels[op->level]); - return pcmk_ok; - } - diff --git a/SOURCES/bz720543-pcmk-fencing_do_not_broadcast_suicide_if_the_on_action_is_being_executed.patch b/SOURCES/bz720543-pcmk-fencing_do_not_broadcast_suicide_if_the_on_action_is_being_executed.patch deleted file mode 100644 index f8f6965..0000000 --- a/SOURCES/bz720543-pcmk-fencing_do_not_broadcast_suicide_if_the_on_action_is_being_executed.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit c041f6362e9e33e78e2645ae7c10f5aa2ad41874 -Author: David Vossel -Date: Tue Oct 1 17:12:17 2013 -0500 - - Low: fencing: Do not broadcast suicide if the on action is being executed - - (cherry picked from commit fd5d4e2f3b61a614f92781bd4280efe282bc142a) - -diff --git a/fencing/commands.c b/fencing/commands.c -index 7d04952..909dc24 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -1352,7 +1352,7 @@ stonith_send_async_reply(async_command_t * cmd, const char *output, int rc, GPid - crm_str_eq(cmd->action, "list", TRUE) || crm_str_eq(cmd->action, "status", TRUE)) { - crm_trace("Never broadcast %s replies", cmd->action); - -- } else if (!stand_alone && safe_str_eq(cmd->origin, cmd->victim)) { -+ } else if (!stand_alone && safe_str_eq(cmd->origin, cmd->victim) && safe_str_neq(cmd->action, "on")) { - crm_trace("Broadcast %s reply for %s", cmd->action, cmd->victim); - crm_xml_add(reply, F_SUBTYPE, "broadcast"); - bcast = TRUE; diff --git a/SOURCES/bz720543-pcmk-ipc_raise_the_default_buffer_size_to_128k.patch b/SOURCES/bz720543-pcmk-ipc_raise_the_default_buffer_size_to_128k.patch deleted file mode 100644 index d0ea458..0000000 --- a/SOURCES/bz720543-pcmk-ipc_raise_the_default_buffer_size_to_128k.patch +++ /dev/null @@ -1,75 +0,0 @@ -commit d42392c04d9f81a51d708723d978558690f5724b -Author: Andrew Beekhof -Date: Tue Sep 17 12:36:45 2013 +1000 - - Feature: ipc: Raise the default buffer size to 128k - - (cherry picked from commit 8196f23a829ed02edb887209bccc88dc851b198b) - -diff --git a/lib/common/ipc.c b/lib/common/ipc.c -index 2cd42bf..451bda5 100644 ---- a/lib/common/ipc.c -+++ b/lib/common/ipc.c -@@ -521,13 +521,6 @@ crm_ipc_prepare(uint32_t request, xmlNode * message, struct iovec ** result) - } else { - unsigned int new_size = 0; - -- if (total > biggest) { -- biggest = 2 * QB_MAX(total, biggest); -- crm_notice("Message exceeds the configured ipc limit (%d bytes), " -- "consider configuring PCMK_ipc_buffer to %d or higher " -- "to avoid compression overheads", ipc_buffer_max, biggest); -- } -- - if (crm_compress_string - (buffer, header->size_uncompressed, ipc_buffer_max, &compressed, &new_size)) { - -@@ -539,10 +532,15 @@ crm_ipc_prepare(uint32_t request, xmlNode * message, struct iovec ** result) - - free(buffer); - -+ if (header->size_compressed > biggest) { -+ biggest = 2 * QB_MAX(header->size_compressed, biggest); -+ } -+ - } else { - ssize_t rc = -EMSGSIZE; - - crm_log_xml_trace(message, "EMSGSIZE"); -+ biggest = 2 * QB_MAX(header->size_uncompressed, biggest); - - crm_err - ("Could not compress the message into less than the configured ipc limit (%d bytes)." -@@ -665,7 +663,7 @@ crm_ipcs_send_ack(crm_client_t * c, uint32_t request, const char *tag, const cha - /* Client... */ - - #define MIN_MSG_SIZE 12336 /* sizeof(struct qb_ipc_connection_response) */ --#define MAX_MSG_SIZE 50*1024 /* 50k default */ -+#define MAX_MSG_SIZE 128*1024 /* 128k default */ - - struct crm_ipc_s { - struct pollfd pfd; -@@ -1004,6 +1002,7 @@ crm_ipc_send(crm_ipc_t * client, xmlNode * message, enum crm_ipc_flags flags, in - long rc = 0; - struct iovec *iov; - static uint32_t id = 0; -+ static int factor = 8; - struct crm_ipc_response_header *header; - - crm_ipc_init(); -@@ -1041,6 +1040,15 @@ crm_ipc_send(crm_ipc_t * client, xmlNode * message, enum crm_ipc_flags flags, in - header = iov[0].iov_base; - header->flags |= flags; - -+ if(header->flags | crm_ipc_compressed) { -+ if(factor < 10 && (ipc_buffer_max / 10) < (rc / factor)) { -+ crm_notice("Compressed message exceeds %d0%% of the configured ipc limit (%d bytes), " -+ "consider setting PCMK_ipc_buffer to %d or higher", -+ factor, ipc_buffer_max, 2*ipc_buffer_max); -+ factor++; -+ } -+ } -+ - if (ms_timeout == 0) { - ms_timeout = 5000; - } diff --git a/SOURCES/bz720543-pcmk-ipc_use_the_higher_of_the_configured_buffer_size_or_the_default.patch b/SOURCES/bz720543-pcmk-ipc_use_the_higher_of_the_configured_buffer_size_or_the_default.patch deleted file mode 100644 index e862a7f..0000000 --- a/SOURCES/bz720543-pcmk-ipc_use_the_higher_of_the_configured_buffer_size_or_the_default.patch +++ /dev/null @@ -1,44 +0,0 @@ -commit 20845c58bf1003225241dcefb47d7d71013aa432 -Author: Andrew Beekhof -Date: Fri Oct 18 12:20:29 2013 +1100 - - Fix: ipc: Use the higher of the configured buffer size or the default - - (cherry picked from commit 87a34aa975ae2a114e964e3dd9c3c84a937c1979) - -diff --git a/lib/common/ipc.c b/lib/common/ipc.c -index 451bda5..435b392 100644 ---- a/lib/common/ipc.c -+++ b/lib/common/ipc.c -@@ -681,22 +681,19 @@ struct crm_ipc_s { - static int - pick_ipc_buffer(int max) - { -- const char *env = getenv("PCMK_ipc_buffer"); -+ static int global_max = 0; - -- if (env) { -- max = crm_parse_int(env, "0"); -- } -- -- if (max <= 0) { -- max = MAX_MSG_SIZE; -- } -+ if(global_max == 0) { -+ const char *env = getenv("PCMK_ipc_buffer"); - -- if (max < MIN_MSG_SIZE) { -- max = MIN_MSG_SIZE; -+ if (env) { -+ global_max = crm_parse_int(env, "0"); -+ } else { -+ global_max = MAX_MSG_SIZE; -+ } - } - -- crm_trace("Using max message size of %d", max); -- return max; -+ return QB_MAX(max, global_max); - } - - crm_ipc_t * diff --git a/SOURCES/bz720543-pcmk-iso8601_prevent_dates_from_jumping_backwards_a_day_in_some_timezones.patch b/SOURCES/bz720543-pcmk-iso8601_prevent_dates_from_jumping_backwards_a_day_in_some_timezones.patch deleted file mode 100644 index 12e6a68..0000000 --- a/SOURCES/bz720543-pcmk-iso8601_prevent_dates_from_jumping_backwards_a_day_in_some_timezones.patch +++ /dev/null @@ -1,20 +0,0 @@ -commit aa0e9c4d42f7ae4a856c5716444e9333b099013b -Author: Andrew Beekhof -Date: Wed Oct 2 09:02:19 2013 +1000 - - Fix: iso8601: Prevent dates from jumping backwards a day in some timezones - - (cherry picked from commit ed70b9864247030bc21163411b60a7e962068d88) - -diff --git a/lib/common/iso8601.c b/lib/common/iso8601.c -index d68e7e6..d88c519 100644 ---- a/lib/common/iso8601.c -+++ b/lib/common/iso8601.c -@@ -1115,7 +1115,6 @@ crm_time_add_seconds(crm_time_t * a_time, int extra) - days++; - } - -- days = 0; - while (a_time->seconds < 0) { - crm_trace("s=%d, d=%d", a_time->seconds, days); - a_time->seconds += seconds; diff --git a/SOURCES/bz720543-pcmk-lrmd_correctly_cancel_monitor_actions_for_lsb_systemd_service_resources_on_cleaning_up.patch b/SOURCES/bz720543-pcmk-lrmd_correctly_cancel_monitor_actions_for_lsb_systemd_service_resources_on_cleaning_up.patch deleted file mode 100644 index 8d4bafa..0000000 --- a/SOURCES/bz720543-pcmk-lrmd_correctly_cancel_monitor_actions_for_lsb_systemd_service_resources_on_cleaning_up.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 59a56d6fef5885f6d22f1e20bd189d91d5844827 -Author: Gao,Yan -Date: Mon Sep 30 21:10:44 2013 +0800 - - Fix: lrmd: Correctly cancel monitor actions for lsb/systemd/service resources on cleaning up - - (cherry picked from commit 1c14b9d69470ff56fd814091867394cd0a1cf61d) - -diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c -index 8592b6c..65421d0 100644 ---- a/lrmd/lrmd.c -+++ b/lrmd/lrmd.c -@@ -978,7 +978,7 @@ free_rsc(gpointer data) - * let service library cancel it and tell us via the callback - * when it is cancelled. The rsc can be safely destroyed - * even if we are waiting for the cancel result */ -- services_action_cancel(rsc->rsc_id, cmd->action, cmd->interval); -+ services_action_cancel(rsc->rsc_id, normalize_action_name(rsc, cmd->action), cmd->interval); - } - } - /* frees list, but not list elements. */ diff --git a/SOURCES/bz720543-pcmk-pcmk_remote_ipv6_support.patch b/SOURCES/bz720543-pcmk-pcmk_remote_ipv6_support.patch deleted file mode 100644 index 40248e3..0000000 --- a/SOURCES/bz720543-pcmk-pcmk_remote_ipv6_support.patch +++ /dev/null @@ -1,173 +0,0 @@ -commit edabd027144c2a9fcd44a997f47981b836b53b77 -Author: David Vossel -Date: Wed Nov 6 13:27:11 2013 -0500 - - High: remote: Add support for ipv6 into pacemaker_remote daemon - (cherry picked from commit 1595263ff56ac14cc697d9866b532c14267d708f) - -diff --git a/lrmd/tls_backend.c b/lrmd/tls_backend.c -index 780d17b..46e7f27 100644 ---- a/lrmd/tls_backend.c -+++ b/lrmd/tls_backend.c -@@ -30,6 +30,7 @@ - - #include - -+#include - #include - #include - #include -@@ -38,7 +39,7 @@ - # define LRMD_REMOTE_AUTH_TIMEOUT 10000 - gnutls_psk_server_credentials_t psk_cred_s; - gnutls_dh_params_t dh_params; --static int ssock = 0; -+static int ssock = -1; - extern int lrmd_call_id; - - static void -@@ -253,12 +254,72 @@ lrmd_tls_server_key_cb(gnutls_session_t session, const char *username, gnutls_da - return lrmd_tls_set_key(key); - } - -+static int -+bind_and_listen(struct addrinfo *addr) -+{ -+ int optval; -+ int fd; -+ int rc; -+ char buffer[256] = { 0, }; -+ -+ if (addr->ai_family == AF_INET6) { -+ struct sockaddr_in6 *addr_in = (struct sockaddr_in6 *)addr->ai_addr; -+ inet_ntop(addr->ai_family, &addr_in->sin6_addr, buffer, DIMOF(buffer)); -+ -+ } else { -+ struct sockaddr_in *addr_in = (struct sockaddr_in *)addr->ai_addr; -+ inet_ntop(addr->ai_family, &addr_in->sin_addr, buffer, DIMOF(buffer)); -+ } -+ -+ crm_trace("Attempting to bind on address %s", buffer); -+ -+ fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); -+ if (fd < 0) { -+ return -1; -+ } -+ -+ /* reuse address */ -+ optval = 1; -+ rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); -+ if (rc < 0) { -+ crm_perror(LOG_INFO, "Couldn't allow the reuse of local addresses by our remote listener, bind address %s", buffer); -+ close(fd); -+ return -1; -+ } -+ -+ if (addr->ai_family == AF_INET6) { -+ optval = 0; -+ rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)); -+ if (rc < 0) { -+ crm_perror(LOG_INFO, "Couldn't disable IPV6 only on address %s", buffer); -+ close(fd); -+ return -1; -+ } -+ } -+ -+ if (bind(fd, addr->ai_addr, addr->ai_addrlen) != 0) { -+ close(fd); -+ return -1; -+ } -+ -+ if (listen(fd, 10) == -1) { -+ crm_err("Can not start listen on address %s", buffer); -+ close(fd); -+ return -1; -+ } -+ -+ crm_notice("Listening on address %s", buffer); -+ -+ return fd; -+} -+ - int - lrmd_init_remote_tls_server(int port) - { - int rc; -- struct sockaddr_in saddr; -- int optval; -+ int filter; -+ struct addrinfo hints, *res = NULL, *iter; -+ char port_str[16]; - - static struct mainloop_fd_callbacks remote_listen_fd_callbacks = { - .dispatch = lrmd_remote_listen, -@@ -275,34 +336,39 @@ lrmd_init_remote_tls_server(int port) - gnutls_psk_set_server_credentials_function(psk_cred_s, lrmd_tls_server_key_cb); - gnutls_psk_set_server_dh_params(psk_cred_s, dh_params); - -- /* create server socket */ -- ssock = socket(AF_INET, SOCK_STREAM, 0); -- if (ssock == -1) { -- crm_err("Can not create server socket."); -- return -1; -- } -+ memset(&hints, 0, sizeof(struct addrinfo)); -+ hints.ai_flags = AI_PASSIVE; /* Only return socket addresses with wildcard INADDR_ANY or IN6ADDR_ANY_INIT */ -+ hints.ai_family = AF_UNSPEC; /* Return IPv6 or IPv4 */ -+ hints.ai_socktype = SOCK_STREAM; -+ hints.ai_protocol = IPPROTO_TCP; - -- /* reuse address */ -- optval = 1; -- rc = setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); -- if (rc < 0) { -- crm_perror(LOG_INFO, "Couldn't allow the reuse of local addresses by our remote listener"); -+ snprintf(port_str, sizeof(port_str), "%d", port); -+ rc = getaddrinfo(NULL, port_str, &hints, &res); -+ if (rc) { -+ crm_err("getaddrinfo: %s", gai_strerror(rc)); -+ return -1; - } - -- rc = -1; -+ iter = res; -+ filter = AF_INET6; -+ /* Try IPv6 addresses first, then IPv4 */ -+ while (iter) { -+ if (iter->ai_family == filter) { -+ ssock = bind_and_listen(iter); -+ } -+ if (ssock != -1) { -+ break; -+ } - -- /* bind server socket */ -- memset(&saddr, '\0', sizeof(saddr)); -- saddr.sin_family = AF_INET; -- saddr.sin_addr.s_addr = INADDR_ANY; -- saddr.sin_port = htons(port); -- if (bind(ssock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) { -- crm_err("Can not bind server socket."); -- goto init_remote_cleanup; -+ iter = iter->ai_next; -+ if (iter == NULL && filter == AF_INET6) { -+ iter = res; -+ filter = AF_INET; -+ } - } - -- if (listen(ssock, 10) == -1) { -- crm_err("Can not start listen."); -+ if (ssock < 0) { -+ crm_err("unable to bind to address"); - goto init_remote_cleanup; - } - -@@ -314,6 +380,7 @@ lrmd_init_remote_tls_server(int port) - close(ssock); - ssock = 0; - } -+ freeaddrinfo(res); - return rc; - - } diff --git a/SOURCES/bz720543-pcmk-pe_don_t_prevent_clones_from_running_due_to_dependant_resources.patch b/SOURCES/bz720543-pcmk-pe_don_t_prevent_clones_from_running_due_to_dependant_resources.patch deleted file mode 100644 index 7976c71..0000000 --- a/SOURCES/bz720543-pcmk-pe_don_t_prevent_clones_from_running_due_to_dependant_resources.patch +++ /dev/null @@ -1,89 +0,0 @@ -commit 7d47ad8be7a9c31a1eba2a3714a645ae3985fc37 -Author: Andrew Beekhof -Date: Fri Aug 9 15:00:40 2013 +1000 - - Bug cl#5171 - PE: Don't prevent clones from running due to dependant resources - - (cherry picked from commit 1c057f8808c71763134ae829851d2a2b3b604d07) - -diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h -index a6b9369..7240106 100644 ---- a/include/crm/pengine/internal.h -+++ b/include/crm/pengine/internal.h -@@ -129,6 +129,7 @@ pe_hash_table_lookup(GHashTable * hash, gconstpointer key) - extern action_t *get_pseudo_op(const char *name, pe_working_set_t * data_set); - extern gboolean order_actions(action_t * lh_action, action_t * rh_action, enum pe_ordering order); - -+GHashTable *node_hash_dup(GHashTable * hash); - extern GListPtr node_list_and(GListPtr list1, GListPtr list2, gboolean filter); - - extern GListPtr node_list_xor(GListPtr list1, GListPtr list2, gboolean filter); -diff --git a/pengine/clone.c b/pengine/clone.c -index b15f76f..9113e9d 100644 ---- a/pengine/clone.c -+++ b/pengine/clone.c -@@ -385,8 +385,9 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working - { - node_t *chosen = NULL; - node_t *local_node = NULL; -+ GHashTable *backup = NULL; - -- pe_rsc_trace(rsc, "Processing %s", rsc->id); -+ pe_rsc_trace(rsc, "Processing %s %d", rsc->id, all_coloc); - - if (is_not_set(rsc->flags, pe_rsc_provisional)) { - return rsc->fns->location(rsc, NULL, FALSE); -@@ -421,15 +422,19 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working - } - } - -+ backup = node_hash_dup(rsc->allowed_nodes); - chosen = rsc->cmds->allocate(rsc, prefer, data_set); - if (chosen) { - local_node = pe_hash_table_lookup(rsc->parent->allowed_nodes, chosen->details->id); - - if (prefer && chosen && chosen->details != prefer->details) { -- crm_err("Pre-allocation failed: got %s instead of %s", -- chosen->details->uname, prefer->details->uname); -+ crm_notice("Pre-allocation failed: got %s instead of %s", -+ chosen->details->uname, prefer->details->uname); -+ g_hash_table_destroy(rsc->allowed_nodes); -+ rsc->allowed_nodes = backup; - native_deallocate(rsc); - chosen = NULL; -+ backup = NULL; - - } else if (local_node) { - local_node->count++; -@@ -442,6 +447,9 @@ color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working - } - } - -+ if(backup) { -+ g_hash_table_destroy(backup); -+ } - return chosen; - } - -@@ -587,7 +595,7 @@ clone_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) - } - } - -- pe_rsc_trace(rsc, "Done pre-allocating"); -+ pe_rsc_trace(rsc, "Done pre-allocating (%d of %d)", allocated, clone_data->clone_max); - g_list_free(nodes); - - for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { -diff --git a/pengine/native.c b/pengine/native.c -index 21ad629..4016a3c 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -313,7 +313,7 @@ node_hash_update(GHashTable * list1, GHashTable * list2, const char *attr, float - } - } - --static GHashTable * -+GHashTable * - node_hash_dup(GHashTable * hash) - { - /* Hack! */ diff --git a/SOURCES/bz720543-pcmk-pe_probe_containers_not_expected_to_be_up.patch b/SOURCES/bz720543-pcmk-pe_probe_containers_not_expected_to_be_up.patch deleted file mode 100644 index 368aec0..0000000 --- a/SOURCES/bz720543-pcmk-pe_probe_containers_not_expected_to_be_up.patch +++ /dev/null @@ -1,121 +0,0 @@ -commit 7d17d8ab2dd91bdcaf2dea199f2ef66b514daea0 -Author: Andrew Beekhof -Date: Wed Nov 6 14:15:24 2013 +1100 - - PE: Probe containers not expected to be up - - RHEL-Only work-around, fixing properly upstream - -diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h -index 7240106..dd52e7f 100644 ---- a/include/crm/pengine/internal.h -+++ b/include/crm/pengine/internal.h -@@ -262,4 +262,5 @@ op_digest_cache_t *rsc_action_digest_cmp(resource_t * rsc, xmlNode * xml_op, nod - - gboolean is_remote_node(xmlNode *xml); - -+resource_t * rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc); - #endif -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index 8eb4a1d..eb52464 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -183,6 +183,7 @@ struct node_s { - # define pe_rsc_migrating 0x00400000ULL - - # define pe_rsc_failure_ignored 0x01000000ULL -+# define pe_rsc_unexpectedly_running 0x02000000ULL - - # define pe_rsc_needs_quorum 0x10000000ULL - # define pe_rsc_needs_fencing 0x20000000ULL -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 78ceb85..56ed291 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2014,6 +2014,9 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d - { - xmlNode *rsc_entry = NULL; - gboolean found_orphaned_container_filler = FALSE; -+ GListPtr unexpected_containers = NULL; -+ GListPtr gIter = NULL; -+ resource_t *remote = NULL; - - CRM_CHECK(node != NULL, return FALSE); - -@@ -2025,9 +2028,29 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d - if (crm_str_eq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE, TRUE)) { - resource_t *rsc; - rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); -- if (rsc && is_set(rsc->flags, pe_rsc_orphan_container_filler)) { -+ if (!rsc) { -+ continue; -+ } -+ if (is_set(rsc->flags, pe_rsc_orphan_container_filler)) { - found_orphaned_container_filler = TRUE; - } -+ if (is_set(rsc->flags, pe_rsc_unexpectedly_running)) { -+ remote = rsc_contains_remote_node(data_set, rsc); -+ if (remote) { -+ unexpected_containers = g_list_append(unexpected_containers, remote); -+ } -+ } -+ } -+ } -+ -+ /* If a container resource is unexpectedly up... and the remote-node -+ * connection resource for that container is not up, the entire container -+ * must be recovered. */ -+ for (gIter = unexpected_containers; gIter != NULL; gIter = gIter->next) { -+ remote = (resource_t *) gIter->data; -+ if (remote->role != RSC_ROLE_STARTED) { -+ crm_warn("Recovering container resource %s. Resource is unexpectedly running and involves a remote-node."); -+ set_bit(remote->container->flags, pe_rsc_failed); - } - } - -@@ -2037,7 +2060,7 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d - if (found_orphaned_container_filler) { - handle_orphaned_container_fillers(lrm_rsc_list, data_set); - } -- -+ g_list_free(unexpected_containers); - return TRUE; - } - -@@ -2366,6 +2389,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - case PCMK_OCF_OK: - if (is_probe && target_rc == 7) { - task_status_i = PCMK_LRM_OP_DONE; -+ set_bit(rsc->flags, pe_rsc_unexpectedly_running); - pe_rsc_info(rsc, "Operation %s found resource %s active on %s", - task, rsc->id, node->details->uname); - -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 1e3877d..e9997a2 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1776,3 +1776,24 @@ const char *rsc_printable_id(resource_t *rsc) - } - return rsc->id; - } -+ -+resource_t * -+rsc_contains_remote_node(pe_working_set_t * data_set, resource_t *rsc) -+{ -+ if (is_set(data_set->flags, pe_flag_have_remote_nodes) == FALSE) { -+ return FALSE; -+ } -+ -+ if (rsc->fillers) { -+ GListPtr gIter = NULL; -+ for (gIter = rsc->fillers; gIter != NULL; gIter = gIter->next) { -+ resource_t *filler = (resource_t *) gIter->data; -+ -+ if (filler->is_remote_node) { -+ return filler; -+ } -+ } -+ } -+ return NULL; -+} -+ diff --git a/SOURCES/bz720543-pcmk-pe_update_regression_test_scores.patch b/SOURCES/bz720543-pcmk-pe_update_regression_test_scores.patch deleted file mode 100644 index 27fe927..0000000 --- a/SOURCES/bz720543-pcmk-pe_update_regression_test_scores.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 1106a46aa325068e42d36d70cdbb78d128602a0d -Author: Andrew Beekhof -Date: Mon Aug 12 11:54:10 2013 +1000 - - Test: PE: Update regression test scores - - (cherry picked from commit 86b339c959f41e9c94195317ba4aa90f09d72450) - -diff --git a/pengine/test10/utilization-order2.scores b/pengine/test10/utilization-order2.scores -index b289b72..22748db 100644 ---- a/pengine/test10/utilization-order2.scores -+++ b/pengine/test10/utilization-order2.scores -@@ -7,7 +7,7 @@ clone_color: rsc2:1 allocation score on node1: 0 - clone_color: rsc2:1 allocation score on node2: 1 - native_color: rsc1 allocation score on node1: 0 - native_color: rsc1 allocation score on node2: 0 --native_color: rsc2:0 allocation score on node1: -INFINITY -+native_color: rsc2:0 allocation score on node1: 1 - native_color: rsc2:0 allocation score on node1: 1 - native_color: rsc2:0 allocation score on node2: -INFINITY - native_color: rsc2:0 allocation score on node2: 0 diff --git a/SOURCES/bz720543-pcmk-prevent_use_of_null_when_ping_resources_do_not_define_a_host_list.patch b/SOURCES/bz720543-pcmk-prevent_use_of_null_when_ping_resources_do_not_define_a_host_list.patch deleted file mode 100644 index 42b4265..0000000 --- a/SOURCES/bz720543-pcmk-prevent_use_of_null_when_ping_resources_do_not_define_a_host_list.patch +++ /dev/null @@ -1,39 +0,0 @@ -commit d4cf7c479c30b4543db45fcce9bf69352b77f85c -Author: Andrew Beekhof -Date: Tue Aug 6 20:36:14 2013 +1000 - - Fix: Prevent use-of-NULL when ping resources do not define a host list - - (cherry picked from commit 7f76afac965afa209e570deac612c696fdcaddb2) - -diff --git a/tools/crm_mon.c b/tools/crm_mon.c -index 9387b46..9d68237 100644 ---- a/tools/crm_mon.c -+++ b/tools/crm_mon.c -@@ -973,7 +973,6 @@ print_attr_msg(node_t * node, GListPtr rsc_list, const char *attrname, const cha - if (safe_str_eq(type, "ping") || safe_str_eq(type, "pingd")) { - const char *name = "pingd"; - const char *multiplier = NULL; -- char **host_list = NULL; - int host_list_num = 0; - int expected_score = 0; - -@@ -984,11 +983,15 @@ print_attr_msg(node_t * node, GListPtr rsc_list, const char *attrname, const cha - /* To identify the resource with the attribute name. */ - if (safe_str_eq(name, attrname)) { - int value = crm_parse_int(attrvalue, "0"); -+ const char *hosts = g_hash_table_lookup(rsc->parameters, "host_list"); - - multiplier = g_hash_table_lookup(rsc->parameters, "multiplier"); -- host_list = g_strsplit(g_hash_table_lookup(rsc->parameters, "host_list"), " ", 0); -- host_list_num = g_strv_length(host_list); -- g_strfreev(host_list); -+ if(hosts) { -+ char **host_list = g_strsplit(hosts, " ", 0); -+ host_list_num = g_strv_length(host_list); -+ g_strfreev(host_list); -+ } -+ - /* pingd multiplier is the same as the default value. */ - expected_score = host_list_num * crm_parse_int(multiplier, "1"); - diff --git a/SOURCES/bz720543-pcmk-reduce_duplication_by_merging_the_lrmd_exec_rc_enum_with_ocf_exitcode.patch b/SOURCES/bz720543-pcmk-reduce_duplication_by_merging_the_lrmd_exec_rc_enum_with_ocf_exitcode.patch deleted file mode 100644 index ccbd8b6..0000000 --- a/SOURCES/bz720543-pcmk-reduce_duplication_by_merging_the_lrmd_exec_rc_enum_with_ocf_exitcode.patch +++ /dev/null @@ -1,1075 +0,0 @@ -commit 6de9bff49d55a5e03f3aac134fa651da02acc805 -Author: Andrew Beekhof -Date: Thu Aug 8 10:07:43 2013 +1000 - - Refactor: Reduce duplication by merging the lrmd_exec_rc enum with ocf_exitcode - - (cherry picked from commit 7c87227849a589b65eb4864fae2811d9cc39bc1b) - -diff --git a/crmd/lrm.c b/crmd/lrm.c -index 5f4d3bb..318c7f8 100644 ---- a/crmd/lrm.c -+++ b/crmd/lrm.c -@@ -691,20 +691,20 @@ is_rsc_active(lrm_state_t * lrm_state, const char *rsc_id) - - crm_trace("Processing %s: %s.%d=%d", - rsc_id, entry->last->op_type, entry->last->interval, entry->last->rc); -- if (entry->last->rc == PCMK_EXECRA_OK && safe_str_eq(entry->last->op_type, CRMD_ACTION_STOP)) { -+ if (entry->last->rc == PCMK_OCF_OK && safe_str_eq(entry->last->op_type, CRMD_ACTION_STOP)) { - return FALSE; - -- } else if (entry->last->rc == PCMK_EXECRA_OK -+ } else if (entry->last->rc == PCMK_OCF_OK - && safe_str_eq(entry->last->op_type, CRMD_ACTION_MIGRATE)) { - /* a stricter check is too complex... - * leave that to the PE - */ - return FALSE; - -- } else if (entry->last->rc == PCMK_EXECRA_NOT_RUNNING) { -+ } else if (entry->last->rc == PCMK_OCF_NOT_RUNNING) { - return FALSE; - -- } else if (entry->last->interval == 0 && entry->last->rc == PCMK_EXECRA_NOT_CONFIGURED) { -+ } else if (entry->last->interval == 0 && entry->last->rc == PCMK_OCF_NOT_CONFIGURED) { - /* Badly configured resources can't be reliably stopped */ - return FALSE; - } -@@ -812,10 +812,10 @@ notify_deleted(lrm_state_t * lrm_state, ha_msg_input_t * input, const char *rsc_ - - if (rc == pcmk_ok) { - op->op_status = PCMK_LRM_OP_DONE; -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { - op->op_status = PCMK_LRM_OP_ERROR; -- op->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ op->rc = PCMK_OCF_UNKNOWN_ERROR; - } - - send_direct_ack(from_host, from_sys, NULL, op, rsc_id); -@@ -1295,7 +1295,7 @@ do_lrm_invoke(long long action, - } - op->interval = 0; - op->op_status = PCMK_LRM_OP_DONE; -- op->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ op->rc = PCMK_OCF_UNKNOWN_ERROR; - op->t_run = time(NULL); - op->t_rcchange = op->t_run; - -@@ -1313,7 +1313,7 @@ do_lrm_invoke(long long action, - crm_info("Failing resource %s...", rsc->id); - process_lrm_event(lrm_state, op); - op->op_status = PCMK_LRM_OP_DONE; -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - lrmd_free_rsc_info(rsc); - } else { - crm_info("Cannot find/create resource in order to fail it..."); -@@ -1425,7 +1425,7 @@ do_lrm_invoke(long long action, - - op = construct_op(lrm_state, input->xml, ID(xml_rsc), operation); - op->op_status = PCMK_LRM_OP_DONE; -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - CRM_ASSERT(op != NULL); - send_direct_ack(from_host, from_sys, NULL, op, ID(xml_rsc)); - lrmd_free_event(op); -@@ -1486,7 +1486,7 @@ do_lrm_invoke(long long action, - g_hash_table_remove(lrm_state->pending_ops, op_key); - } - -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - op->op_status = PCMK_LRM_OP_DONE; - send_direct_ack(from_host, from_sys, rsc, op, rsc->id); - -@@ -1509,9 +1509,9 @@ do_lrm_invoke(long long action, - op->op_status = PCMK_LRM_OP_ERROR; - - if (cib_rc == -EACCES) { -- op->rc = PCMK_EXECRA_INSUFFICIENT_PRIV; -+ op->rc = PCMK_OCF_INSUFFICIENT_PRIV; - } else { -- op->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ op->rc = PCMK_OCF_UNKNOWN_ERROR; - } - send_direct_ack(from_host, from_sys, NULL, op, rsc->id); - lrmd_free_event(op); -@@ -2046,7 +2046,7 @@ process_lrm_event(lrm_state_t * lrm_state, lrmd_event_data_t * op) - } - - if (op->op_status == PCMK_LRM_OP_ERROR -- && (op->rc == PCMK_EXECRA_RUNNING_MASTER || op->rc == PCMK_EXECRA_NOT_RUNNING)) { -+ && (op->rc == PCMK_OCF_RUNNING_MASTER || op->rc == PCMK_OCF_NOT_RUNNING)) { - /* Leave it up to the TE/PE to decide if this is an error */ - op->op_status = PCMK_LRM_OP_DONE; - log_level = LOG_INFO; -@@ -2096,7 +2096,7 @@ process_lrm_event(lrm_state_t * lrm_state, lrmd_event_data_t * op) - do_crm_log(log_level, - "LRM operation %s (call=%d, rc=%d, cib-update=%d, confirmed=%s) %s", - op_key, op->call_id, op->rc, update_id, removed ? "true" : "false", -- lrmd_event_rc2str(op->rc)); -+ services_ocf_exitcode_str(op->rc)); - } else { - do_crm_log(log_level, - "LRM operation %s (call=%d, status=%d, cib-update=%d, confirmed=%s) %s", -diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c -index 42ea043..fbb9ecb 100644 ---- a/crmd/remote_lrmd_ra.c -+++ b/crmd/remote_lrmd_ra.c -@@ -211,7 +211,7 @@ retry_start_cmd_cb(gpointer data) - } - - if (rc != 0) { -- cmd->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ cmd->rc = PCMK_OCF_UNKNOWN_ERROR; - cmd->op_status = PCMK_LRM_OP_ERROR; - report_remote_ra_result(cmd); - -@@ -236,7 +236,7 @@ monitor_timeout_cb(gpointer data) - crm_debug("Poke async response timed out for node %s", cmd->rsc_id); - cmd->monitor_timeout_id = 0; - cmd->op_status = PCMK_LRM_OP_TIMEOUT; -- cmd->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ cmd->rc = PCMK_OCF_UNKNOWN_ERROR; - - lrm_state = lrm_state_find(cmd->rsc_id); - if (lrm_state && lrm_state->remote_ra_data) { -@@ -291,7 +291,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) - lrmd_event_type2str(op->type), - op->remote_nodename, - op->op_type ? op->op_type : "none", -- lrmd_event_rc2str(op->rc), services_lrm_status_str(op->op_status)); -+ services_ocf_exitcode_str(op->rc), services_lrm_status_str(op->op_status)); - - /* filter all EXEC events up */ - if (op->type == lrmd_event_exec_complete) { -@@ -329,7 +329,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) - cmd->remaining_timeout); - } - cmd->op_status = PCMK_LRM_OP_TIMEOUT; -- cmd->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ cmd->rc = PCMK_OCF_UNKNOWN_ERROR; - - } else { - /* make sure we have a clean status section to start with */ -@@ -338,7 +338,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) - erase_status_tag(lrm_state->node_name, XML_CIB_TAG_LRM, cib_scope_local); - erase_status_tag(lrm_state->node_name, XML_TAG_TRANSIENT_NODEATTRS, cib_scope_local); - -- cmd->rc = PCMK_EXECRA_OK; -+ cmd->rc = PCMK_OCF_OK; - cmd->op_status = PCMK_LRM_OP_DONE; - } - -@@ -361,7 +361,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) - * For this function, if we get the poke pack, it is always a success. Pokes - * only fail if the send fails, or the response times out. */ - if (!cmd->reported_success) { -- cmd->rc = PCMK_EXECRA_OK; -+ cmd->rc = PCMK_OCF_OK; - cmd->op_status = PCMK_LRM_OP_DONE; - report_remote_ra_result(cmd); - cmd->reported_success = 1; -@@ -442,7 +442,7 @@ handle_remote_ra_exec(gpointer user_data) - return TRUE; - } else { - crm_debug("connect failed, not expecting to match any connection event later"); -- cmd->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ cmd->rc = PCMK_OCF_UNKNOWN_ERROR; - cmd->op_status = PCMK_LRM_OP_ERROR; - } - report_remote_ra_result(cmd); -@@ -452,13 +452,13 @@ handle_remote_ra_exec(gpointer user_data) - if (lrm_state_is_connected(lrm_state) == TRUE) { - rc = lrm_state_poke_connection(lrm_state); - if (rc < 0) { -- cmd->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ cmd->rc = PCMK_OCF_UNKNOWN_ERROR; - cmd->op_status = PCMK_LRM_OP_ERROR; - } - } else { - rc = -1; - cmd->op_status = PCMK_LRM_OP_DONE; -- cmd->rc = PCMK_EXECRA_NOT_RUNNING; -+ cmd->rc = PCMK_OCF_NOT_RUNNING; - } - - if (rc == 0) { -@@ -471,7 +471,7 @@ handle_remote_ra_exec(gpointer user_data) - - } else if (!strcmp(cmd->action, "stop")) { - lrm_state_disconnect(lrm_state); -- cmd->rc = PCMK_EXECRA_OK; -+ cmd->rc = PCMK_OCF_OK; - cmd->op_status = PCMK_LRM_OP_DONE; - - if (ra_data->cmds) { -@@ -486,7 +486,7 @@ handle_remote_ra_exec(gpointer user_data) - - } else if (!strcmp(cmd->action, "migrate_to")) { - /* no-op. */ -- cmd->rc = PCMK_EXECRA_OK; -+ cmd->rc = PCMK_OCF_OK; - cmd->op_status = PCMK_LRM_OP_DONE; - report_remote_ra_result(cmd); - } -diff --git a/crmd/te_actions.c b/crmd/te_actions.c -index b533f58..63d15bb 100644 ---- a/crmd/te_actions.c -+++ b/crmd/te_actions.c -@@ -465,7 +465,7 @@ te_rsc_command(crm_graph_t * graph, crm_action_t * action) - && safe_str_neq(task, CRMD_ACTION_DELETE)) { - /* write a "pending" entry to the CIB, inhibit notification */ - crm_debug("Recording pending op %s in the CIB", task_uuid); -- cib_action_update(action, PCMK_LRM_OP_PENDING, PCMK_EXECRA_STATUS_UNKNOWN); -+ cib_action_update(action, PCMK_LRM_OP_PENDING, PCMK_OCF_STATUS_UNKNOWN); - } - - return TRUE; -diff --git a/crmd/te_callbacks.c b/crmd/te_callbacks.c -index 3d923b2..c0360b4 100644 ---- a/crmd/te_callbacks.c -+++ b/crmd/te_callbacks.c -@@ -548,8 +548,8 @@ action_timer_callback(gpointer data) - } - - if (send_update) { -- /* cib_action_update(timer->action, PCMK_LRM_OP_PENDING, PCMK_EXECRA_STATUS_UNKNOWN); */ -- cib_action_update(timer->action, PCMK_LRM_OP_TIMEOUT, PCMK_EXECRA_UNKNOWN_ERROR); -+ /* cib_action_update(timer->action, PCMK_LRM_OP_PENDING, PCMK_OCF_STATUS_UNKNOWN); */ -+ cib_action_update(timer->action, PCMK_LRM_OP_TIMEOUT, PCMK_OCF_UNKNOWN_ERROR); - } - } - -diff --git a/crmd/te_events.c b/crmd/te_events.c -index bc474bd..78d00dd 100644 ---- a/crmd/te_events.c -+++ b/crmd/te_events.c -@@ -540,7 +540,7 @@ process_graph_event(xmlNode * event, const char *event_node) - desc = "failed"; - } - crm_info("Detected action (%d.%d) %s.%d=%s: %s", transition_num, action, id, callid, -- lrmd_event_rc2str(rc), desc); -+ services_ocf_exitcode_str(rc), desc); - } - - bail: -diff --git a/fencing/commands.c b/fencing/commands.c -index 7ef003d..7d04952 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -224,7 +224,7 @@ stonith_device_execute(stonith_device_t * device) - } else { - crm_err("failed to get secrets for %s, " - "considering resource not configured", device->id); -- exec_rc = PCMK_EXECRA_NOT_CONFIGURED; -+ exec_rc = PCMK_OCF_NOT_CONFIGURED; - cmd->done_cb(0, exec_rc, NULL, cmd); - return TRUE; - } -diff --git a/include/crm/lrmd.h b/include/crm/lrmd.h -index f627373..b8c3167 100644 ---- a/include/crm/lrmd.h -+++ b/include/crm/lrmd.h -@@ -22,6 +22,7 @@ - * \brief Local Resource Manager - * \ingroup lrm - */ -+#include - - #ifndef LRMD__H - # define LRMD__H -@@ -166,21 +167,6 @@ enum lrmd_callback_event { - lrmd_event_poke, - }; - --enum lrmd_exec_rc { -- PCMK_EXECRA_OK = 0, -- PCMK_EXECRA_UNKNOWN_ERROR = 1, -- PCMK_EXECRA_INVALID_PARAM = 2, -- PCMK_EXECRA_UNIMPLEMENT_FEATURE = 3, -- PCMK_EXECRA_INSUFFICIENT_PRIV = 4, -- PCMK_EXECRA_NOT_INSTALLED = 5, -- PCMK_EXECRA_NOT_CONFIGURED = 6, -- PCMK_EXECRA_NOT_RUNNING = 7, -- PCMK_EXECRA_RUNNING_MASTER = 8, -- PCMK_EXECRA_FAILED_MASTER = 9, -- -- /* For status command only */ -- PCMK_EXECRA_STATUS_UNKNOWN = 14, --}; - /* *INDENT-ON* */ - - typedef struct lrmd_event_data_s { -@@ -205,8 +191,8 @@ typedef struct lrmd_event_data_s { - /*! This operation that just completed is on a deleted rsc. */ - int rsc_deleted; - -- /*! The executed ra return code */ -- enum lrmd_exec_rc rc; -+ /*! The executed ra return code mapped to OCF */ -+ enum ocf_exitcode rc; - /*! The lrmd status returned for exec_complete events */ - int op_status; - /*! stdout from resource agent operation */ -@@ -448,38 +434,6 @@ struct lrmd_s { - }; - - static inline const char * --lrmd_event_rc2str(enum lrmd_exec_rc rc) --{ -- switch (rc) { -- case PCMK_EXECRA_OK: -- return "ok"; -- case PCMK_EXECRA_UNKNOWN_ERROR: -- return "unknown error"; -- case PCMK_EXECRA_INVALID_PARAM: -- return "invalid parameter"; -- case PCMK_EXECRA_UNIMPLEMENT_FEATURE: -- return "unimplemented feature"; -- case PCMK_EXECRA_INSUFFICIENT_PRIV: -- return "insufficient privileges"; -- case PCMK_EXECRA_NOT_INSTALLED: -- return "not installed"; -- case PCMK_EXECRA_NOT_CONFIGURED: -- return "not configured"; -- case PCMK_EXECRA_NOT_RUNNING: -- return "not running"; -- case PCMK_EXECRA_RUNNING_MASTER: -- return "master"; -- case PCMK_EXECRA_FAILED_MASTER: -- return "master (failed)"; -- case PCMK_EXECRA_STATUS_UNKNOWN: -- return "status: unknown"; -- default: -- break; -- } -- return ""; --} -- --static inline const char * - lrmd_event_type2str(enum lrmd_callback_event type) - { - switch (type) { -diff --git a/include/crm/services.h b/include/crm/services.h -index fb5c6b0..0c0cca9 100644 ---- a/include/crm/services.h -+++ b/include/crm/services.h -@@ -31,6 +31,7 @@ extern "C" { - - # include - # include -+# include - - # ifndef OCF_ROOT_DIR - # define OCF_ROOT_DIR "/usr/lib/ocf" -@@ -59,34 +60,22 @@ enum lsb_exitcode { - PCMK_LSB_NOT_INSTALLED = 5, - PCMK_LSB_NOT_CONFIGURED = 6, - PCMK_LSB_NOT_RUNNING = 7, -- -- /* 150-199 reserved for application use */ -- PCMK_LSB_SIGNAL = 194, -- PCMK_LSB_NOT_SUPPORTED = 195, -- PCMK_LSB_PENDING = 196, -- PCMK_LSB_CANCELLED = 197, -- PCMK_LSB_TIMEOUT = 198, -- PCMK_LSB_OTHER_ERROR = 199, - }; - - /* The return codes for the status operation are not the same for other -- * operatios - go figure */ -+ * operatios - go figure -+ */ - enum lsb_status_exitcode { - PCMK_LSB_STATUS_OK = 0, - PCMK_LSB_STATUS_VAR_PID = 1, - PCMK_LSB_STATUS_VAR_LOCK = 2, - PCMK_LSB_STATUS_NOT_RUNNING = 3, - PCMK_LSB_STATUS_NOT_INSTALLED = 4, -- -- /* 150-199 reserved for application use */ -- PCMK_LSB_STATUS_SIGNAL = 194, -- PCMK_LSB_STATUS_NOT_SUPPORTED = 195, -- PCMK_LSB_STATUS_PENDING = 196, -- PCMK_LSB_STATUS_CANCELLED = 197, -- PCMK_LSB_STATUS_TIMEOUT = 198, -- PCMK_LSB_STATUS_OTHER_ERROR = 199, - }; - -+/* Uniform exit codes -+ * Everything is mapped to its OCF equivalent so that Pacemaker only deals with one set of codes -+ */ - enum ocf_exitcode { - PCMK_OCF_OK = 0, - PCMK_OCF_UNKNOWN_ERROR = 1, -@@ -95,10 +84,12 @@ enum ocf_exitcode { - PCMK_OCF_INSUFFICIENT_PRIV = 4, - PCMK_OCF_NOT_INSTALLED = 5, - PCMK_OCF_NOT_CONFIGURED = 6, -- PCMK_OCF_NOT_RUNNING = 7, -+ PCMK_OCF_NOT_RUNNING = 7, /* End of overlap with LSB */ - PCMK_OCF_RUNNING_MASTER = 8, - PCMK_OCF_FAILED_MASTER = 9, - -+ PCMK_OCF_STATUS_UNKNOWN = 14, /* Already in use */ -+ - /* 150-199 reserved for application use */ - PCMK_OCF_SIGNAL = 194, - PCMK_OCF_NOT_SUPPORTED = 195, -@@ -114,7 +105,7 @@ enum op_status { - PCMK_LRM_OP_CANCELLED, - PCMK_LRM_OP_TIMEOUT, - PCMK_LRM_OP_NOTSUPPORTED, -- PCMK_LRM_OP_ERROR -+ PCMK_LRM_OP_ERROR, - }; - - enum nagios_exitcode { -@@ -276,25 +267,25 @@ enum nagios_exitcode { - }} static inline const char *services_ocf_exitcode_str(enum ocf_exitcode code) { - switch (code) { - case PCMK_OCF_OK: -- return "OCF_OK"; -+ return "ok"; - case PCMK_OCF_UNKNOWN_ERROR: -- return "OCF_UNKNOWN_ERROR"; -+ return "unknown error"; - case PCMK_OCF_INVALID_PARAM: -- return "OCF_INVALID_PARAM"; -+ return "invalid parameter"; - case PCMK_OCF_UNIMPLEMENT_FEATURE: -- return "OCF_UNIMPLEMENT_FEATURE"; -+ return "unimplemented feature"; - case PCMK_OCF_INSUFFICIENT_PRIV: -- return "OCF_INSUFFICIENT_PRIV"; -+ return "insufficient privileges"; - case PCMK_OCF_NOT_INSTALLED: -- return "OCF_NOT_INSTALLED"; -+ return "not installed"; - case PCMK_OCF_NOT_CONFIGURED: -- return "OCF_NOT_CONFIGURED"; -+ return "not configured"; - case PCMK_OCF_NOT_RUNNING: -- return "OCF_NOT_RUNNING"; -+ return "not running"; - case PCMK_OCF_RUNNING_MASTER: -- return "OCF_RUNNING_MASTER"; -+ return "master"; - case PCMK_OCF_FAILED_MASTER: -- return "OCF_FAILED_MASTER"; -+ return "master (failed)"; - case PCMK_OCF_SIGNAL: - return "OCF_SIGNAL"; - case PCMK_OCF_NOT_SUPPORTED: -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 26cecb2..78ceb85 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2205,8 +2205,8 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - task_status_i = PCMK_LRM_OP_ERROR; - pe_rsc_debug(rsc, "%s on %s returned %d (%s) instead of the expected value: %d (%s)", - id, node->details->uname, -- actual_rc_i, lrmd_event_rc2str(actual_rc_i), -- target_rc, lrmd_event_rc2str(target_rc)); -+ actual_rc_i, services_ocf_exitcode_str(actual_rc_i), -+ target_rc, services_ocf_exitcode_str(target_rc)); - } - - } else if (task_status_i == PCMK_LRM_OP_ERROR) { -@@ -2215,7 +2215,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - } - - if (task_status_i == PCMK_LRM_OP_NOTSUPPORTED) { -- actual_rc_i = PCMK_EXECRA_UNIMPLEMENT_FEATURE; -+ actual_rc_i = PCMK_OCF_UNIMPLEMENT_FEATURE; - } - - if (expired) { -@@ -2254,8 +2254,8 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - } - - if (expired -- && actual_rc_i != PCMK_EXECRA_NOT_RUNNING -- && actual_rc_i != PCMK_EXECRA_RUNNING_MASTER && actual_rc_i != PCMK_EXECRA_OK) { -+ && actual_rc_i != PCMK_OCF_NOT_RUNNING -+ && actual_rc_i != PCMK_OCF_RUNNING_MASTER && actual_rc_i != PCMK_OCF_OK) { - if(interval == 0) { - crm_notice("Ignoring expired failure %s (rc=%d, magic=%s) on %s", - id, actual_rc_i, magic, node->details->uname); -@@ -2273,7 +2273,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - * didnt include target_rc and liked to remap status - */ - switch (actual_rc_i) { -- case PCMK_EXECRA_NOT_RUNNING: -+ case PCMK_OCF_NOT_RUNNING: - if (is_probe || target_rc == actual_rc_i) { - task_status_i = PCMK_LRM_OP_DONE; - rsc->role = RSC_ROLE_STOPPED; -@@ -2287,7 +2287,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - } - break; - -- case PCMK_EXECRA_RUNNING_MASTER: -+ case PCMK_OCF_RUNNING_MASTER: - if (is_probe) { - task_status_i = PCMK_LRM_OP_DONE; - crm_notice("Operation %s found resource %s active in master mode on %s", -@@ -2311,42 +2311,42 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - rsc->role = RSC_ROLE_MASTER; - break; - -- case PCMK_EXECRA_FAILED_MASTER: -+ case PCMK_OCF_FAILED_MASTER: - rsc->role = RSC_ROLE_MASTER; - task_status_i = PCMK_LRM_OP_ERROR; - break; - -- case PCMK_EXECRA_UNIMPLEMENT_FEATURE: -+ case PCMK_OCF_UNIMPLEMENT_FEATURE: - if (interval > 0) { - task_status_i = PCMK_LRM_OP_NOTSUPPORTED; - break; - } - /* else: fall through */ -- case PCMK_EXECRA_INSUFFICIENT_PRIV: -- case PCMK_EXECRA_NOT_INSTALLED: -- case PCMK_EXECRA_INVALID_PARAM: -+ case PCMK_OCF_INSUFFICIENT_PRIV: -+ case PCMK_OCF_NOT_INSTALLED: -+ case PCMK_OCF_INVALID_PARAM: - effective_node = node; - if(pe_can_fence(data_set, node) == FALSE - && safe_str_eq(task, CRMD_ACTION_STOP)) { - /* If a stop fails and we can't fence, there's nothing else we can do */ - pe_proc_err("No further recovery can be attempted for %s: %s action failed with '%s' (%d)", -- rsc->id, task, lrmd_event_rc2str(actual_rc_i), actual_rc_i); -+ rsc->id, task, services_ocf_exitcode_str(actual_rc_i), actual_rc_i); - clear_bit(rsc->flags, pe_rsc_managed); - set_bit(rsc->flags, pe_rsc_block); - } - /* fall through */ -- case PCMK_EXECRA_NOT_CONFIGURED: -+ case PCMK_OCF_NOT_CONFIGURED: - failed = rsc; - if (is_not_set(rsc->flags, pe_rsc_unique)) { - failed = uber_parent(failed); - } - -- do_crm_log(actual_rc_i == PCMK_EXECRA_NOT_INSTALLED ? LOG_NOTICE : LOG_ERR, -+ do_crm_log(actual_rc_i == PCMK_OCF_NOT_INSTALLED ? LOG_NOTICE : LOG_ERR, - "Preventing %s from re-starting %s %s: operation %s failed '%s' (rc=%d)", - failed->id, - effective_node ? "on" : "anywhere in the cluster", - effective_node ? effective_node->details->uname : "", -- task, lrmd_event_rc2str(actual_rc_i), actual_rc_i); -+ task, services_ocf_exitcode_str(actual_rc_i), actual_rc_i); - - resource_location(failed, effective_node, -INFINITY, "hard-error", data_set); - if (is_probe) { -@@ -2354,7 +2354,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - task = CRMD_ACTION_STOP; - task_status_i = PCMK_LRM_OP_DONE; - crm_xml_add(xml_op, XML_ATTR_UNAME, node->details->uname); -- if (actual_rc_i != PCMK_EXECRA_NOT_INSTALLED -+ if (actual_rc_i != PCMK_OCF_NOT_INSTALLED - || is_set(data_set->flags, pe_flag_symmetric_cluster)) { - if ((node->details->shutdown == FALSE) || (node->details->online == TRUE)) { - add_node_copy(data_set->failed, xml_op); -@@ -2363,7 +2363,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - } - break; - -- case PCMK_EXECRA_OK: -+ case PCMK_OCF_OK: - if (is_probe && target_rc == 7) { - task_status_i = PCMK_LRM_OP_DONE; - pe_rsc_info(rsc, "Operation %s found resource %s active on %s", -@@ -2447,7 +2447,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - case PCMK_LRM_OP_DONE: - pe_rsc_trace(rsc, "%s/%s completed on %s", rsc->id, task, node->details->uname); - -- if (actual_rc_i == PCMK_EXECRA_NOT_RUNNING) { -+ if (actual_rc_i == PCMK_OCF_NOT_RUNNING) { - clear_past_failure = TRUE; - - } else if (safe_str_eq(task, CRMD_ACTION_STATUS)) { -@@ -2519,7 +2519,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - ID(migrate_from), migrate_target, from_status, from_rc); - } - -- if (migrate_from && from_rc == PCMK_EXECRA_OK -+ if (migrate_from && from_rc == PCMK_OCF_OK - && from_status == PCMK_LRM_OP_DONE) { - pe_rsc_trace(rsc, "Detected dangling migration op: %s on %s", ID(xml_op), - migrate_source); -@@ -2603,7 +2603,7 @@ unpack_rsc_op(resource_t * rsc, node_t * node, xmlNode * xml_op, - case PCMK_LRM_OP_TIMEOUT: - case PCMK_LRM_OP_NOTSUPPORTED: - crm_warn("Processing failed op %s for %s on %s: %s (%d)", -- task, rsc->id, node->details->uname, lrmd_event_rc2str(actual_rc_i), -+ task, rsc->id, node->details->uname, services_ocf_exitcode_str(actual_rc_i), - actual_rc_i); - crm_xml_add(xml_op, XML_ATTR_UNAME, node->details->uname); - if ((node->details->shutdown == FALSE) || (node->details->online == TRUE)) { -diff --git a/lib/services/systemd.c b/lib/services/systemd.c -index 74cf53e..783caca 100644 ---- a/lib/services/systemd.c -+++ b/lib/services/systemd.c -@@ -381,10 +381,10 @@ systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer use - - if (safe_str_eq(op->action, "stop")) { - crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else { -- op->rc = PCMK_EXECRA_NOT_INSTALLED; -+ op->rc = PCMK_OCF_NOT_INSTALLED; - } - - } else { -@@ -398,11 +398,11 @@ systemd_unit_exec_done(GObject * source_object, GAsyncResult * res, gpointer use - g_variant_get(_ret, "(o)", &path); - crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), - path); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else { - crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } - - operation_finalize(op); -@@ -423,7 +423,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - const char *action = op->action; - char *name = systemd_service_name(op->agent); - -- op->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ op->rc = PCMK_OCF_UNKNOWN_ERROR; - CRM_ASSERT(systemd_init()); - - crm_debug("Performing %ssynchronous %s op on systemd unit %s named '%s'", -@@ -431,7 +431,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - - if (safe_str_eq(op->action, "meta-data")) { - op->stdout_data = systemd_unit_metadata(op->agent); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - goto cleanup; - } - -@@ -440,7 +440,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - crm_debug("Could not obtain unit named '%s': %s", op->agent, - error ? error->message : "unknown"); - if (error && strstr(error->message, "systemd1.NoSuchUnit")) { -- op->rc = PCMK_EXECRA_NOT_INSTALLED; -+ op->rc = PCMK_OCF_NOT_INSTALLED; - } - if(error) { - g_error_free(error); -@@ -452,9 +452,9 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - char *state = systemd_unit_property(unit, BUS_NAME ".Unit", "ActiveState"); - - if (g_strcmp0(state, "active") == 0) { -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { -- op->rc = PCMK_EXECRA_NOT_RUNNING; -+ op->rc = PCMK_OCF_NOT_RUNNING; - } - - free(state); -@@ -504,7 +504,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - } else if (g_strcmp0(action, "restart") == 0) { - action = "RestartUnit"; - } else { -- op->rc = PCMK_EXECRA_UNIMPLEMENT_FEATURE; -+ op->rc = PCMK_OCF_UNIMPLEMENT_FEATURE; - goto cleanup; - } - -@@ -525,7 +525,7 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - if (safe_str_eq(op->action, "stop") - && strstr(error->message, "systemd1.InvalidName")) { - crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { - crm_err("Could not issue %s for %s: %s (%s)", action, op->rsc, error->message, unit); - } -@@ -537,11 +537,11 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - g_variant_get(_ret, "(o)", &path); - crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), - path); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else { - crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } - - cleanup: -@@ -555,5 +555,5 @@ systemd_unit_exec(svc_action_t * op, gboolean synchronous) - operation_finalize(op); - return TRUE; - } -- return op->rc == PCMK_EXECRA_OK; -+ return op->rc == PCMK_OCF_OK; - } -diff --git a/lib/services/upstart.c b/lib/services/upstart.c -index f5fa189..daeb398 100644 ---- a/lib/services/upstart.c -+++ b/lib/services/upstart.c -@@ -384,12 +384,12 @@ upstart_job_exec_done(GObject * source_object, GAsyncResult * res, gpointer user - if (safe_str_eq(op->action, "start") - && strstr(error->message, BUS_MANAGER_IFACE ".Error.AlreadyStarted")) { - crm_trace("Masking Start failure for %s: already started", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else if (safe_str_eq(op->action, "stop") - && strstr(error->message, BUS_MANAGER_IFACE ".Error.UnknownInstance")) { - crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { - crm_err("Could not issue %s for %s: %s", op->action, op->rsc, error->message); - } -@@ -401,11 +401,11 @@ upstart_job_exec_done(GObject * source_object, GAsyncResult * res, gpointer user - g_variant_get(_ret, "(o)", &path); - crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), - path); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else { - crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } - - operation_finalize(op); -@@ -427,12 +427,12 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - GVariant *_ret = NULL; - GDBusProxy *job_proxy = NULL; - -- op->rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ op->rc = PCMK_OCF_UNKNOWN_ERROR; - CRM_ASSERT(upstart_init()); - - if (safe_str_eq(op->action, "meta-data")) { - op->stdout_data = upstart_job_metadata(op->agent); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - goto cleanup; - } - -@@ -443,18 +443,18 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - } - if (pass == FALSE) { - if (!g_strcmp0(action, "stop")) { -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { -- op->rc = PCMK_EXECRA_NOT_INSTALLED; -+ op->rc = PCMK_OCF_NOT_INSTALLED; - } - goto cleanup; - } - - if (safe_str_eq(op->action, "monitor") || safe_str_eq(action, "status")) { - if (upstart_job_running(op->agent)) { -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { -- op->rc = PCMK_EXECRA_NOT_RUNNING; -+ op->rc = PCMK_OCF_NOT_RUNNING; - } - goto cleanup; - -@@ -465,7 +465,7 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - } else if (!g_strcmp0(action, "restart")) { - action = "Restart"; - } else { -- op->rc = PCMK_EXECRA_UNIMPLEMENT_FEATURE; -+ op->rc = PCMK_OCF_UNIMPLEMENT_FEATURE; - goto cleanup; - } - -@@ -487,11 +487,11 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - if (safe_str_eq(action, "Start") - && strstr(error->message, BUS_MANAGER_IFACE ".Error.AlreadyStarted")) { - crm_trace("Masking Start failure for %s: already started", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else if (safe_str_eq(action, "Stop") - && strstr(error->message, BUS_MANAGER_IFACE ".Error.UnknownInstance")) { - crm_trace("Masking Stop failure for %s: unknown services are stopped", op->rsc); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } else { - crm_err("Could not issue %s for %s: %s (%s)", action, op->rsc, error->message, job); - } -@@ -502,11 +502,11 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - g_variant_get(_ret, "(o)", &path); - crm_info("Call to %s passed: type '%s' %s", op->action, g_variant_get_type_string(_ret), - path); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - - } else { - crm_err("Call to %s passed but return type was '%s' not '(o)'", op->action, g_variant_get_type_string(_ret)); -- op->rc = PCMK_EXECRA_OK; -+ op->rc = PCMK_OCF_OK; - } - - cleanup: -@@ -524,5 +524,5 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) - operation_finalize(op); - return TRUE; - } -- return op->rc == PCMK_EXECRA_OK; -+ return op->rc == PCMK_OCF_OK; - } -diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c -index b5bbea0..8592b6c 100644 ---- a/lrmd/lrmd.c -+++ b/lrmd/lrmd.c -@@ -460,38 +460,38 @@ static int - lsb2uniform_rc(const char *action, int rc) - { - if (rc < 0) { -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - - /* status has different return codes that everything else. */ - if (!safe_str_eq(action, "status") && !safe_str_eq(action, "monitor")) { - if (rc > PCMK_LSB_NOT_RUNNING) { -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - return rc; - } - - switch (rc) { - case PCMK_LSB_STATUS_OK: -- return PCMK_EXECRA_OK; -+ return PCMK_OCF_OK; - case PCMK_LSB_STATUS_NOT_INSTALLED: -- return PCMK_EXECRA_NOT_INSTALLED; -+ return PCMK_OCF_NOT_INSTALLED; - case PCMK_LSB_STATUS_VAR_PID: - case PCMK_LSB_STATUS_VAR_LOCK: - case PCMK_LSB_STATUS_NOT_RUNNING: -- return PCMK_EXECRA_NOT_RUNNING; -+ return PCMK_OCF_NOT_RUNNING; - default: -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - - static int - ocf2uniform_rc(int rc) - { - if (rc < 0 || rc > PCMK_OCF_FAILED_MASTER) { -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - - return rc; -@@ -502,14 +502,14 @@ stonith2uniform_rc(const char *action, int rc) - { - if (rc == -ENODEV) { - if (safe_str_eq(action, "stop")) { -- rc = PCMK_EXECRA_OK; -+ rc = PCMK_OCF_OK; - } else if (safe_str_eq(action, "start")) { -- rc = PCMK_EXECRA_NOT_INSTALLED; -+ rc = PCMK_OCF_NOT_INSTALLED; - } else { -- rc = PCMK_EXECRA_NOT_RUNNING; -+ rc = PCMK_OCF_NOT_RUNNING; - } - } else if (rc != 0) { -- rc = PCMK_EXECRA_UNKNOWN_ERROR; -+ rc = PCMK_OCF_UNKNOWN_ERROR; - } - return rc; - } -@@ -519,25 +519,25 @@ static int - nagios2uniform_rc(const char *action, int rc) - { - if (rc < 0) { -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - - switch (rc) { - case NAGIOS_STATE_OK: -- return PCMK_EXECRA_OK; -+ return PCMK_OCF_OK; - case NAGIOS_INSUFFICIENT_PRIV: -- return PCMK_EXECRA_INSUFFICIENT_PRIV; -+ return PCMK_OCF_INSUFFICIENT_PRIV; - case NAGIOS_NOT_INSTALLED: -- return PCMK_EXECRA_NOT_INSTALLED; -+ return PCMK_OCF_NOT_INSTALLED; - case NAGIOS_STATE_WARNING: - case NAGIOS_STATE_CRITICAL: - case NAGIOS_STATE_UNKNOWN: - case NAGIOS_STATE_DEPENDENT: - default: -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - -- return PCMK_EXECRA_UNKNOWN_ERROR; -+ return PCMK_OCF_UNKNOWN_ERROR; - } - #endif - -@@ -605,11 +605,11 @@ action_complete(svc_action_t * action) - #if SUPPORT_NAGIOS - if (rsc && safe_str_eq(rsc->class, "nagios")) { - if (safe_str_eq(cmd->action, "monitor") && -- cmd->interval == 0 && cmd->exec_rc == PCMK_EXECRA_OK) { -+ cmd->interval == 0 && cmd->exec_rc == PCMK_OCF_OK) { - /* Successfully executed --version for the nagios plugin */ -- cmd->exec_rc = PCMK_EXECRA_NOT_RUNNING; -+ cmd->exec_rc = PCMK_OCF_NOT_RUNNING; - -- } else if (safe_str_eq(cmd->action, "start") && cmd->exec_rc != PCMK_EXECRA_OK) { -+ } else if (safe_str_eq(cmd->action, "start") && cmd->exec_rc != PCMK_OCF_OK) { - int time_sum = 0; - int timeout_left = 0; - int delay = cmd->timeout_orig / 10; -@@ -841,7 +841,7 @@ lrmd_rsc_execute_service_lib(lrmd_rsc_t * rsc, lrmd_cmd_t * cmd) - #if SUPPORT_NAGIOS - /* Recurring operations are cancelled anyway for a stop operation */ - if (safe_str_eq(rsc->class, "nagios") && safe_str_eq(cmd->action, "stop")) { -- cmd->exec_rc = PCMK_EXECRA_OK; -+ cmd->exec_rc = PCMK_OCF_OK; - goto exec_done; - } - #endif -diff --git a/lrmd/test.c b/lrmd/test.c -index 15ffd88..2d8571e 100644 ---- a/lrmd/test.c -+++ b/lrmd/test.c -@@ -110,7 +110,7 @@ test_exit(int rc) - lrmd_event_type2str(event->type), \ - event->rsc_id, \ - event->op_type ? event->op_type : "none", \ -- lrmd_event_rc2str(event->rc), \ -+ services_ocf_exitcode_str(event->rc), \ - services_lrm_status_str(event->op_status)); \ - crm_info("%s", event_buf_v0);; - -diff --git a/pengine/native.c b/pengine/native.c -index 37f5211..21ad629 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - /* #define DELETE_THEN_REFRESH 1 // The crmd will remove the resource from the CIB itself, making this redundant */ - #define INFINITY_HACK (INFINITY * -100) -@@ -783,7 +784,7 @@ RecurringOp(resource_t * rsc, action_t * start, node_t * node, - } - - if (rsc->next_role == RSC_ROLE_MASTER) { -- char *running_master = crm_itoa(PCMK_EXECRA_RUNNING_MASTER); -+ char *running_master = crm_itoa(PCMK_OCF_RUNNING_MASTER); - - add_hash_param(mon->meta, XML_ATTR_TE_TARGET_RC, running_master); - free(running_master); -@@ -949,7 +950,7 @@ RecurringOp_Stopped(resource_t * rsc, action_t * start, node_t * node, - - stopped_mon = custom_action(rsc, strdup(key), name, stop_node, is_optional, TRUE, data_set); - -- rc_inactive = crm_itoa(PCMK_EXECRA_NOT_RUNNING); -+ rc_inactive = crm_itoa(PCMK_OCF_NOT_RUNNING); - add_hash_param(stopped_mon->meta, XML_ATTR_TE_TARGET_RC, rc_inactive); - free(rc_inactive); - -@@ -2400,8 +2401,8 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - static const char *rc_inactive = NULL; - - if (rc_inactive == NULL) { -- rc_inactive = crm_itoa(PCMK_EXECRA_NOT_RUNNING); -- rc_master = crm_itoa(PCMK_EXECRA_RUNNING_MASTER); -+ rc_inactive = crm_itoa(PCMK_OCF_NOT_RUNNING); -+ rc_master = crm_itoa(PCMK_OCF_RUNNING_MASTER); - } - - CRM_CHECK(node != NULL, return FALSE); -diff --git a/tools/crm_mon.c b/tools/crm_mon.c -index 9d68237..7c6e495 100644 ---- a/tools/crm_mon.c -+++ b/tools/crm_mon.c -@@ -950,7 +950,7 @@ print_rsc_history(pe_working_set_t * data_set, node_t * node, xmlNode * rsc_entr - } - } - -- print_as(" rc=%s (%s)\n", op_rc, lrmd_event_rc2str(rc)); -+ print_as(" rc=%s (%s)\n", op_rc, services_ocf_exitcode_str(rc)); - } - - /* no need to free the contents */ -@@ -1405,11 +1405,11 @@ print_status(pe_working_set_t * data_set) - } - - print_as(" %s on %s '%s' (%d): call=%s, status=%s, last-rc-change='%s', queued=%sms, exec=%sms\n", -- op_key ? op_key : id, node, lrmd_event_rc2str(rc), rc, call, services_lrm_status_str(status), -+ op_key ? op_key : id, node, services_ocf_exitcode_str(rc), rc, call, services_lrm_status_str(status), - run_at_s, crm_element_value(xml_op, XML_RSC_OP_T_EXEC), crm_element_value(xml_op, XML_RSC_OP_T_QUEUE)); - } else { - print_as(" %s on %s '%s' (%d): call=%s, status=%s\n", -- op_key ? op_key : id, node, lrmd_event_rc2str(rc), rc, call, services_lrm_status_str(status)); -+ op_key ? op_key : id, node, services_ocf_exitcode_str(rc), rc, call, services_lrm_status_str(status)); - } - } - print_as("\n"); -@@ -2135,10 +2135,10 @@ send_smtp_trap(const char *node, const char *rsc, const char *task, int target_r - "\toperation status: (%d) %s\r\n", status, services_lrm_status_str(status)); - if (status == PCMK_LRM_OP_DONE) { - len += snprintf(crm_mail_body + len, BODY_MAX - len, -- "\tscript returned: (%d) %s\r\n", rc, lrmd_event_rc2str(rc)); -+ "\tscript returned: (%d) %s\r\n", rc, services_ocf_exitcode_str(rc)); - len += snprintf(crm_mail_body + len, BODY_MAX - len, - "\texpected return value: (%d) %s\r\n", target_rc, -- lrmd_event_rc2str(target_rc)); -+ services_ocf_exitcode_str(target_rc)); - } - - auth_client_init(); -@@ -2274,12 +2274,12 @@ handle_rsc_op(xmlNode * rsc_op) - desc = pcmk_strerror(pcmk_ok); - if (status == PCMK_LRM_OP_DONE && target_rc == rc) { - crm_notice("%s of %s on %s completed: %s", task, rsc, node, desc); -- if (rc == PCMK_EXECRA_NOT_RUNNING) { -+ if (rc == PCMK_OCF_NOT_RUNNING) { - notify = FALSE; - } - - } else if (status == PCMK_LRM_OP_DONE) { -- desc = lrmd_event_rc2str(rc); -+ desc = services_ocf_exitcode_str(rc); - crm_warn("%s of %s on %s failed: %s", task, rsc, node, desc); - - } else { diff --git a/SOURCES/bz720543-pcmk-remote_handle_endian_changes_between_client_and_server_and_improve_forward_compatibility.patch b/SOURCES/bz720543-pcmk-remote_handle_endian_changes_between_client_and_server_and_improve_forward_compatibility.patch deleted file mode 100644 index acf5502..0000000 --- a/SOURCES/bz720543-pcmk-remote_handle_endian_changes_between_client_and_server_and_improve_forward_compatibility.patch +++ /dev/null @@ -1,316 +0,0 @@ -commit d0cd173e2b9d26a3af6e28746003453500f8f655 -Author: Andrew Beekhof -Date: Thu Oct 31 08:18:11 2013 +1100 - - Fix: remote: Handle endian changes between client and server and improve forward compatibility - - (cherry picked from commit 0c8cb451bb31335e242da328c8a537ab60095a0f) - -diff --git a/configure.ac b/configure.ac -index cfc1b1f..b94c26e 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -727,6 +727,7 @@ AC_CHECK_HEADERS(glib.h) - AC_CHECK_HEADERS(grp.h) - AC_CHECK_HEADERS(limits.h) - AC_CHECK_HEADERS(linux/errqueue.h) -+AC_CHECK_HEADERS(linux/swab.h) - AC_CHECK_HEADERS(malloc.h) - AC_CHECK_HEADERS(netdb.h) - AC_CHECK_HEADERS(netinet/in.h) -diff --git a/lib/common/remote.c b/lib/common/remote.c -index c991761..47f0205 100644 ---- a/lib/common/remote.c -+++ b/lib/common/remote.c -@@ -43,9 +43,7 @@ - #ifdef HAVE_GNUTLS_GNUTLS_H - # undef KEYFILE - # include --#endif - --#ifdef HAVE_GNUTLS_GNUTLS_H - const int psk_tls_kx_order[] = { - GNUTLS_KX_DHE_PSK, - GNUTLS_KX_PSK, -@@ -58,17 +56,87 @@ const int anon_tls_kx_order[] = { - GNUTLS_KX_RSA, - 0 - }; -+#endif -+ -+/* Swab macros from linux/swab.h */ -+#ifdef HAVE_LINUX_SWAB_H -+# include -+#else -+/* -+ * casts are necessary for constants, because we never know how for sure -+ * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. -+ */ -+#define ___swab16(x) ((__u16)( \ -+ (((__u16)(x) & (__u16)0x00ffU) << 8) | \ -+ (((__u16)(x) & (__u16)0xff00U) >> 8))) -+ -+#define ___swab32(x) ((__u32)( \ -+ (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ -+ (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ -+ (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ -+ (((__u32)(x) & (__u32)0xff000000UL) >> 24))) -+ -+#define ___swab64(x) ((__u64)( \ -+ (((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ -+ (((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ -+ (((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ -+ (((__u64)(x) & (__u64)0x00000000ff000000ULL) << 8) | \ -+ (((__u64)(x) & (__u64)0x000000ff00000000ULL) >> 8) | \ -+ (((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ -+ (((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ -+ (((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56))) -+#endif -+ -+#define REMOTE_MSG_VERSION 1 -+#define ENDIAN_LOCAL 0xBADADBBD - - struct crm_remote_header_v0 - { -+ uint32_t endian; /* Detect messages from hosts with different endian-ness */ -+ uint32_t version; - uint64_t id; - uint64_t flags; -- uint32_t error; -- uint32_t version; - uint32_t size_total; -- uint32_t payload_uncompressed; -+ uint32_t payload_offset; - uint32_t payload_compressed; --}; -+ uint32_t payload_uncompressed; -+ -+ /* New fields get added here */ -+ -+} __attribute__ ((packed)); -+ -+static struct crm_remote_header_v0 * -+crm_remote_header(crm_remote_t * remote) -+{ -+ struct crm_remote_header_v0 *header = (struct crm_remote_header_v0 *)remote->buffer; -+ if(remote->buffer_offset < sizeof(struct crm_remote_header_v0)) { -+ return NULL; -+ -+ } else if(header->endian != ENDIAN_LOCAL) { -+ uint32_t endian = __swab32(header->endian); -+ -+ CRM_LOG_ASSERT(endian == ENDIAN_LOCAL); -+ if(endian != ENDIAN_LOCAL) { -+ crm_err("Invalid message detected, endian mismatch: %lx is neither %lx nor the swab'd %lx", -+ ENDIAN_LOCAL, header->endian, endian); -+ return NULL; -+ } -+ -+ header->id = __swab64(header->id); -+ header->flags = __swab64(header->flags); -+ header->endian = __swab32(header->endian); -+ -+ header->version = __swab32(header->version); -+ header->size_total = __swab32(header->size_total); -+ header->payload_offset = __swab32(header->payload_offset); -+ header->payload_compressed = __swab32(header->payload_compressed); -+ header->payload_uncompressed = __swab32(header->payload_uncompressed); -+ } -+ -+ return header; -+} -+ -+#ifdef HAVE_GNUTLS_GNUTLS_H - - int - crm_initiate_client_tls_handshake(crm_remote_t * remote, int timeout_ms) -@@ -253,13 +321,11 @@ crm_remote_sendv(crm_remote_t * remote, struct iovec * iov, int iovs) - return rc; - } - --#define PCMK_TLS_VERSION 1 -- - int - crm_remote_send(crm_remote_t * remote, xmlNode * msg) - { -- static uint64_t id = 0; - int rc = -1; -+ static uint64_t id = 0; - char *xml_text = dump_xml_unformatted(msg); - - struct iovec iov[2]; -@@ -278,19 +344,25 @@ crm_remote_send(crm_remote_t * remote, xmlNode * msg) - - id++; - header->id = id; -- header->version = PCMK_TLS_VERSION; -- header->size_total = iov[0].iov_len + iov[1].iov_len; -+ header->endian = ENDIAN_LOCAL; -+ header->version = REMOTE_MSG_VERSION; -+ header->payload_offset = iov[0].iov_len; - header->payload_uncompressed = iov[1].iov_len; -+ header->size_total = iov[0].iov_len + iov[1].iov_len; - -+ crm_trace("Sending len[0]=%d, start=%x\n", -+ (int)iov[0].iov_len, *(int*)xml_text); - rc = crm_remote_sendv(remote, iov, 2); - if (rc < 0) { - crm_err("Failed to send remote msg, rc = %d", rc); - } - -- free(xml_text); -+ free(iov[0].iov_base); -+ free(iov[1].iov_base); - return rc; - } - -+ - /*! - * \internal - * \brief handles the recv buffer and parsing out msgs. -@@ -300,34 +372,35 @@ xmlNode * - crm_remote_parse_buffer(crm_remote_t * remote) - { - xmlNode *xml = NULL; -- size_t offset = sizeof(struct crm_remote_header_v0); -- struct crm_remote_header_v0 *header = NULL; -+ struct crm_remote_header_v0 *header = crm_remote_header(remote); - -- if (remote->buffer == NULL) { -- return NULL; -- -- } else if(remote->buffer_offset < sizeof(struct crm_remote_header_v0)) { -+ if (remote->buffer == NULL || header == NULL) { - return NULL; - } - - /* take ownership of the buffer */ - remote->buffer_offset = 0; - -- header = (struct crm_remote_header_v0 *)remote->buffer; - /* Support compression on the receiving end now, in case we ever want to add it later */ - if (header->payload_compressed) { - int rc = 0; - unsigned int size_u = 1 + header->payload_uncompressed; -- char *uncompressed = calloc(1, offset + size_u); -+ char *uncompressed = calloc(1, header->payload_offset + size_u); - - crm_trace("Decompressing message data %d bytes into %d bytes", - header->payload_compressed, size_u); - -- rc = BZ2_bzBuffToBuffDecompress(uncompressed + offset, &size_u, -- remote->buffer + offset, -+ rc = BZ2_bzBuffToBuffDecompress(uncompressed + header->payload_offset, &size_u, -+ remote->buffer + header->payload_offset, - header->payload_compressed, 1, 0); - -- if (rc != BZ_OK) { -+ if (rc != BZ_OK && header->version > REMOTE_MSG_VERSION) { -+ crm_warn("Couldn't decompress v%d message, we only understand v%d", -+ header->version, REMOTE_MSG_VERSION); -+ free(uncompressed); -+ return NULL; -+ -+ } else if (rc != BZ_OK) { - crm_err("Decompression failed: %s (%d)", bz2_strerror(rc), rc); - free(uncompressed); - return NULL; -@@ -335,19 +408,23 @@ crm_remote_parse_buffer(crm_remote_t * remote) - - CRM_ASSERT(size_u == header->payload_uncompressed); - -- memcpy(uncompressed, remote->buffer, offset); /* Preserve the header */ -- header = (struct crm_remote_header_v0 *)uncompressed; -+ memcpy(uncompressed, remote->buffer, header->payload_offset); /* Preserve the header */ -+ remote->buffer_size = header->payload_offset + size_u; - - free(remote->buffer); -- remote->buffer_size = offset + size_u; - remote->buffer = uncompressed; -+ header = crm_remote_header(remote); - } - -- CRM_ASSERT(remote->buffer[sizeof(struct crm_remote_header_v0) + header->payload_uncompressed - 1] == 0); -+ CRM_LOG_ASSERT(remote->buffer[sizeof(struct crm_remote_header_v0) + header->payload_uncompressed - 1] == 0); -+ -+ xml = string2xml(remote->buffer + header->payload_offset); -+ if (xml == NULL && header->version > REMOTE_MSG_VERSION) { -+ crm_warn("Couldn't parse v%d message, we only understand v%d", -+ header->version, REMOTE_MSG_VERSION); - -- xml = string2xml(remote->buffer + offset); -- if (xml == NULL) { -- crm_err("Couldn't parse: '%.120s'", remote->buffer + offset); -+ } else if (xml == NULL) { -+ crm_err("Couldn't parse: '%.120s'", remote->buffer + header->payload_offset); - } - - return xml; -@@ -424,16 +501,16 @@ crm_remote_recv_once(crm_remote_t * remote) - { - int rc = 0; - size_t read_len = sizeof(struct crm_remote_header_v0); -+ struct crm_remote_header_v0 *header = crm_remote_header(remote); - -- if(remote->buffer_offset >= sizeof(struct crm_remote_header_v0)) { -- struct crm_remote_header_v0 *hdr = (struct crm_remote_header_v0 *)remote->buffer; -- -- read_len = hdr->size_total; -+ if(header) { -+ /* Stop at the end of the current message */ -+ read_len = header->size_total; - } - - /* automatically grow the buffer when needed */ - if(remote->buffer_size < read_len) { -- remote->buffer_size = 2 * read_len; -+ remote->buffer_size = 2 * read_len; - crm_trace("Expanding buffer to %u bytes", remote->buffer_size); - - remote->buffer = realloc(remote->buffer, remote->buffer_size + 1); -@@ -488,23 +565,18 @@ crm_remote_recv_once(crm_remote_t * remote) - return -ENOTCONN; - } - -- if(remote->buffer_offset < sizeof(struct crm_remote_header_v0)) { -- crm_trace("Not enough data to fill header: %u < %u bytes", -- remote->buffer_offset, sizeof(struct crm_remote_header_v0)); -- return -EAGAIN; -- -- } else { -- struct crm_remote_header_v0 *hdr = (struct crm_remote_header_v0 *)remote->buffer; -- -- if(remote->buffer_offset < hdr->size_total) { -+ header = crm_remote_header(remote); -+ if(header) { -+ if(remote->buffer_offset < header->size_total) { - crm_trace("Read less than the advertised length: %u < %u bytes", -- remote->buffer_offset, hdr->size_total); -- return -EAGAIN; -+ remote->buffer_offset, header->size_total); -+ } else { -+ crm_trace("Read full message of %u bytes", remote->buffer_offset); -+ return remote->buffer_offset; - } - } - -- crm_trace("Read full message of %u bytes", remote->buffer_offset); -- return remote->buffer_offset; -+ return -EAGAIN; - } - - /*! -diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c -index d037022..d99d7c8 100644 ---- a/lib/lrmd/lrmd_client.c -+++ b/lib/lrmd/lrmd_client.c -@@ -414,9 +414,6 @@ lrmd_poll(lrmd_t * lrmd, int timeout) - case CRM_CLIENT_TLS: - if (native->pending_notify) { - return 1; -- } else if (native->remote->buffer -- && strstr(native->remote->buffer, REMOTE_MSG_TERMINATOR)) { -- return 1; - } - - return crm_remote_ready(native->remote, 0); diff --git a/SOURCES/bz720543-pcmk-remote_improved_logging_of_recv_errors.patch b/SOURCES/bz720543-pcmk-remote_improved_logging_of_recv_errors.patch deleted file mode 100644 index edb302c..0000000 --- a/SOURCES/bz720543-pcmk-remote_improved_logging_of_recv_errors.patch +++ /dev/null @@ -1,33 +0,0 @@ -commit 15ebd31f77412e869c2bd7264a53117eb90d1229 -Author: Andrew Beekhof -Date: Tue Oct 15 10:01:05 2013 +1100 - - Log: remote: Improved logging of recv() errors - - (cherry picked from commit 3647b64d004b4377c90963de5ccbec45d1daef72) - -diff --git a/lib/common/remote.c b/lib/common/remote.c -index 297c75a..c991761 100644 ---- a/lib/common/remote.c -+++ b/lib/common/remote.c -@@ -459,7 +459,7 @@ crm_remote_recv_once(crm_remote_t * remote) - } else if (rc == GNUTLS_E_AGAIN) { - rc = -EAGAIN; - } else if (rc < 0) { -- crm_info("TLS receive failed: %s (%d)", gnutls_strerror(rc), rc); -+ crm_debug("TLS receive failed: %s (%d)", gnutls_strerror(rc), rc); - rc = -pcmk_err_generic; - } - #endif -@@ -482,9 +482,9 @@ crm_remote_recv_once(crm_remote_t * remote) - crm_debug("EOF encoutered after %u bytes", remote->buffer_offset); - return -ENOTCONN; - -- } else if (rc <= 0) { -+ } else { - crm_debug("Error receiving message after %u bytes: %s (%d)", -- remote->buffer_offset, gnutls_strerror(rc), rc); -+ remote->buffer_offset, pcmk_strerror(rc), rc); - return -ENOTCONN; - } - diff --git a/SOURCES/bz720543-pcmk-remote_properly_version_the_remote_connection_protocol.patch b/SOURCES/bz720543-pcmk-remote_properly_version_the_remote_connection_protocol.patch deleted file mode 100644 index d562189..0000000 --- a/SOURCES/bz720543-pcmk-remote_properly_version_the_remote_connection_protocol.patch +++ /dev/null @@ -1,607 +0,0 @@ -commit 330600b4cafd37f51d109728f9377bc921a6aa7f -Author: Andrew Beekhof -Date: Mon Oct 14 13:50:41 2013 +1100 - - Feature: remote: Properly version the remote connection protocol - - (cherry picked from commit aa024490a023bd0d0d5568f08b2c60b61adb15f5) - -diff --git a/include/crm/common/ipcs.h b/include/crm/common/ipcs.h -index 3e78d51..84249a3 100644 ---- a/include/crm/common/ipcs.h -+++ b/include/crm/common/ipcs.h -@@ -41,14 +41,17 @@ enum client_type { - struct crm_remote_s { - /* Shared */ - char *buffer; -+ size_t buffer_size; -+ size_t buffer_offset; - int auth_timeout; -- bool authenticated; /* CIB-only */ -+ int tcp_socket; - mainloop_io_t *source; - -- char *token; /* CIB Only */ -- -- int tcp_socket; -+ /* CIB-only */ -+ bool authenticated; -+ char *token; - -+ /* TLS only */ - # ifdef HAVE_GNUTLS_GNUTLS_H - gnutls_session_t *tls_session; - bool tls_handshake_complete; -diff --git a/lib/common/remote.c b/lib/common/remote.c -index 8b00f16..297c75a 100644 ---- a/lib/common/remote.c -+++ b/lib/common/remote.c -@@ -34,6 +34,8 @@ - #include - #include - -+#include -+ - #include - #include - #include -@@ -57,6 +59,17 @@ const int anon_tls_kx_order[] = { - 0 - }; - -+struct crm_remote_header_v0 -+{ -+ uint64_t id; -+ uint64_t flags; -+ uint32_t error; -+ uint32_t version; -+ uint32_t size_total; -+ uint32_t payload_uncompressed; -+ uint32_t payload_compressed; -+}; -+ - int - crm_initiate_client_tls_handshake(crm_remote_t * remote, int timeout_ms) - { -@@ -176,97 +189,6 @@ crm_send_tls(gnutls_session_t * session, const char *buf, size_t len) - - return rc < 0 ? rc : total_send; - } -- --/*! -- * \internal -- * \brief Read bytes off non blocking tls session. -- * -- * \param session - tls session to read -- * \param max_size - max bytes allowed to read for buffer. 0 assumes no limit -- * -- * \note only use with NON-Blocking sockets. Should only be used after polling socket. -- * This function will return once max_size is met, the socket read buffer -- * is empty, or an error is encountered. -- * -- * \retval '\0' terminated buffer on success -- */ --static char * --crm_recv_tls(gnutls_session_t * session, size_t max_size, size_t * recv_len, int *disconnected) --{ -- char *buf = NULL; -- int rc = 0; -- size_t len = 0; -- size_t chunk_size = max_size ? max_size : 1024; -- size_t buf_size = 0; -- size_t read_size = 0; -- -- if (session == NULL) { -- if (disconnected) { -- *disconnected = 1; -- } -- goto done; -- } -- -- buf = calloc(1, chunk_size + 1); -- buf_size = chunk_size; -- -- while (TRUE) { -- read_size = buf_size - len; -- -- /* automatically grow the buffer when needed if max_size is not set. */ -- if (!max_size && (read_size < (chunk_size / 2))) { -- buf_size += chunk_size; -- crm_trace("Grow buffer by %d more bytes. buf is now %d bytes", (int)chunk_size, -- buf_size); -- buf = realloc(buf, buf_size + 1); -- CRM_ASSERT(buf != NULL); -- -- read_size = buf_size - len; -- } -- -- rc = gnutls_record_recv(*session, buf + len, read_size); -- -- if (rc > 0) { -- crm_trace("Got %d more bytes.", rc); -- len += rc; -- /* always null terminate buffer, the +1 to alloc always allows for this. */ -- buf[len] = '\0'; -- } -- if (max_size && (max_size == read_size)) { -- crm_trace("Buffer max read size %d met", max_size); -- goto done; -- } -- -- /* process any errors. */ -- if (rc == GNUTLS_E_INTERRUPTED) { -- crm_trace("EINTR encoutered, retry tls read"); -- } else if (rc == GNUTLS_E_AGAIN) { -- crm_trace("non-blocking, exiting read on rc = %d", rc); -- goto done; -- } else if (rc <= 0) { -- if (rc == 0) { -- crm_debug("EOF encoutered during TLS read"); -- } else { -- crm_debug("Error receiving message: %s (%d)", gnutls_strerror(rc), rc); -- } -- if (disconnected) { -- *disconnected = 1; -- } -- goto done; -- } -- } -- -- done: -- if (recv_len) { -- *recv_len = len; -- } -- if (!len) { -- free(buf); -- buf = NULL; -- } -- return buf; -- --} - #endif - - static int -@@ -310,141 +232,57 @@ crm_send_plaintext(int sock, const char *buf, size_t len) - - } - --/*! -- * \internal -- * \brief Read bytes off non blocking socket. -- * -- * \param session - tls session to read -- * \param max_size - max bytes allowed to read for buffer. 0 assumes no limit -- * -- * \note only use with NON-Blocking sockets. Should only be used after polling socket. -- * This function will return once max_size is met, the socket read buffer -- * is empty, or an error is encountered. -- * -- * \retval '\0' terminated buffer on success -- */ --static char * --crm_recv_plaintext(int sock, size_t max_size, size_t * recv_len, int *disconnected) --{ -- char *buf = NULL; -- ssize_t rc = 0; -- ssize_t len = 0; -- ssize_t chunk_size = max_size ? max_size : 1024; -- size_t buf_size = 0; -- size_t read_size = 0; -- -- if (sock <= 0) { -- if (disconnected) { -- *disconnected = 1; -- } -- goto done; -- } -- -- buf = calloc(1, chunk_size + 1); -- buf_size = chunk_size; -- -- while (TRUE) { -- errno = 0; -- read_size = buf_size - len; -- -- /* automatically grow the buffer when needed if max_size is not set. */ -- if (!max_size && (read_size < (chunk_size / 2))) { -- buf_size += chunk_size; -- crm_trace("Grow buffer by %d more bytes. buf is now %d bytes", (int)chunk_size, -- buf_size); -- buf = realloc(buf, buf_size + 1); -- CRM_ASSERT(buf != NULL); -- -- read_size = buf_size - len; -- } -- -- rc = read(sock, buf + len, chunk_size); -- -- if (rc > 0) { -- crm_trace("Got %d more bytes. errno=%d", (int)rc, errno); -- len += rc; -- /* always null terminate buffer, the +1 to alloc always allows for this. */ -- buf[len] = '\0'; -- } -- if (max_size && (max_size == read_size)) { -- crm_trace("Buffer max read size %d met", max_size); -- goto done; -- } -- -- if (rc > 0) { -- continue; -- } else if (rc == 0) { -- if (disconnected) { -- *disconnected = 1; -- } -- crm_trace("EOF encoutered during read"); -- goto done; -- } -- -- /* process errors */ -- if (errno == EINTR) { -- crm_trace("EINTER encoutered, retry socket read."); -- } else if (errno == EAGAIN) { -- crm_trace("non-blocking, exiting read on rc = %d", rc); -- goto done; -- } else if (errno <= 0) { -- if (disconnected) { -- *disconnected = 1; -- } -- crm_debug("Error receiving message: %d", (int)rc); -- goto done; -- } -- } -- -- done: -- if (recv_len) { -- *recv_len = len; -- } -- if (!len) { -- free(buf); -- buf = NULL; -- } -- return buf; --} -- - static int --crm_remote_send_raw(crm_remote_t * remote, const char *buf, size_t len) -+crm_remote_sendv(crm_remote_t * remote, struct iovec * iov, int iovs) - { -+ int lpc = 0; - int rc = -ESOCKTNOSUPPORT; - -- if (remote->tcp_socket) { -- rc = crm_send_plaintext(remote->tcp_socket, buf, len); -+ for(; lpc < iovs; lpc++) { -+ if (remote->tcp_socket) { -+ rc = crm_send_plaintext(remote->tcp_socket, iov[lpc].iov_base, iov[lpc].iov_len); - #ifdef HAVE_GNUTLS_GNUTLS_H - -- } else if (remote->tls_session) { -- rc = crm_send_tls(remote->tls_session, buf, len); -+ } else if (remote->tls_session) { -+ rc = crm_send_tls(remote->tls_session, iov[lpc].iov_base, iov[lpc].iov_len); - #endif -- } else { -- crm_err("Unsupported connection type"); -+ } else { -+ crm_err("Unsupported connection type"); -+ } - } - return rc; - } - -+#define PCMK_TLS_VERSION 1 -+ - int - crm_remote_send(crm_remote_t * remote, xmlNode * msg) - { -+ static uint64_t id = 0; - int rc = -1; -- char *xml_text = NULL; -- int len = 0; -+ char *xml_text = dump_xml_unformatted(msg); - -- xml_text = dump_xml_unformatted(msg); -- if (xml_text) { -- len = strlen(xml_text); -- } else { -+ struct iovec iov[2]; -+ struct crm_remote_header_v0 *header = calloc(1, sizeof(struct crm_remote_header_v0)); -+ -+ if (xml_text == NULL) { - crm_err("Invalid XML, can not send msg"); - return -1; - } - -- rc = crm_remote_send_raw(remote, xml_text, len); -- if (rc >= 0) { -- rc = crm_remote_send_raw(remote, REMOTE_MSG_TERMINATOR, strlen(REMOTE_MSG_TERMINATOR)); -- } -+ iov[0].iov_base = header; -+ iov[0].iov_len = sizeof(struct crm_remote_header_v0); -+ -+ iov[1].iov_base = xml_text; -+ iov[1].iov_len = 1 + strlen(xml_text); - -+ id++; -+ header->id = id; -+ header->version = PCMK_TLS_VERSION; -+ header->size_total = iov[0].iov_len + iov[1].iov_len; -+ header->payload_uncompressed = iov[1].iov_len; -+ -+ rc = crm_remote_sendv(remote, iov, 2); - if (rc < 0) { - crm_err("Failed to send remote msg, rc = %d", rc); - } -@@ -461,44 +299,55 @@ crm_remote_send(crm_remote_t * remote, xmlNode * msg) - xmlNode * - crm_remote_parse_buffer(crm_remote_t * remote) - { -- char *buf = NULL; -- char *start = NULL; -- char *end = NULL; - xmlNode *xml = NULL; -+ size_t offset = sizeof(struct crm_remote_header_v0); -+ struct crm_remote_header_v0 *header = NULL; - - if (remote->buffer == NULL) { - return NULL; -+ -+ } else if(remote->buffer_offset < sizeof(struct crm_remote_header_v0)) { -+ return NULL; - } - - /* take ownership of the buffer */ -- buf = remote->buffer; -- remote->buffer = NULL; -- -- /* MSGS are separated by a '\r\n\r\n'. Split a message off the buffer and return it. */ -- start = buf; -- end = strstr(start, REMOTE_MSG_TERMINATOR); -+ remote->buffer_offset = 0; -+ -+ header = (struct crm_remote_header_v0 *)remote->buffer; -+ /* Support compression on the receiving end now, in case we ever want to add it later */ -+ if (header->payload_compressed) { -+ int rc = 0; -+ unsigned int size_u = 1 + header->payload_uncompressed; -+ char *uncompressed = calloc(1, offset + size_u); -+ -+ crm_trace("Decompressing message data %d bytes into %d bytes", -+ header->payload_compressed, size_u); -+ -+ rc = BZ2_bzBuffToBuffDecompress(uncompressed + offset, &size_u, -+ remote->buffer + offset, -+ header->payload_compressed, 1, 0); -+ -+ if (rc != BZ_OK) { -+ crm_err("Decompression failed: %s (%d)", bz2_strerror(rc), rc); -+ free(uncompressed); -+ return NULL; -+ } - -- while (!xml && end) { -+ CRM_ASSERT(size_u == header->payload_uncompressed); - -- /* grab the message */ -- end[0] = '\0'; -- end += strlen(REMOTE_MSG_TERMINATOR); -+ memcpy(uncompressed, remote->buffer, offset); /* Preserve the header */ -+ header = (struct crm_remote_header_v0 *)uncompressed; - -- xml = string2xml(start); -- if (xml == NULL) { -- crm_err("Couldn't parse: '%.120s'", start); -- } -- start = end; -- end = strstr(start, REMOTE_MSG_TERMINATOR); -+ free(remote->buffer); -+ remote->buffer_size = offset + size_u; -+ remote->buffer = uncompressed; - } - -- if (xml && start) { -- /* we have msgs left over, save it until next time */ -- remote->buffer = strdup(start); -- free(buf); -- } else if (!xml) { -- /* no msg present */ -- remote->buffer = buf; -+ CRM_ASSERT(remote->buffer[sizeof(struct crm_remote_header_v0) + header->payload_uncompressed - 1] == 0); -+ -+ xml = string2xml(remote->buffer + offset); -+ if (xml == NULL) { -+ crm_err("Couldn't parse: '%.120s'", remote->buffer + offset); - } - - return xml; -@@ -559,6 +408,105 @@ crm_remote_ready(crm_remote_t * remote, int timeout /* ms */ ) - return rc; - } - -+ -+/*! -+ * \internal -+ * \brief Read bytes off non blocking remote connection. -+ * -+ * \note only use with NON-Blocking sockets. Should only be used after polling socket. -+ * This function will return once max_size is met, the socket read buffer -+ * is empty, or an error is encountered. -+ * -+ * \retval number of bytes received -+ */ -+static size_t -+crm_remote_recv_once(crm_remote_t * remote) -+{ -+ int rc = 0; -+ size_t read_len = sizeof(struct crm_remote_header_v0); -+ -+ if(remote->buffer_offset >= sizeof(struct crm_remote_header_v0)) { -+ struct crm_remote_header_v0 *hdr = (struct crm_remote_header_v0 *)remote->buffer; -+ -+ read_len = hdr->size_total; -+ } -+ -+ /* automatically grow the buffer when needed */ -+ if(remote->buffer_size < read_len) { -+ remote->buffer_size = 2 * read_len; -+ crm_trace("Expanding buffer to %u bytes", remote->buffer_size); -+ -+ remote->buffer = realloc(remote->buffer, remote->buffer_size + 1); -+ CRM_ASSERT(remote->buffer != NULL); -+ } -+ -+ if (remote->tcp_socket) { -+ errno = 0; -+ rc = read(remote->tcp_socket, -+ remote->buffer + remote->buffer_offset, -+ remote->buffer_size - remote->buffer_offset); -+ if(rc < 0) { -+ rc = -errno; -+ } -+ -+#ifdef HAVE_GNUTLS_GNUTLS_H -+ } else if (remote->tls_session) { -+ rc = gnutls_record_recv(*(remote->tls_session), -+ remote->buffer + remote->buffer_offset, -+ remote->buffer_size - remote->buffer_offset); -+ if (rc == GNUTLS_E_INTERRUPTED) { -+ rc = -EINTR; -+ } else if (rc == GNUTLS_E_AGAIN) { -+ rc = -EAGAIN; -+ } else if (rc < 0) { -+ crm_info("TLS receive failed: %s (%d)", gnutls_strerror(rc), rc); -+ rc = -pcmk_err_generic; -+ } -+#endif -+ } else { -+ crm_err("Unsupported connection type"); -+ return -ESOCKTNOSUPPORT; -+ } -+ -+ /* process any errors. */ -+ if (rc > 0) { -+ remote->buffer_offset += rc; -+ /* always null terminate buffer, the +1 to alloc always allows for this. */ -+ remote->buffer[remote->buffer_offset] = '\0'; -+ crm_trace("Received %u more bytes, %u total", rc, remote->buffer_offset); -+ -+ } else if (rc == -EINTR || rc == -EAGAIN) { -+ crm_trace("non-blocking, exiting read: %s (%d)", pcmk_strerror(rc), rc); -+ -+ } else if (rc == 0) { -+ crm_debug("EOF encoutered after %u bytes", remote->buffer_offset); -+ return -ENOTCONN; -+ -+ } else if (rc <= 0) { -+ crm_debug("Error receiving message after %u bytes: %s (%d)", -+ remote->buffer_offset, gnutls_strerror(rc), rc); -+ return -ENOTCONN; -+ } -+ -+ if(remote->buffer_offset < sizeof(struct crm_remote_header_v0)) { -+ crm_trace("Not enough data to fill header: %u < %u bytes", -+ remote->buffer_offset, sizeof(struct crm_remote_header_v0)); -+ return -EAGAIN; -+ -+ } else { -+ struct crm_remote_header_v0 *hdr = (struct crm_remote_header_v0 *)remote->buffer; -+ -+ if(remote->buffer_offset < hdr->size_total) { -+ crm_trace("Read less than the advertised length: %u < %u bytes", -+ remote->buffer_offset, hdr->size_total); -+ return -EAGAIN; -+ } -+ } -+ -+ crm_trace("Read full message of %u bytes", remote->buffer_offset); -+ return remote->buffer_offset; -+} -+ - /*! - * \internal - * \brief Read data off the socket until at least one full message is present or timeout occures. -@@ -569,10 +517,8 @@ crm_remote_ready(crm_remote_t * remote, int timeout /* ms */ ) - gboolean - crm_remote_recv(crm_remote_t * remote, int total_timeout /*ms */ , int *disconnected) - { -- int ret; -- size_t request_len = 0; -+ int rc; - time_t start = time(NULL); -- char *raw_request = NULL; - int remaining_timeout = 0; - - if (total_timeout == 0) { -@@ -588,57 +534,30 @@ crm_remote_recv(crm_remote_t * remote, int total_timeout /*ms */ , int *disconne - /* read some more off the tls buffer if we still have time left. */ - crm_trace("waiting to receive remote msg, starting timeout %d, remaining_timeout %d", - total_timeout, remaining_timeout); -- ret = crm_remote_ready(remote, remaining_timeout); -- raw_request = NULL; -+ rc = crm_remote_ready(remote, remaining_timeout); - -- if (ret == 0) { -+ if (rc == 0) { - crm_err("poll timed out (%d ms) while waiting to receive msg", remaining_timeout); - return FALSE; - -- } else if (ret < 0) { -- if (errno != EINTR) { -- crm_debug("poll returned error while waiting for msg, rc: %d, errno: %d", ret, -- errno); -- *disconnected = 1; -- return FALSE; -- } -- crm_debug("poll EINTR encountered during poll, retrying"); -- -- } else if (remote->tcp_socket) { -- raw_request = crm_recv_plaintext(remote->tcp_socket, 0, &request_len, disconnected); -+ } else if(rc < 0) { -+ crm_debug("poll() failed: %s (%d)", pcmk_strerror(rc), rc); - --#ifdef HAVE_GNUTLS_GNUTLS_H -- } else if (remote->tls_session) { -- raw_request = crm_recv_tls(remote->tls_session, 0, &request_len, disconnected); --#endif - } else { -- crm_err("Unsupported connection type"); -- } -- -- remaining_timeout = remaining_timeout - ((time(NULL) - start) * 1000); -- -- if (!raw_request) { -- crm_debug("Empty msg received after poll"); -- continue; -+ rc = crm_remote_recv_once(remote); -+ if(rc > 0) { -+ return TRUE; -+ } else if (rc < 0) { -+ crm_debug("recv() failed: %s (%d)", pcmk_strerror(rc), rc); -+ } - } - -- if (remote->buffer) { -- int old_len = strlen(remote->buffer); -- -- crm_trace("Expanding recv buffer from %d to %d", old_len, old_len + request_len); -- -- remote->buffer = realloc(remote->buffer, old_len + request_len + 1); -- memcpy(remote->buffer + old_len, raw_request, request_len); -- *(remote->buffer + old_len + request_len) = '\0'; -- free(raw_request); -- -- } else { -- remote->buffer = raw_request; -+ if(rc == -ENOTCONN) { -+ *disconnected = 1; -+ return FALSE; - } - -- if (strstr(remote->buffer, REMOTE_MSG_TERMINATOR)) { -- return TRUE; -- } -+ remaining_timeout = remaining_timeout - ((time(NULL) - start) * 1000); - } - - return FALSE; diff --git a/SOURCES/bz720543-pcmk-removes_unnecessary_newlines_in_crm_resource_o_output.patch b/SOURCES/bz720543-pcmk-removes_unnecessary_newlines_in_crm_resource_o_output.patch deleted file mode 100644 index 9d1e7cc..0000000 --- a/SOURCES/bz720543-pcmk-removes_unnecessary_newlines_in_crm_resource_o_output.patch +++ /dev/null @@ -1,64 +0,0 @@ -commit 0c88fc0aa260dcd50e654275cc9fdd68e27a2617 -Author: David Vossel -Date: Wed Dec 4 17:04:52 2013 -0600 - - Fix: Removes unnecessary newlines in crm_resource -O output - - Resolves: rhbz#1038155 - (cherry picked from commit cd56faa1c9168811b64be9f7eea73ad600261844) - -diff --git a/include/crm/common/util.h b/include/crm/common/util.h -index f0dca36..9092708 100644 ---- a/include/crm/common/util.h -+++ b/include/crm/common/util.h -@@ -67,6 +67,8 @@ gboolean decode_transition_key(const char *key, char **uuid, int *action, int *t - gboolean decode_transition_magic(const char *magic, char **uuid, int *transition_id, int *action_id, - int *op_status, int *op_rc, int *target_rc); - -+char * crm_strip_trailing_newline(char *str); -+ - # define safe_str_eq(a, b) crm_str_eq(a, b, FALSE) - gboolean crm_str_eq(const char *a, const char *b, gboolean use_case); - gboolean safe_str_neq(const char *a, const char *b); -diff --git a/lib/common/utils.c b/lib/common/utils.c -index 527c9e0..4e18039 100644 ---- a/lib/common/utils.c -+++ b/lib/common/utils.c -@@ -1550,6 +1550,22 @@ crm_is_writable(const char *dir, const char *file, - return pass; - } - -+char * -+crm_strip_trailing_newline(char *str) -+{ -+ int len; -+ -+ if (str == NULL) { -+ return str; -+ } -+ -+ for (len = strlen(str) - 1; len >= 0 && str[len] == '\n'; len--) { -+ str[len] = '\0'; -+ } -+ -+ return str; -+} -+ - gboolean - crm_str_eq(const char *a, const char *b, gboolean use_case) - { -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index c03501d..2f0e282 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -1119,8 +1119,8 @@ list_resource_operations(const char *rsc_id, const char *host_uname, gboolean ac - if (last) { - time_t run_at = crm_parse_int(last, "0"); - -- fprintf(stdout, ", last-rc-change=%s, exec=%sms\n", -- ctime(&run_at), crm_element_value(xml_op, XML_RSC_OP_T_EXEC)); -+ fprintf(stdout, ", last-rc-change=%s, exec=%sms", -+ crm_strip_trailing_newline(ctime(&run_at)), crm_element_value(xml_op, XML_RSC_OP_T_EXEC)); - } - fprintf(stdout, "): %s\n", services_lrm_status_str(status)); - } diff --git a/SOURCES/bz720543-pcmk-tools_fixes_formatting_of_remote_nodes_in_crm_mon_and_crm_simulate.patch b/SOURCES/bz720543-pcmk-tools_fixes_formatting_of_remote_nodes_in_crm_mon_and_crm_simulate.patch deleted file mode 100644 index ddbfc43..0000000 --- a/SOURCES/bz720543-pcmk-tools_fixes_formatting_of_remote_nodes_in_crm_mon_and_crm_simulate.patch +++ /dev/null @@ -1,356 +0,0 @@ -commit 27adba1575f508166e7203225a3ff6d580842dfd -Author: David Vossel -Date: Tue Aug 27 17:46:28 2013 -0500 - - Fix: tools: Fixes formatting of remote-nodes in crm_mon and crm_simulate - - (cherry picked from commit b32b60ec6d0963ea3767196f0fdd50746d27fafa) - - Conflicts: - pengine/test10/whitebox-ms-ordering.summary - -diff --git a/pengine/test10/whitebox-asymmetric.summary b/pengine/test10/whitebox-asymmetric.summary -index c4a8e0a..1a68802 100644 ---- a/pengine/test10/whitebox-asymmetric.summary -+++ b/pengine/test10/whitebox-asymmetric.summary -@@ -1,7 +1,6 @@ - - Current cluster status: - Online: [ 18builder ] --OFFLINE: [ 18node2:container2 ] - - fence_false (stonith:fence_false): Stopped - container2 (ocf::pacemaker:Dummy): Started 18builder -@@ -22,7 +21,8 @@ Executing cluster transition: - * Resource action: nfs_mount monitor=10000 on 18node2 - - Revised cluster status: --Online: [ 18builder 18node2:container2 ] -+Online: [ 18builder ] -+Containers: [ 18node2:container2 ] - - fence_false (stonith:fence_false): Stopped - container2 (ocf::pacemaker:Dummy): Started 18builder -diff --git a/pengine/test10/whitebox-fail1.summary b/pengine/test10/whitebox-fail1.summary -index 02d0f8e..5e5887b 100644 ---- a/pengine/test10/whitebox-fail1.summary -+++ b/pengine/test10/whitebox-fail1.summary -@@ -1,7 +1,7 @@ - - Current cluster status: --Online: [ 18node1 18node2 18node3 lxc2:container2 ] --OFFLINE: [ lxc1:container1 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): FAILED 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -@@ -38,7 +38,8 @@ Executing cluster transition: - * Resource action: B monitor=10000 on lxc1 - - Revised cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -diff --git a/pengine/test10/whitebox-fail2.summary b/pengine/test10/whitebox-fail2.summary -index 0e53524..338173d 100644 ---- a/pengine/test10/whitebox-fail2.summary -+++ b/pengine/test10/whitebox-fail2.summary -@@ -1,7 +1,7 @@ - - Current cluster status: --Online: [ 18node1 18node2 18node3 lxc2:container2 ] --OFFLINE: [ lxc1:container1 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): FAILED 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -@@ -38,7 +38,8 @@ Executing cluster transition: - * Resource action: B monitor=10000 on lxc1 - - Revised cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -diff --git a/pengine/test10/whitebox-fail3.summary b/pengine/test10/whitebox-fail3.summary -index 1d25724..395d218 100644 ---- a/pengine/test10/whitebox-fail3.summary -+++ b/pengine/test10/whitebox-fail3.summary -@@ -1,7 +1,6 @@ - - Current cluster status: - Online: [ dvossel-laptop2 ] --OFFLINE: [ 18builder:vm 18node1:vm2 ] - - vm (ocf::heartbeat:VirtualDomain): Stopped - vm2 (ocf::heartbeat:VirtualDomain): Stopped -@@ -39,8 +38,8 @@ Executing cluster transition: - * Resource action: X monitor=10000 on 18builder - - Revised cluster status: --Online: [ 18builder:vm dvossel-laptop2 ] --OFFLINE: [ 18node1:vm2 ] -+Online: [ dvossel-laptop2 ] -+Containers: [ 18builder:vm ] - - vm (ocf::heartbeat:VirtualDomain): Started dvossel-laptop2 - vm2 (ocf::heartbeat:VirtualDomain): Stopped -diff --git a/pengine/test10/whitebox-move.summary b/pengine/test10/whitebox-move.summary -index 6dc2f6f..3422ac7 100644 ---- a/pengine/test10/whitebox-move.summary -+++ b/pengine/test10/whitebox-move.summary -@@ -1,6 +1,7 @@ - - Current cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node1 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -@@ -34,7 +35,8 @@ Executing cluster transition: - * Resource action: lxc1 monitor=30000 on 18node2 - - Revised cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -diff --git a/pengine/test10/whitebox-start.summary b/pengine/test10/whitebox-start.summary -index e5d654b..2801abe 100644 ---- a/pengine/test10/whitebox-start.summary -+++ b/pengine/test10/whitebox-start.summary -@@ -1,7 +1,7 @@ - - Current cluster status: --Online: [ 18node1 18node2 18node3 lxc2:container2 ] --OFFLINE: [ lxc1:container1 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Stopped - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -@@ -29,7 +29,8 @@ Executing cluster transition: - * Resource action: M monitor=10000 on lxc1 - - Revised cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node1 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -diff --git a/pengine/test10/whitebox-stop.summary b/pengine/test10/whitebox-stop.summary -index 4116571..51357b9 100644 ---- a/pengine/test10/whitebox-stop.summary -+++ b/pengine/test10/whitebox-stop.summary -@@ -1,6 +1,7 @@ - - Current cluster status: --Online: [ 18node1 18node2 18node3 lxc1:container1 lxc2:container2 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Started 18node2 - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -@@ -30,8 +31,8 @@ Executing cluster transition: - * Pseudo action: all_stopped - - Revised cluster status: --Online: [ 18node1 18node2 18node3 lxc2:container2 ] --OFFLINE: [ lxc1:container1 ] -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc2:container2 ] - - container1 (ocf::heartbeat:VirtualDomain): Stopped - container2 (ocf::heartbeat:VirtualDomain): Started 18node2 -diff --git a/tools/crm_mon.c b/tools/crm_mon.c -index 7c6e495..599df02 100644 ---- a/tools/crm_mon.c -+++ b/tools/crm_mon.c -@@ -1153,7 +1153,10 @@ print_status(pe_working_set_t * data_set) - node_t *dc = NULL; - char *since_epoch = NULL; - char *online_nodes = NULL; -+ char *online_remote_nodes = NULL; -+ char *online_remote_containers = NULL; - char *offline_nodes = NULL; -+ char *offline_remote_nodes = NULL; - const char *stack_s = NULL; - xmlNode *dc_version = NULL; - xmlNode *quorum_node = NULL; -@@ -1246,7 +1249,7 @@ print_status(pe_working_set_t * data_set) - const char *node_mode = NULL; - char *node_name = NULL; - -- if(node->details->remote_rsc) { -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { - node_name = g_strdup_printf("%s:%s", node->details->uname, node->details->remote_rsc->container->id); - } else { - node_name = g_strdup_printf("%s", node->details->uname); -@@ -1286,23 +1289,37 @@ print_status(pe_working_set_t * data_set) - } else if (node->details->online) { - node_mode = "online"; - if (group_by_node == FALSE) { -- online_nodes = add_list_element(online_nodes, node_name); -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { -+ online_remote_containers = add_list_element(online_remote_containers, node_name); -+ } else if (node->details->remote_rsc) { -+ online_remote_nodes = add_list_element(online_remote_nodes, node_name); -+ } else { -+ online_nodes = add_list_element(online_nodes, node_name); -+ } - continue; - } -- - } else { - node_mode = "OFFLINE"; - if (group_by_node == FALSE) { -- offline_nodes = add_list_element(offline_nodes, node_name); -+ -+ if (node->details->remote_rsc) { -+ if (node->details->remote_rsc->container == NULL) { -+ offline_remote_nodes = add_list_element(offline_remote_nodes, node_name); -+ } else { -+ /* ignore displaying offline container nodes */ -+ } -+ } else { -+ offline_nodes = add_list_element(offline_nodes, node_name); -+ } - continue; - } - } - -- if(node->details->remote_rsc) { -- online_nodes = add_list_element(online_nodes, node->details->remote_rsc->id); -- } -- -- if (safe_str_eq(node->details->uname, node->details->id)) { -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { -+ print_as("ContainerNode %s: %s\n", node_name, node_mode); -+ } else if (node->details->remote_rsc) { -+ print_as("RemoteNode %s: %s\n", node_name, node_mode); -+ } else if (safe_str_eq(node->details->uname, node->details->id)) { - print_as("Node %s: %s\n", node_name, node_mode); - } else { - print_as("Node %s (%s): %s\n", node_name, node->details->id, node_mode); -@@ -1328,6 +1345,18 @@ print_status(pe_working_set_t * data_set) - print_as("OFFLINE: [%s ]\n", offline_nodes); - free(offline_nodes); - } -+ if (online_remote_nodes) { -+ print_as("RemoteOnline: [%s ]\n", online_remote_nodes); -+ free(online_remote_nodes); -+ } -+ if (offline_remote_nodes) { -+ print_as("RemoteOFFLINE: [%s ]\n", offline_remote_nodes); -+ free(offline_remote_nodes); -+ } -+ if (online_remote_containers) { -+ print_as("Containers: [%s ]\n", online_remote_containers); -+ free(online_remote_containers); -+ } - - if (group_by_node == FALSE && inactive_resources) { - print_as("\nFull list of resources:\n"); -diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c -index 0d95e53..78cab50 100644 ---- a/tools/crm_simulate.c -+++ b/tools/crm_simulate.c -@@ -530,7 +530,10 @@ static void - print_cluster_status(pe_working_set_t * data_set) - { - char *online_nodes = NULL; -+ char *online_remote_nodes = NULL; -+ char *online_remote_containers = NULL; - char *offline_nodes = NULL; -+ char *offline_remote_nodes = NULL; - - GListPtr gIter = NULL; - -@@ -539,7 +542,7 @@ print_cluster_status(pe_working_set_t * data_set) - const char *node_mode = NULL; - char *node_name = NULL; - -- if(node->details->remote_rsc) { -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { - node_name = g_strdup_printf("%s:%s", node->details->uname, node->details->remote_rsc->container->id); - } else { - node_name = g_strdup_printf("%s", node->details->uname); -@@ -576,24 +579,45 @@ print_cluster_status(pe_working_set_t * data_set) - node_mode = "OFFLINE (maintenance)"; - } - -+ -+ - } else if (node->details->online) { - node_mode = "online"; -- online_nodes = add_list_element(online_nodes, node_name); -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { -+ online_remote_containers = add_list_element(online_remote_containers, node_name); -+ } else if (node->details->remote_rsc) { -+ online_remote_nodes = add_list_element(online_remote_nodes, node_name); -+ } else { -+ online_nodes = add_list_element(online_nodes, node_name); -+ } - free(node_name); - continue; - - } else { - node_mode = "OFFLINE"; -- offline_nodes = add_list_element(offline_nodes, node_name); -+ if (node->details->remote_rsc) { -+ if (node->details->remote_rsc->container == NULL) { -+ offline_remote_nodes = add_list_element(offline_remote_nodes, node_name); -+ } else { -+ /* ignore displaying offline container nodes */ -+ } -+ } else { -+ offline_nodes = add_list_element(offline_nodes, node_name); -+ } - free(node_name); - continue; - } - -- if (safe_str_eq(node_name, node->details->id)) { -+ if (node->details->remote_rsc && node->details->remote_rsc->container) { -+ printf("ContainerNode %s: %s\n", node_name, node_mode); -+ } else if (node->details->remote_rsc) { -+ printf("RemoteNode %s: %s\n", node_name, node_mode); -+ } else if (safe_str_eq(node->details->uname, node->details->id)) { - printf("Node %s: %s\n", node_name, node_mode); - } else { - printf("Node %s (%s): %s\n", node_name, node->details->id, node_mode); - } -+ - free(node_name); - } - -@@ -605,6 +629,18 @@ print_cluster_status(pe_working_set_t * data_set) - printf("OFFLINE: [%s ]\n", offline_nodes); - free(offline_nodes); - } -+ if (online_remote_nodes) { -+ printf("RemoteOnline: [%s ]\n", online_remote_nodes); -+ free(online_remote_nodes); -+ } -+ if (offline_remote_nodes) { -+ printf("RemoteOFFLINE: [%s ]\n", offline_remote_nodes); -+ free(offline_remote_nodes); -+ } -+ if (online_remote_containers) { -+ printf("Containers: [%s ]\n", online_remote_containers); -+ free(online_remote_containers); -+ } - - fprintf(stdout, "\n"); - for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { diff --git a/SOURCES/bz902407-pcmk-crm_resource_handle_ban_for_master_slave_resources_as_advertised.patch b/SOURCES/bz902407-pcmk-crm_resource_handle_ban_for_master_slave_resources_as_advertised.patch deleted file mode 100644 index 346f593..0000000 --- a/SOURCES/bz902407-pcmk-crm_resource_handle_ban_for_master_slave_resources_as_advertised.patch +++ /dev/null @@ -1,41 +0,0 @@ -commit b15fd2bd176211fb9ae6b158e48f1ee07c21ecee -Author: Andrew Beekhof -Date: Fri Aug 23 13:29:00 2013 +1000 - - Bug rhbz#902407 - crm_resource: Handle --ban for master/slave resources as advertised - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index e4d2215..ea23698 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -905,16 +905,19 @@ ban_resource(const char *rsc_id, const char *host, GListPtr allnodes, cib_t * ci - CMD_ERR("WARNING: Creating rsc_location constraint '%s'" - " with a score of -INFINITY for resource %s" - " on %s.\n", ID(location), rsc_id, host); -- CMD_ERR("\tThis will prevent %s from running" -+ CMD_ERR("\tThis will prevent %s from %s" - " on %s until the constraint is removed using" - " the 'crm_resource --clear' command or manually" -- " with cibadmin\n", rsc_id, host); -+ " with cibadmin\n", rsc_id, scope_master?"being promoted":"running", host); - CMD_ERR("\tThis will be the case even if %s is" - " the last node in the cluster\n", host); - CMD_ERR("\tThis message can be disabled with --quiet\n"); - } - - crm_xml_add(location, XML_COLOC_ATTR_SOURCE, rsc_id); -+ if(scope_master) { -+ crm_xml_add(location, XML_RULE_ATTR_ROLE, RSC_ROLE_MASTER_S); -+ } - - if (later_s == NULL) { - /* Short form */ -@@ -2003,7 +2006,7 @@ main(int argc, char **argv) - node_t *current = rsc->running_on->data; - rc = ban_resource(rsc_id, current->details->uname, NULL, cib_conn); - -- } else if(scope_master && rsc->variant == pe_master) { -+ } else if(rsc->variant == pe_master) { - int count = 0; - GListPtr iter = NULL; - node_t *current = NULL; diff --git a/SOURCES/bz902407-pcmk-crm_resource_observe_master_modifier_for_move.patch b/SOURCES/bz902407-pcmk-crm_resource_observe_master_modifier_for_move.patch deleted file mode 100644 index 3781c22..0000000 --- a/SOURCES/bz902407-pcmk-crm_resource_observe_master_modifier_for_move.patch +++ /dev/null @@ -1,180 +0,0 @@ -commit 04c1373e2758744d53e83f8013c84c3517a028ce -Author: Andrew Beekhof -Date: Tue Oct 1 20:47:07 2013 +1000 - - Fix: crm_resource: Observe --master modifier for --move - - Also ensure role=Master is overwritten for --ban - Do something sane for --move when called for a clone - - (cherry picked from commit f36c32b47b58254caf580e7fe56e6b5a8eef7639) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 6ded13d..44d96b0 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -917,6 +917,8 @@ ban_resource(const char *rsc_id, const char *host, GListPtr allnodes, cib_t * ci - crm_xml_add(location, XML_COLOC_ATTR_SOURCE, rsc_id); - if(scope_master) { - crm_xml_add(location, XML_RULE_ATTR_ROLE, RSC_ROLE_MASTER_S); -+ } else { -+ crm_xml_add(location, XML_RULE_ATTR_ROLE, RSC_ROLE_STARTED_S); - } - - if (later_s == NULL) { -@@ -982,6 +984,11 @@ prefer_resource(const char *rsc_id, const char *host, cib_t * cib_conn) - free(id); - - crm_xml_add(location, XML_COLOC_ATTR_SOURCE, rsc_id); -+ if(scope_master) { -+ crm_xml_add(location, XML_RULE_ATTR_ROLE, RSC_ROLE_MASTER_S); -+ } else { -+ crm_xml_add(location, XML_RULE_ATTR_ROLE, RSC_ROLE_STARTED_S); -+ } - - if (later_s == NULL) { - /* Short form */ -@@ -1924,8 +1931,11 @@ main(int argc, char **argv) - } - - } else if (rsc_cmd == 'M' && host_uname) { -- resource_t *rsc = pe_find_resource(data_set.resources, rsc_id); -+ -+ int count = 0; -+ 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); - - rc = -EINVAL; - -@@ -1934,23 +1944,40 @@ main(int argc, char **argv) - rc = -ENXIO; - goto bail; - -- } else if(rsc->variant == pe_clone) { -- CMD_ERR("Resource '%s' not moved: moving a clone makes no sense\n", rsc_id); -- goto bail; -- -- } else if (rsc->variant < pe_clone && g_list_length(rsc->running_on) > 1) { -- CMD_ERR("Resource '%s' not moved: active on multiple nodes\n", rsc_id); -- goto bail; -- -- } else if (rsc->variant < pe_clone && scope_master) { -+ } else if (scope_master && rsc->variant < pe_master) { - resource_t *p = uber_parent(rsc); - if(p->variant == pe_master) { -- CMD_ERR("Resource '%s' not moved: The --master option is not a valid for %s resources." -- " Did you mean '%s'?\n", rsc_id, get_resource_typename(rsc->variant), p->id); -+ CMD_ERR("Using parent '%s' for --move command instead of '%s'.\n", rsc->id, rsc_id); -+ rsc_id = p->id; -+ rsc = p; -+ - } else { -- CMD_ERR("Resource '%s' not moved: The --master option is not a valid for %s resources.\n", -- rsc_id, get_resource_typename(rsc->variant)); -+ CMD_ERR("Ignoring '--master' option: not valid for %s resources.\n", -+ get_resource_typename(rsc->variant)); -+ scope_master = FALSE; - } -+ } -+ -+ if(rsc->variant == pe_master) { -+ GListPtr iter = NULL; -+ -+ for(iter = rsc->children; iter; iter = iter->next) { -+ resource_t *child = (resource_t *)iter->data; -+ if(child->role == RSC_ROLE_MASTER) { -+ rsc = child; -+ count++; -+ } -+ } -+ -+ if(scope_master == FALSE && count == 0) { -+ count = g_list_length(rsc->running_on); -+ } -+ -+ } else if (rsc->variant > pe_group) { -+ count = g_list_length(rsc->running_on); -+ -+ } else if (g_list_length(rsc->running_on) > 1) { -+ CMD_ERR("Resource '%s' not moved: active on multiple nodes\n", rsc_id); - goto bail; - } - -@@ -1961,13 +1988,19 @@ main(int argc, char **argv) - } - - if(g_list_length(rsc->running_on) == 1) { -- node_t *current = rsc->running_on->data; -+ current = rsc->running_on->data; -+ } - -- if (safe_str_eq(current->details->uname, dest->details->uname)) { -- CMD_ERR("Error performing operation: %s is already active on %s\n", rsc_id, dest->details->uname); -- goto bail; -- } -- /* } else if (rsc->variant == pe_master) { Find the master and ban it */ -+ if(current == NULL) { -+ /* Nothing to check */ -+ -+ } else if(scope_master && rsc->role != 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; - } - - /* Clear any previous constraints for 'dest' */ -@@ -1976,11 +2009,23 @@ main(int argc, char **argv) - /* Record an explicit preference for 'dest' */ - rc = prefer_resource(rsc_id, dest->details->uname, cib_conn); - -- if(do_force && g_list_length(rsc->running_on) == 1) { -- node_t *current = rsc->running_on->data; -+ crm_trace("%s%s now prefers node %s%s", -+ rsc->id, scope_master?" (master)":"", dest->details->uname, do_force?"(forced)":""); - -- /* Ban the original location */ -- ban_resource(rsc_id, current->details->uname, NULL, cib_conn); -+ if(do_force) { -+ /* Ban the original location if possible */ -+ if(current) { -+ ban_resource(rsc_id, current->details->uname, NULL, cib_conn); -+ -+ } else if(count > 1) { -+ CMD_ERR("Resource '%s' is currently %s in %d locations. One may now move one to %s\n", -+ rsc_id, scope_master?"promoted":"active", count, dest->details->uname); -+ CMD_ERR("You can prevent '%s' from being %s at a specific location with:" -+ " --ban %s--host \n", rsc_id, scope_master?"promoted":"active", scope_master?"--master ":""); -+ -+ } else { -+ crm_trace("Not banning %s from it's current location: not active", rsc_id); -+ } - } - - } else if (rsc_cmd == 'B' && host_uname) { -@@ -2034,7 +2079,8 @@ main(int argc, char **argv) - rc = ban_resource(rsc_id, current->details->uname, NULL, cib_conn); - - } else { -- CMD_ERR("Resource '%s' not moved: currently promoted in %d locations.\n", rsc_id, count); -+ CMD_ERR("Resource '%s' not moved: active in %d locations (promoted in %d).\n", rsc_id, g_list_length(rsc->running_on), count); -+ CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --host \n", rsc_id); - CMD_ERR("You can prevent '%s' from being promoted at a specific location with:" - " --ban --master --host \n", rsc_id); - } -@@ -2042,12 +2088,6 @@ main(int argc, char **argv) - } else { - CMD_ERR("Resource '%s' not moved: active in %d locations.\n", rsc_id, g_list_length(rsc->running_on)); - CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --host \n", rsc_id); -- -- if(rsc->variant == pe_master && g_list_length(rsc->running_on) > 0) { -- CMD_ERR("You can prevent '%s' from being promoted at its current location with: --ban --master\n", rsc_id); -- CMD_ERR("You can prevent '%s' from being promoted at a specific location with:" -- " --ban --master --host \n", rsc_id); -- } - } - - } else if (rsc_cmd == 'G') { diff --git a/SOURCES/bz902407-pcmk-location_constraints_are_allowed_to_specify_a_role.patch b/SOURCES/bz902407-pcmk-location_constraints_are_allowed_to_specify_a_role.patch deleted file mode 100644 index c06bfda..0000000 --- a/SOURCES/bz902407-pcmk-location_constraints_are_allowed_to_specify_a_role.patch +++ /dev/null @@ -1,45 +0,0 @@ -commit 1bf33b4b3954cc7e8958d90c0dd02c1a108871d6 -Author: Andrew Beekhof -Date: Fri Aug 23 13:27:48 2013 +1000 - - Fix: xml: Location constraints are allowed to specify a role - -diff --git a/xml/constraints-1.1.rng b/xml/constraints-1.1.rng -index e224600..425b54c 100644 ---- a/xml/constraints-1.1.rng -+++ b/xml/constraints-1.1.rng -@@ -20,13 +20,13 @@ - - - -+ -+ -+ -+ -+ - - -- -- -- -- -- - - - -diff --git a/xml/constraints-1.2.rng b/xml/constraints-1.2.rng -index f3af61f..221140c 100644 ---- a/xml/constraints-1.2.rng -+++ b/xml/constraints-1.2.rng -@@ -20,6 +20,11 @@ - - - -+ -+ -+ -+ -+ - - - diff --git a/SOURCES/bz902407-pcmk-pe_location_constraints_with_role_started_should_prevent_masters_from_running_at_all.patch b/SOURCES/bz902407-pcmk-pe_location_constraints_with_role_started_should_prevent_masters_from_running_at_all.patch deleted file mode 100644 index 6cb28fa..0000000 --- a/SOURCES/bz902407-pcmk-pe_location_constraints_with_role_started_should_prevent_masters_from_running_at_all.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit fbb822a3f83a180380d16be59d8eb9e38abbdce3 -Author: Andrew Beekhof -Date: Tue Oct 1 15:20:25 2013 +1000 - - Fix: PE: Location constraints with role=Started should prevent masters from running at all - - (cherry picked from commit b4c34e06f5f355f5cf6ee721b4bff1ce455e114e) - -diff --git a/pengine/constraints.c b/pengine/constraints.c -index 9fc52d9..594d630 100644 ---- a/pengine/constraints.c -+++ b/pengine/constraints.c -@@ -402,13 +402,17 @@ unpack_rsc_location(xmlNode * xml_obj, pe_working_set_t * data_set) - return FALSE; - - } else { -- location->role_filter = text2role(role); -- if (location->role_filter == RSC_ROLE_SLAVE) { -- /* Fold slave back into Started for simplicity -- * At the point Slave location constraints are evaluated, -- * all resources are still either stopped or started -- */ -- location->role_filter = RSC_ROLE_STARTED; -+ enum rsc_role_e r = text2role(role); -+ switch(r) { -+ case RSC_ROLE_UNKNOWN: -+ case RSC_ROLE_STARTED: -+ case RSC_ROLE_SLAVE: -+ /* Applies to all */ -+ location->role_filter = RSC_ROLE_UNKNOWN; -+ break; -+ default: -+ location->role_filter = r; -+ break; - } - } - } diff --git a/SOURCES/bz902407-pcmk-provide_a_meaningful_error_if_master_is_used_for_primitives_and_groups.patch b/SOURCES/bz902407-pcmk-provide_a_meaningful_error_if_master_is_used_for_primitives_and_groups.patch deleted file mode 100644 index 4c79da2..0000000 --- a/SOURCES/bz902407-pcmk-provide_a_meaningful_error_if_master_is_used_for_primitives_and_groups.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit 4cc5bf3a67cae9b17c49cd73d840b5388500ad13 -Author: Andrew Beekhof -Date: Tue Sep 17 14:06:41 2013 +1000 - - Fix: crm_resource: Provide a meaningful error if --master is used for primitives and groups - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 69470d7..b63b9ae 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -1942,6 +1942,17 @@ main(int argc, char **argv) - } else if (rsc->variant < pe_clone && g_list_length(rsc->running_on) > 1) { - CMD_ERR("Resource '%s' not moved: active on multiple nodes\n", rsc_id); - goto bail; -+ -+ } else if (rsc->variant < pe_clone && scope_master) { -+ resource_t *p = uber_parent(rsc); -+ if(p->variant == pe_master) { -+ CMD_ERR("Resource '%s' not moved: The --master option is not a valid for %s resources." -+ " Did you mean '%s'?\n", rsc_id, get_resource_typename(rsc->variant), p->id); -+ } else { -+ CMD_ERR("Resource '%s' not moved: The --master option is not a valid for %s resources.\n", -+ rsc_id, get_resource_typename(rsc->variant)); -+ } -+ goto bail; - } - - if(dest == NULL) { diff --git a/SOURCES/bz996576-pcmk-crm_report_correctly_redirect_error_message_to_dev_null.patch b/SOURCES/bz996576-pcmk-crm_report_correctly_redirect_error_message_to_dev_null.patch deleted file mode 100644 index 86a9f9e..0000000 --- a/SOURCES/bz996576-pcmk-crm_report_correctly_redirect_error_message_to_dev_null.patch +++ /dev/null @@ -1,29 +0,0 @@ -commit e3410ecf4c13dba52d11981b371f4f9c81b369be -Author: Andrew Beekhof -Date: Wed Sep 25 12:44:58 2013 +1000 - - Fix: crm_report: Correctly redirect error message to /dev/null - - (cherry picked from commit 2a977cb7a338fdb1e845c5403485c606b8c9eb2f) - - Conflicts: - tools/report.collector - -diff --git a/tools/report.collector b/tools/report.collector -index 00bd319..1667364 100644 ---- a/tools/report.collector -+++ b/tools/report.collector -@@ -711,6 +711,13 @@ for l in $logfiles $EXTRA_LOGS; do - cat $b | grep -f $pattfile >> $ANALYSIS_F - done - -+which journalctl > /dev/null 2>&1 -+if [ $? = 0 ]; then -+ log "Including segment [$LOG_START-$LOG_END] from journald" -+ journalctl --since "$start" --until "$end" > journal.log -+ cat journal.log | grep -f $pattfile >> $ANALYSIS_F -+fi -+ - rm -f $pattfile - trap "" 0 - diff --git a/SOURCES/bz996576-pcmk-observe_pcmk_host_list_during_automatic_unfencing.patch b/SOURCES/bz996576-pcmk-observe_pcmk_host_list_during_automatic_unfencing.patch deleted file mode 100644 index 5f58a19..0000000 --- a/SOURCES/bz996576-pcmk-observe_pcmk_host_list_during_automatic_unfencing.patch +++ /dev/null @@ -1,66 +0,0 @@ -commit dde47a0eca301ca97dbe03fc9a1f6328e3b127a3 -Author: Andrew Beekhof -Date: Mon Sep 23 09:23:45 2013 +1000 - - Fix: Fencing: Observe pcmk_host_list during automatic unfencing - -diff --git a/fencing/commands.c b/fencing/commands.c -index 73a7fc1..7d04952 100644 ---- a/fencing/commands.c -+++ b/fencing/commands.c -@@ -665,7 +665,7 @@ schedule_internal_command(const char *origin, - schedule_stonith_command(cmd, device); - } - --static gboolean -+gboolean - string_in_list(GListPtr list, const char *item) - { - int lpc = 0; -diff --git a/fencing/internal.h b/fencing/internal.h -index 9a8b096..11a8c58 100644 ---- a/fencing/internal.h -+++ b/fencing/internal.h -@@ -164,6 +164,8 @@ int stonith_manual_ack(xmlNode * msg, remote_fencing_op_t * op); - - void unfence_cb(GPid pid, int rc, const char *output, gpointer user_data); - -+gboolean string_in_list(GListPtr list, const char *item); -+ - void - schedule_internal_command(const char *origin, - stonith_device_t * device, -diff --git a/fencing/main.c b/fencing/main.c -index 6401f2f..a90c43b 100644 ---- a/fencing/main.c -+++ b/fencing/main.c -@@ -669,12 +669,24 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) - if(have_fence_scsi == FALSE && safe_str_eq(agent, "fence_scsi")) { - stonith_device_t *device = g_hash_table_lookup(device_list, rsc->id); - -- if(device) { -- have_fence_scsi = TRUE; -- crm_notice("Unfencing ourselves with %s (%s)", agent, device->id); -- schedule_internal_command(__FUNCTION__, device, "on", stonith_our_uname, 0, NULL, unfence_cb); -+ if(stonith_our_uname == NULL) { -+ crm_trace("Cannot unfence ourselves: no local host name"); -+ -+ } else if(device == NULL) { -+ crm_err("Cannot unfence ourselves: no such device '%s'", rsc->id); -+ - } else { -- crm_err("Device %s does not exist", rsc->id); -+ const char *alias = g_hash_table_lookup(device->aliases, stonith_our_uname); -+ -+ if (!alias) { -+ alias = stonith_our_uname; -+ } -+ -+ if (device->targets && string_in_list(device->targets, alias)) { -+ have_fence_scsi = TRUE; -+ crm_notice("Unfencing ourselves with %s (%s)", agent, device->id); -+ schedule_internal_command(__FUNCTION__, device, "on", stonith_our_uname, 0, NULL, unfence_cb); -+ } - } - } - diff --git a/SOURCES/bz996850-pcmk-log_crmd_supply_arguments_in_the_correct_order.patch b/SOURCES/bz996850-pcmk-log_crmd_supply_arguments_in_the_correct_order.patch deleted file mode 100644 index 93f07e0..0000000 --- a/SOURCES/bz996850-pcmk-log_crmd_supply_arguments_in_the_correct_order.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit d5875e38412739155a6e3480cd5797d86fdda301 -Author: Andrew Beekhof -Date: Mon Sep 23 15:37:18 2013 +1000 - - Log: crmd: Supply arguments in the correct order - - (cherry picked from commit 6cbe8c46fa82ab908d8b0731ad4995cc19b34cc4) - -diff --git a/crmd/lrm.c b/crmd/lrm.c -index 2e17488..0254a9f 100644 ---- a/crmd/lrm.c -+++ b/crmd/lrm.c -@@ -353,7 +353,7 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, - lrm_state->pending_ops, stop_recurring_actions, lrm_state); - - crm_notice("Stopped %u recurring operations at %s (%u ops remaining)", -- g_hash_table_size(lrm_state->pending_ops), when, removed); -+ removed, when, g_hash_table_size(lrm_state->pending_ops)); - } - - if (lrm_state->pending_ops) { diff --git a/SOURCES/pacemaker-094c0ea-to-d9a51c6.patch b/SOURCES/pacemaker-094c0ea-to-d9a51c6.patch new file mode 100644 index 0000000..d166559 --- /dev/null +++ b/SOURCES/pacemaker-094c0ea-to-d9a51c6.patch @@ -0,0 +1,8513 @@ +diff --git a/crmd/crmd_lrm.h b/crmd/crmd_lrm.h +index 46cddc2..3a08392 100644 +--- a/crmd/crmd_lrm.h ++++ b/crmd/crmd_lrm.h +@@ -71,6 +71,12 @@ struct pending_deletion_op_s { + xmlNode *do_lrm_query_internal(lrm_state_t * lrm_state, gboolean is_replace); + + /*! ++ * \brief Is this the local ipc connection to the lrmd ++ */ ++gboolean ++lrm_state_is_local(lrm_state_t *lrm_state); ++ ++/*! + * \brief Clear all state information from a single state entry. + * \note This does not close the lrmd connection + */ +diff --git a/crmd/lrm.c b/crmd/lrm.c +index b68f657..5bff4d5 100644 +--- a/crmd/lrm.c ++++ b/crmd/lrm.c +@@ -1163,7 +1163,12 @@ get_lrm_resource(lrm_state_t * lrm_state, xmlNode * resource, xmlNode * op_msg, + fsa_data_t *msg_data = NULL; + + crm_err("Could not add resource %s to LRM %s", id, lrm_state->node_name); +- register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); ++ /* only register this as a internal error if this involves the local ++ * lrmd. Otherwise we're likely dealing with an unresponsive remote-node ++ * which is not a FSA failure. */ ++ if (lrm_state_is_local(lrm_state) == TRUE) { ++ register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); ++ } + } + } + +@@ -1211,6 +1216,28 @@ delete_resource(lrm_state_t * lrm_state, + delete_rsc_entry(lrm_state, request, id, gIter, rc, user); + } + ++static int ++get_fake_call_id(lrm_state_t *lrm_state, const char *rsc_id) ++{ ++ int call_id = 0; ++ rsc_history_t *entry = NULL; ++ ++ entry = g_hash_table_lookup(lrm_state->resource_history, rsc_id); ++ ++ /* Make sure the call id is greater than the last successful operation, ++ * otherwise the failure will not result in a possible recovery of the resource ++ * as it could appear the failure occurred before the successful start */ ++ if (entry) { ++ call_id = entry->last_callid + 1; ++ } ++ ++ if (call_id < 0) { ++ call_id = 1; ++ } ++ return call_id; ++} ++ ++ + /* A_LRM_INVOKE */ + void + do_lrm_invoke(long long action, +@@ -1272,7 +1299,6 @@ do_lrm_invoke(long long action, + operation = CRM_OP_LRM_REFRESH; + + } else if (safe_str_eq(crm_op, CRM_OP_LRM_FAIL)) { +- rsc_history_t *entry = NULL; + lrmd_event_data_t *op = NULL; + lrmd_rsc_info_t *rsc = NULL; + xmlNode *xml_rsc = find_xml_node(input->xml, XML_CIB_TAG_RESOURCE, TRUE); +@@ -1293,16 +1319,7 @@ do_lrm_invoke(long long action, + + free((char *)op->user_data); + op->user_data = NULL; +- entry = g_hash_table_lookup(lrm_state->resource_history, op->rsc_id); +- /* Make sure the call id is greater than the last successful operation, +- * otherwise the failure will not result in a possible recovery of the resource +- * as it could appear the failure occurred before the successful start */ +- if (entry) { +- op->call_id = entry->last_callid + 1; +- if (op->call_id < 0) { +- op->call_id = 1; +- } +- } ++ op->call_id = get_fake_call_id(lrm_state, op->rsc_id); + op->interval = 0; + op->op_status = PCMK_LRM_OP_DONE; + op->rc = PCMK_OCF_UNKNOWN_ERROR; +@@ -1430,6 +1447,21 @@ do_lrm_invoke(long long action, + rsc = get_lrm_resource(lrm_state, xml_rsc, input->xml, create_rsc); + + if (rsc == NULL && create_rsc) { ++ lrmd_event_data_t *op = NULL; ++ ++ /* if the operation couldn't complete because we can't register ++ * the resource, return a generic error */ ++ op = construct_op(lrm_state, input->xml, ID(xml_rsc), operation); ++ CRM_ASSERT(op != NULL); ++ ++ op->op_status = PCMK_LRM_OP_DONE; ++ op->rc = PCMK_OCF_UNKNOWN_ERROR; ++ op->t_run = time(NULL); ++ op->t_rcchange = op->t_run; ++ ++ send_direct_ack(from_host, from_sys, NULL, op, ID(xml_rsc)); ++ lrmd_free_event(op); ++ + crm_err("Invalid resource definition"); + crm_log_xml_warn(input->msg, "bad input"); + +@@ -1767,6 +1799,7 @@ do_lrm_rsc_op(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, const char *operat + lrmd_key_value_t *params = NULL; + fsa_data_t *msg_data = NULL; + const char *transition = NULL; ++ gboolean stop_recurring = FALSE; + + CRM_CHECK(rsc != NULL, return); + CRM_CHECK(operation != NULL, return); +@@ -1781,10 +1814,25 @@ do_lrm_rsc_op(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, const char *operat + op = construct_op(lrm_state, msg, rsc->id, operation); + CRM_CHECK(op != NULL, return); + +- /* stop any previous monitor operations before changing the resource state */ +- if (op->interval == 0 ++ if (is_remote_lrmd_ra(NULL, NULL, rsc->id) ++ && op->interval == 0 ++ && strcmp(operation, CRMD_ACTION_MIGRATE) == 0) { ++ ++ /* pcmk remote connections are a special use case. ++ * We never ever want to stop monitoring a connection resource until ++ * the entire migration has completed. If the connection is ever unexpected ++ * severed, even during a migration, this is an event we must detect.*/ ++ stop_recurring = FALSE; ++ ++ } else if (op->interval == 0 + && strcmp(operation, CRMD_ACTION_STATUS) != 0 + && strcmp(operation, CRMD_ACTION_NOTIFY) != 0) { ++ ++ /* stop any previous monitor operations before changing the resource state */ ++ stop_recurring = TRUE; ++ } ++ ++ if (stop_recurring == TRUE) { + guint removed = 0; + struct stop_recurring_action_s data; + +@@ -1837,10 +1885,20 @@ do_lrm_rsc_op(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, const char *operat + op->op_type, + op->user_data, op->interval, op->timeout, op->start_delay, params); + +- if (call_id <= 0) { ++ if (call_id <= 0 && lrm_state_is_local(lrm_state)) { + crm_err("Operation %s on %s failed: %d", operation, rsc->id, call_id); + register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); + ++ } else if (call_id <= 0) { ++ ++ crm_err("Operation %s on resource %s failed to execute on remote node %s: %d", operation, rsc->id, lrm_state->node_name, call_id); ++ op->call_id = get_fake_call_id(lrm_state, rsc->id); ++ op->op_status = PCMK_LRM_OP_DONE; ++ op->rc = PCMK_OCF_UNKNOWN_ERROR; ++ op->t_run = time(NULL); ++ op->t_rcchange = op->t_run; ++ process_lrm_event(lrm_state, op); ++ + } else { + /* record all operations so we can wait + * for them to complete during shutdown +diff --git a/crmd/lrm_state.c b/crmd/lrm_state.c +index 72f66c7..efd061c 100644 +--- a/crmd/lrm_state.c ++++ b/crmd/lrm_state.c +@@ -90,6 +90,21 @@ free_recurring_op(gpointer value) + free(op); + } + ++gboolean ++lrm_state_is_local(lrm_state_t *lrm_state) ++{ ++ if (lrm_state == NULL || fsa_our_uname == NULL) { ++ return FALSE; ++ } ++ ++ if (strcmp(lrm_state->node_name, fsa_our_uname) != 0) { ++ return FALSE; ++ } ++ ++ return TRUE; ++ ++} ++ + lrm_state_t * + lrm_state_create(const char *node_name) + { +diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c +index 2f658ee..ae59070 100644 +--- a/crmd/remote_lrmd_ra.c ++++ b/crmd/remote_lrmd_ra.c +@@ -231,7 +231,7 @@ retry_start_cmd_cb(gpointer data) + return FALSE; + } + cmd = ra_data->cur_cmd; +- if (safe_str_neq(cmd->action, "start")) { ++ if (safe_str_neq(cmd->action, "start") && safe_str_neq(cmd->action, "migrate_from")) { + return FALSE; + } + update_remaining_timeout(cmd); +@@ -264,7 +264,7 @@ connection_takeover_timeout_cb(gpointer data) + lrm_state_t *lrm_state = NULL; + remote_ra_cmd_t *cmd = data; + +- crm_debug("takeover event timed out for node %s", cmd->rsc_id); ++ crm_info("takeover event timed out for node %s", cmd->rsc_id); + cmd->takeover_timeout_id = 0; + + lrm_state = lrm_state_find(cmd->rsc_id); +@@ -281,7 +281,7 @@ monitor_timeout_cb(gpointer data) + lrm_state_t *lrm_state = NULL; + remote_ra_cmd_t *cmd = data; + +- crm_debug("Poke async response timed out for node %s", cmd->rsc_id); ++ crm_info("Poke async response timed out for node %s", cmd->rsc_id); + cmd->monitor_timeout_id = 0; + cmd->op_status = PCMK_LRM_OP_TIMEOUT; + cmd->rc = PCMK_OCF_UNKNOWN_ERROR; +diff --git a/include/crm/pengine/common.h b/include/crm/pengine/common.h +index 33acc6e..0d853c0 100644 +--- a/include/crm/pengine/common.h ++++ b/include/crm/pengine/common.h +@@ -34,7 +34,18 @@ enum action_fail_response { + action_fail_stop, + action_fail_standby, + action_fail_fence, +- action_fail_restart_container ++ action_fail_restart_container, ++ /* This is reserved for internal use for baremetal remote node connection ++ * resources. This fail action means ++ * 1. If stonith is enabled, fence the baremetal remote node ++ * 2. stonith not enabled, attempt to recover the connection resources ++ * ++ * This response value gives us control of saying types of ++ * connection resource failures result in fencing the remote node. ++ * Example: recurring monitors failure should result in fencing. ++ */ ++ action_fail_reset_remote, ++ + }; + + /* the "done" action must be the "pre" action +1 */ +diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h +index f08a910..da20f64 100644 +--- a/include/crm/pengine/status.h ++++ b/include/crm/pengine/status.h +@@ -138,6 +138,8 @@ struct node_shared_s { + gboolean is_dc; + gboolean rsc_discovery_enabled; + ++ gboolean remote_requires_reset; ++ + int num_resources; + GListPtr running_rsc; /* resource_t* */ + GListPtr allocated_rsc; /* resource_t* */ +diff --git a/lib/common/ipc.c b/lib/common/ipc.c +index f26225f..1b8558d 100644 +--- a/lib/common/ipc.c ++++ b/lib/common/ipc.c +@@ -1144,7 +1144,7 @@ crm_ipc_send(crm_ipc_t * client, xmlNode * message, enum crm_ipc_flags flags, in + + id++; + CRM_LOG_ASSERT(id != 0); /* Crude wrap-around detection */ +- rc = crm_ipc_prepare(id, message, &iov, ipc_buffer_max); ++ rc = crm_ipc_prepare(id, message, &iov, client->max_buf_size); + if(rc < 0) { + return rc; + } +@@ -1158,10 +1158,10 @@ crm_ipc_send(crm_ipc_t * client, xmlNode * message, enum crm_ipc_flags flags, in + } + + if(header->size_compressed) { +- if(factor < 10 && (ipc_buffer_max / 10) < (rc / factor)) { ++ if(factor < 10 && (client->max_buf_size / 10) < (rc / factor)) { + crm_notice("Compressed message exceeds %d0%% of the configured ipc limit (%d bytes), " + "consider setting PCMK_ipc_buffer to %d or higher", +- factor, ipc_buffer_max, 2*ipc_buffer_max); ++ factor, client->max_buf_size, 2*client->max_buf_size); + factor++; + } + } +diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c +index b8c5d23..74bd692 100644 +--- a/lib/lrmd/lrmd_client.c ++++ b/lib/lrmd/lrmd_client.c +@@ -604,12 +604,18 @@ lrmd_tls_recv_reply(lrmd_t * lrmd, int total_timeout, int expected_reply_id, int + remaining_timeout = total_timeout; + } + if (remaining_timeout <= 0) { ++ crm_err("Never received the expected reply during the timeout period, disconnecting."); ++ *disconnected = TRUE; + return NULL; + } + + crm_remote_recv(native->remote, remaining_timeout, disconnected); + xml = crm_remote_parse_buffer(native->remote); +- if (!xml || *disconnected) { ++ if (!xml) { ++ crm_err("Unable to receive expected reply, disconnecting."); ++ *disconnected = TRUE; ++ return NULL; ++ } else if (*disconnected) { + return NULL; + } + } +diff --git a/lib/pengine/common.c b/lib/pengine/common.c +index e5e4ea7..42eda33 100644 +--- a/lib/pengine/common.c ++++ b/lib/pengine/common.c +@@ -214,6 +214,9 @@ fail2text(enum action_fail_response fail) + case action_fail_restart_container: + result = "restart-container"; + break; ++ case action_fail_reset_remote: ++ result = "reset-remote"; ++ break; + } + return result; + } +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index a19bdff..bdd6450 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -80,6 +80,15 @@ pe_fence_node(pe_working_set_t * data_set, node_t * node, const char *reason) + node->details->uname, reason); + set_bit(node->details->remote_rsc->flags, pe_rsc_failed); + ++ } else if (is_baremetal_remote_node(node)) { ++ if(pe_can_fence(data_set, node)) { ++ crm_warn("Node %s will be fenced %s", node->details->uname, reason); ++ } else { ++ crm_warn("Node %s is unclean %s", node->details->uname, reason); ++ } ++ node->details->unclean = TRUE; ++ node->details->remote_requires_reset = TRUE; ++ + } else if (node->details->unclean == FALSE) { + if(pe_can_fence(data_set, node)) { + crm_warn("Node %s will be fenced %s", node->details->uname, reason); +@@ -1143,8 +1152,10 @@ unpack_remote_status(xmlNode * status, pe_working_set_t * data_set) + } + crm_trace("Processing remote node id=%s, uname=%s", id, uname); + +- this_node->details->unclean = FALSE; +- this_node->details->unseen = FALSE; ++ if (this_node->details->remote_requires_reset == FALSE) { ++ this_node->details->unclean = FALSE; ++ this_node->details->unseen = FALSE; ++ } + attrs = find_xml_node(state, XML_TAG_TRANSIENT_NODEATTRS, FALSE); + add_node_attrs(attrs, this_node, TRUE, data_set); + +@@ -1777,6 +1788,7 @@ process_rsc_state(resource_t * rsc, node_t * node, + enum action_fail_response on_fail, + xmlNode * migrate_op, pe_working_set_t * data_set) + { ++ node_t *tmpnode = NULL; + CRM_ASSERT(rsc); + pe_rsc_trace(rsc, "Resource %s is %s on %s: on_fail=%s", + rsc->id, role2text(rsc->role), node->details->uname, fail2text(on_fail)); +@@ -1817,7 +1829,7 @@ process_rsc_state(resource_t * rsc, node_t * node, + should_fence = TRUE; + } else if (is_set(data_set->flags, pe_flag_stonith_enabled)) { + if (is_baremetal_remote_node(node) && is_not_set(node->details->remote_rsc->flags, pe_rsc_failed)) { +- /* setting unceen = true means that fencing of the remote node will ++ /* setting unseen = true means that fencing of the remote node will + * only occur if the connection resource is not going to start somewhere. + * This allows connection resources on a failed cluster-node to move to + * another node without requiring the baremetal remote nodes to be fenced +@@ -1892,7 +1904,20 @@ process_rsc_state(resource_t * rsc, node_t * node, + + if (rsc->container) { + stop_action(rsc->container, node, FALSE); +- ++ } else if (rsc->role != RSC_ROLE_STOPPED && rsc->role != RSC_ROLE_UNKNOWN) { ++ stop_action(rsc, node, FALSE); ++ } ++ break; ++ case action_fail_reset_remote: ++ set_bit(rsc->flags, pe_rsc_failed); ++ tmpnode = NULL; ++ if (rsc->is_remote_node) { ++ tmpnode = pe_find_node(data_set->nodes, rsc->id); ++ } ++ if (tmpnode && is_baremetal_remote_node(tmpnode)) { ++ /* connection resource to baremetal resource failed in a way that ++ * should result in fencing the remote-node. */ ++ pe_fence_node(data_set, tmpnode, "because of connection failure(s)"); + } else if (rsc->role != RSC_ROLE_STOPPED && rsc->role != RSC_ROLE_UNKNOWN) { + stop_action(rsc, node, FALSE); + } +@@ -1904,7 +1929,7 @@ process_rsc_state(resource_t * rsc, node_t * node, + * result in a fencing operation regardless if we're going to attempt to + * 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); ++ tmpnode = pe_find_node(data_set->nodes, rsc->id); + if (tmpnode && tmpnode->details->unclean) { + tmpnode->details->unseen = FALSE; + } +@@ -2510,10 +2535,9 @@ unpack_rsc_op_failure(resource_t *rsc, node_t *node, int rc, xmlNode *xml_op, en + + action = custom_action(rsc, strdup(key), task, NULL, TRUE, FALSE, data_set); + if ((action->on_fail <= action_fail_fence && *on_fail < action->on_fail) || +- (action->on_fail == action_fail_restart_container +- && *on_fail <= action_fail_recover) || (*on_fail == action_fail_restart_container +- && action->on_fail >= +- action_fail_migrate)) { ++ (action->on_fail == action_fail_reset_remote && *on_fail <= action_fail_recover) || ++ (action->on_fail == action_fail_restart_container && *on_fail <= action_fail_recover) || ++ (*on_fail == action_fail_restart_container && action->on_fail >= action_fail_migrate)) { + pe_rsc_trace(rsc, "on-fail %s -> %s for %s (%s)", fail2text(*on_fail), + fail2text(action->on_fail), action->uuid, key); + *on_fail = action->on_fail; +@@ -2881,13 +2905,11 @@ update_resource_state(resource_t *rsc, node_t * node, xmlNode * xml_op, const ch + case action_fail_block: + case action_fail_ignore: + case action_fail_recover: +- *on_fail = action_fail_ignore; +- rsc->next_role = RSC_ROLE_UNKNOWN; +- break; +- + case action_fail_restart_container: ++ case action_fail_reset_remote: + *on_fail = action_fail_ignore; + rsc->next_role = RSC_ROLE_UNKNOWN; ++ break; + } + } + } +diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c +index baf6cb9..a40de60 100644 +--- a/lib/pengine/utils.c ++++ b/lib/pengine/utils.c +@@ -35,6 +35,7 @@ void unpack_operation(action_t * action, xmlNode * xml_obj, resource_t * contain + pe_working_set_t * data_set); + static xmlNode *find_rsc_op_entry_helper(resource_t * rsc, const char *key, + gboolean include_disabled); ++static gboolean is_rsc_baremetal_remote_node(resource_t *rsc, pe_working_set_t * data_set); + + bool pe_can_fence(pe_working_set_t * data_set, node_t *node) + { +@@ -686,6 +687,19 @@ unpack_operation(action_t * action, xmlNode * xml_obj, resource_t * container, + NULL, action->meta, NULL, FALSE, data_set->now); + g_hash_table_remove(action->meta, "id"); + ++ field = XML_LRM_ATTR_INTERVAL; ++ value = g_hash_table_lookup(action->meta, field); ++ if (value != NULL) { ++ interval = crm_get_interval(value); ++ if (interval > 0) { ++ value_ms = crm_itoa(interval); ++ g_hash_table_replace(action->meta, strdup(field), value_ms); ++ ++ } else { ++ g_hash_table_remove(action->meta, field); ++ } ++ } ++ + /* Begin compatability code */ + value = g_hash_table_lookup(action->meta, "requires"); + +@@ -789,6 +803,22 @@ unpack_operation(action_t * action, xmlNode * xml_obj, resource_t * container, + action->on_fail = action_fail_restart_container; + value = "restart container (and possibly migrate) (default)"; + ++ /* for baremetal remote nodes, ensure that a recurring monitor operation failure ++ * defaults to either fencing the remote-node for recovery, or at least ++ * attempting to recover the the connection when fencing is disabled. */ ++ } else if (value == NULL && ++ is_rsc_baremetal_remote_node(action->rsc, data_set) && ++ safe_str_eq(action->task, CRMD_ACTION_STATUS) && ++ interval > 0) { ++ ++ if (is_set(data_set->flags, pe_flag_stonith_enabled)) { ++ action->on_fail = action_fail_reset_remote; ++ value = "fence baremetal remote node (default)"; ++ } else { ++ action->on_fail = action_fail_recover; ++ value = "recover baremetal remote node connection (default)"; ++ } ++ + } else if (value == NULL && safe_str_eq(action->task, CRMD_ACTION_STOP)) { + if (is_set(data_set->flags, pe_flag_stonith_enabled)) { + action->on_fail = action_fail_fence; +@@ -824,19 +854,6 @@ unpack_operation(action_t * action, xmlNode * xml_obj, resource_t * container, + pe_rsc_trace(action->rsc, "\t%s failure results in: %s", action->task, + role2text(action->fail_role)); + +- field = XML_LRM_ATTR_INTERVAL; +- value = g_hash_table_lookup(action->meta, field); +- if (value != NULL) { +- interval = crm_get_interval(value); +- if (interval > 0) { +- value_ms = crm_itoa(interval); +- g_hash_table_replace(action->meta, strdup(field), value_ms); +- +- } else { +- g_hash_table_remove(action->meta, field); +- } +- } +- + field = XML_OP_ATTR_START_DELAY; + value = g_hash_table_lookup(action->meta, field); + if (value != NULL) { +@@ -1939,6 +1956,25 @@ const char *rsc_printable_id(resource_t *rsc) + } + + gboolean ++is_rsc_baremetal_remote_node(resource_t *rsc, pe_working_set_t * data_set) ++{ ++ node_t *node; ++ ++ if (rsc == NULL) { ++ return FALSE; ++ } else if (rsc->is_remote_node == FALSE) { ++ return FALSE; ++ } ++ ++ node = pe_find_node(data_set->nodes, rsc->id); ++ if (node == NULL) { ++ return FALSE; ++ } ++ ++ return is_baremetal_remote_node(node); ++} ++ ++gboolean + is_baremetal_remote_node(node_t *node) + { + if (is_remote_node(node) && (node->details->remote_rsc == FALSE || node->details->remote_rsc->container == FALSE)) { +diff --git a/pengine/allocate.c b/pengine/allocate.c +index 45e2212..9c3cb60 100644 +--- a/pengine/allocate.c ++++ b/pengine/allocate.c +@@ -1191,7 +1191,10 @@ allocate_resources(pe_working_set_t * data_set) + continue; + } + pe_rsc_trace(rsc, "Allocating: %s", rsc->id); +- rsc->cmds->allocate(rsc, NULL, data_set); ++ /* for remote node connection resources, always prefer the partial migration ++ * target during resource allocation if the rsc is in the middle of a ++ * migration */ ++ rsc->cmds->allocate(rsc, rsc->partial_migration_target, data_set); + } + } + +@@ -1716,9 +1719,18 @@ apply_remote_node_ordering(pe_working_set_t *data_set) + node_t *cluster_node = remote_rsc->running_on ? remote_rsc->running_on->data : NULL; + + /* if the current cluster node a baremetal connection resource +- * is residing on is unclean, we can't process any operations on that +- * remote node until after it starts somewhere else. */ +- if (cluster_node && cluster_node->details->unclean == TRUE) { ++ * is residing on is unclean or went offline we can't process any ++ * operations on that remote node until after it starts somewhere else. */ ++ if (cluster_node == NULL || ++ cluster_node->details->unclean == TRUE || ++ cluster_node->details->online == FALSE) { ++ after_start = TRUE; ++ } else if (g_list_length(remote_rsc->running_on) > 1 && ++ remote_rsc->partial_migration_source && ++ remote_rsc->partial_migration_target) { ++ /* if we're caught in the middle of migrating a connection resource, ++ * then we have to wait until after the resource migrates before performing ++ * any actions. */ + after_start = TRUE; + } + } +diff --git a/pengine/native.c b/pengine/native.c +index 6d62010..62639d0 100644 +--- a/pengine/native.c ++++ b/pengine/native.c +@@ -1137,12 +1137,18 @@ handle_migration_actions(resource_t * rsc, node_t *current, node_t *chosen, pe_w + if (migrate_to) { + add_hash_param(migrate_to->meta, XML_LRM_ATTR_MIGRATE_SOURCE, current->details->uname); + add_hash_param(migrate_to->meta, XML_LRM_ATTR_MIGRATE_TARGET, chosen->details->uname); +- /* migrate_to takes place on the source node, but can +- * have an effect on the target node depending on how +- * the agent is written. Because of this, we have to maintain +- * a record that the migrate_to occurred incase the source node +- * loses membership while the migrate_to action is still in-flight. */ +- add_hash_param(migrate_to->meta, XML_OP_ATTR_PENDING, "true"); ++ ++ /* pcmk remote connections don't require pending to be recorded in cib. ++ * We can optimize cib writes by only setting PENDING for non pcmk remote ++ * connection resources */ ++ if (rsc->is_remote_node == FALSE) { ++ /* migrate_to takes place on the source node, but can ++ * have an effect on the target node depending on how ++ * the agent is written. Because of this, we have to maintain ++ * a record that the migrate_to occurred incase the source node ++ * loses membership while the migrate_to action is still in-flight. */ ++ add_hash_param(migrate_to->meta, XML_OP_ATTR_PENDING, "true"); ++ } + } + + if (migrate_from) { +diff --git a/pengine/regression.sh b/pengine/regression.sh +index aa03b18..3a244d7 100755 +--- a/pengine/regression.sh ++++ b/pengine/regression.sh +@@ -769,6 +769,11 @@ 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" ++do_test remote-partial-migrate "Make sure partial migrations are handled before ops on the remote node." ++do_test remote-partial-migrate2 "Make sure partial migration target is prefered for remote connection." ++do_test remote-recover-fail "Make sure start failure causes fencing if rsc are active on remote." ++do_test remote-start-fail "Make sure a start failure does not result in fencing if no active resources are on remote." ++do_test remote-unclean2 "Make monitor failure always results in fencing, even if no rsc are active on remote." + + echo "" + do_test resource-discovery "Exercises resource-discovery location constraint option." +diff --git a/pengine/test10/remote-fence-unclean.exp b/pengine/test10/remote-fence-unclean.exp +index 9b1e327..b8c90f2 100644 +--- a/pengine/test10/remote-fence-unclean.exp ++++ b/pengine/test10/remote-fence-unclean.exp +@@ -8,7 +8,7 @@ + + + +- ++ + + + +@@ -17,7 +17,7 @@ + + + +- ++ + + + +@@ -176,13 +176,13 @@ + + + +- ++ + + + + + +- ++ + + + +diff --git a/pengine/test10/remote-move.exp b/pengine/test10/remote-move.exp +index 6724679..6287daa 100644 +--- a/pengine/test10/remote-move.exp ++++ b/pengine/test10/remote-move.exp +@@ -51,7 +51,7 @@ + + + +- ++ + + + +diff --git a/pengine/test10/remote-partial-migrate.dot b/pengine/test10/remote-partial-migrate.dot +new file mode 100644 +index 0000000..8d776dc +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate.dot +@@ -0,0 +1,86 @@ ++ digraph "g" { ++"FAKE10_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE10_start_0 pcmk1" -> "FAKE10_monitor_10000 pcmk1" [ style = bold] ++"FAKE10_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE13_monitor_10000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE13_start_0 pcmk2" -> "FAKE13_monitor_10000 pcmk2" [ style = bold] ++"FAKE13_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE15_monitor_10000 pcmk3" [ style=bold color="green" fontcolor="black"] ++"FAKE15_start_0 pcmk3" -> "FAKE15_monitor_10000 pcmk3" [ style = bold] ++"FAKE15_start_0 pcmk3" [ style=bold color="green" fontcolor="black"] ++"FAKE16_monitor_10000 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE16_start_0 pcmk_remote3" -> "FAKE16_monitor_10000 pcmk_remote3" [ style = bold] ++"FAKE16_start_0 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE16_stop_0 pcmk1" -> "FAKE16_start_0 pcmk_remote3" [ style = bold] ++"FAKE16_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE16_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE22_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE22_start_0 pcmk1" -> "FAKE22_monitor_10000 pcmk1" [ style = bold] ++"FAKE22_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE23_monitor_10000 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE23_start_0 pcmk_remote1" -> "FAKE23_monitor_10000 pcmk_remote1" [ style = bold] ++"FAKE23_start_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE23_stop_0 pcmk1" -> "FAKE23_start_0 pcmk_remote1" [ style = bold] ++"FAKE23_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE23_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE26_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE26_start_0 pcmk1" -> "FAKE26_monitor_10000 pcmk1" [ style = bold] ++"FAKE26_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE29_monitor_10000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE29_start_0 pcmk2" -> "FAKE29_monitor_10000 pcmk2" [ style = bold] ++"FAKE29_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE30_monitor_10000 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE30_start_0 pcmk_remote2" -> "FAKE30_monitor_10000 pcmk_remote2" [ style = bold] ++"FAKE30_start_0 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE30_stop_0 pcmk1" -> "FAKE30_start_0 pcmk_remote2" [ style = bold] ++"FAKE30_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE30_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE36_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE36_start_0 pcmk1" -> "FAKE36_monitor_10000 pcmk1" [ style = bold] ++"FAKE36_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE37_monitor_10000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE37_start_0 pcmk2" -> "FAKE37_monitor_10000 pcmk2" [ style = bold] ++"FAKE37_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE37_stop_0 pcmk1" -> "FAKE37_start_0 pcmk2" [ style = bold] ++"FAKE37_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE37_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE43_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE43_start_0 pcmk1" -> "FAKE43_monitor_10000 pcmk1" [ style = bold] ++"FAKE43_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE44_monitor_10000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE44_start_0 pcmk2" -> "FAKE44_monitor_10000 pcmk2" [ style = bold] ++"FAKE44_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE44_stop_0 pcmk1" -> "FAKE44_start_0 pcmk2" [ style = bold] ++"FAKE44_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE44_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE4_monitor_10000 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE4_start_0 pcmk_remote3" -> "FAKE4_monitor_10000 pcmk_remote3" [ style = bold] ++"FAKE4_start_0 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE50_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE50_start_0 pcmk1" -> "FAKE50_monitor_10000 pcmk1" [ style = bold] ++"FAKE50_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE9_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE9_start_0 pcmk1" -> "FAKE9_monitor_10000 pcmk1" [ style = bold] ++"FAKE9_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE9_stop_0 pcmk_remote3" -> "FAKE9_start_0 pcmk1" [ style = bold] ++"FAKE9_stop_0 pcmk_remote3" -> "all_stopped" [ style = bold] ++"FAKE9_stop_0 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"pcmk_remote3_migrate_from_0 pcmk2" -> "pcmk_remote3_start_0 pcmk2" [ style = bold] ++"pcmk_remote3_migrate_from_0 pcmk2" -> "pcmk_remote3_stop_0 pcmk1" [ style = bold] ++"pcmk_remote3_migrate_from_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote3_monitor_60000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote3_start_0 pcmk2" -> "FAKE16_monitor_10000 pcmk_remote3" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" -> "FAKE16_start_0 pcmk_remote3" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" -> "FAKE4_monitor_10000 pcmk_remote3" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" -> "FAKE4_start_0 pcmk_remote3" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" -> "FAKE9_stop_0 pcmk_remote3" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" -> "pcmk_remote3_monitor_60000 pcmk2" [ style = bold] ++"pcmk_remote3_start_0 pcmk2" [ style=bold color="green" fontcolor="orange"] ++"pcmk_remote3_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"pcmk_remote3_stop_0 pcmk1" -> "pcmk_remote3_start_0 pcmk2" [ style = bold] ++"pcmk_remote3_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"probe_complete pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"probe_complete pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"probe_complete pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/remote-partial-migrate.exp b/pengine/test10/remote-partial-migrate.exp +new file mode 100644 +index 0000000..0a531df +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate.exp +@@ -0,0 +1,553 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-partial-migrate.scores b/pengine/test10/remote-partial-migrate.scores +new file mode 100644 +index 0000000..a81602d +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate.scores +@@ -0,0 +1,449 @@ ++Allocation scores: ++native_color: FAKE1 allocation score on pcmk1: 0 ++native_color: FAKE1 allocation score on pcmk2: 0 ++native_color: FAKE1 allocation score on pcmk3: 0 ++native_color: FAKE1 allocation score on pcmk_remote1: 0 ++native_color: FAKE1 allocation score on pcmk_remote2: 0 ++native_color: FAKE1 allocation score on pcmk_remote3: 0 ++native_color: FAKE1 allocation score on pcmk_remote4: 0 ++native_color: FAKE1 allocation score on pcmk_remote5: 0 ++native_color: FAKE10 allocation score on pcmk1: 0 ++native_color: FAKE10 allocation score on pcmk2: 0 ++native_color: FAKE10 allocation score on pcmk3: 0 ++native_color: FAKE10 allocation score on pcmk_remote1: 0 ++native_color: FAKE10 allocation score on pcmk_remote2: 0 ++native_color: FAKE10 allocation score on pcmk_remote3: 0 ++native_color: FAKE10 allocation score on pcmk_remote4: 0 ++native_color: FAKE10 allocation score on pcmk_remote5: 0 ++native_color: FAKE11 allocation score on pcmk1: 0 ++native_color: FAKE11 allocation score on pcmk2: 0 ++native_color: FAKE11 allocation score on pcmk3: 0 ++native_color: FAKE11 allocation score on pcmk_remote1: 0 ++native_color: FAKE11 allocation score on pcmk_remote2: 0 ++native_color: FAKE11 allocation score on pcmk_remote3: 0 ++native_color: FAKE11 allocation score on pcmk_remote4: 0 ++native_color: FAKE11 allocation score on pcmk_remote5: 0 ++native_color: FAKE12 allocation score on pcmk1: 0 ++native_color: FAKE12 allocation score on pcmk2: 0 ++native_color: FAKE12 allocation score on pcmk3: 0 ++native_color: FAKE12 allocation score on pcmk_remote1: 0 ++native_color: FAKE12 allocation score on pcmk_remote2: 0 ++native_color: FAKE12 allocation score on pcmk_remote3: 0 ++native_color: FAKE12 allocation score on pcmk_remote4: 0 ++native_color: FAKE12 allocation score on pcmk_remote5: 0 ++native_color: FAKE13 allocation score on pcmk1: 0 ++native_color: FAKE13 allocation score on pcmk2: 0 ++native_color: FAKE13 allocation score on pcmk3: 0 ++native_color: FAKE13 allocation score on pcmk_remote1: 0 ++native_color: FAKE13 allocation score on pcmk_remote2: 0 ++native_color: FAKE13 allocation score on pcmk_remote3: 0 ++native_color: FAKE13 allocation score on pcmk_remote4: 0 ++native_color: FAKE13 allocation score on pcmk_remote5: 0 ++native_color: FAKE14 allocation score on pcmk1: 0 ++native_color: FAKE14 allocation score on pcmk2: 0 ++native_color: FAKE14 allocation score on pcmk3: 0 ++native_color: FAKE14 allocation score on pcmk_remote1: 0 ++native_color: FAKE14 allocation score on pcmk_remote2: 0 ++native_color: FAKE14 allocation score on pcmk_remote3: 0 ++native_color: FAKE14 allocation score on pcmk_remote4: 0 ++native_color: FAKE14 allocation score on pcmk_remote5: 0 ++native_color: FAKE15 allocation score on pcmk1: 0 ++native_color: FAKE15 allocation score on pcmk2: 0 ++native_color: FAKE15 allocation score on pcmk3: 0 ++native_color: FAKE15 allocation score on pcmk_remote1: 0 ++native_color: FAKE15 allocation score on pcmk_remote2: 0 ++native_color: FAKE15 allocation score on pcmk_remote3: 0 ++native_color: FAKE15 allocation score on pcmk_remote4: 0 ++native_color: FAKE15 allocation score on pcmk_remote5: 0 ++native_color: FAKE16 allocation score on pcmk1: 0 ++native_color: FAKE16 allocation score on pcmk2: 0 ++native_color: FAKE16 allocation score on pcmk3: 0 ++native_color: FAKE16 allocation score on pcmk_remote1: 0 ++native_color: FAKE16 allocation score on pcmk_remote2: 0 ++native_color: FAKE16 allocation score on pcmk_remote3: 0 ++native_color: FAKE16 allocation score on pcmk_remote4: 0 ++native_color: FAKE16 allocation score on pcmk_remote5: 0 ++native_color: FAKE17 allocation score on pcmk1: 0 ++native_color: FAKE17 allocation score on pcmk2: 0 ++native_color: FAKE17 allocation score on pcmk3: 0 ++native_color: FAKE17 allocation score on pcmk_remote1: 0 ++native_color: FAKE17 allocation score on pcmk_remote2: 0 ++native_color: FAKE17 allocation score on pcmk_remote3: 0 ++native_color: FAKE17 allocation score on pcmk_remote4: 0 ++native_color: FAKE17 allocation score on pcmk_remote5: 0 ++native_color: FAKE18 allocation score on pcmk1: 0 ++native_color: FAKE18 allocation score on pcmk2: 0 ++native_color: FAKE18 allocation score on pcmk3: 0 ++native_color: FAKE18 allocation score on pcmk_remote1: 0 ++native_color: FAKE18 allocation score on pcmk_remote2: 0 ++native_color: FAKE18 allocation score on pcmk_remote3: 0 ++native_color: FAKE18 allocation score on pcmk_remote4: 0 ++native_color: FAKE18 allocation score on pcmk_remote5: 0 ++native_color: FAKE19 allocation score on pcmk1: 0 ++native_color: FAKE19 allocation score on pcmk2: 0 ++native_color: FAKE19 allocation score on pcmk3: 0 ++native_color: FAKE19 allocation score on pcmk_remote1: 0 ++native_color: FAKE19 allocation score on pcmk_remote2: 0 ++native_color: FAKE19 allocation score on pcmk_remote3: 0 ++native_color: FAKE19 allocation score on pcmk_remote4: 0 ++native_color: FAKE19 allocation score on pcmk_remote5: 0 ++native_color: FAKE2 allocation score on pcmk1: 0 ++native_color: FAKE2 allocation score on pcmk2: 0 ++native_color: FAKE2 allocation score on pcmk3: 0 ++native_color: FAKE2 allocation score on pcmk_remote1: 0 ++native_color: FAKE2 allocation score on pcmk_remote2: 0 ++native_color: FAKE2 allocation score on pcmk_remote3: 0 ++native_color: FAKE2 allocation score on pcmk_remote4: 0 ++native_color: FAKE2 allocation score on pcmk_remote5: 0 ++native_color: FAKE20 allocation score on pcmk1: 0 ++native_color: FAKE20 allocation score on pcmk2: 0 ++native_color: FAKE20 allocation score on pcmk3: 0 ++native_color: FAKE20 allocation score on pcmk_remote1: 0 ++native_color: FAKE20 allocation score on pcmk_remote2: 0 ++native_color: FAKE20 allocation score on pcmk_remote3: 0 ++native_color: FAKE20 allocation score on pcmk_remote4: 0 ++native_color: FAKE20 allocation score on pcmk_remote5: 0 ++native_color: FAKE21 allocation score on pcmk1: 0 ++native_color: FAKE21 allocation score on pcmk2: 0 ++native_color: FAKE21 allocation score on pcmk3: 0 ++native_color: FAKE21 allocation score on pcmk_remote1: 0 ++native_color: FAKE21 allocation score on pcmk_remote2: 0 ++native_color: FAKE21 allocation score on pcmk_remote3: 0 ++native_color: FAKE21 allocation score on pcmk_remote4: 0 ++native_color: FAKE21 allocation score on pcmk_remote5: 0 ++native_color: FAKE22 allocation score on pcmk1: 0 ++native_color: FAKE22 allocation score on pcmk2: 0 ++native_color: FAKE22 allocation score on pcmk3: 0 ++native_color: FAKE22 allocation score on pcmk_remote1: 0 ++native_color: FAKE22 allocation score on pcmk_remote2: 0 ++native_color: FAKE22 allocation score on pcmk_remote3: 0 ++native_color: FAKE22 allocation score on pcmk_remote4: 0 ++native_color: FAKE22 allocation score on pcmk_remote5: 0 ++native_color: FAKE23 allocation score on pcmk1: 0 ++native_color: FAKE23 allocation score on pcmk2: 0 ++native_color: FAKE23 allocation score on pcmk3: 0 ++native_color: FAKE23 allocation score on pcmk_remote1: 0 ++native_color: FAKE23 allocation score on pcmk_remote2: 0 ++native_color: FAKE23 allocation score on pcmk_remote3: 0 ++native_color: FAKE23 allocation score on pcmk_remote4: 0 ++native_color: FAKE23 allocation score on pcmk_remote5: 0 ++native_color: FAKE24 allocation score on pcmk1: 0 ++native_color: FAKE24 allocation score on pcmk2: 0 ++native_color: FAKE24 allocation score on pcmk3: 0 ++native_color: FAKE24 allocation score on pcmk_remote1: 0 ++native_color: FAKE24 allocation score on pcmk_remote2: 0 ++native_color: FAKE24 allocation score on pcmk_remote3: 0 ++native_color: FAKE24 allocation score on pcmk_remote4: 0 ++native_color: FAKE24 allocation score on pcmk_remote5: 0 ++native_color: FAKE25 allocation score on pcmk1: 0 ++native_color: FAKE25 allocation score on pcmk2: 0 ++native_color: FAKE25 allocation score on pcmk3: 0 ++native_color: FAKE25 allocation score on pcmk_remote1: 0 ++native_color: FAKE25 allocation score on pcmk_remote2: 0 ++native_color: FAKE25 allocation score on pcmk_remote3: 0 ++native_color: FAKE25 allocation score on pcmk_remote4: 0 ++native_color: FAKE25 allocation score on pcmk_remote5: 0 ++native_color: FAKE26 allocation score on pcmk1: 0 ++native_color: FAKE26 allocation score on pcmk2: 0 ++native_color: FAKE26 allocation score on pcmk3: 0 ++native_color: FAKE26 allocation score on pcmk_remote1: 0 ++native_color: FAKE26 allocation score on pcmk_remote2: 0 ++native_color: FAKE26 allocation score on pcmk_remote3: 0 ++native_color: FAKE26 allocation score on pcmk_remote4: 0 ++native_color: FAKE26 allocation score on pcmk_remote5: 0 ++native_color: FAKE27 allocation score on pcmk1: 0 ++native_color: FAKE27 allocation score on pcmk2: 0 ++native_color: FAKE27 allocation score on pcmk3: 0 ++native_color: FAKE27 allocation score on pcmk_remote1: 0 ++native_color: FAKE27 allocation score on pcmk_remote2: 0 ++native_color: FAKE27 allocation score on pcmk_remote3: 0 ++native_color: FAKE27 allocation score on pcmk_remote4: 0 ++native_color: FAKE27 allocation score on pcmk_remote5: 0 ++native_color: FAKE28 allocation score on pcmk1: 0 ++native_color: FAKE28 allocation score on pcmk2: 0 ++native_color: FAKE28 allocation score on pcmk3: 0 ++native_color: FAKE28 allocation score on pcmk_remote1: 0 ++native_color: FAKE28 allocation score on pcmk_remote2: 0 ++native_color: FAKE28 allocation score on pcmk_remote3: 0 ++native_color: FAKE28 allocation score on pcmk_remote4: 0 ++native_color: FAKE28 allocation score on pcmk_remote5: 0 ++native_color: FAKE29 allocation score on pcmk1: 0 ++native_color: FAKE29 allocation score on pcmk2: 0 ++native_color: FAKE29 allocation score on pcmk3: 0 ++native_color: FAKE29 allocation score on pcmk_remote1: 0 ++native_color: FAKE29 allocation score on pcmk_remote2: 0 ++native_color: FAKE29 allocation score on pcmk_remote3: 0 ++native_color: FAKE29 allocation score on pcmk_remote4: 0 ++native_color: FAKE29 allocation score on pcmk_remote5: 0 ++native_color: FAKE3 allocation score on pcmk1: 0 ++native_color: FAKE3 allocation score on pcmk2: 0 ++native_color: FAKE3 allocation score on pcmk3: 0 ++native_color: FAKE3 allocation score on pcmk_remote1: 0 ++native_color: FAKE3 allocation score on pcmk_remote2: 0 ++native_color: FAKE3 allocation score on pcmk_remote3: 0 ++native_color: FAKE3 allocation score on pcmk_remote4: 0 ++native_color: FAKE3 allocation score on pcmk_remote5: 0 ++native_color: FAKE30 allocation score on pcmk1: 0 ++native_color: FAKE30 allocation score on pcmk2: 0 ++native_color: FAKE30 allocation score on pcmk3: 0 ++native_color: FAKE30 allocation score on pcmk_remote1: 0 ++native_color: FAKE30 allocation score on pcmk_remote2: 0 ++native_color: FAKE30 allocation score on pcmk_remote3: 0 ++native_color: FAKE30 allocation score on pcmk_remote4: 0 ++native_color: FAKE30 allocation score on pcmk_remote5: 0 ++native_color: FAKE31 allocation score on pcmk1: 0 ++native_color: FAKE31 allocation score on pcmk2: 0 ++native_color: FAKE31 allocation score on pcmk3: 0 ++native_color: FAKE31 allocation score on pcmk_remote1: 0 ++native_color: FAKE31 allocation score on pcmk_remote2: 0 ++native_color: FAKE31 allocation score on pcmk_remote3: 0 ++native_color: FAKE31 allocation score on pcmk_remote4: 0 ++native_color: FAKE31 allocation score on pcmk_remote5: 0 ++native_color: FAKE32 allocation score on pcmk1: 0 ++native_color: FAKE32 allocation score on pcmk2: 0 ++native_color: FAKE32 allocation score on pcmk3: 0 ++native_color: FAKE32 allocation score on pcmk_remote1: 0 ++native_color: FAKE32 allocation score on pcmk_remote2: 0 ++native_color: FAKE32 allocation score on pcmk_remote3: 0 ++native_color: FAKE32 allocation score on pcmk_remote4: 0 ++native_color: FAKE32 allocation score on pcmk_remote5: 0 ++native_color: FAKE33 allocation score on pcmk1: 0 ++native_color: FAKE33 allocation score on pcmk2: 0 ++native_color: FAKE33 allocation score on pcmk3: 0 ++native_color: FAKE33 allocation score on pcmk_remote1: 0 ++native_color: FAKE33 allocation score on pcmk_remote2: 0 ++native_color: FAKE33 allocation score on pcmk_remote3: 0 ++native_color: FAKE33 allocation score on pcmk_remote4: 0 ++native_color: FAKE33 allocation score on pcmk_remote5: 0 ++native_color: FAKE34 allocation score on pcmk1: 0 ++native_color: FAKE34 allocation score on pcmk2: 0 ++native_color: FAKE34 allocation score on pcmk3: 0 ++native_color: FAKE34 allocation score on pcmk_remote1: 0 ++native_color: FAKE34 allocation score on pcmk_remote2: 0 ++native_color: FAKE34 allocation score on pcmk_remote3: 0 ++native_color: FAKE34 allocation score on pcmk_remote4: 0 ++native_color: FAKE34 allocation score on pcmk_remote5: 0 ++native_color: FAKE35 allocation score on pcmk1: 0 ++native_color: FAKE35 allocation score on pcmk2: 0 ++native_color: FAKE35 allocation score on pcmk3: 0 ++native_color: FAKE35 allocation score on pcmk_remote1: 0 ++native_color: FAKE35 allocation score on pcmk_remote2: 0 ++native_color: FAKE35 allocation score on pcmk_remote3: 0 ++native_color: FAKE35 allocation score on pcmk_remote4: 0 ++native_color: FAKE35 allocation score on pcmk_remote5: 0 ++native_color: FAKE36 allocation score on pcmk1: 0 ++native_color: FAKE36 allocation score on pcmk2: 0 ++native_color: FAKE36 allocation score on pcmk3: 0 ++native_color: FAKE36 allocation score on pcmk_remote1: 0 ++native_color: FAKE36 allocation score on pcmk_remote2: 0 ++native_color: FAKE36 allocation score on pcmk_remote3: 0 ++native_color: FAKE36 allocation score on pcmk_remote4: 0 ++native_color: FAKE36 allocation score on pcmk_remote5: 0 ++native_color: FAKE37 allocation score on pcmk1: 0 ++native_color: FAKE37 allocation score on pcmk2: 0 ++native_color: FAKE37 allocation score on pcmk3: 0 ++native_color: FAKE37 allocation score on pcmk_remote1: 0 ++native_color: FAKE37 allocation score on pcmk_remote2: 0 ++native_color: FAKE37 allocation score on pcmk_remote3: 0 ++native_color: FAKE37 allocation score on pcmk_remote4: 0 ++native_color: FAKE37 allocation score on pcmk_remote5: 0 ++native_color: FAKE38 allocation score on pcmk1: 0 ++native_color: FAKE38 allocation score on pcmk2: 0 ++native_color: FAKE38 allocation score on pcmk3: 0 ++native_color: FAKE38 allocation score on pcmk_remote1: 0 ++native_color: FAKE38 allocation score on pcmk_remote2: 0 ++native_color: FAKE38 allocation score on pcmk_remote3: 0 ++native_color: FAKE38 allocation score on pcmk_remote4: 0 ++native_color: FAKE38 allocation score on pcmk_remote5: 0 ++native_color: FAKE39 allocation score on pcmk1: 0 ++native_color: FAKE39 allocation score on pcmk2: 0 ++native_color: FAKE39 allocation score on pcmk3: 0 ++native_color: FAKE39 allocation score on pcmk_remote1: 0 ++native_color: FAKE39 allocation score on pcmk_remote2: 0 ++native_color: FAKE39 allocation score on pcmk_remote3: 0 ++native_color: FAKE39 allocation score on pcmk_remote4: 0 ++native_color: FAKE39 allocation score on pcmk_remote5: 0 ++native_color: FAKE4 allocation score on pcmk1: 0 ++native_color: FAKE4 allocation score on pcmk2: 0 ++native_color: FAKE4 allocation score on pcmk3: 0 ++native_color: FAKE4 allocation score on pcmk_remote1: 0 ++native_color: FAKE4 allocation score on pcmk_remote2: 0 ++native_color: FAKE4 allocation score on pcmk_remote3: 0 ++native_color: FAKE4 allocation score on pcmk_remote4: 0 ++native_color: FAKE4 allocation score on pcmk_remote5: 0 ++native_color: FAKE40 allocation score on pcmk1: 0 ++native_color: FAKE40 allocation score on pcmk2: 0 ++native_color: FAKE40 allocation score on pcmk3: 0 ++native_color: FAKE40 allocation score on pcmk_remote1: 0 ++native_color: FAKE40 allocation score on pcmk_remote2: 0 ++native_color: FAKE40 allocation score on pcmk_remote3: 0 ++native_color: FAKE40 allocation score on pcmk_remote4: 0 ++native_color: FAKE40 allocation score on pcmk_remote5: 0 ++native_color: FAKE41 allocation score on pcmk1: 0 ++native_color: FAKE41 allocation score on pcmk2: 0 ++native_color: FAKE41 allocation score on pcmk3: 0 ++native_color: FAKE41 allocation score on pcmk_remote1: 0 ++native_color: FAKE41 allocation score on pcmk_remote2: 0 ++native_color: FAKE41 allocation score on pcmk_remote3: 0 ++native_color: FAKE41 allocation score on pcmk_remote4: 0 ++native_color: FAKE41 allocation score on pcmk_remote5: 0 ++native_color: FAKE42 allocation score on pcmk1: 0 ++native_color: FAKE42 allocation score on pcmk2: 0 ++native_color: FAKE42 allocation score on pcmk3: 0 ++native_color: FAKE42 allocation score on pcmk_remote1: 0 ++native_color: FAKE42 allocation score on pcmk_remote2: 0 ++native_color: FAKE42 allocation score on pcmk_remote3: 0 ++native_color: FAKE42 allocation score on pcmk_remote4: 0 ++native_color: FAKE42 allocation score on pcmk_remote5: 0 ++native_color: FAKE43 allocation score on pcmk1: 0 ++native_color: FAKE43 allocation score on pcmk2: 0 ++native_color: FAKE43 allocation score on pcmk3: 0 ++native_color: FAKE43 allocation score on pcmk_remote1: 0 ++native_color: FAKE43 allocation score on pcmk_remote2: 0 ++native_color: FAKE43 allocation score on pcmk_remote3: 0 ++native_color: FAKE43 allocation score on pcmk_remote4: 0 ++native_color: FAKE43 allocation score on pcmk_remote5: 0 ++native_color: FAKE44 allocation score on pcmk1: 0 ++native_color: FAKE44 allocation score on pcmk2: 0 ++native_color: FAKE44 allocation score on pcmk3: 0 ++native_color: FAKE44 allocation score on pcmk_remote1: 0 ++native_color: FAKE44 allocation score on pcmk_remote2: 0 ++native_color: FAKE44 allocation score on pcmk_remote3: 0 ++native_color: FAKE44 allocation score on pcmk_remote4: 0 ++native_color: FAKE44 allocation score on pcmk_remote5: 0 ++native_color: FAKE45 allocation score on pcmk1: 0 ++native_color: FAKE45 allocation score on pcmk2: 0 ++native_color: FAKE45 allocation score on pcmk3: 0 ++native_color: FAKE45 allocation score on pcmk_remote1: 0 ++native_color: FAKE45 allocation score on pcmk_remote2: 0 ++native_color: FAKE45 allocation score on pcmk_remote3: 0 ++native_color: FAKE45 allocation score on pcmk_remote4: 0 ++native_color: FAKE45 allocation score on pcmk_remote5: 0 ++native_color: FAKE46 allocation score on pcmk1: 0 ++native_color: FAKE46 allocation score on pcmk2: 0 ++native_color: FAKE46 allocation score on pcmk3: 0 ++native_color: FAKE46 allocation score on pcmk_remote1: 0 ++native_color: FAKE46 allocation score on pcmk_remote2: 0 ++native_color: FAKE46 allocation score on pcmk_remote3: 0 ++native_color: FAKE46 allocation score on pcmk_remote4: 0 ++native_color: FAKE46 allocation score on pcmk_remote5: 0 ++native_color: FAKE47 allocation score on pcmk1: 0 ++native_color: FAKE47 allocation score on pcmk2: 0 ++native_color: FAKE47 allocation score on pcmk3: 0 ++native_color: FAKE47 allocation score on pcmk_remote1: 0 ++native_color: FAKE47 allocation score on pcmk_remote2: 0 ++native_color: FAKE47 allocation score on pcmk_remote3: 0 ++native_color: FAKE47 allocation score on pcmk_remote4: 0 ++native_color: FAKE47 allocation score on pcmk_remote5: 0 ++native_color: FAKE48 allocation score on pcmk1: 0 ++native_color: FAKE48 allocation score on pcmk2: 0 ++native_color: FAKE48 allocation score on pcmk3: 0 ++native_color: FAKE48 allocation score on pcmk_remote1: 0 ++native_color: FAKE48 allocation score on pcmk_remote2: 0 ++native_color: FAKE48 allocation score on pcmk_remote3: 0 ++native_color: FAKE48 allocation score on pcmk_remote4: 0 ++native_color: FAKE48 allocation score on pcmk_remote5: 0 ++native_color: FAKE49 allocation score on pcmk1: 0 ++native_color: FAKE49 allocation score on pcmk2: 0 ++native_color: FAKE49 allocation score on pcmk3: 0 ++native_color: FAKE49 allocation score on pcmk_remote1: 0 ++native_color: FAKE49 allocation score on pcmk_remote2: 0 ++native_color: FAKE49 allocation score on pcmk_remote3: 0 ++native_color: FAKE49 allocation score on pcmk_remote4: 0 ++native_color: FAKE49 allocation score on pcmk_remote5: 0 ++native_color: FAKE5 allocation score on pcmk1: 0 ++native_color: FAKE5 allocation score on pcmk2: 0 ++native_color: FAKE5 allocation score on pcmk3: 0 ++native_color: FAKE5 allocation score on pcmk_remote1: 0 ++native_color: FAKE5 allocation score on pcmk_remote2: 0 ++native_color: FAKE5 allocation score on pcmk_remote3: 0 ++native_color: FAKE5 allocation score on pcmk_remote4: 0 ++native_color: FAKE5 allocation score on pcmk_remote5: 0 ++native_color: FAKE50 allocation score on pcmk1: 0 ++native_color: FAKE50 allocation score on pcmk2: 0 ++native_color: FAKE50 allocation score on pcmk3: 0 ++native_color: FAKE50 allocation score on pcmk_remote1: 0 ++native_color: FAKE50 allocation score on pcmk_remote2: 0 ++native_color: FAKE50 allocation score on pcmk_remote3: 0 ++native_color: FAKE50 allocation score on pcmk_remote4: 0 ++native_color: FAKE50 allocation score on pcmk_remote5: 0 ++native_color: FAKE6 allocation score on pcmk1: 0 ++native_color: FAKE6 allocation score on pcmk2: 0 ++native_color: FAKE6 allocation score on pcmk3: 0 ++native_color: FAKE6 allocation score on pcmk_remote1: 0 ++native_color: FAKE6 allocation score on pcmk_remote2: 0 ++native_color: FAKE6 allocation score on pcmk_remote3: 0 ++native_color: FAKE6 allocation score on pcmk_remote4: 0 ++native_color: FAKE6 allocation score on pcmk_remote5: 0 ++native_color: FAKE7 allocation score on pcmk1: 0 ++native_color: FAKE7 allocation score on pcmk2: 0 ++native_color: FAKE7 allocation score on pcmk3: 0 ++native_color: FAKE7 allocation score on pcmk_remote1: 0 ++native_color: FAKE7 allocation score on pcmk_remote2: 0 ++native_color: FAKE7 allocation score on pcmk_remote3: 0 ++native_color: FAKE7 allocation score on pcmk_remote4: 0 ++native_color: FAKE7 allocation score on pcmk_remote5: 0 ++native_color: FAKE8 allocation score on pcmk1: 0 ++native_color: FAKE8 allocation score on pcmk2: 0 ++native_color: FAKE8 allocation score on pcmk3: 0 ++native_color: FAKE8 allocation score on pcmk_remote1: 0 ++native_color: FAKE8 allocation score on pcmk_remote2: 0 ++native_color: FAKE8 allocation score on pcmk_remote3: 0 ++native_color: FAKE8 allocation score on pcmk_remote4: 0 ++native_color: FAKE8 allocation score on pcmk_remote5: 0 ++native_color: FAKE9 allocation score on pcmk1: 0 ++native_color: FAKE9 allocation score on pcmk2: -INFINITY ++native_color: FAKE9 allocation score on pcmk3: 0 ++native_color: FAKE9 allocation score on pcmk_remote1: 0 ++native_color: FAKE9 allocation score on pcmk_remote2: 0 ++native_color: FAKE9 allocation score on pcmk_remote3: 0 ++native_color: FAKE9 allocation score on pcmk_remote4: 0 ++native_color: FAKE9 allocation score on pcmk_remote5: 0 ++native_color: pcmk_remote1 allocation score on pcmk1: 0 ++native_color: pcmk_remote1 allocation score on pcmk2: 0 ++native_color: pcmk_remote1 allocation score on pcmk3: 0 ++native_color: pcmk_remote1 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk1: 0 ++native_color: pcmk_remote2 allocation score on pcmk2: 0 ++native_color: pcmk_remote2 allocation score on pcmk3: 0 ++native_color: pcmk_remote2 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk1: 0 ++native_color: pcmk_remote3 allocation score on pcmk2: 0 ++native_color: pcmk_remote3 allocation score on pcmk3: 0 ++native_color: pcmk_remote3 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk1: 0 ++native_color: pcmk_remote4 allocation score on pcmk2: 0 ++native_color: pcmk_remote4 allocation score on pcmk3: 0 ++native_color: pcmk_remote4 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk1: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk2: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk3: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote5: -INFINITY ++native_color: shooter allocation score on pcmk1: 0 ++native_color: shooter allocation score on pcmk2: 0 ++native_color: shooter allocation score on pcmk3: 0 ++native_color: shooter allocation score on pcmk_remote1: -INFINITY ++native_color: shooter allocation score on pcmk_remote2: -INFINITY ++native_color: shooter allocation score on pcmk_remote3: -INFINITY ++native_color: shooter allocation score on pcmk_remote4: -INFINITY ++native_color: shooter allocation score on pcmk_remote5: -INFINITY +diff --git a/pengine/test10/remote-partial-migrate.summary b/pengine/test10/remote-partial-migrate.summary +new file mode 100644 +index 0000000..e8abf92 +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate.summary +@@ -0,0 +1,189 @@ ++ ++Current cluster status: ++Online: [ pcmk1 pcmk2 pcmk3 ] ++RemoteOnline: [ pcmk_remote1 pcmk_remote2 pcmk_remote3 pcmk_remote4 ] ++RemoteOFFLINE: [ pcmk_remote5 ] ++ ++ shooter (stonith:fence_docker_cts): Started pcmk2 ++ pcmk_remote1 (ocf::pacemaker:remote): Started pcmk1 ++ pcmk_remote2 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote3 (ocf::pacemaker:remote): Started [ pcmk2 pcmk1 ] ++ pcmk_remote4 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote5 (ocf::pacemaker:remote): Stopped ++ FAKE1 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE2 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE3 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE4 (ocf::heartbeat:Dummy): Stopped ++ FAKE5 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE6 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE7 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE8 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE9 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE10 (ocf::heartbeat:Dummy): Stopped ++ FAKE11 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE12 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE13 (ocf::heartbeat:Dummy): Stopped ++ FAKE14 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE15 (ocf::heartbeat:Dummy): Stopped ++ FAKE16 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE17 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE18 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE19 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE20 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE21 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE22 (ocf::heartbeat:Dummy): Stopped ++ FAKE23 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE24 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE25 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE26 (ocf::heartbeat:Dummy): Stopped ++ FAKE27 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE28 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE29 (ocf::heartbeat:Dummy): Stopped ++ FAKE30 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE31 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE32 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE33 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE34 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE35 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE36 (ocf::heartbeat:Dummy): Stopped ++ FAKE37 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE38 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE39 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE40 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE41 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE42 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE43 (ocf::heartbeat:Dummy): Stopped ++ FAKE44 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE45 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE46 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE47 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE48 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE49 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE50 (ocf::heartbeat:Dummy): Stopped ++ ++Transition Summary: ++ * Migrate pcmk_remote3 (Started pcmk1 -> pcmk2) ++ * Start FAKE4 (pcmk_remote3) ++ * Move FAKE9 (Started pcmk_remote3 -> pcmk1) ++ * Start FAKE10 (pcmk1) ++ * Start FAKE13 (pcmk2) ++ * Start FAKE15 (pcmk3) ++ * Move FAKE16 (Started pcmk1 -> pcmk_remote3) ++ * Start FAKE22 (pcmk1) ++ * Move FAKE23 (Started pcmk1 -> pcmk_remote1) ++ * Start FAKE26 (pcmk1) ++ * Start FAKE29 (pcmk2) ++ * Move FAKE30 (Started pcmk1 -> pcmk_remote2) ++ * Start FAKE36 (pcmk1) ++ * Move FAKE37 (Started pcmk1 -> pcmk2) ++ * Start FAKE43 (pcmk1) ++ * Move FAKE44 (Started pcmk1 -> pcmk2) ++ * Start FAKE50 (pcmk1) ++ ++Executing cluster transition: ++ * Resource action: pcmk_remote3 migrate_from on pcmk2 ++ * Resource action: pcmk_remote3 stop on pcmk1 ++ * Resource action: FAKE10 start on pcmk1 ++ * Resource action: FAKE13 start on pcmk2 ++ * Resource action: FAKE15 start on pcmk3 ++ * Resource action: FAKE16 stop on pcmk1 ++ * Resource action: FAKE22 start on pcmk1 ++ * Resource action: FAKE23 stop on pcmk1 ++ * Resource action: FAKE26 start on pcmk1 ++ * Resource action: FAKE29 start on pcmk2 ++ * Resource action: FAKE30 stop on pcmk1 ++ * Resource action: FAKE36 start on pcmk1 ++ * Resource action: FAKE37 stop on pcmk1 ++ * Resource action: FAKE43 start on pcmk1 ++ * Resource action: FAKE44 stop on pcmk1 ++ * Resource action: FAKE50 start on pcmk1 ++ * Pseudo action: pcmk_remote3_start_0 ++ * Resource action: FAKE4 start on pcmk_remote3 ++ * Resource action: FAKE9 stop on pcmk_remote3 ++ * Resource action: FAKE10 monitor=10000 on pcmk1 ++ * Resource action: FAKE13 monitor=10000 on pcmk2 ++ * Resource action: FAKE15 monitor=10000 on pcmk3 ++ * Resource action: FAKE16 start on pcmk_remote3 ++ * Resource action: FAKE22 monitor=10000 on pcmk1 ++ * Resource action: FAKE23 start on pcmk_remote1 ++ * Resource action: FAKE26 monitor=10000 on pcmk1 ++ * Resource action: FAKE29 monitor=10000 on pcmk2 ++ * Resource action: FAKE30 start on pcmk_remote2 ++ * Resource action: FAKE36 monitor=10000 on pcmk1 ++ * Resource action: FAKE37 start on pcmk2 ++ * Resource action: FAKE43 monitor=10000 on pcmk1 ++ * Resource action: FAKE44 start on pcmk2 ++ * Resource action: FAKE50 monitor=10000 on pcmk1 ++ * Pseudo action: all_stopped ++ * Resource action: pcmk_remote3 monitor=60000 on pcmk2 ++ * Resource action: FAKE4 monitor=10000 on pcmk_remote3 ++ * Resource action: FAKE9 start on pcmk1 ++ * Resource action: FAKE16 monitor=10000 on pcmk_remote3 ++ * Resource action: FAKE23 monitor=10000 on pcmk_remote1 ++ * Resource action: FAKE30 monitor=10000 on pcmk_remote2 ++ * Resource action: FAKE37 monitor=10000 on pcmk2 ++ * Resource action: FAKE44 monitor=10000 on pcmk2 ++ * Resource action: FAKE9 monitor=10000 on pcmk1 ++ ++Revised cluster status: ++Online: [ pcmk1 pcmk2 pcmk3 ] ++RemoteOnline: [ pcmk_remote1 pcmk_remote2 pcmk_remote3 pcmk_remote4 ] ++RemoteOFFLINE: [ pcmk_remote5 ] ++ ++ shooter (stonith:fence_docker_cts): Started pcmk2 ++ pcmk_remote1 (ocf::pacemaker:remote): Started pcmk1 ++ pcmk_remote2 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote3 (ocf::pacemaker:remote): Started pcmk2 ++ pcmk_remote4 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote5 (ocf::pacemaker:remote): Stopped ++ FAKE1 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE2 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE3 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE4 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE5 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE6 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE7 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE8 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE9 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE10 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE11 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE12 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE13 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE14 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE15 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE16 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE17 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE18 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE19 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE20 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE21 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE22 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE23 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE24 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE25 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE26 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE27 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE28 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE29 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE30 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE31 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE32 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE33 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE34 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE35 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE36 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE37 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE38 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE39 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE40 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE41 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE42 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE43 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE44 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE45 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE46 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE47 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE48 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE49 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE50 (ocf::heartbeat:Dummy): Started pcmk1 ++ +diff --git a/pengine/test10/remote-partial-migrate.xml b/pengine/test10/remote-partial-migrate.xml +new file mode 100644 +index 0000000..e71f029 +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate.xml +@@ -0,0 +1,1734 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-partial-migrate2.dot b/pengine/test10/remote-partial-migrate2.dot +new file mode 100644 +index 0000000..a8bf29b +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate2.dot +@@ -0,0 +1,159 @@ ++ digraph "g" { ++"FAKE12_monitor_10000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE12_start_0 pcmk2" -> "FAKE12_monitor_10000 pcmk2" [ style = bold] ++"FAKE12_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE12_stop_0 pcmk1" -> "FAKE12_start_0 pcmk2" [ style = bold] ++"FAKE12_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE12_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE14_monitor_10000 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE14_start_0 pcmk_remote1" -> "FAKE14_monitor_10000 pcmk_remote1" [ style = bold] ++"FAKE14_start_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE14_stop_0 pcmk2" -> "FAKE14_start_0 pcmk_remote1" [ style = bold] ++"FAKE14_stop_0 pcmk2" -> "all_stopped" [ style = bold] ++"FAKE14_stop_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE17_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE17_start_0 pcmk_remote4" -> "FAKE17_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE17_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE17_stop_0 pcmk_remote1" -> "FAKE17_start_0 pcmk_remote4" [ style = bold] ++"FAKE17_stop_0 pcmk_remote1" -> "all_stopped" [ style = bold] ++"FAKE17_stop_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE25_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE25_start_0 pcmk_remote4" -> "FAKE25_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE25_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE25_stop_0 pcmk_remote1" -> "FAKE25_start_0 pcmk_remote4" [ style = bold] ++"FAKE25_stop_0 pcmk_remote1" -> "all_stopped" [ style = bold] ++"FAKE25_stop_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE28_monitor_10000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE28_start_0 pcmk1" -> "FAKE28_monitor_10000 pcmk1" [ style = bold] ++"FAKE28_start_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE28_stop_0 pcmk3" -> "FAKE28_start_0 pcmk1" [ style = bold] ++"FAKE28_stop_0 pcmk3" -> "all_stopped" [ style = bold] ++"FAKE28_stop_0 pcmk3" [ style=bold color="green" fontcolor="black"] ++"FAKE30_monitor_10000 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE30_start_0 pcmk_remote1" -> "FAKE30_monitor_10000 pcmk_remote1" [ style = bold] ++"FAKE30_start_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE30_stop_0 pcmk1" -> "FAKE30_start_0 pcmk_remote1" [ style = bold] ++"FAKE30_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE30_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE33_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE33_start_0 pcmk_remote4" -> "FAKE33_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE33_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE33_stop_0 pcmk_remote1" -> "FAKE33_start_0 pcmk_remote4" [ style = bold] ++"FAKE33_stop_0 pcmk_remote1" -> "all_stopped" [ style = bold] ++"FAKE33_stop_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE38_monitor_10000 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE38_start_0 pcmk_remote1" -> "FAKE38_monitor_10000 pcmk_remote1" [ style = bold] ++"FAKE38_start_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE38_stop_0 pcmk2" -> "FAKE38_start_0 pcmk_remote1" [ style = bold] ++"FAKE38_stop_0 pcmk2" -> "all_stopped" [ style = bold] ++"FAKE38_stop_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"FAKE39_monitor_10000 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE39_start_0 pcmk_remote2" -> "FAKE39_monitor_10000 pcmk_remote2" [ style = bold] ++"FAKE39_start_0 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE39_stop_0 pcmk1" -> "FAKE39_start_0 pcmk_remote2" [ style = bold] ++"FAKE39_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE39_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE41_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE41_start_0 pcmk_remote4" -> "FAKE41_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE41_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE41_stop_0 pcmk_remote2" -> "FAKE41_start_0 pcmk_remote4" [ style = bold] ++"FAKE41_stop_0 pcmk_remote2" -> "all_stopped" [ style = bold] ++"FAKE41_stop_0 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE47_monitor_10000 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE47_start_0 pcmk_remote2" -> "FAKE47_monitor_10000 pcmk_remote2" [ style = bold] ++"FAKE47_start_0 pcmk_remote2" [ style=bold color="green" fontcolor="black"] ++"FAKE47_stop_0 pcmk_remote1" -> "FAKE47_start_0 pcmk_remote2" [ style = bold] ++"FAKE47_stop_0 pcmk_remote1" -> "all_stopped" [ style = bold] ++"FAKE47_stop_0 pcmk_remote1" [ style=bold color="green" fontcolor="black"] ++"FAKE48_monitor_10000 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE48_start_0 pcmk_remote3" -> "FAKE48_monitor_10000 pcmk_remote3" [ style = bold] ++"FAKE48_start_0 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE48_stop_0 pcmk1" -> "FAKE48_start_0 pcmk_remote3" [ style = bold] ++"FAKE48_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE48_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE49_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE49_start_0 pcmk_remote4" -> "FAKE49_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE49_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE49_stop_0 pcmk_remote3" -> "FAKE49_start_0 pcmk_remote4" [ style = bold] ++"FAKE49_stop_0 pcmk_remote3" -> "all_stopped" [ style = bold] ++"FAKE49_stop_0 pcmk_remote3" [ style=bold color="green" fontcolor="black"] ++"FAKE5_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE5_start_0 pcmk_remote4" -> "FAKE5_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE5_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE5_stop_0 pcmk1" -> "FAKE5_start_0 pcmk_remote4" [ style = bold] ++"FAKE5_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"FAKE5_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"FAKE9_monitor_10000 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE9_start_0 pcmk_remote4" -> "FAKE9_monitor_10000 pcmk_remote4" [ style = bold] ++"FAKE9_start_0 pcmk_remote4" [ style=bold color="green" fontcolor="black"] ++"FAKE9_stop_0 pcmk2" -> "FAKE9_start_0 pcmk_remote4" [ style = bold] ++"FAKE9_stop_0 pcmk2" -> "all_stopped" [ style = bold] ++"FAKE9_stop_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"pcmk_remote2_migrate_from_0 pcmk1" -> "pcmk_remote2_start_0 pcmk1" [ style = bold] ++"pcmk_remote2_migrate_from_0 pcmk1" -> "pcmk_remote2_stop_0 pcmk3" [ style = bold] ++"pcmk_remote2_migrate_from_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote2_monitor_60000 pcmk1" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote2_start_0 pcmk1" -> "FAKE39_monitor_10000 pcmk_remote2" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" -> "FAKE39_start_0 pcmk_remote2" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" -> "FAKE41_stop_0 pcmk_remote2" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" -> "FAKE47_monitor_10000 pcmk_remote2" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" -> "FAKE47_start_0 pcmk_remote2" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" -> "pcmk_remote2_monitor_60000 pcmk1" [ style = bold] ++"pcmk_remote2_start_0 pcmk1" [ style=bold color="green" fontcolor="orange"] ++"pcmk_remote2_stop_0 pcmk3" -> "all_stopped" [ style = bold] ++"pcmk_remote2_stop_0 pcmk3" -> "pcmk_remote2_start_0 pcmk1" [ style = bold] ++"pcmk_remote2_stop_0 pcmk3" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote4_monitor_60000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE17_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE17_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE25_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE25_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE33_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE33_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE41_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE41_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE49_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE49_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE5_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE5_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE9_monitor_10000 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "FAKE9_start_0 pcmk_remote4" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" -> "pcmk_remote4_monitor_60000 pcmk2" [ style = bold] ++"pcmk_remote4_start_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote5_migrate_from_0 pcmk2" -> "pcmk_remote5_start_0 pcmk2" [ style = bold] ++"pcmk_remote5_migrate_from_0 pcmk2" -> "pcmk_remote5_stop_0 pcmk1" [ style = bold] ++"pcmk_remote5_migrate_from_0 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote5_migrate_to_0 pcmk1" -> "pcmk_remote5_migrate_from_0 pcmk2" [ style = bold] ++"pcmk_remote5_migrate_to_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote5_monitor_60000 pcmk2" [ style=bold color="green" fontcolor="black"] ++"pcmk_remote5_start_0 pcmk2" -> "pcmk_remote5_monitor_60000 pcmk2" [ style = bold] ++"pcmk_remote5_start_0 pcmk2" [ style=bold color="green" fontcolor="orange"] ++"pcmk_remote5_stop_0 pcmk1" -> "all_stopped" [ style = bold] ++"pcmk_remote5_stop_0 pcmk1" -> "pcmk_remote5_start_0 pcmk2" [ style = bold] ++"pcmk_remote5_stop_0 pcmk1" [ style=bold color="green" fontcolor="black"] ++"stonith 'reboot' pcmk4" -> "stonith_complete" [ style = bold] ++"stonith 'reboot' pcmk4" [ style=bold color="green" fontcolor="black"] ++"stonith_complete" -> "FAKE12_start_0 pcmk2" [ style = bold] ++"stonith_complete" -> "FAKE14_start_0 pcmk_remote1" [ style = bold] ++"stonith_complete" -> "FAKE17_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE25_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE28_start_0 pcmk1" [ style = bold] ++"stonith_complete" -> "FAKE30_start_0 pcmk_remote1" [ style = bold] ++"stonith_complete" -> "FAKE33_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE38_start_0 pcmk_remote1" [ style = bold] ++"stonith_complete" -> "FAKE39_start_0 pcmk_remote2" [ style = bold] ++"stonith_complete" -> "FAKE41_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE47_start_0 pcmk_remote2" [ style = bold] ++"stonith_complete" -> "FAKE48_start_0 pcmk_remote3" [ style = bold] ++"stonith_complete" -> "FAKE49_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE5_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "FAKE9_start_0 pcmk_remote4" [ style = bold] ++"stonith_complete" -> "all_stopped" [ style = bold] ++"stonith_complete" -> "pcmk_remote2_migrate_from_0 pcmk1" [ style = bold] ++"stonith_complete" -> "pcmk_remote2_start_0 pcmk1" [ style = bold] ++"stonith_complete" -> "pcmk_remote4_start_0 pcmk2" [ style = bold] ++"stonith_complete" -> "pcmk_remote5_migrate_to_0 pcmk1" [ style = bold] ++"stonith_complete" -> "pcmk_remote5_start_0 pcmk2" [ style = bold] ++"stonith_complete" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/remote-partial-migrate2.exp b/pengine/test10/remote-partial-migrate2.exp +new file mode 100644 +index 0000000..e3d7495 +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate2.exp +@@ -0,0 +1,866 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-partial-migrate2.scores b/pengine/test10/remote-partial-migrate2.scores +new file mode 100644 +index 0000000..6965507 +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate2.scores +@@ -0,0 +1,505 @@ ++Allocation scores: ++native_color: FAKE1 allocation score on pcmk1: -INFINITY ++native_color: FAKE1 allocation score on pcmk2: 0 ++native_color: FAKE1 allocation score on pcmk3: 0 ++native_color: FAKE1 allocation score on pcmk4: 0 ++native_color: FAKE1 allocation score on pcmk_remote1: 0 ++native_color: FAKE1 allocation score on pcmk_remote2: 0 ++native_color: FAKE1 allocation score on pcmk_remote3: 0 ++native_color: FAKE1 allocation score on pcmk_remote4: 0 ++native_color: FAKE1 allocation score on pcmk_remote5: 0 ++native_color: FAKE10 allocation score on pcmk1: 0 ++native_color: FAKE10 allocation score on pcmk2: 0 ++native_color: FAKE10 allocation score on pcmk3: 0 ++native_color: FAKE10 allocation score on pcmk4: 0 ++native_color: FAKE10 allocation score on pcmk_remote1: 0 ++native_color: FAKE10 allocation score on pcmk_remote2: 0 ++native_color: FAKE10 allocation score on pcmk_remote3: 0 ++native_color: FAKE10 allocation score on pcmk_remote4: 0 ++native_color: FAKE10 allocation score on pcmk_remote5: 0 ++native_color: FAKE11 allocation score on pcmk1: 0 ++native_color: FAKE11 allocation score on pcmk2: 0 ++native_color: FAKE11 allocation score on pcmk3: 0 ++native_color: FAKE11 allocation score on pcmk4: 0 ++native_color: FAKE11 allocation score on pcmk_remote1: 0 ++native_color: FAKE11 allocation score on pcmk_remote2: 0 ++native_color: FAKE11 allocation score on pcmk_remote3: 0 ++native_color: FAKE11 allocation score on pcmk_remote4: 0 ++native_color: FAKE11 allocation score on pcmk_remote5: 0 ++native_color: FAKE12 allocation score on pcmk1: 0 ++native_color: FAKE12 allocation score on pcmk2: 0 ++native_color: FAKE12 allocation score on pcmk3: 0 ++native_color: FAKE12 allocation score on pcmk4: 0 ++native_color: FAKE12 allocation score on pcmk_remote1: 0 ++native_color: FAKE12 allocation score on pcmk_remote2: 0 ++native_color: FAKE12 allocation score on pcmk_remote3: 0 ++native_color: FAKE12 allocation score on pcmk_remote4: 0 ++native_color: FAKE12 allocation score on pcmk_remote5: 0 ++native_color: FAKE13 allocation score on pcmk1: 0 ++native_color: FAKE13 allocation score on pcmk2: 0 ++native_color: FAKE13 allocation score on pcmk3: 0 ++native_color: FAKE13 allocation score on pcmk4: 0 ++native_color: FAKE13 allocation score on pcmk_remote1: 0 ++native_color: FAKE13 allocation score on pcmk_remote2: 0 ++native_color: FAKE13 allocation score on pcmk_remote3: 0 ++native_color: FAKE13 allocation score on pcmk_remote4: 0 ++native_color: FAKE13 allocation score on pcmk_remote5: 0 ++native_color: FAKE14 allocation score on pcmk1: 0 ++native_color: FAKE14 allocation score on pcmk2: 0 ++native_color: FAKE14 allocation score on pcmk3: 0 ++native_color: FAKE14 allocation score on pcmk4: 0 ++native_color: FAKE14 allocation score on pcmk_remote1: 0 ++native_color: FAKE14 allocation score on pcmk_remote2: 0 ++native_color: FAKE14 allocation score on pcmk_remote3: 0 ++native_color: FAKE14 allocation score on pcmk_remote4: 0 ++native_color: FAKE14 allocation score on pcmk_remote5: 0 ++native_color: FAKE15 allocation score on pcmk1: 0 ++native_color: FAKE15 allocation score on pcmk2: 0 ++native_color: FAKE15 allocation score on pcmk3: 0 ++native_color: FAKE15 allocation score on pcmk4: 0 ++native_color: FAKE15 allocation score on pcmk_remote1: 0 ++native_color: FAKE15 allocation score on pcmk_remote2: 0 ++native_color: FAKE15 allocation score on pcmk_remote3: 0 ++native_color: FAKE15 allocation score on pcmk_remote4: 0 ++native_color: FAKE15 allocation score on pcmk_remote5: 0 ++native_color: FAKE16 allocation score on pcmk1: 0 ++native_color: FAKE16 allocation score on pcmk2: 0 ++native_color: FAKE16 allocation score on pcmk3: 0 ++native_color: FAKE16 allocation score on pcmk4: 0 ++native_color: FAKE16 allocation score on pcmk_remote1: 0 ++native_color: FAKE16 allocation score on pcmk_remote2: 0 ++native_color: FAKE16 allocation score on pcmk_remote3: 0 ++native_color: FAKE16 allocation score on pcmk_remote4: 0 ++native_color: FAKE16 allocation score on pcmk_remote5: 0 ++native_color: FAKE17 allocation score on pcmk1: 0 ++native_color: FAKE17 allocation score on pcmk2: 0 ++native_color: FAKE17 allocation score on pcmk3: 0 ++native_color: FAKE17 allocation score on pcmk4: 0 ++native_color: FAKE17 allocation score on pcmk_remote1: 0 ++native_color: FAKE17 allocation score on pcmk_remote2: 0 ++native_color: FAKE17 allocation score on pcmk_remote3: 0 ++native_color: FAKE17 allocation score on pcmk_remote4: 0 ++native_color: FAKE17 allocation score on pcmk_remote5: 0 ++native_color: FAKE18 allocation score on pcmk1: 0 ++native_color: FAKE18 allocation score on pcmk2: 0 ++native_color: FAKE18 allocation score on pcmk3: 0 ++native_color: FAKE18 allocation score on pcmk4: 0 ++native_color: FAKE18 allocation score on pcmk_remote1: 0 ++native_color: FAKE18 allocation score on pcmk_remote2: 0 ++native_color: FAKE18 allocation score on pcmk_remote3: 0 ++native_color: FAKE18 allocation score on pcmk_remote4: 0 ++native_color: FAKE18 allocation score on pcmk_remote5: 0 ++native_color: FAKE19 allocation score on pcmk1: 0 ++native_color: FAKE19 allocation score on pcmk2: 0 ++native_color: FAKE19 allocation score on pcmk3: 0 ++native_color: FAKE19 allocation score on pcmk4: 0 ++native_color: FAKE19 allocation score on pcmk_remote1: 0 ++native_color: FAKE19 allocation score on pcmk_remote2: 0 ++native_color: FAKE19 allocation score on pcmk_remote3: 0 ++native_color: FAKE19 allocation score on pcmk_remote4: 0 ++native_color: FAKE19 allocation score on pcmk_remote5: 0 ++native_color: FAKE2 allocation score on pcmk1: 0 ++native_color: FAKE2 allocation score on pcmk2: 0 ++native_color: FAKE2 allocation score on pcmk3: 0 ++native_color: FAKE2 allocation score on pcmk4: 0 ++native_color: FAKE2 allocation score on pcmk_remote1: 0 ++native_color: FAKE2 allocation score on pcmk_remote2: 0 ++native_color: FAKE2 allocation score on pcmk_remote3: 0 ++native_color: FAKE2 allocation score on pcmk_remote4: 0 ++native_color: FAKE2 allocation score on pcmk_remote5: 0 ++native_color: FAKE20 allocation score on pcmk1: 0 ++native_color: FAKE20 allocation score on pcmk2: 0 ++native_color: FAKE20 allocation score on pcmk3: 0 ++native_color: FAKE20 allocation score on pcmk4: 0 ++native_color: FAKE20 allocation score on pcmk_remote1: 0 ++native_color: FAKE20 allocation score on pcmk_remote2: 0 ++native_color: FAKE20 allocation score on pcmk_remote3: 0 ++native_color: FAKE20 allocation score on pcmk_remote4: 0 ++native_color: FAKE20 allocation score on pcmk_remote5: 0 ++native_color: FAKE21 allocation score on pcmk1: 0 ++native_color: FAKE21 allocation score on pcmk2: 0 ++native_color: FAKE21 allocation score on pcmk3: 0 ++native_color: FAKE21 allocation score on pcmk4: 0 ++native_color: FAKE21 allocation score on pcmk_remote1: 0 ++native_color: FAKE21 allocation score on pcmk_remote2: 0 ++native_color: FAKE21 allocation score on pcmk_remote3: 0 ++native_color: FAKE21 allocation score on pcmk_remote4: 0 ++native_color: FAKE21 allocation score on pcmk_remote5: 0 ++native_color: FAKE22 allocation score on pcmk1: 0 ++native_color: FAKE22 allocation score on pcmk2: 0 ++native_color: FAKE22 allocation score on pcmk3: 0 ++native_color: FAKE22 allocation score on pcmk4: 0 ++native_color: FAKE22 allocation score on pcmk_remote1: 0 ++native_color: FAKE22 allocation score on pcmk_remote2: 0 ++native_color: FAKE22 allocation score on pcmk_remote3: 0 ++native_color: FAKE22 allocation score on pcmk_remote4: 0 ++native_color: FAKE22 allocation score on pcmk_remote5: 0 ++native_color: FAKE23 allocation score on pcmk1: 0 ++native_color: FAKE23 allocation score on pcmk2: 0 ++native_color: FAKE23 allocation score on pcmk3: 0 ++native_color: FAKE23 allocation score on pcmk4: 0 ++native_color: FAKE23 allocation score on pcmk_remote1: 0 ++native_color: FAKE23 allocation score on pcmk_remote2: 0 ++native_color: FAKE23 allocation score on pcmk_remote3: 0 ++native_color: FAKE23 allocation score on pcmk_remote4: 0 ++native_color: FAKE23 allocation score on pcmk_remote5: 0 ++native_color: FAKE24 allocation score on pcmk1: 0 ++native_color: FAKE24 allocation score on pcmk2: 0 ++native_color: FAKE24 allocation score on pcmk3: 0 ++native_color: FAKE24 allocation score on pcmk4: 0 ++native_color: FAKE24 allocation score on pcmk_remote1: 0 ++native_color: FAKE24 allocation score on pcmk_remote2: 0 ++native_color: FAKE24 allocation score on pcmk_remote3: 0 ++native_color: FAKE24 allocation score on pcmk_remote4: 0 ++native_color: FAKE24 allocation score on pcmk_remote5: 0 ++native_color: FAKE25 allocation score on pcmk1: 0 ++native_color: FAKE25 allocation score on pcmk2: 0 ++native_color: FAKE25 allocation score on pcmk3: 0 ++native_color: FAKE25 allocation score on pcmk4: 0 ++native_color: FAKE25 allocation score on pcmk_remote1: 0 ++native_color: FAKE25 allocation score on pcmk_remote2: 0 ++native_color: FAKE25 allocation score on pcmk_remote3: 0 ++native_color: FAKE25 allocation score on pcmk_remote4: 0 ++native_color: FAKE25 allocation score on pcmk_remote5: 0 ++native_color: FAKE26 allocation score on pcmk1: 0 ++native_color: FAKE26 allocation score on pcmk2: 0 ++native_color: FAKE26 allocation score on pcmk3: 0 ++native_color: FAKE26 allocation score on pcmk4: 0 ++native_color: FAKE26 allocation score on pcmk_remote1: 0 ++native_color: FAKE26 allocation score on pcmk_remote2: 0 ++native_color: FAKE26 allocation score on pcmk_remote3: 0 ++native_color: FAKE26 allocation score on pcmk_remote4: 0 ++native_color: FAKE26 allocation score on pcmk_remote5: 0 ++native_color: FAKE27 allocation score on pcmk1: 0 ++native_color: FAKE27 allocation score on pcmk2: 0 ++native_color: FAKE27 allocation score on pcmk3: 0 ++native_color: FAKE27 allocation score on pcmk4: 0 ++native_color: FAKE27 allocation score on pcmk_remote1: 0 ++native_color: FAKE27 allocation score on pcmk_remote2: 0 ++native_color: FAKE27 allocation score on pcmk_remote3: 0 ++native_color: FAKE27 allocation score on pcmk_remote4: 0 ++native_color: FAKE27 allocation score on pcmk_remote5: 0 ++native_color: FAKE28 allocation score on pcmk1: 0 ++native_color: FAKE28 allocation score on pcmk2: 0 ++native_color: FAKE28 allocation score on pcmk3: 0 ++native_color: FAKE28 allocation score on pcmk4: 0 ++native_color: FAKE28 allocation score on pcmk_remote1: 0 ++native_color: FAKE28 allocation score on pcmk_remote2: 0 ++native_color: FAKE28 allocation score on pcmk_remote3: 0 ++native_color: FAKE28 allocation score on pcmk_remote4: 0 ++native_color: FAKE28 allocation score on pcmk_remote5: 0 ++native_color: FAKE29 allocation score on pcmk1: 0 ++native_color: FAKE29 allocation score on pcmk2: 0 ++native_color: FAKE29 allocation score on pcmk3: 0 ++native_color: FAKE29 allocation score on pcmk4: 0 ++native_color: FAKE29 allocation score on pcmk_remote1: 0 ++native_color: FAKE29 allocation score on pcmk_remote2: 0 ++native_color: FAKE29 allocation score on pcmk_remote3: 0 ++native_color: FAKE29 allocation score on pcmk_remote4: 0 ++native_color: FAKE29 allocation score on pcmk_remote5: 0 ++native_color: FAKE3 allocation score on pcmk1: 0 ++native_color: FAKE3 allocation score on pcmk2: 0 ++native_color: FAKE3 allocation score on pcmk3: 0 ++native_color: FAKE3 allocation score on pcmk4: 0 ++native_color: FAKE3 allocation score on pcmk_remote1: 0 ++native_color: FAKE3 allocation score on pcmk_remote2: 0 ++native_color: FAKE3 allocation score on pcmk_remote3: 0 ++native_color: FAKE3 allocation score on pcmk_remote4: 0 ++native_color: FAKE3 allocation score on pcmk_remote5: 0 ++native_color: FAKE30 allocation score on pcmk1: 0 ++native_color: FAKE30 allocation score on pcmk2: 0 ++native_color: FAKE30 allocation score on pcmk3: 0 ++native_color: FAKE30 allocation score on pcmk4: 0 ++native_color: FAKE30 allocation score on pcmk_remote1: 0 ++native_color: FAKE30 allocation score on pcmk_remote2: 0 ++native_color: FAKE30 allocation score on pcmk_remote3: 0 ++native_color: FAKE30 allocation score on pcmk_remote4: 0 ++native_color: FAKE30 allocation score on pcmk_remote5: 0 ++native_color: FAKE31 allocation score on pcmk1: 0 ++native_color: FAKE31 allocation score on pcmk2: 0 ++native_color: FAKE31 allocation score on pcmk3: 0 ++native_color: FAKE31 allocation score on pcmk4: 0 ++native_color: FAKE31 allocation score on pcmk_remote1: 0 ++native_color: FAKE31 allocation score on pcmk_remote2: 0 ++native_color: FAKE31 allocation score on pcmk_remote3: 0 ++native_color: FAKE31 allocation score on pcmk_remote4: 0 ++native_color: FAKE31 allocation score on pcmk_remote5: 0 ++native_color: FAKE32 allocation score on pcmk1: 0 ++native_color: FAKE32 allocation score on pcmk2: 0 ++native_color: FAKE32 allocation score on pcmk3: 0 ++native_color: FAKE32 allocation score on pcmk4: 0 ++native_color: FAKE32 allocation score on pcmk_remote1: 0 ++native_color: FAKE32 allocation score on pcmk_remote2: 0 ++native_color: FAKE32 allocation score on pcmk_remote3: 0 ++native_color: FAKE32 allocation score on pcmk_remote4: 0 ++native_color: FAKE32 allocation score on pcmk_remote5: 0 ++native_color: FAKE33 allocation score on pcmk1: 0 ++native_color: FAKE33 allocation score on pcmk2: 0 ++native_color: FAKE33 allocation score on pcmk3: 0 ++native_color: FAKE33 allocation score on pcmk4: 0 ++native_color: FAKE33 allocation score on pcmk_remote1: 0 ++native_color: FAKE33 allocation score on pcmk_remote2: 0 ++native_color: FAKE33 allocation score on pcmk_remote3: 0 ++native_color: FAKE33 allocation score on pcmk_remote4: 0 ++native_color: FAKE33 allocation score on pcmk_remote5: 0 ++native_color: FAKE34 allocation score on pcmk1: 0 ++native_color: FAKE34 allocation score on pcmk2: 0 ++native_color: FAKE34 allocation score on pcmk3: 0 ++native_color: FAKE34 allocation score on pcmk4: 0 ++native_color: FAKE34 allocation score on pcmk_remote1: 0 ++native_color: FAKE34 allocation score on pcmk_remote2: 0 ++native_color: FAKE34 allocation score on pcmk_remote3: 0 ++native_color: FAKE34 allocation score on pcmk_remote4: 0 ++native_color: FAKE34 allocation score on pcmk_remote5: 0 ++native_color: FAKE35 allocation score on pcmk1: 0 ++native_color: FAKE35 allocation score on pcmk2: 0 ++native_color: FAKE35 allocation score on pcmk3: 0 ++native_color: FAKE35 allocation score on pcmk4: 0 ++native_color: FAKE35 allocation score on pcmk_remote1: 0 ++native_color: FAKE35 allocation score on pcmk_remote2: 0 ++native_color: FAKE35 allocation score on pcmk_remote3: 0 ++native_color: FAKE35 allocation score on pcmk_remote4: 0 ++native_color: FAKE35 allocation score on pcmk_remote5: 0 ++native_color: FAKE36 allocation score on pcmk1: 0 ++native_color: FAKE36 allocation score on pcmk2: 0 ++native_color: FAKE36 allocation score on pcmk3: 0 ++native_color: FAKE36 allocation score on pcmk4: 0 ++native_color: FAKE36 allocation score on pcmk_remote1: 0 ++native_color: FAKE36 allocation score on pcmk_remote2: 0 ++native_color: FAKE36 allocation score on pcmk_remote3: 0 ++native_color: FAKE36 allocation score on pcmk_remote4: 0 ++native_color: FAKE36 allocation score on pcmk_remote5: 0 ++native_color: FAKE37 allocation score on pcmk1: 0 ++native_color: FAKE37 allocation score on pcmk2: 0 ++native_color: FAKE37 allocation score on pcmk3: 0 ++native_color: FAKE37 allocation score on pcmk4: 0 ++native_color: FAKE37 allocation score on pcmk_remote1: 0 ++native_color: FAKE37 allocation score on pcmk_remote2: 0 ++native_color: FAKE37 allocation score on pcmk_remote3: 0 ++native_color: FAKE37 allocation score on pcmk_remote4: 0 ++native_color: FAKE37 allocation score on pcmk_remote5: 0 ++native_color: FAKE38 allocation score on pcmk1: 0 ++native_color: FAKE38 allocation score on pcmk2: 0 ++native_color: FAKE38 allocation score on pcmk3: 0 ++native_color: FAKE38 allocation score on pcmk4: 0 ++native_color: FAKE38 allocation score on pcmk_remote1: 0 ++native_color: FAKE38 allocation score on pcmk_remote2: 0 ++native_color: FAKE38 allocation score on pcmk_remote3: 0 ++native_color: FAKE38 allocation score on pcmk_remote4: 0 ++native_color: FAKE38 allocation score on pcmk_remote5: 0 ++native_color: FAKE39 allocation score on pcmk1: 0 ++native_color: FAKE39 allocation score on pcmk2: 0 ++native_color: FAKE39 allocation score on pcmk3: 0 ++native_color: FAKE39 allocation score on pcmk4: 0 ++native_color: FAKE39 allocation score on pcmk_remote1: 0 ++native_color: FAKE39 allocation score on pcmk_remote2: 0 ++native_color: FAKE39 allocation score on pcmk_remote3: 0 ++native_color: FAKE39 allocation score on pcmk_remote4: 0 ++native_color: FAKE39 allocation score on pcmk_remote5: 0 ++native_color: FAKE4 allocation score on pcmk1: 0 ++native_color: FAKE4 allocation score on pcmk2: 0 ++native_color: FAKE4 allocation score on pcmk3: 0 ++native_color: FAKE4 allocation score on pcmk4: 0 ++native_color: FAKE4 allocation score on pcmk_remote1: 0 ++native_color: FAKE4 allocation score on pcmk_remote2: 0 ++native_color: FAKE4 allocation score on pcmk_remote3: 0 ++native_color: FAKE4 allocation score on pcmk_remote4: 0 ++native_color: FAKE4 allocation score on pcmk_remote5: 0 ++native_color: FAKE40 allocation score on pcmk1: 0 ++native_color: FAKE40 allocation score on pcmk2: 0 ++native_color: FAKE40 allocation score on pcmk3: 0 ++native_color: FAKE40 allocation score on pcmk4: 0 ++native_color: FAKE40 allocation score on pcmk_remote1: 0 ++native_color: FAKE40 allocation score on pcmk_remote2: 0 ++native_color: FAKE40 allocation score on pcmk_remote3: 0 ++native_color: FAKE40 allocation score on pcmk_remote4: 0 ++native_color: FAKE40 allocation score on pcmk_remote5: 0 ++native_color: FAKE41 allocation score on pcmk1: 0 ++native_color: FAKE41 allocation score on pcmk2: 0 ++native_color: FAKE41 allocation score on pcmk3: 0 ++native_color: FAKE41 allocation score on pcmk4: 0 ++native_color: FAKE41 allocation score on pcmk_remote1: 0 ++native_color: FAKE41 allocation score on pcmk_remote2: 0 ++native_color: FAKE41 allocation score on pcmk_remote3: 0 ++native_color: FAKE41 allocation score on pcmk_remote4: 0 ++native_color: FAKE41 allocation score on pcmk_remote5: 0 ++native_color: FAKE42 allocation score on pcmk1: 0 ++native_color: FAKE42 allocation score on pcmk2: 0 ++native_color: FAKE42 allocation score on pcmk3: 0 ++native_color: FAKE42 allocation score on pcmk4: 0 ++native_color: FAKE42 allocation score on pcmk_remote1: 0 ++native_color: FAKE42 allocation score on pcmk_remote2: 0 ++native_color: FAKE42 allocation score on pcmk_remote3: 0 ++native_color: FAKE42 allocation score on pcmk_remote4: 0 ++native_color: FAKE42 allocation score on pcmk_remote5: 0 ++native_color: FAKE43 allocation score on pcmk1: 0 ++native_color: FAKE43 allocation score on pcmk2: 0 ++native_color: FAKE43 allocation score on pcmk3: 0 ++native_color: FAKE43 allocation score on pcmk4: 0 ++native_color: FAKE43 allocation score on pcmk_remote1: 0 ++native_color: FAKE43 allocation score on pcmk_remote2: 0 ++native_color: FAKE43 allocation score on pcmk_remote3: 0 ++native_color: FAKE43 allocation score on pcmk_remote4: 0 ++native_color: FAKE43 allocation score on pcmk_remote5: 0 ++native_color: FAKE44 allocation score on pcmk1: 0 ++native_color: FAKE44 allocation score on pcmk2: 0 ++native_color: FAKE44 allocation score on pcmk3: 0 ++native_color: FAKE44 allocation score on pcmk4: 0 ++native_color: FAKE44 allocation score on pcmk_remote1: 0 ++native_color: FAKE44 allocation score on pcmk_remote2: 0 ++native_color: FAKE44 allocation score on pcmk_remote3: 0 ++native_color: FAKE44 allocation score on pcmk_remote4: 0 ++native_color: FAKE44 allocation score on pcmk_remote5: 0 ++native_color: FAKE45 allocation score on pcmk1: 0 ++native_color: FAKE45 allocation score on pcmk2: 0 ++native_color: FAKE45 allocation score on pcmk3: 0 ++native_color: FAKE45 allocation score on pcmk4: 0 ++native_color: FAKE45 allocation score on pcmk_remote1: 0 ++native_color: FAKE45 allocation score on pcmk_remote2: 0 ++native_color: FAKE45 allocation score on pcmk_remote3: 0 ++native_color: FAKE45 allocation score on pcmk_remote4: 0 ++native_color: FAKE45 allocation score on pcmk_remote5: 0 ++native_color: FAKE46 allocation score on pcmk1: 0 ++native_color: FAKE46 allocation score on pcmk2: 0 ++native_color: FAKE46 allocation score on pcmk3: 0 ++native_color: FAKE46 allocation score on pcmk4: 0 ++native_color: FAKE46 allocation score on pcmk_remote1: 0 ++native_color: FAKE46 allocation score on pcmk_remote2: 0 ++native_color: FAKE46 allocation score on pcmk_remote3: 0 ++native_color: FAKE46 allocation score on pcmk_remote4: 0 ++native_color: FAKE46 allocation score on pcmk_remote5: 0 ++native_color: FAKE47 allocation score on pcmk1: 0 ++native_color: FAKE47 allocation score on pcmk2: 0 ++native_color: FAKE47 allocation score on pcmk3: 0 ++native_color: FAKE47 allocation score on pcmk4: 0 ++native_color: FAKE47 allocation score on pcmk_remote1: 0 ++native_color: FAKE47 allocation score on pcmk_remote2: 0 ++native_color: FAKE47 allocation score on pcmk_remote3: 0 ++native_color: FAKE47 allocation score on pcmk_remote4: 0 ++native_color: FAKE47 allocation score on pcmk_remote5: 0 ++native_color: FAKE48 allocation score on pcmk1: 0 ++native_color: FAKE48 allocation score on pcmk2: 0 ++native_color: FAKE48 allocation score on pcmk3: 0 ++native_color: FAKE48 allocation score on pcmk4: 0 ++native_color: FAKE48 allocation score on pcmk_remote1: 0 ++native_color: FAKE48 allocation score on pcmk_remote2: 0 ++native_color: FAKE48 allocation score on pcmk_remote3: 0 ++native_color: FAKE48 allocation score on pcmk_remote4: 0 ++native_color: FAKE48 allocation score on pcmk_remote5: 0 ++native_color: FAKE49 allocation score on pcmk1: 0 ++native_color: FAKE49 allocation score on pcmk2: 0 ++native_color: FAKE49 allocation score on pcmk3: 0 ++native_color: FAKE49 allocation score on pcmk4: 0 ++native_color: FAKE49 allocation score on pcmk_remote1: 0 ++native_color: FAKE49 allocation score on pcmk_remote2: 0 ++native_color: FAKE49 allocation score on pcmk_remote3: 0 ++native_color: FAKE49 allocation score on pcmk_remote4: 0 ++native_color: FAKE49 allocation score on pcmk_remote5: 0 ++native_color: FAKE5 allocation score on pcmk1: 0 ++native_color: FAKE5 allocation score on pcmk2: 0 ++native_color: FAKE5 allocation score on pcmk3: 0 ++native_color: FAKE5 allocation score on pcmk4: 0 ++native_color: FAKE5 allocation score on pcmk_remote1: 0 ++native_color: FAKE5 allocation score on pcmk_remote2: 0 ++native_color: FAKE5 allocation score on pcmk_remote3: 0 ++native_color: FAKE5 allocation score on pcmk_remote4: 0 ++native_color: FAKE5 allocation score on pcmk_remote5: 0 ++native_color: FAKE50 allocation score on pcmk1: 0 ++native_color: FAKE50 allocation score on pcmk2: 0 ++native_color: FAKE50 allocation score on pcmk3: 0 ++native_color: FAKE50 allocation score on pcmk4: 0 ++native_color: FAKE50 allocation score on pcmk_remote1: 0 ++native_color: FAKE50 allocation score on pcmk_remote2: 0 ++native_color: FAKE50 allocation score on pcmk_remote3: 0 ++native_color: FAKE50 allocation score on pcmk_remote4: 0 ++native_color: FAKE50 allocation score on pcmk_remote5: 0 ++native_color: FAKE6 allocation score on pcmk1: 0 ++native_color: FAKE6 allocation score on pcmk2: 0 ++native_color: FAKE6 allocation score on pcmk3: 0 ++native_color: FAKE6 allocation score on pcmk4: 0 ++native_color: FAKE6 allocation score on pcmk_remote1: 0 ++native_color: FAKE6 allocation score on pcmk_remote2: 0 ++native_color: FAKE6 allocation score on pcmk_remote3: 0 ++native_color: FAKE6 allocation score on pcmk_remote4: 0 ++native_color: FAKE6 allocation score on pcmk_remote5: 0 ++native_color: FAKE7 allocation score on pcmk1: 0 ++native_color: FAKE7 allocation score on pcmk2: 0 ++native_color: FAKE7 allocation score on pcmk3: 0 ++native_color: FAKE7 allocation score on pcmk4: 0 ++native_color: FAKE7 allocation score on pcmk_remote1: 0 ++native_color: FAKE7 allocation score on pcmk_remote2: 0 ++native_color: FAKE7 allocation score on pcmk_remote3: 0 ++native_color: FAKE7 allocation score on pcmk_remote4: 0 ++native_color: FAKE7 allocation score on pcmk_remote5: 0 ++native_color: FAKE8 allocation score on pcmk1: 0 ++native_color: FAKE8 allocation score on pcmk2: 0 ++native_color: FAKE8 allocation score on pcmk3: 0 ++native_color: FAKE8 allocation score on pcmk4: 0 ++native_color: FAKE8 allocation score on pcmk_remote1: 0 ++native_color: FAKE8 allocation score on pcmk_remote2: 0 ++native_color: FAKE8 allocation score on pcmk_remote3: 0 ++native_color: FAKE8 allocation score on pcmk_remote4: 0 ++native_color: FAKE8 allocation score on pcmk_remote5: 0 ++native_color: FAKE9 allocation score on pcmk1: 0 ++native_color: FAKE9 allocation score on pcmk2: 0 ++native_color: FAKE9 allocation score on pcmk3: 0 ++native_color: FAKE9 allocation score on pcmk4: 0 ++native_color: FAKE9 allocation score on pcmk_remote1: 0 ++native_color: FAKE9 allocation score on pcmk_remote2: 0 ++native_color: FAKE9 allocation score on pcmk_remote3: 0 ++native_color: FAKE9 allocation score on pcmk_remote4: 0 ++native_color: FAKE9 allocation score on pcmk_remote5: 0 ++native_color: pcmk_remote1 allocation score on pcmk1: 0 ++native_color: pcmk_remote1 allocation score on pcmk2: 0 ++native_color: pcmk_remote1 allocation score on pcmk3: 0 ++native_color: pcmk_remote1 allocation score on pcmk4: 0 ++native_color: pcmk_remote1 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote1 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk1: 0 ++native_color: pcmk_remote2 allocation score on pcmk2: 0 ++native_color: pcmk_remote2 allocation score on pcmk3: 0 ++native_color: pcmk_remote2 allocation score on pcmk4: 0 ++native_color: pcmk_remote2 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote2 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk1: 0 ++native_color: pcmk_remote3 allocation score on pcmk2: 0 ++native_color: pcmk_remote3 allocation score on pcmk3: 0 ++native_color: pcmk_remote3 allocation score on pcmk4: 0 ++native_color: pcmk_remote3 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote3 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk1: 0 ++native_color: pcmk_remote4 allocation score on pcmk2: 0 ++native_color: pcmk_remote4 allocation score on pcmk3: 0 ++native_color: pcmk_remote4 allocation score on pcmk4: 0 ++native_color: pcmk_remote4 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote4 allocation score on pcmk_remote5: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk1: 0 ++native_color: pcmk_remote5 allocation score on pcmk2: 0 ++native_color: pcmk_remote5 allocation score on pcmk3: 0 ++native_color: pcmk_remote5 allocation score on pcmk4: 0 ++native_color: pcmk_remote5 allocation score on pcmk_remote1: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote2: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote3: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote4: -INFINITY ++native_color: pcmk_remote5 allocation score on pcmk_remote5: -INFINITY ++native_color: shooter allocation score on pcmk1: 0 ++native_color: shooter allocation score on pcmk2: 0 ++native_color: shooter allocation score on pcmk3: 0 ++native_color: shooter allocation score on pcmk4: 0 ++native_color: shooter allocation score on pcmk_remote1: -INFINITY ++native_color: shooter allocation score on pcmk_remote2: -INFINITY ++native_color: shooter allocation score on pcmk_remote3: -INFINITY ++native_color: shooter allocation score on pcmk_remote4: -INFINITY ++native_color: shooter allocation score on pcmk_remote5: -INFINITY +diff --git a/pengine/test10/remote-partial-migrate2.summary b/pengine/test10/remote-partial-migrate2.summary +new file mode 100644 +index 0000000..6a65975 +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate2.summary +@@ -0,0 +1,207 @@ ++ ++Current cluster status: ++Node pcmk4 (4): UNCLEAN (offline) ++Online: [ pcmk1 pcmk2 pcmk3 ] ++RemoteOnline: [ pcmk_remote1 pcmk_remote2 pcmk_remote3 pcmk_remote5 ] ++RemoteOFFLINE: [ pcmk_remote4 ] ++ ++ shooter (stonith:fence_docker_cts): Started pcmk3 ++ pcmk_remote1 (ocf::pacemaker:remote): Started pcmk1 ++ pcmk_remote2 (ocf::pacemaker:remote): Started [ pcmk1 pcmk3 ] ++ pcmk_remote3 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote4 (ocf::pacemaker:remote): Stopped ++ pcmk_remote5 (ocf::pacemaker:remote): Started pcmk1 ++ FAKE1 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE2 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE3 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE4 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE5 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE6 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE7 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE8 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE9 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE10 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE11 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE12 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE13 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE14 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE15 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE16 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE17 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE18 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE19 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE20 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE21 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE22 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE23 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE24 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE25 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE26 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE27 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE28 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE29 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE30 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE31 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE32 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE33 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE34 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE35 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE36 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE37 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE38 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE39 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE40 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE41 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE42 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE43 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE44 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE45 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE46 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE47 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE48 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE49 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE50 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ ++Transition Summary: ++ * Migrate pcmk_remote2 (Started pcmk3 -> pcmk1) ++ * Start pcmk_remote4 (pcmk2) ++ * Migrate pcmk_remote5 (Started pcmk1 -> pcmk2) ++ * Move FAKE5 (Started pcmk1 -> pcmk_remote4) ++ * Move FAKE9 (Started pcmk2 -> pcmk_remote4) ++ * Move FAKE12 (Started pcmk1 -> pcmk2) ++ * Move FAKE14 (Started pcmk2 -> pcmk_remote1) ++ * Move FAKE17 (Started pcmk_remote1 -> pcmk_remote4) ++ * Move FAKE25 (Started pcmk_remote1 -> pcmk_remote4) ++ * Move FAKE28 (Started pcmk3 -> pcmk1) ++ * Move FAKE30 (Started pcmk1 -> pcmk_remote1) ++ * Move FAKE33 (Started pcmk_remote1 -> pcmk_remote4) ++ * Move FAKE38 (Started pcmk2 -> pcmk_remote1) ++ * Move FAKE39 (Started pcmk1 -> pcmk_remote2) ++ * Move FAKE41 (Started pcmk_remote2 -> pcmk_remote4) ++ * Move FAKE47 (Started pcmk_remote1 -> pcmk_remote2) ++ * Move FAKE48 (Started pcmk1 -> pcmk_remote3) ++ * Move FAKE49 (Started pcmk_remote3 -> pcmk_remote4) ++ ++Executing cluster transition: ++ * Resource action: FAKE5 stop on pcmk1 ++ * Resource action: FAKE9 stop on pcmk2 ++ * Resource action: FAKE12 stop on pcmk1 ++ * Resource action: FAKE14 stop on pcmk2 ++ * Resource action: FAKE17 stop on pcmk_remote1 ++ * Resource action: FAKE25 stop on pcmk_remote1 ++ * Resource action: FAKE28 stop on pcmk3 ++ * Resource action: FAKE30 stop on pcmk1 ++ * Resource action: FAKE33 stop on pcmk_remote1 ++ * Resource action: FAKE38 stop on pcmk2 ++ * Resource action: FAKE39 stop on pcmk1 ++ * Resource action: FAKE47 stop on pcmk_remote1 ++ * Resource action: FAKE48 stop on pcmk1 ++ * Resource action: FAKE49 stop on pcmk_remote3 ++ * Fencing pcmk4 (reboot) ++ * Pseudo action: stonith_complete ++ * Resource action: pcmk_remote2 migrate_from on pcmk1 ++ * Resource action: pcmk_remote2 stop on pcmk3 ++ * Resource action: pcmk_remote4 start on pcmk2 ++ * Resource action: pcmk_remote5 migrate_to on pcmk1 ++ * Resource action: FAKE5 start on pcmk_remote4 ++ * Resource action: FAKE9 start on pcmk_remote4 ++ * Resource action: FAKE12 start on pcmk2 ++ * Resource action: FAKE14 start on pcmk_remote1 ++ * Resource action: FAKE17 start on pcmk_remote4 ++ * Resource action: FAKE25 start on pcmk_remote4 ++ * Resource action: FAKE28 start on pcmk1 ++ * Resource action: FAKE30 start on pcmk_remote1 ++ * Resource action: FAKE33 start on pcmk_remote4 ++ * Resource action: FAKE38 start on pcmk_remote1 ++ * Resource action: FAKE48 start on pcmk_remote3 ++ * Resource action: FAKE49 start on pcmk_remote4 ++ * Pseudo action: pcmk_remote2_start_0 ++ * Resource action: pcmk_remote4 monitor=60000 on pcmk2 ++ * Resource action: pcmk_remote5 migrate_from on pcmk2 ++ * Resource action: pcmk_remote5 stop on pcmk1 ++ * Resource action: FAKE5 monitor=10000 on pcmk_remote4 ++ * Resource action: FAKE9 monitor=10000 on pcmk_remote4 ++ * Resource action: FAKE12 monitor=10000 on pcmk2 ++ * Resource action: FAKE14 monitor=10000 on pcmk_remote1 ++ * Resource action: FAKE17 monitor=10000 on pcmk_remote4 ++ * Resource action: FAKE25 monitor=10000 on pcmk_remote4 ++ * Resource action: FAKE28 monitor=10000 on pcmk1 ++ * Resource action: FAKE30 monitor=10000 on pcmk_remote1 ++ * Resource action: FAKE33 monitor=10000 on pcmk_remote4 ++ * Resource action: FAKE38 monitor=10000 on pcmk_remote1 ++ * Resource action: FAKE39 start on pcmk_remote2 ++ * Resource action: FAKE41 stop on pcmk_remote2 ++ * Resource action: FAKE47 start on pcmk_remote2 ++ * Resource action: FAKE48 monitor=10000 on pcmk_remote3 ++ * Resource action: FAKE49 monitor=10000 on pcmk_remote4 ++ * Pseudo action: all_stopped ++ * Resource action: pcmk_remote2 monitor=60000 on pcmk1 ++ * Pseudo action: pcmk_remote5_start_0 ++ * Resource action: FAKE39 monitor=10000 on pcmk_remote2 ++ * Resource action: FAKE41 start on pcmk_remote4 ++ * Resource action: FAKE47 monitor=10000 on pcmk_remote2 ++ * Resource action: pcmk_remote5 monitor=60000 on pcmk2 ++ * Resource action: FAKE41 monitor=10000 on pcmk_remote4 ++ ++Revised cluster status: ++Online: [ pcmk1 pcmk2 pcmk3 ] ++OFFLINE: [ pcmk4 ] ++RemoteOnline: [ pcmk_remote1 pcmk_remote2 pcmk_remote3 pcmk_remote4 pcmk_remote5 ] ++ ++ shooter (stonith:fence_docker_cts): Started pcmk3 ++ pcmk_remote1 (ocf::pacemaker:remote): Started pcmk1 ++ pcmk_remote2 (ocf::pacemaker:remote): Started pcmk1 ++ pcmk_remote3 (ocf::pacemaker:remote): Started pcmk3 ++ pcmk_remote4 (ocf::pacemaker:remote): Started pcmk2 ++ pcmk_remote5 (ocf::pacemaker:remote): Started pcmk2 ++ FAKE1 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE2 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE3 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE4 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE5 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE6 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE7 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE8 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE9 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE10 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE11 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE12 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE13 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE14 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE15 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE16 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE17 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE18 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE19 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE20 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE21 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE22 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE23 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE24 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE25 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE26 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE27 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE28 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE29 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE30 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE31 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE32 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE33 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE34 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE35 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE36 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE37 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE38 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE39 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE40 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE41 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE42 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ FAKE43 (ocf::heartbeat:Dummy): Started pcmk_remote1 ++ FAKE44 (ocf::heartbeat:Dummy): Started pcmk2 ++ FAKE45 (ocf::heartbeat:Dummy): Started pcmk3 ++ FAKE46 (ocf::heartbeat:Dummy): Started pcmk1 ++ FAKE47 (ocf::heartbeat:Dummy): Started pcmk_remote2 ++ FAKE48 (ocf::heartbeat:Dummy): Started pcmk_remote3 ++ FAKE49 (ocf::heartbeat:Dummy): Started pcmk_remote4 ++ FAKE50 (ocf::heartbeat:Dummy): Started pcmk_remote5 ++ +diff --git a/pengine/test10/remote-partial-migrate2.xml b/pengine/test10/remote-partial-migrate2.xml +new file mode 100644 +index 0000000..ed9299b +--- /dev/null ++++ b/pengine/test10/remote-partial-migrate2.xml +@@ -0,0 +1,1947 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-recover-fail.dot b/pengine/test10/remote-recover-fail.dot +new file mode 100644 +index 0000000..a920089 +--- /dev/null ++++ b/pengine/test10/remote-recover-fail.dot +@@ -0,0 +1,36 @@ ++ digraph "g" { ++"FAKE1_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"FAKE1_start_0 rhel7-auto2" -> "FAKE1_monitor_10000 rhel7-auto2" [ style = bold] ++"FAKE1_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"FAKE2_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"FAKE2_start_0 rhel7-auto3" -> "FAKE2_monitor_10000 rhel7-auto3" [ style = bold] ++"FAKE2_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"FAKE2_stop_0 rhel7-auto4" -> "FAKE2_start_0 rhel7-auto3" [ style = bold] ++"FAKE2_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"FAKE2_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="orange"] ++"FAKE3_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"FAKE4_monitor_10000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"FAKE6_monitor_10000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"FAKE6_start_0 rhel7-auto2" -> "FAKE6_monitor_10000 rhel7-auto2" [ style = bold] ++"FAKE6_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"FAKE6_stop_0 rhel7-auto4" -> "FAKE6_start_0 rhel7-auto2" [ style = bold] ++"FAKE6_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] ++"FAKE6_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="orange"] ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"rhel7-auto4_monitor_60000 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_start_0 rhel7-auto2" -> "rhel7-auto4_monitor_60000 rhel7-auto2" [ style = bold] ++"rhel7-auto4_start_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_stop_0 rhel7-auto2" -> "all_stopped" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto2" -> "rhel7-auto4_start_0 rhel7-auto2" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++"stonith 'reboot' rhel7-auto4" -> "FAKE2_stop_0 rhel7-auto4" [ style = bold] ++"stonith 'reboot' rhel7-auto4" -> "FAKE6_stop_0 rhel7-auto4" [ style = bold] ++"stonith 'reboot' rhel7-auto4" -> "stonith_complete" [ style = bold] ++"stonith 'reboot' rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"stonith_complete" -> "FAKE1_start_0 rhel7-auto2" [ style = bold] ++"stonith_complete" -> "FAKE2_start_0 rhel7-auto3" [ style = bold] ++"stonith_complete" -> "FAKE6_start_0 rhel7-auto2" [ style = bold] ++"stonith_complete" -> "all_stopped" [ style = bold] ++"stonith_complete" -> "rhel7-auto4_start_0 rhel7-auto2" [ style = bold] ++"stonith_complete" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/remote-recover-fail.exp b/pengine/test10/remote-recover-fail.exp +new file mode 100644 +index 0000000..dee4acf +--- /dev/null ++++ b/pengine/test10/remote-recover-fail.exp +@@ -0,0 +1,207 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-recover-fail.scores b/pengine/test10/remote-recover-fail.scores +new file mode 100644 +index 0000000..8fc7805 +--- /dev/null ++++ b/pengine/test10/remote-recover-fail.scores +@@ -0,0 +1,33 @@ ++Allocation scores: ++native_color: FAKE1 allocation score on rhel7-auto1: 0 ++native_color: FAKE1 allocation score on rhel7-auto2: 0 ++native_color: FAKE1 allocation score on rhel7-auto3: 0 ++native_color: FAKE1 allocation score on rhel7-auto4: 0 ++native_color: FAKE2 allocation score on rhel7-auto1: 0 ++native_color: FAKE2 allocation score on rhel7-auto2: 0 ++native_color: FAKE2 allocation score on rhel7-auto3: 0 ++native_color: FAKE2 allocation score on rhel7-auto4: 0 ++native_color: FAKE3 allocation score on rhel7-auto1: 0 ++native_color: FAKE3 allocation score on rhel7-auto2: 0 ++native_color: FAKE3 allocation score on rhel7-auto3: 0 ++native_color: FAKE3 allocation score on rhel7-auto4: 0 ++native_color: FAKE4 allocation score on rhel7-auto1: 0 ++native_color: FAKE4 allocation score on rhel7-auto2: 0 ++native_color: FAKE4 allocation score on rhel7-auto3: 0 ++native_color: FAKE4 allocation score on rhel7-auto4: 0 ++native_color: FAKE5 allocation score on rhel7-auto1: 0 ++native_color: FAKE5 allocation score on rhel7-auto2: 0 ++native_color: FAKE5 allocation score on rhel7-auto3: 0 ++native_color: FAKE5 allocation score on rhel7-auto4: 0 ++native_color: FAKE6 allocation score on rhel7-auto1: 0 ++native_color: FAKE6 allocation score on rhel7-auto2: 0 ++native_color: FAKE6 allocation score on rhel7-auto3: 0 ++native_color: FAKE6 allocation score on rhel7-auto4: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto1: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto2: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto3: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: -INFINITY +diff --git a/pengine/test10/remote-recover-fail.summary b/pengine/test10/remote-recover-fail.summary +new file mode 100644 +index 0000000..2811fdc +--- /dev/null ++++ b/pengine/test10/remote-recover-fail.summary +@@ -0,0 +1,53 @@ ++ ++Current cluster status: ++RemoteNode rhel7-auto4: UNCLEAN (offline) ++Online: [ rhel7-auto2 rhel7-auto3 ] ++OFFLINE: [ rhel7-auto1 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto3 ++ rhel7-auto4 (ocf::pacemaker:remote): FAILED rhel7-auto2 ++ FAKE1 (ocf::heartbeat:Dummy): Stopped ++ FAKE2 (ocf::heartbeat:Dummy): Started rhel7-auto4 ++ FAKE3 (ocf::heartbeat:Dummy): Started rhel7-auto2 ++ FAKE4 (ocf::heartbeat:Dummy): Started rhel7-auto3 ++ FAKE5 (ocf::heartbeat:Dummy): Started rhel7-auto3 ++ FAKE6 (ocf::heartbeat:Dummy): Started rhel7-auto4 ++ ++Transition Summary: ++ * Recover rhel7-auto4 (Started rhel7-auto2) ++ * Start FAKE1 (rhel7-auto2) ++ * Move FAKE2 (Started rhel7-auto4 -> rhel7-auto3) ++ * Move FAKE6 (Started rhel7-auto4 -> rhel7-auto2) ++ ++Executing cluster transition: ++ * Resource action: rhel7-auto4 stop on rhel7-auto2 ++ * Resource action: FAKE3 monitor=10000 on rhel7-auto2 ++ * Resource action: FAKE4 monitor=10000 on rhel7-auto3 ++ * Fencing rhel7-auto4 (reboot) ++ * Pseudo action: stonith_complete ++ * Resource action: rhel7-auto4 start on rhel7-auto2 ++ * Resource action: FAKE1 start on rhel7-auto2 ++ * Pseudo action: FAKE2_stop_0 ++ * Pseudo action: FAKE6_stop_0 ++ * Pseudo action: all_stopped ++ * Resource action: rhel7-auto4 monitor=60000 on rhel7-auto2 ++ * Resource action: FAKE1 monitor=10000 on rhel7-auto2 ++ * Resource action: FAKE2 start on rhel7-auto3 ++ * Resource action: FAKE6 start on rhel7-auto2 ++ * Resource action: FAKE2 monitor=10000 on rhel7-auto3 ++ * Resource action: FAKE6 monitor=10000 on rhel7-auto2 ++ ++Revised cluster status: ++Online: [ rhel7-auto2 rhel7-auto3 ] ++OFFLINE: [ rhel7-auto1 ] ++RemoteOnline: [ rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto3 ++ rhel7-auto4 (ocf::pacemaker:remote): Started rhel7-auto2 ++ FAKE1 (ocf::heartbeat:Dummy): Started rhel7-auto2 ++ FAKE2 (ocf::heartbeat:Dummy): Started rhel7-auto3 ++ FAKE3 (ocf::heartbeat:Dummy): Started rhel7-auto2 ++ FAKE4 (ocf::heartbeat:Dummy): Started rhel7-auto3 ++ FAKE5 (ocf::heartbeat:Dummy): Started rhel7-auto3 ++ FAKE6 (ocf::heartbeat:Dummy): Started rhel7-auto2 ++ +diff --git a/pengine/test10/remote-recover-fail.xml b/pengine/test10/remote-recover-fail.xml +new file mode 100644 +index 0000000..8703e75 +--- /dev/null ++++ b/pengine/test10/remote-recover-fail.xml +@@ -0,0 +1,198 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-recover.dot b/pengine/test10/remote-recover.dot +index 1da6a7b..22e0cc7 100644 +--- a/pengine/test10/remote-recover.dot ++++ b/pengine/test10/remote-recover.dot +@@ -9,6 +9,7 @@ + "rhel7-alt4_monitor_60000 rhel7-alt1" [ style=bold color="green" fontcolor="black"] + "rhel7-alt4_start_0 rhel7-alt1" -> "fake_monitor_10000 rhel7-alt4" [ style = bold] + "rhel7-alt4_start_0 rhel7-alt1" -> "fake_start_0 rhel7-alt4" [ style = bold] ++"rhel7-alt4_start_0 rhel7-alt1" -> "fake_stop_0 rhel7-alt4" [ style = bold] + "rhel7-alt4_start_0 rhel7-alt1" -> "rhel7-alt4_monitor_60000 rhel7-alt1" [ style = bold] + "rhel7-alt4_start_0 rhel7-alt1" [ style=bold color="green" fontcolor="black"] + "shooter_monitor_60000 rhel7-alt1" [ style=bold color="green" fontcolor="black"] +diff --git a/pengine/test10/remote-recover.exp b/pengine/test10/remote-recover.exp +index 37e4f71..6386740 100644 +--- a/pengine/test10/remote-recover.exp ++++ b/pengine/test10/remote-recover.exp +@@ -82,7 +82,11 @@ + + + +- ++ ++ ++ ++ ++ + + + +diff --git a/pengine/test10/remote-start-fail.dot b/pengine/test10/remote-start-fail.dot +new file mode 100644 +index 0000000..26c9f33 +--- /dev/null ++++ b/pengine/test10/remote-start-fail.dot +@@ -0,0 +1,9 @@ ++ digraph "g" { ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"rhel7-auto4_monitor_60000 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_start_0 rhel7-auto3" -> "rhel7-auto4_monitor_60000 rhel7-auto3" [ style = bold] ++"rhel7-auto4_start_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_stop_0 rhel7-auto2" -> "all_stopped" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto2" -> "rhel7-auto4_start_0 rhel7-auto3" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/pengine/test10/remote-start-fail.exp b/pengine/test10/remote-start-fail.exp +new file mode 100644 +index 0000000..6e2ce8b +--- /dev/null ++++ b/pengine/test10/remote-start-fail.exp +@@ -0,0 +1,49 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-start-fail.scores b/pengine/test10/remote-start-fail.scores +new file mode 100644 +index 0000000..d36577f +--- /dev/null ++++ b/pengine/test10/remote-start-fail.scores +@@ -0,0 +1,9 @@ ++Allocation scores: ++native_color: rhel7-auto4 allocation score on rhel7-auto1: -INFINITY ++native_color: rhel7-auto4 allocation score on rhel7-auto2: -INFINITY ++native_color: rhel7-auto4 allocation score on rhel7-auto3: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: -INFINITY +diff --git a/pengine/test10/remote-start-fail.summary b/pengine/test10/remote-start-fail.summary +new file mode 100644 +index 0000000..4f64c75 +--- /dev/null ++++ b/pengine/test10/remote-start-fail.summary +@@ -0,0 +1,24 @@ ++ ++Current cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++RemoteOFFLINE: [ rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ rhel7-auto4 (ocf::pacemaker:remote): FAILED rhel7-auto2 ++ ++Transition Summary: ++ * Recover rhel7-auto4 (Started rhel7-auto2 -> rhel7-auto3) ++ ++Executing cluster transition: ++ * Resource action: rhel7-auto4 stop on rhel7-auto2 ++ * Pseudo action: all_stopped ++ * Resource action: rhel7-auto4 start on rhel7-auto3 ++ * Resource action: rhel7-auto4 monitor=60000 on rhel7-auto3 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++RemoteOnline: [ rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto1 ++ rhel7-auto4 (ocf::pacemaker:remote): Started rhel7-auto3 ++ +diff --git a/pengine/test10/remote-start-fail.xml b/pengine/test10/remote-start-fail.xml +new file mode 100644 +index 0000000..7f92eaf +--- /dev/null ++++ b/pengine/test10/remote-start-fail.xml +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-unclean2.dot b/pengine/test10/remote-unclean2.dot +new file mode 100644 +index 0000000..3f8981b +--- /dev/null ++++ b/pengine/test10/remote-unclean2.dot +@@ -0,0 +1,14 @@ ++ digraph "g" { ++"all_stopped" [ style=bold color="green" fontcolor="orange"] ++"rhel7-auto4_monitor_60000 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_start_0 rhel7-auto1" -> "rhel7-auto4_monitor_60000 rhel7-auto1" [ style = bold] ++"rhel7-auto4_start_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"rhel7-auto4_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto1" -> "rhel7-auto4_start_0 rhel7-auto1" [ style = bold] ++"rhel7-auto4_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] ++"stonith 'reboot' rhel7-auto4" -> "stonith_complete" [ style = bold] ++"stonith 'reboot' rhel7-auto4" [ style=bold color="green" fontcolor="black"] ++"stonith_complete" -> "all_stopped" [ style = bold] ++"stonith_complete" -> "rhel7-auto4_start_0 rhel7-auto1" [ style = bold] ++"stonith_complete" [ style=bold color="green" fontcolor="orange"] ++} +diff --git a/pengine/test10/remote-unclean2.exp b/pengine/test10/remote-unclean2.exp +new file mode 100644 +index 0000000..19d5863 +--- /dev/null ++++ b/pengine/test10/remote-unclean2.exp +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/remote-unclean2.scores b/pengine/test10/remote-unclean2.scores +new file mode 100644 +index 0000000..72a5953 +--- /dev/null ++++ b/pengine/test10/remote-unclean2.scores +@@ -0,0 +1,9 @@ ++Allocation scores: ++native_color: rhel7-auto4 allocation score on rhel7-auto1: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto2: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto3: 0 ++native_color: rhel7-auto4 allocation score on rhel7-auto4: -INFINITY ++native_color: shooter allocation score on rhel7-auto1: 0 ++native_color: shooter allocation score on rhel7-auto2: 0 ++native_color: shooter allocation score on rhel7-auto3: 0 ++native_color: shooter allocation score on rhel7-auto4: -INFINITY +diff --git a/pengine/test10/remote-unclean2.summary b/pengine/test10/remote-unclean2.summary +new file mode 100644 +index 0000000..0a73cbd +--- /dev/null ++++ b/pengine/test10/remote-unclean2.summary +@@ -0,0 +1,26 @@ ++ ++Current cluster status: ++RemoteNode rhel7-auto4: UNCLEAN (offline) ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto2 ++ rhel7-auto4 (ocf::pacemaker:remote): FAILED rhel7-auto1 ++ ++Transition Summary: ++ * Recover rhel7-auto4 (Started rhel7-auto1) ++ ++Executing cluster transition: ++ * Resource action: rhel7-auto4 stop on rhel7-auto1 ++ * Fencing rhel7-auto4 (reboot) ++ * Pseudo action: stonith_complete ++ * Pseudo action: all_stopped ++ * Resource action: rhel7-auto4 start on rhel7-auto1 ++ * Resource action: rhel7-auto4 monitor=60000 on rhel7-auto1 ++ ++Revised cluster status: ++Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] ++RemoteOnline: [ rhel7-auto4 ] ++ ++ shooter (stonith:fence_xvm): Started rhel7-auto2 ++ rhel7-auto4 (ocf::pacemaker:remote): Started rhel7-auto1 ++ +diff --git a/pengine/test10/remote-unclean2.xml b/pengine/test10/remote-unclean2.xml +new file mode 100644 +index 0000000..616b482 +--- /dev/null ++++ b/pengine/test10/remote-unclean2.xml +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/pengine/test10/whitebox-migrate1.exp b/pengine/test10/whitebox-migrate1.exp +index 0a2b5ac..ce77eb1 100644 +--- a/pengine/test10/whitebox-migrate1.exp ++++ b/pengine/test10/whitebox-migrate1.exp +@@ -152,7 +152,7 @@ + + + +- ++ + + + diff --git a/SOURCES/pacemaker-3414f1cd3ebcc2e6f787ea14d8e31510f36fbe4a-update-membership.patch b/SOURCES/pacemaker-3414f1cd3ebcc2e6f787ea14d8e31510f36fbe4a-update-membership.patch new file mode 100644 index 0000000..2b4c369 --- /dev/null +++ b/SOURCES/pacemaker-3414f1cd3ebcc2e6f787ea14d8e31510f36fbe4a-update-membership.patch @@ -0,0 +1,36 @@ +From 3414f1cd3ebcc2e6f787ea14d8e31510f36fbe4a Mon Sep 17 00:00:00 2001 +From: Hideo Yamauchi +Date: Tue, 6 Jan 2015 16:05:34 +0900 +Subject: [PATCH] Update membership.c + +--- + crmd/membership.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/crmd/membership.c b/crmd/membership.c +index 946cde0..e1414df 100644 +--- a/crmd/membership.c ++++ b/crmd/membership.c +@@ -378,17 +378,13 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) + + g_hash_table_iter_init(&iter, crm_peer_cache); + while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { +- xmlNode *update = NULL; +- update = do_update_node_cib(node, flags, node_list, source); +- free_xml(update); ++ do_update_node_cib(node, flags, node_list, source); + } + + if (crm_remote_peer_cache) { + g_hash_table_iter_init(&iter, crm_remote_peer_cache); + while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { +- xmlNode *update = NULL; +- update = do_update_node_cib(node, flags, node_list, source); +- free_xml(update); ++ do_update_node_cib(node, flags, node_list, source); + } + } + +-- +1.8.4.2 + diff --git a/SOURCES/pacemaker-5147bbf46b81708a1ac544a4cfd204b50938c67c-crmd-memleak.patch b/SOURCES/pacemaker-5147bbf46b81708a1ac544a4cfd204b50938c67c-crmd-memleak.patch new file mode 100644 index 0000000..c3a9967 --- /dev/null +++ b/SOURCES/pacemaker-5147bbf46b81708a1ac544a4cfd204b50938c67c-crmd-memleak.patch @@ -0,0 +1,61 @@ +From 5147bbf46b81708a1ac544a4cfd204b50938c67c Mon Sep 17 00:00:00 2001 +From: Hideo Yamauchi +Date: Tue, 6 Jan 2015 13:45:19 +0900 +Subject: [PATCH] Fix: crmd: resolves memory leak in crmd. + +--- + crmd/membership.c | 10 ++++++++-- + crmd/pengine.c | 1 + + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/crmd/membership.c b/crmd/membership.c +index 9a58339..946cde0 100644 +--- a/crmd/membership.c ++++ b/crmd/membership.c +@@ -215,9 +215,11 @@ search_conflicting_node_callback(xmlNode * msg, int call_id, int rc, + crm_notice("Searching conflicting nodes for %s failed: %s (%d)", + new_node_uuid, pcmk_strerror(rc), rc); + } ++ free(new_node_uuid); + return; + + } else if (output == NULL) { ++ free(new_node_uuid); + return; + } + +@@ -376,13 +378,17 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) + + g_hash_table_iter_init(&iter, crm_peer_cache); + while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { +- do_update_node_cib(node, flags, node_list, source); ++ xmlNode *update = NULL; ++ update = do_update_node_cib(node, flags, node_list, source); ++ free_xml(update); + } + + if (crm_remote_peer_cache) { + g_hash_table_iter_init(&iter, crm_remote_peer_cache); + while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { +- do_update_node_cib(node, flags, node_list, source); ++ xmlNode *update = NULL; ++ update = do_update_node_cib(node, flags, node_list, source); ++ free_xml(update); + } + } + +diff --git a/crmd/pengine.c b/crmd/pengine.c +index 2f7513f..35f35c6 100644 +--- a/crmd/pengine.c ++++ b/crmd/pengine.c +@@ -277,6 +277,7 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value) + + free(attr_id); + } ++ freeXpathObject(xpathObj); + } + + void +-- +1.8.4.2 + diff --git a/SOURCES/pacemaker-6d482cf1c1226f75e59569b930cf916ccb0d350f-pcmk-remote-timer-fix.patch b/SOURCES/pacemaker-6d482cf1c1226f75e59569b930cf916ccb0d350f-pcmk-remote-timer-fix.patch new file mode 100644 index 0000000..701b54f --- /dev/null +++ b/SOURCES/pacemaker-6d482cf1c1226f75e59569b930cf916ccb0d350f-pcmk-remote-timer-fix.patch @@ -0,0 +1,25 @@ +From 6d482cf1c1226f75e59569b930cf916ccb0d350f Mon Sep 17 00:00:00 2001 +From: Hideo Yamauchi +Date: Fri, 10 Oct 2014 13:11:01 +0900 +Subject: [PATCH] Mistake of the set of the variable. + +--- + crmd/remote_lrmd_ra.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c +index f3dedeb..929b3f8 100644 +--- a/crmd/remote_lrmd_ra.c ++++ b/crmd/remote_lrmd_ra.c +@@ -573,7 +573,7 @@ handle_remote_ra_exec(gpointer user_data) + * cleared which will require all the resources running in the remote-node + * to be explicitly re-detected via probe actions. If the takeover does occur + * successfully, then we can leave the status section intact. */ +- cmd->monitor_timeout_id = g_timeout_add((cmd->timeout/2), connection_takeover_timeout_cb, cmd); ++ cmd->takeover_timeout_id = g_timeout_add((cmd->timeout/2), connection_takeover_timeout_cb, cmd); + ra_data->cur_cmd = cmd; + return TRUE; + } +-- +1.8.4.2 + diff --git a/SOURCES/pacemaker-7170ed-fix-acl-correctly-implement-the-reference-acl-direct.patch b/SOURCES/pacemaker-7170ed-fix-acl-correctly-implement-the-reference-acl-direct.patch new file mode 100644 index 0000000..4489278 --- /dev/null +++ b/SOURCES/pacemaker-7170ed-fix-acl-correctly-implement-the-reference-acl-direct.patch @@ -0,0 +1,26 @@ +From 7170ed6129d7381f3adab964d8295f00f7c4b776 Mon Sep 17 00:00:00 2001 +From: Andrew Beekhof +Date: Mon, 12 Jan 2015 13:45:17 +1100 +Subject: [PATCH] Fix: acl: Correctly implement the 'reference' acl directive + +--- + lib/common/xml.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/lib/common/xml.c b/lib/common/xml.c +index 54f1aa7..2c476dc 100644 +--- a/lib/common/xml.c ++++ b/lib/common/xml.c +@@ -653,8 +653,7 @@ __xml_acl_create(xmlNode * xml, xmlNode *target, enum xml_private_flags mode) + if(tag) { + offset += snprintf(buffer + offset, XML_BUFFER_SIZE - offset, "//%s", tag); + } else { +- /* Is this even legal xpath syntax? */ +- offset += snprintf(buffer + offset, XML_BUFFER_SIZE - offset, "*"); ++ offset += snprintf(buffer + offset, XML_BUFFER_SIZE - offset, "//*"); + } + + if(ref || attr) { +-- +1.8.4.2 + diff --git a/SOURCES/pacemaker-8ffcf86bcab8bf98d5477a68b73e5062eb0c0fad-pacemakerd-memleak.patch b/SOURCES/pacemaker-8ffcf86bcab8bf98d5477a68b73e5062eb0c0fad-pacemakerd-memleak.patch new file mode 100644 index 0000000..234331d --- /dev/null +++ b/SOURCES/pacemaker-8ffcf86bcab8bf98d5477a68b73e5062eb0c0fad-pacemakerd-memleak.patch @@ -0,0 +1,28 @@ +From 8ffcf86bcab8bf98d5477a68b73e5062eb0c0fad Mon Sep 17 00:00:00 2001 +From: Hideo Yamauchi +Date: Wed, 24 Dec 2014 09:37:52 +0900 +Subject: [PATCH] Fix: pacemakerd: resolves memory leak of xml structure in + pacemakerd + +--- + mcp/pacemaker.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/mcp/pacemaker.c b/mcp/pacemaker.c +index fa2c707..5235ba6 100644 +--- a/mcp/pacemaker.c ++++ b/mcp/pacemaker.c +@@ -828,6 +828,10 @@ mcp_cpg_deliver(cpg_handle_t handle, + name = crm_element_value(xml, XML_ATTR_UNAME); + reap_crm_member(id, name); + } ++ ++ if (xml != NULL) { ++ free_xml(xml); ++ } + } + + static void +-- +1.8.4.2 + diff --git a/SOURCES/pacemaker-add-RemoteLXC-cts-test.patch b/SOURCES/pacemaker-add-RemoteLXC-cts-test.patch deleted file mode 100644 index e693975..0000000 --- a/SOURCES/pacemaker-add-RemoteLXC-cts-test.patch +++ /dev/null @@ -1,581 +0,0 @@ -commit c8136d5f0abe785223f4ea809073d6566aa36b58 -Author: David Vossel -Date: Wed Sep 25 18:14:13 2013 -0400 - - RemoteLXC port - -diff --git a/configure.ac b/configure.ac -index 6c80891..cfc1b1f 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1084,6 +1084,10 @@ CRM_CONFIG_DIR="${localstatedir}/lib/pacemaker/cib" - AC_DEFINE_UNQUOTED(CRM_CONFIG_DIR,"$CRM_CONFIG_DIR", Where to keep configuration files) - AC_SUBST(CRM_CONFIG_DIR) - -+CRM_CONFIG_CTS="${localstatedir}/lib/pacemaker/cts" -+AC_DEFINE_UNQUOTED(CRM_CONFIG_CTS,"$CRM_CONFIG_CTS", Where to keep cts stateful data) -+AC_SUBST(CRM_CONFIG_CTS) -+ - CRM_LEGACY_CONFIG_DIR="${localstatedir}/lib/heartbeat/crm" - AC_DEFINE_UNQUOTED(CRM_LEGACY_CONFIG_DIR,"$CRM_LEGACY_CONFIG_DIR", Where Pacemaker used to keep configuration files) - AC_SUBST(CRM_LEGACY_CONFIG_DIR) -@@ -1790,7 +1794,8 @@ cts/Makefile \ - cts/CTSvars.py \ - cts/LSBDummy \ - cts/benchmark/Makefile \ -- cts/benchmark/clubench \ -+ cts/benchmark/clubench \ -+ cts/lxc_autogen.sh \ - cib/Makefile \ - crmd/Makefile \ - pengine/Makefile \ -diff --git a/cts/CTSlab.py b/cts/CTSlab.py -index 58506c3..f7e183c 100755 ---- a/cts/CTSlab.py -+++ b/cts/CTSlab.py -@@ -95,6 +95,7 @@ class LabEnvironment(CtsLab): - #self["valgrind-opts"] = """--trace-children=no --num-callers=25 --gen-suppressions=all --suppressions="""+CTSvars.CTS_home+"""/cts.supp""" - - self["experimental-tests"] = 0 -+ self["container-tests"] = 0 - self["valgrind-tests"] = 0 - self["unsafe-tests"] = 1 - self["loop-tests"] = 1 -@@ -148,6 +149,7 @@ def usage(arg, status=1): - print "\t [--no-unsafe-tests] dont run tests that are unsafe for use with ocfs2/drbd" - print "\t [--valgrind-tests] include tests using valgrind" - print "\t [--experimental-tests] include experimental tests" -+ print "\t [--container-tests] include pacemaker_remote tests that run in lxc container resources" - print "\t [--oprofile 'node list'] list of cluster nodes to run oprofile on]" - print "\t [--qarsh] use the QARSH backdoor to access nodes instead of SSH" - print "\t [--seed random_seed]" -@@ -427,6 +429,9 @@ if __name__ == '__main__': - elif args[i] == "--experimental-tests": - Environment["experimental-tests"] = 1 - -+ elif args[i] == "--container-tests": -+ Environment["container-tests"] = 1 -+ - elif args[i] == "--set": - skipthis=1 - (name, value) = args[i+1].split('=') -diff --git a/cts/CTStests.py b/cts/CTStests.py -index b5dd69a..19f6ef4 100644 ---- a/cts/CTStests.py -+++ b/cts/CTStests.py -@@ -73,6 +73,7 @@ class CTSTest: - self.is_loop = 0 - self.is_unsafe = 0 - self.is_experimental = 0 -+ self.is_container = 0 - self.is_valgrind = 0 - self.benchmark = 0 # which tests to benchmark - self.timer = {} # timers -@@ -205,6 +206,8 @@ class CTSTest: - return 0 - elif self.is_experimental and not self.CM.Env["experimental-tests"]: - return 0 -+ elif self.is_container and not self.CM.Env["container-tests"]: -+ return 0 - elif self.CM.Env["benchmark"] and self.benchmark == 0: - return 0 - -@@ -2473,4 +2476,118 @@ def TestList(cm, audits): - result.append(bound_test) - return result - -+################################################################### -+class RemoteLXC(CTSTest): -+################################################################### -+ def __init__(self, cm): -+ CTSTest.__init__(self,cm) -+ self.name="RemoteLXC" -+ self.start = StartTest(cm) -+ self.startall = SimulStartLite(cm) -+ self.num_containers = 2 -+ self.is_container = 1 -+ self.failed = 0 -+ self.fail_string = "" -+ -+ def start_lxc_simple(self, node): -+ -+ rc = self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -v &>/dev/null") -+ if rc == 1: -+ return self.skipped() -+ -+ # restore any artifacts laying around from a previous test. -+ self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -R &>/dev/null") -+ -+ # generate the containers, put them in the config, add some resources to them -+ pats = [ ] -+ watch = self.create_watch(pats, 120) -+ watch.setwatch() -+ pats.append("process_lrm_event: LRM operation lxc1_start_0.*confirmed.*ok") -+ pats.append("process_lrm_event: LRM operation lxc2_start_0.*confirmed.*ok") -+ pats.append("process_lrm_event: LRM operation lxc-ms_start_0.*confirmed.*ok") -+ pats.append("process_lrm_event: LRM operation lxc-ms_promote_0.*confirmed.*ok") -+ -+ self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -g -a -m -s -c %d &>/dev/null" % self.num_containers) -+ self.set_timer("remoteSimpleInit") -+ watch.lookforall() -+ self.log_timer("remoteSimpleInit") -+ if watch.unmatched: -+ self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched)) -+ self.failed = 1 -+ -+ def cleanup_lxc_simple(self, node): -+ -+ pats = [ ] -+ # if the test failed, attempt to clean up the cib and libvirt environment -+ # as best as possible -+ if self.failed == 1: -+ # restore libvirt and cib -+ self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -R &>/dev/null") -+ self.CM.rsh(node, "crm_resource -C -r container1 &>/dev/null") -+ self.CM.rsh(node, "crm_resource -C -r container2 &>/dev/null") -+ self.CM.rsh(node, "crm_resource -C -r lxc1 &>/dev/null") -+ self.CM.rsh(node, "crm_resource -C -r lxc2 &>/dev/null") -+ self.CM.rsh(node, "crm_resource -C -r lxc-ms &>/dev/null") -+ time.sleep(20) -+ return -+ -+ watch = self.create_watch(pats, 120) -+ watch.setwatch() -+ -+ pats.append("process_lrm_event: LRM operation container1_stop_0.*confirmed.*ok") -+ pats.append("process_lrm_event: LRM operation container2_stop_0.*confirmed.*ok") -+ -+ self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -p &>/dev/null") -+ self.set_timer("remoteSimpleCleanup") -+ watch.lookforall() -+ self.log_timer("remoteSimpleCleanup") -+ -+ if watch.unmatched: -+ self.fail_string = "Unmatched patterns: %s" % (repr(watch.unmatched)) -+ self.failed = 1 -+ -+ # cleanup libvirt -+ self.CM.rsh(node, "/usr/share/pacemaker/tests/cts/lxc_autogen.sh -R &>/dev/null") -+ -+ def __call__(self, node): -+ '''Perform the 'RemoteLXC' test. ''' -+ self.incr("calls") -+ -+ ret = self.startall(None) -+ if not ret: -+ return self.failure("Setup failed, start all nodes failed.") -+ -+ self.start_lxc_simple(node) -+ self.cleanup_lxc_simple(node) -+ -+ self.CM.debug("Waiting for the cluster to recover") -+ self.CM.cluster_stable() -+ -+ if self.failed == 1: -+ return self.failure(self.fail_string) -+ -+ return self.success() -+ -+ def errorstoignore(self): -+ '''Return list of errors which should be ignored''' -+ return [ """Updating failcount for ping""", -+ """LogActions: Recover ping""", -+ """LogActions: Recover lxc-ms""", -+ """LogActions: Recover container""", -+ # The orphaned lxc-ms resource causes an expected transition error -+ # that is a result of the pengine not having knowledge that the -+ # ms resource used to be a clone. As a result it looks like that -+ # resource is running in multiple locations when it shouldn't... But in -+ # this instance we know why this error is occurring and that it is expected. -+ """Calculated Transition .* /var/lib/pacemaker/pengine/pe-error""", -+ """Resource lxc-ms .* is active on 2 nodes attempting recovery""", -+ """Unknown operation: fail""", -+ """notice: operation_finished: ping-""", -+ """notice: operation_finished: container""", -+ """notice: operation_finished: .*_monitor_0:.*:stderr""", -+ """(ERROR|error): sending stonithRA op to stonithd failed.""", -+ ] -+ -+AllTestClasses.append(RemoteLXC) -+ - # vim:ts=4:sw=4:et: -diff --git a/cts/Makefile.am b/cts/Makefile.am -index e01ac10..cb86db8 100644 ---- a/cts/Makefile.am -+++ b/cts/Makefile.am -@@ -40,6 +40,7 @@ cts_DATA = README cts.supp - - cts_SCRIPTS = cluster_test \ - CTSlab.py \ -+ lxc_autogen.sh \ - LSBDummy \ - $(top_srcdir)/fencing/fence_dummy - -diff --git a/cts/lxc_autogen.sh.in b/cts/lxc_autogen.sh.in -new file mode 100644 -index 0000000..1d334c4 ---- /dev/null -+++ b/cts/lxc_autogen.sh.in -@@ -0,0 +1,362 @@ -+#!/bin/bash -+ -+containers="2" -+download=0 -+share_configs=0 -+# different than default libvirt network in case this is run nested in a KVM instance -+addr="192.168.123.1" -+restore=0 -+restore_pcmk=0 -+restore_all=0 -+generate=0 -+key_gen=0 -+cib=0 -+add_master=0 -+verify=0 -+working_dir="@CRM_CONFIG_CTS@/lxc" -+curdir=$(pwd) -+ -+function helptext() { -+ echo "lxc_autogen.sh - A tool for generating libvirt lxc containers for testing purposes." -+ echo "" -+ echo "Usage: lxc-autogen [options]" -+ echo "" -+ echo "Options:" -+ echo "-g, --generate Generate libvirt lxc environment in the directory this script is run from." -+ echo "-k, --key-gen Generate local pacemaker remote key only." -+ echo "-r, --restore-libvirt Restore the default network, and libvirt config to before this script ran." -+ echo "-p, --restore-cib Remove cib entries this script generated." -+ echo "-R, --restore-all Restore both libvirt and cib plus clean working directory. This will leave libvirt xml files though so rsc can be stopped properly." -+ echo "" -+ echo "-a, --add-cib Add remote-node entries for each lxc instance into the cib" -+ echo "-m, --add-master Add master resource shared between remote-nodes" -+ echo "-d, --download-agent Download and install the latest VirtualDomain agent." -+ echo "-s, --share-configs Copy container configs to all other known cluster nodes, (crm_node -l)" -+ echo "-c, --containers Specify the number of containers to generate, defaults to $containers. Used with -g" -+ echo "-n, --network What network to override default libvirt network to. Example: -n 192.168.123.1. Used with -g" -+ echo "-v, --verify Verify environment is capable of running lxc" -+ echo "" -+ exit $1 -+} -+ -+while true ; do -+ case "$1" in -+ --help|-h|-\?) helptext 0;; -+ -c|--containers) containers="$2"; shift; shift;; -+ -d|--download-agent) download=1; shift;; -+ -s|--share-configs) share_configs=1; shift;; -+ -n|--network) addr="$2"; shift; shift;; -+ -r|--restore-libvirt) restore=1; shift;; -+ -p|--restore-cib) restore_pcmk=1; shift;; -+ -R|--restore-all) -+ restore_all=1 -+ restore=1 -+ restore_pcmk=1 -+ shift;; -+ -g|--generate) generate=1; shift;; -+ -k|--key-gen) key_gen=1; shift;; -+ -a|--add-cib) cib=1; shift;; -+ -m|--add-master) add_master=1; shift;; -+ -v|--verify) verify=1; shift;; -+ "") break;; -+ *) helptext 1;; -+ esac -+done -+ -+if [ $verify -eq 1 ]; then -+ # verify virsh tool is available and that -+ # we can connect to lxc driver. -+ virsh -c lxc:/// list --all > /dev/null 2>&1 -+ if [ $? -ne 0 ]; then -+ echo "Could not connect 'virsh -c lxc:///' check that libvirt lxc driver is installed" -+ exit 1 -+ fi -+ -+ cat /etc/selinux/config | grep -e "SELINUX.*=.*permissive" -e "SELINUX.*=.*enforcing" > /dev/null 2>&1 -+ if [ $? -ne 0 ]; then -+ echo "/etc/selinux/config must have SELINUX set to permissive or enforcing mode." -+ exit 1 -+ fi -+ -+ ps x > /tmp/lxc-autogen-libvirt-test.txt -+ grep "libvirtd" /tmp/lxc-autogen-libvirt-test.txt -+ if [ $? -ne 0 ]; then -+ rm -f /tmp/lxc-autogen-libvirt-test.txt -+ echo "libvirtd isn't up." -+ exit 1 -+ fi -+ rm -f /tmp/lxc-autogen-libvirt-test.txt -+ -+ which rsync > /dev/null 2>&1 -+ if [ $? -ne 0 ]; then -+ echo "rsync is required" -+ fi -+ -+fi -+ -+#strip last digits off addr -+tmp="s/\.$(echo "$addr" | tr '.' ' ' | awk '{print $4}')$//g" -+addr=$(echo $addr | sed -e ${tmp}) -+ -+set_network() -+{ -+ rm -f cur_network.xml -+ cat << END >> cur_network.xml -+ -+ default -+ 41ebdb84-7134-1111-a136-91f0f1119225 -+ -+ -+ -+ -+ -+ -+ -+ -+ -+END -+ -+ ls restore_default.xml > /dev/null 2>&1 -+ if [ $? -ne 0 ]; then -+ virsh net-dumpxml default > restore_default.xml -+ fi -+ virsh net-destroy default -+ virsh net-undefine default -+ virsh net-define cur_network.xml -+ virsh net-start default -+} -+ -+generate_key() -+{ -+ #generate pacemaker remote key -+ ls /etc/pacemaker/authkey > /dev/null 2>&1 -+ if [ $? != 0 ]; then -+ mkdir -p /etc/pacemaker -+ dd if=/dev/urandom of=/etc/pacemaker/authkey bs=4096 count=1 -+ fi -+} -+ -+generate() -+{ -+ set_network -+ -+ # Generate libvirt domains in xml -+ for (( c=1; c <= $containers; c++ )) -+ do -+ rm -rf lxc$c-filesystem -+ mkdir -p lxc$c-filesystem/var/run/ -+ mkdir -p lxc$c-filesystem/usr/var/run -+ rm -f lxc$c.xml -+ cat << END >> lxc$c.xml -+ -+ lxc$c -+ 102400 -+ -+ exe -+ $working_dir/lxc$c-filesystem/launch-helper -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+END -+ rm -f container$c.cib -+ cat << END >> container$c.cib -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+END -+ -+ rm -f lxc-ms$c.cib -+ cat << END >> lxc-ms.cib -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+END -+ -+ rm -f lxc$c-filesystem/launch-helper -+ cat << END >> lxc$c-filesystem/launch-helper -+#!/bin/bash -+ifconfig eth0 $addr.10$c -+route add 0.0.0.0 gw $addr.1 eth0 -+hostname lxc$c -+/usr/sbin/pacemaker_remoted -+END -+ chmod 711 lxc$c-filesystem/launch-helper -+ -+ cat << END >> /etc/hosts -+$addr.10$c lxc$c -+END -+ done -+} -+ -+apply_cib_master() -+{ -+ cibadmin -Q > cur.cib -+ export CIB_file=cur.cib -+ -+ cibadmin -o resources -C -x lxc-ms.cib -+ for tmp in $(ls lxc*.xml); do -+ tmp=$(echo $tmp | sed -e 's/\.xml//g') -+ echo "" > tmp_constraint -+ cibadmin -o constraints -C -x tmp_constraint -+ echo "" > tmp_constraint -+ cibadmin -o constraints -C -x tmp_constraint > /dev/null 2>&1 -+ rm -f tmp_constraint -+ done -+ unset CIB_file -+ -+ cibadmin --replace --xml-file cur.cib -+ rm -f cur.cib -+} -+ -+apply_cib_entries() -+{ -+ node=$(crm_node -n) -+ -+ cibadmin -Q > cur.cib -+ export CIB_file=cur.cib -+ for tmp in $(ls container*.cib); do -+ cibadmin -o resources -C -x $tmp -+ -+ tmp=$(echo $tmp | sed -e 's/\.cib//g') -+ crm_resource -M -r $tmp -H $node -+ done -+ unset CIB_file -+ -+ cibadmin --replace --xml-file cur.cib -+ rm -f cur.cib -+} -+ -+restore_cib() -+{ -+ node=$(crm_node -n) -+ cibadmin -Q > cur.cib -+ export CIB_file=cur.cib -+ -+ for tmp in $(ls lxc*.xml); do -+ tmp=$(echo $tmp | sed -e 's/\.xml//g') -+ echo "" > tmp_constraint -+ cibadmin -o constraints -D -x tmp_constraint -+ echo "" > tmp_constraint -+ cibadmin -o constraints -D -x tmp_constraint -+ rm -f tmp_constraint -+ done -+ cibadmin -o resources -D -x lxc-ms.cib -+ -+ for tmp in $(ls container*.cib); do -+ tmp=$(echo $tmp | sed -e 's/\.cib//g') -+ crm_resource -U -r $tmp -H $node -+ crm_resource -D -r $tmp -t primitive -+ done -+ unset CIB_file -+ -+ cibadmin --replace --xml-file cur.cib -+ rm -f cur.cib -+} -+ -+restore_libvirt() -+{ -+ for tmp in $(ls lxc*.xml); do -+ tmp=$(echo $tmp | sed -e 's/\.xml//g') -+ virsh -c lxc:/// destroy $tmp > /dev/null 2>&1 -+ virsh -c lxc:/// undefine $tmp > /dev/null 2>&1 -+ -+ sed -i.bak "/...\....\....\..* ${tmp}/d" /etc/hosts -+ echo "$tmp destroyed" -+ done -+ -+ ls restore_default.xml > /dev/null 2>&1 -+ if [ $? -eq 0 ]; then -+ virsh net-destroy default > /dev/null 2>&1 -+ virsh net-undefine default > /dev/null 2>&1 -+ virsh net-define restore_default.xml -+ virsh net-start default -+ if [ $? -eq 0 ]; then -+ echo "default network restored" -+ fi -+ fi -+ rm -f restore_default.xml > /dev/null 2>&1 -+} -+ -+distribute_configs() -+{ -+ local node -+ local id -+ while read id node -+ do -+ rsync -ave 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' $working_dir/lxc*.xml $node:/$working_dir -+ rsync -ave 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' $working_dir/lxc*-filesystem $node:/$working_dir -+ done < <(crm_node -l) -+} -+ -+mkdir -p $working_dir -+cd $working_dir -+ -+if [ $download -eq 1 ]; then -+ wget https://raw.github.com/ClusterLabs/resource-agents/master/heartbeat/VirtualDomain -+ chmod 755 VirtualDomain -+ mv -f VirtualDomain /usr/lib/ocf/resource.d/heartbeat/VirtualDomain -+fi -+if [ $restore_pcmk -eq 1 ]; then -+ restore_cib -+fi -+if [ $restore -eq 1 ]; then -+ restore_libvirt -+fi -+if [ $key_gen -eq 1 ]; then -+ generate_key -+fi -+if [ $generate -eq 1 ]; then -+ if [ $key_gen -eq 0]; then -+ generate_key -+ fi -+ generate -+fi -+if [ $cib -eq 1 ]; then -+ apply_cib_entries -+fi -+if [ $add_master -eq 1 ]; then -+ apply_cib_master -+fi -+if [ $share_configs -eq 1 ]; then -+ distribute_configs -+fi -+if [ $restore_all -eq 1 ]; then -+ ls | grep -v "lxc.\.xml" | xargs rm -rf -+fi -+ -+cd $curdir diff --git a/SOURCES/pacemaker-async-systemd-reload.patch b/SOURCES/pacemaker-async-systemd-reload.patch new file mode 100644 index 0000000..6398fc0 --- /dev/null +++ b/SOURCES/pacemaker-async-systemd-reload.patch @@ -0,0 +1,665 @@ +diff --git a/include/crm/common/logging.h b/include/crm/common/logging.h +index 5b8e47f..642fa92 100644 +--- a/include/crm/common/logging.h ++++ b/include/crm/common/logging.h +@@ -157,7 +157,7 @@ unsigned int get_crm_log_level(void); + } \ + } while(0) + +-# define do_crm_log_always(level, fmt, args...) qb_log(level, "%s: " fmt, __FUNCTION__ , ##args) ++# define do_crm_log_always(level, fmt, args...) qb_log(level, fmt , ##args) + + # define crm_perror(level, fmt, args...) do { \ + const char *err = strerror(errno); \ +diff --git a/include/crm/services.h b/include/crm/services.h +index 5310709..1a02656 100644 +--- a/include/crm/services.h ++++ b/include/crm/services.h +@@ -262,8 +262,9 @@ enum nagios_exitcode { + */ + svc_action_t *services_action_create_generic(const char *exec, const char *args[]); + +- void +- services_action_free(svc_action_t * op); ++ void services_action_cleanup(svc_action_t * op); ++ ++ void services_action_free(svc_action_t * op); + + gboolean services_action_sync(svc_action_t * op); + +diff --git a/lib/cib/cib_utils.c b/lib/cib/cib_utils.c +index 15b354b..ea37c4b 100644 +--- a/lib/cib/cib_utils.c ++++ b/lib/cib/cib_utils.c +@@ -112,8 +112,13 @@ get_cib_copy(cib_t * cib) + { + xmlNode *xml_cib; + int options = cib_scope_local | cib_sync_call; +- int rc = cib->cmds->query(cib, NULL, &xml_cib, options); ++ int rc = pcmk_ok; ++ ++ if (cib->state == cib_disconnected) { ++ return NULL; ++ } + ++ rc = cib->cmds->query(cib, NULL, &xml_cib, options); + if (rc == -EACCES) { + return NULL; + +diff --git a/lib/services/dbus.c b/lib/services/dbus.c +index c0153b5..f44b590 100644 +--- a/lib/services/dbus.c ++++ b/lib/services/dbus.c +@@ -145,7 +145,7 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, D + return reply; + } + +-bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, ++DBusPendingCall* pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, + void(*done)(DBusPendingCall *pending, void *user_data), void *user_data) + { + DBusError error; +@@ -161,27 +161,30 @@ bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, + // send message and get a handle for a reply + if (!dbus_connection_send_with_reply (connection, msg, &pending, -1/* aka. DBUS_TIMEOUT_USE_DEFAULT */)) { // -1 is default timeout + crm_err("Send with reply failed for %s", method); +- return FALSE; ++ return NULL; + + } else if (pending == NULL) { + crm_err("No pending call found for %s", method); +- return FALSE; +- ++ return NULL; + } + ++ crm_trace("DBus %s call sent", method); + if (dbus_pending_call_get_completed(pending)) { +- crm_info("DBus %s call completed too soon"); +-#if 1 ++ crm_info("DBus %s call completed too soon", method); ++ if(done) { ++#if 0 + /* This sounds like a good idea, but allegedly it breaks things */ + done(pending, user_data); ++ pending = NULL; + #else + CRM_ASSERT(dbus_pending_call_set_notify(pending, done, user_data, NULL)); + #endif ++ } + +- } else { ++ } else if(done) { + CRM_ASSERT(dbus_pending_call_set_notify(pending, done, user_data, NULL)); + } +- return TRUE; ++ return pending; + } + + bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line) +@@ -286,6 +289,11 @@ pcmk_dbus_lookup_result(DBusMessage *reply, struct db_getall_data *data) + dbus_message_iter_next (&dict); + } + ++ if(data->name && data->callback) { ++ crm_trace("No value for property %s[%s]", data->object, data->name); ++ data->callback(data->name, NULL, data->userdata); ++ } ++ + cleanup: + free(data->target); + free(data->object); +@@ -306,6 +314,9 @@ pcmk_dbus_lookup_cb(DBusPendingCall *pending, void *user_data) + + pcmk_dbus_lookup_result(reply, user_data); + ++ if(pending) { ++ dbus_pending_call_unref(pending); ++ } + if(reply) { + dbus_message_unref(reply); + } +@@ -375,20 +386,59 @@ static void pcmk_dbus_connection_dispatch(DBusConnection *connection, DBusDispat + crm_trace("status %d for %p", new_status, data); + if (new_status == DBUS_DISPATCH_DATA_REMAINS){ + dbus_connection_dispatch(connection); ++ ++ while (dbus_connection_get_dispatch_status(connection) == DBUS_DISPATCH_DATA_REMAINS) { ++ dbus_connection_dispatch(connection); ++ } + } + } + ++/* Copied from dbus-watch.c */ ++ ++static const char* ++dbus_watch_flags_to_string (int flags) ++{ ++ const char *watch_type; ++ ++ if ((flags & DBUS_WATCH_READABLE) && ++ (flags & DBUS_WATCH_WRITABLE)) ++ watch_type = "readwrite"; ++ else if (flags & DBUS_WATCH_READABLE) ++ watch_type = "read"; ++ else if (flags & DBUS_WATCH_WRITABLE) ++ watch_type = "write"; ++ else ++ watch_type = "not read or write"; ++ return watch_type; ++} ++ + static int + pcmk_dbus_watch_dispatch(gpointer userdata) + { ++ bool oom = FALSE; + DBusWatch *watch = userdata; + int flags = dbus_watch_get_flags(watch); ++ bool enabled = dbus_watch_get_enabled (watch); ++ mainloop_io_t *client = dbus_watch_get_data(watch); + +- crm_trace("Dispatching %p with flags %d", watch, flags); +- if(flags & DBUS_WATCH_READABLE) { +- dbus_watch_handle(watch, DBUS_WATCH_READABLE); +- } else { +- dbus_watch_handle(watch, DBUS_WATCH_ERROR); ++ crm_trace("Dispatching client %p: %s", client, dbus_watch_flags_to_string(flags)); ++ if (enabled && is_set(flags, DBUS_WATCH_READABLE)) { ++ oom = !dbus_watch_handle(watch, flags); ++ ++ } else if (enabled && is_set(flags, DBUS_WATCH_READABLE)) { ++ oom = !dbus_watch_handle(watch, flags); ++ ++ } else if(enabled) { ++ oom = !dbus_watch_handle(watch, DBUS_WATCH_ERROR); ++ } ++ ++ if(flags != dbus_watch_get_flags(watch)) { ++ flags = dbus_watch_get_flags(watch); ++ crm_trace("Dispatched client %p: %s (%d)", client, dbus_watch_flags_to_string(flags), flags); ++ } ++ ++ if(oom) { ++ crm_err("DBus encountered OOM while attempting to dispatch %p (%s)", client, dbus_watch_flags_to_string(flags)); + } + return 0; + } +@@ -396,7 +446,8 @@ pcmk_dbus_watch_dispatch(gpointer userdata) + static void + pcmk_dbus_watch_destroy(gpointer userdata) + { +- crm_trace("Destroyed %p", userdata); ++ mainloop_io_t *client = dbus_watch_get_data(userdata); ++ crm_trace("Destroyed %p", client); + } + + +@@ -412,7 +463,7 @@ pcmk_dbus_watch_add(DBusWatch *watch, void *data){ + mainloop_io_t *client = mainloop_add_fd( + "dbus", G_PRIORITY_DEFAULT, fd, watch, &pcmk_dbus_cb); + +- crm_trace("Added %p with fd=%d", watch, fd); ++ crm_trace("Added watch %p with fd=%d to client %p", watch, fd, client); + dbus_watch_set_data(watch, client, NULL); + return TRUE; + } +@@ -429,14 +480,14 @@ static void + pcmk_dbus_watch_remove(DBusWatch *watch, void *data){ + mainloop_io_t *client = dbus_watch_get_data(watch); + +- crm_trace("Removed %p", watch); ++ crm_trace("Removed client %p (%p)", client, data); + mainloop_del_fd(client); + } + + static gboolean + pcmk_dbus_timeout_dispatch(gpointer data) + { +- crm_trace("Timeout for %p"); ++ crm_info("Timeout %p expired", data); + dbus_timeout_handle(data); + return FALSE; + } +@@ -445,6 +496,8 @@ static dbus_bool_t + pcmk_dbus_timeout_add(DBusTimeout *timeout, void *data){ + guint id = g_timeout_add(dbus_timeout_get_interval(timeout), pcmk_dbus_timeout_dispatch, timeout); + ++ crm_trace("Adding timeout %p (%ld)", timeout, dbus_timeout_get_interval(timeout)); ++ + if(id) { + dbus_timeout_set_data(timeout, GUINT_TO_POINTER(id), NULL); + } +@@ -456,6 +509,8 @@ pcmk_dbus_timeout_remove(DBusTimeout *timeout, void *data){ + void *vid = dbus_timeout_get_data(timeout); + guint id = GPOINTER_TO_UINT(vid); + ++ crm_trace("Removing timeout %p (%p)", timeout, data); ++ + if(id) { + g_source_remove(id); + dbus_timeout_set_data(timeout, 0, NULL); +@@ -464,7 +519,11 @@ pcmk_dbus_timeout_remove(DBusTimeout *timeout, void *data){ + + static void + pcmk_dbus_timeout_toggle(DBusTimeout *timeout, void *data){ +- if(dbus_timeout_get_enabled(timeout)) { ++ bool enabled = dbus_timeout_get_enabled(timeout); ++ ++ crm_trace("Toggling timeout for %p to %s", timeout, enabled?"off":"on"); ++ ++ if(enabled) { + pcmk_dbus_timeout_add(timeout, data); + } else { + pcmk_dbus_timeout_remove(timeout, data); +diff --git a/lib/services/pcmk-dbus.h b/lib/services/pcmk-dbus.h +index ed80c5f..468020e 100644 +--- a/lib/services/pcmk-dbus.h ++++ b/lib/services/pcmk-dbus.h +@@ -2,7 +2,7 @@ DBusConnection *pcmk_dbus_connect(void); + void pcmk_dbus_connection_setup_with_select(DBusConnection *c); + void pcmk_dbus_disconnect(DBusConnection *connection); + +-bool pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, ++DBusPendingCall *pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, + void(*done)(DBusPendingCall *pending, void *user_data), void *user_data); + DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, DBusError *error); + bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line); +diff --git a/lib/services/services.c b/lib/services/services.c +index 9936c72..582fbe1 100644 +--- a/lib/services/services.c ++++ b/lib/services/services.c +@@ -303,18 +303,24 @@ services_action_create_generic(const char *exec, const char *args[]) + } + + void +-services_action_free(svc_action_t * op) ++services_action_cleanup(svc_action_t * op) + { +- unsigned int i; +- +- if (op == NULL) { +- return; ++ if(op->opaque->timerid != 0) { ++ crm_trace("Removing timer for call %s to %s", op->action, op->rsc); ++ g_source_remove(op->opaque->timerid); ++ op->opaque->timerid = 0; + } + +- if (op->opaque->repeat_timer) { +- g_source_remove(op->opaque->repeat_timer); +- op->opaque->repeat_timer = 0; ++ if(op->opaque->pending) { ++ crm_trace("Cleaning up pending dbus call %p %s for %s", op->opaque->pending, op->action, op->rsc); ++ if(dbus_pending_call_get_completed(op->opaque->pending)) { ++ crm_warn("Pending dbus call %s for %s did not complete", op->action, op->rsc); ++ } ++ dbus_pending_call_cancel(op->opaque->pending); ++ dbus_pending_call_unref(op->opaque->pending); ++ op->opaque->pending = NULL; + } ++ + if (op->opaque->stderr_gsource) { + mainloop_del_fd(op->opaque->stderr_gsource); + op->opaque->stderr_gsource = NULL; +@@ -324,6 +330,23 @@ services_action_free(svc_action_t * op) + mainloop_del_fd(op->opaque->stdout_gsource); + op->opaque->stdout_gsource = NULL; + } ++} ++ ++void ++services_action_free(svc_action_t * op) ++{ ++ unsigned int i; ++ ++ if (op == NULL) { ++ return; ++ } ++ ++ services_action_cleanup(op); ++ ++ if (op->opaque->repeat_timer) { ++ g_source_remove(op->opaque->repeat_timer); ++ op->opaque->repeat_timer = 0; ++ } + + free(op->id); + free(op->opaque->exec); +diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c +index 2279e4e..8d6f450 100644 +--- a/lib/services/services_linux.c ++++ b/lib/services/services_linux.c +@@ -264,6 +264,8 @@ operation_finalize(svc_action_t * op) + services_action_free(op); + return TRUE; + } ++ ++ services_action_cleanup(op); + return FALSE; + } + +diff --git a/lib/services/services_private.h b/lib/services/services_private.h +index dd759e3..bcf882c 100644 +--- a/lib/services/services_private.h ++++ b/lib/services/services_private.h +@@ -19,6 +19,10 @@ + #ifndef __MH_SERVICES_PRIVATE_H__ + # define __MH_SERVICES_PRIVATE_H__ + ++#if SUPPORT_DBUS ++# include ++#endif ++ + struct svc_action_private_s { + char *exec; + char *args[255]; +@@ -31,6 +35,10 @@ struct svc_action_private_s { + + int stdout_fd; + mainloop_io_t *stdout_gsource; ++#if SUPPORT_DBUS ++ DBusPendingCall* pending; ++ unsigned timerid; ++#endif + }; + + GList *services_os_get_directory_list(const char *root, gboolean files, gboolean executable); +diff --git a/lib/services/systemd.c b/lib/services/systemd.c +index 9a7b078..51ade44 100644 +--- a/lib/services/systemd.c ++++ b/lib/services/systemd.c +@@ -110,20 +110,48 @@ systemd_service_name(const char *name) + return g_strdup_printf("%s.service", name); + } + +-static bool +-systemd_daemon_reload(void) ++static void ++systemd_daemon_reload_complete(DBusPendingCall *pending, void *user_data) + { +- /* TODO: Make this asynchronous */ +- const char *method = "Reload"; ++ DBusError error; + DBusMessage *reply = NULL; +- DBusMessage *msg = systemd_new_method(BUS_NAME".Manager", method); ++ unsigned int reload_count = GPOINTER_TO_UINT(user_data); + +- CRM_ASSERT(msg != NULL); +- reply = pcmk_dbus_send_recv(msg, systemd_proxy, NULL); +- dbus_message_unref(msg); ++ dbus_error_init(&error); ++ if(pending) { ++ reply = dbus_pending_call_steal_reply(pending); ++ } ++ ++ if(pcmk_dbus_find_error("Reload", pending, reply, &error)) { ++ crm_err("Could not issue systemd reload %d: %s", reload_count, error.message); ++ ++ } else { ++ crm_trace("Reload %d complete", reload_count); ++ } ++ ++ if(pending) { ++ dbus_pending_call_unref(pending); ++ } + if(reply) { + dbus_message_unref(reply); + } ++} ++ ++static bool ++systemd_daemon_reload(void) ++{ ++ static unsigned int reload_count = 0; ++ const char *method = "Reload"; ++ ++ ++ reload_count++; ++ if(reload_count % 10 == 0) { ++ DBusMessage *msg = systemd_new_method(BUS_NAME".Manager", method); ++ ++ CRM_ASSERT(msg != NULL); ++ pcmk_dbus_send(msg, systemd_proxy, systemd_daemon_reload_complete, GUINT_TO_POINTER(reload_count)); ++ dbus_message_unref(msg); ++ } + return TRUE; + } + +@@ -155,13 +183,22 @@ static void + systemd_loadunit_cb(DBusPendingCall *pending, void *user_data) + { + DBusMessage *reply = NULL; ++ svc_action_t * op = user_data; + + if(pending) { + reply = dbus_pending_call_steal_reply(pending); + } + ++ if(op) { ++ crm_trace("Got result: %p for %p for %s, %s", reply, pending, op->rsc, op->action); ++ } else { ++ crm_trace("Got result: %p for %p", reply, pending); ++ } + systemd_loadunit_result(reply, user_data); + ++ if(pending) { ++ dbus_pending_call_unref(pending); ++ } + if(reply) { + dbus_message_unref(reply); + } +@@ -213,6 +250,7 @@ systemd_unit_by_name(const gchar * arg_name, svc_action_t *op) + } + + pcmk_dbus_send(msg, systemd_proxy, systemd_loadunit_cb, op); ++ dbus_message_unref(msg); + return NULL; + } + +@@ -421,6 +459,12 @@ systemd_async_dispatch(DBusPendingCall *pending, void *user_data) + reply = dbus_pending_call_steal_reply(pending); + } + ++ if(op) { ++ crm_trace("Got result: %p for %p for %s, %s", reply, pending, op->rsc, op->action); ++ } else { ++ crm_trace("Got result: %p for %p", reply, pending); ++ } ++ op->opaque->pending = NULL; + systemd_exec_result(reply, op); + + if(pending) { +@@ -437,10 +481,13 @@ static void + systemd_unit_check(const char *name, const char *state, void *userdata) + { + svc_action_t * op = userdata; +- +- CRM_ASSERT(state != NULL); + +- if (g_strcmp0(state, "active") == 0) { ++ crm_trace("Resource %s has %s='%s'", op->rsc, name, state); ++ ++ if(state == NULL) { ++ op->rc = PCMK_OCF_NOT_RUNNING; ++ ++ } else if (g_strcmp0(state, "active") == 0) { + op->rc = PCMK_OCF_OK; + } else if (g_strcmp0(state, "activating") == 0) { + op->rc = PCMK_OCF_PENDING; +@@ -449,6 +496,7 @@ systemd_unit_check(const char *name, const char *state, void *userdata) + } + + if (op->synchronous == FALSE) { ++ op->opaque->pending = NULL; + operation_finalize(op); + } + } +@@ -539,28 +587,29 @@ systemd_unit_exec_with_unit(svc_action_t * op, const char *unit) + } + + if (op->synchronous == FALSE) { +- return pcmk_dbus_send(msg, systemd_proxy, systemd_async_dispatch, op); ++ DBusPendingCall* pending = pcmk_dbus_send(msg, systemd_proxy, systemd_async_dispatch, op); ++ ++ dbus_message_unref(msg); ++ if(pending) { ++ dbus_pending_call_ref(pending); ++ op->opaque->pending = pending; ++ return TRUE; ++ } ++ return FALSE; + + } else { + DBusError error; + + reply = pcmk_dbus_send_recv(msg, systemd_proxy, &error); ++ dbus_message_unref(msg); + systemd_exec_result(reply, op); + + if(reply) { + dbus_message_unref(reply); + } +- if(msg) { +- dbus_message_unref(msg); +- } +- + return FALSE; + } + +- if(msg) { +- dbus_message_unref(msg); +- } +- + cleanup: + if (op->synchronous == FALSE) { + operation_finalize(op); +@@ -570,6 +619,18 @@ systemd_unit_exec_with_unit(svc_action_t * op, const char *unit) + return op->rc == PCMK_OCF_OK; + } + ++static gboolean ++systemd_timeout_callback(gpointer p) ++{ ++ svc_action_t * op = p; ++ ++ op->opaque->timerid = 0; ++ crm_warn("%s operation on systemd unit %s named '%s' timed out", op->action, op->agent, op->rsc); ++ operation_finalize(op); ++ ++ return FALSE; ++} ++ + gboolean + systemd_unit_exec(svc_action_t * op) + { +@@ -596,6 +657,7 @@ systemd_unit_exec(svc_action_t * op) + free(unit); + + if (op->synchronous == FALSE) { ++ op->opaque->timerid = g_timeout_add(op->timeout + 5000, systemd_timeout_callback, op); + return TRUE; + } + +diff --git a/lib/services/upstart.c b/lib/services/upstart.c +index 4c7211d..01ff817 100644 +--- a/lib/services/upstart.c ++++ b/lib/services/upstart.c +@@ -513,8 +513,15 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous) + CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &arg_wait, DBUS_TYPE_INVALID)); + + if (op->synchronous == FALSE) { ++ DBusPendingCall* pending = pcmk_dbus_send(msg, upstart_proxy, upstart_async_dispatch, op); + free(job); +- return pcmk_dbus_send(msg, upstart_proxy, upstart_async_dispatch, op); ++ ++ if(pending) { ++ dbus_pending_call_ref(pending); ++ op->opaque->pending = pending; ++ return TRUE; ++ } ++ return FALSE; + } + + dbus_error_init(&error); +diff --git a/lrmd/regression.py.in b/lrmd/regression.py.in +index a9a32ef..649c984 100755 +--- a/lrmd/regression.py.in ++++ b/lrmd/regression.py.in +@@ -27,12 +27,12 @@ build_dir="@abs_top_builddir@" + test_dir=sys.path[0] + + new_path=os.environ['PATH'] +- + if os.path.exists("%s/regression.py.in" % test_dir): + print "Running tests from the source tree: %s (%s)" % (build_dir, test_dir) + new_path = "%s/lrmd:%s" % (build_dir, new_path) # For lrmd, lrmd_test and pacemaker_remoted + new_path = "%s/tools:%s" % (build_dir, new_path) # For crm_resource + new_path = "%s/fencing:%s" % (build_dir, new_path) # For stonithd ++ + else: + print "Running tests from the install tree: @CRM_DAEMON_DIR@ (not %s)" % test_dir + new_path = "@CRM_DAEMON_DIR@:%s" % (new_path) # For stonithd, lrmd, lrmd_test and pacemaker_remoted +@@ -434,13 +434,15 @@ if __name__ == "__main__": + for ra in [ "Dummy", "Stateful", "ping" ]: + os.system("cp %s/extra/resources/%s @OCF_RA_DIR@/pacemaker/%s" % (build_dir, ra, ra)) + os.system("chmod a+x @OCF_RA_DIR@/pacemaker/%s" % (ra)) +- else: +- # Assume it's installed +- print "Using @datadir@/@PACKAGE@/tests/cts/LSBDummy" +- os.system("cp @datadir@/@PACKAGE@/tests/cts/LSBDummy /etc/init.d/LSBDummy") + +- os.system("chmod a+x /etc/init.d/LSBDummy") +- os.system("ls -al /etc/init.d/LSBDummy") ++ else: ++ # Assume it's installed ++ print "Using @datadir@/@PACKAGE@/tests/cts/LSBDummy" ++ os.system("cp @datadir@/@PACKAGE@/tests/cts/LSBDummy /etc/init.d/LSBDummy") ++ ++ os.system("chmod a+x /etc/init.d/LSBDummy") ++ os.system("ls -al /etc/init.d/LSBDummy") ++ + os.system("mkdir -p @CRM_CORE_DIR@/root") + + if os.path.exists("/bin/systemctl"): +@@ -747,6 +749,33 @@ if __name__ == "__main__": + test.add_cmd("-c unregister_rsc -r \"test_rsc\" "+self.action_timeout+ + "-l \"NEW_EVENT event_type:unregister rsc_id:test_rsc action:none rc:ok op_status:complete\" ") + ++ ### stress tests ### ++ def build_stress_tests(self): ++ timeout = "-t 20000" ++ iterations = 25 ++ ++ test = self.new_test("ocf_stress", "Verify systemd dbus connection works under load") ++ for i in range(iterations): ++ test.add_cmd("-c register_rsc -r rsc_%s %s -C ocf -P heartbeat -T Dummy -l \"NEW_EVENT event_type:register rsc_id:rsc_%s action:none rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c exec -r rsc_%s -a start %s -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:start rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c exec -r rsc_%s -a monitor %s -i 1000 -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:monitor rc:ok op_status:complete\"" % (i, timeout, i)) ++ for i in range(iterations): ++ test.add_cmd("-c exec -r rsc_%s -a stop %s -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:stop rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c unregister_rsc -r rsc_%s %s -l \"NEW_EVENT event_type:unregister rsc_id:rsc_%s action:none rc:ok op_status:complete\"" % (i, timeout, i)) ++ ++ ++ if "systemd" in self.rsc_classes: ++ test = self.new_test("systemd_stress", "Verify systemd dbus connection works under load") ++ for i in range(iterations): ++ test.add_cmd("-c register_rsc -r rsc_%s %s -C systemd -T lrmd_dummy_daemon -l \"NEW_EVENT event_type:register rsc_id:rsc_%s action:none rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c exec -r rsc_%s -a start %s -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:start rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c exec -r rsc_%s -a monitor %s -i 1000 -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:monitor rc:ok op_status:complete\"" % (i, timeout, i)) ++ ++ for i in range(iterations): ++ test.add_cmd("-c exec -r rsc_%s -a stop %s -l \"NEW_EVENT event_type:exec_complete rsc_id:rsc_%s action:stop rc:ok op_status:complete\"" % (i, timeout, i)) ++ test.add_cmd("-c unregister_rsc -r rsc_%s %s -l \"NEW_EVENT event_type:unregister rsc_id:rsc_%s action:none rc:ok op_status:complete\"" % (i, timeout, i)) ++ ++ + ### These are tests that target specific cases ### + def build_custom_tests(self): + +@@ -1016,6 +1045,7 @@ def main(argv): + tests.build_multi_rsc_tests() + tests.build_negative_tests() + tests.build_custom_tests() ++ tests.build_stress_tests() + + tests.setup_test_environment() + diff --git a/SOURCES/pacemaker-attrd-updater-other-nodes.patch b/SOURCES/pacemaker-attrd-updater-other-nodes.patch new file mode 100644 index 0000000..91df385 --- /dev/null +++ b/SOURCES/pacemaker-attrd-updater-other-nodes.patch @@ -0,0 +1,45 @@ +commit 7652cce56196ee039245c21f8a7f8d5e55149358 +Author: Andrew Beekhof +Date: Wed Jan 14 12:05:38 2015 +1100 + + Feature: attrd_updater: Allow attributes to be set for other nodes + +diff --git a/tools/attrd_updater.c b/tools/attrd_updater.c +index 54b2c60..703f7f9 100644 +--- a/tools/attrd_updater.c ++++ b/tools/attrd_updater.c +@@ -32,6 +32,7 @@ + + #include + ++const char *attr_node = NULL; + const char *attr_name = NULL; + const char *attr_value = NULL; + const char *attr_set = NULL; +@@ -59,6 +60,7 @@ static struct crm_option long_options[] = { + {"lifetime",1, 0, 'l', "Lifetime of the node attribute. Allowed values: forever, reboot"}, + {"delay", 1, 0, 'd', "The time to wait (dampening) in seconds further changes occur"}, + {"set", 1, 0, 's', "(Advanced) The attribute set in which to place the value"}, ++ {"node", 1, 0, 'N', "Set the attribute for the named node (instead of the local one)"}, + + /* Legacy options */ + {"update", 1, 0, 'v', NULL, 1}, +@@ -108,6 +110,9 @@ main(int argc, char **argv) + case 'S': + attr_section = strdup(optarg); + break; ++ case 'N': ++ attr_node = strdup(optarg); ++ break; + case 'q': + break; + case 'Q': +@@ -141,7 +146,7 @@ main(int argc, char **argv) + crm_help('?', EX_USAGE); + + } else { +- int rc = attrd_update_delegate(NULL, command, NULL, attr_name, attr_value, attr_section, ++ int rc = attrd_update_delegate(NULL, command, attr_node, attr_name, attr_value, attr_section, + attr_set, attr_dampen, NULL, FALSE); + if (rc != pcmk_ok) { + fprintf(stderr, "Could not update %s=%s: %s (%d)\n", attr_name, attr_value, pcmk_strerror(rc), rc); diff --git a/SOURCES/pacemaker-coverity-fixes.patch b/SOURCES/pacemaker-coverity-fixes.patch new file mode 100644 index 0000000..4ca19cd --- /dev/null +++ b/SOURCES/pacemaker-coverity-fixes.patch @@ -0,0 +1,80 @@ +diff --git a/crmd/control.c b/crmd/control.c +index 8989859..0332f10 100644 +--- a/crmd/control.c ++++ b/crmd/control.c +@@ -951,7 +951,6 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void + value = crmd_pref(config_hash, "stonith-watchdog-timeout"); + } + +- value = crmd_pref(config_hash, "stonith-watchdog-timeout"); + 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); +diff --git a/crmd/lrm.c b/crmd/lrm.c +index 44634fb..b68f657 100644 +--- a/crmd/lrm.c ++++ b/crmd/lrm.c +@@ -1377,7 +1377,6 @@ do_lrm_invoke(long long action, + } else if (safe_str_eq(operation, CRM_OP_REPROBE) || safe_str_eq(crm_op, CRM_OP_REPROBE)) { + GHashTableIter gIter; + rsc_history_t *entry = NULL; +- gboolean unregister = is_remote_lrmd_ra(NULL, NULL, entry->id) ? FALSE : TRUE; + + crm_notice("Forcing the status of all resources to be redetected"); + +@@ -1386,6 +1385,8 @@ do_lrm_invoke(long long action, + /* only unregister the resource during a reprobe if it is not a remote connection + * resource. otherwise unregistering the connection will terminate remote-node + * membership */ ++ gboolean unregister = is_remote_lrmd_ra(NULL, NULL, entry->id) ? FALSE : TRUE; ++ + delete_resource(lrm_state, entry->id, &entry->rsc, &gIter, from_sys, from_host, + user_name, NULL, unregister); + } +diff --git a/lib/services/dbus.c b/lib/services/dbus.c +index f4632f2..c0153b5 100644 +--- a/lib/services/dbus.c ++++ b/lib/services/dbus.c +@@ -338,6 +338,11 @@ pcmk_dbus_get_property( + CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &iface, DBUS_TYPE_INVALID)); + + query_data = malloc(sizeof(struct db_getall_data)); ++ if(query_data == NULL) { ++ crm_err("Call to %s failed: malloc failed", method); ++ return NULL; ++ } ++ + query_data->target = strdup(target); + query_data->object = strdup(obj); + query_data->callback = callback; +@@ -355,10 +360,6 @@ 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 753e257..9936c72 100644 +--- a/lib/services/services.c ++++ b/lib/services/services.c +@@ -506,12 +506,13 @@ services_action_sync(svc_action_t * op) + { + gboolean rc = TRUE; + +- op->synchronous = true; + if (op == NULL) { + crm_trace("No operation to execute"); + return FALSE; ++ } + +- } else if (op->standard && strcasecmp(op->standard, "upstart") == 0) { ++ op->synchronous = true; ++ if (op->standard && strcasecmp(op->standard, "upstart") == 0) { + #if SUPPORT_UPSTART + rc = upstart_job_exec(op, TRUE); + #endif diff --git a/SOURCES/pacemaker-doc_controld_update_the_description.patch b/SOURCES/pacemaker-doc_controld_update_the_description.patch deleted file mode 100644 index ccdb1be..0000000 --- a/SOURCES/pacemaker-doc_controld_update_the_description.patch +++ /dev/null @@ -1,24 +0,0 @@ -commit 41d245c28c5144423073e4fffa543a744c2ec321 -Author: Andrew Beekhof -Date: Wed Aug 7 09:11:31 2013 +1000 - - Doc: controld: Update the description - -diff --git a/extra/resources/controld b/extra/resources/controld -index 2122ff8..bacf0e9 100644 ---- a/extra/resources/controld -+++ b/extra/resources/controld -@@ -42,11 +42,11 @@ meta_data() { - 1.0 - - --This Resource Agent can control the dlm_controld services needed by ocfs2. -+This Resource Agent can control the dlm_controld services needed by cluster-aware file systems. - It assumes that dlm_controld is in your default PATH. - In most cases, it should be run as an anonymous clone. - --DLM Agent for OCFS2 -+DLM Agent for cluster file systems - - - diff --git a/SOURCES/pacemaker-f43678b-to-fe1ef5c-acl-fix.patch b/SOURCES/pacemaker-f43678b-to-fe1ef5c-acl-fix.patch new file mode 100644 index 0000000..649da8d --- /dev/null +++ b/SOURCES/pacemaker-f43678b-to-fe1ef5c-acl-fix.patch @@ -0,0 +1,1186 @@ +diff --git a/lib/cib/cib_file.c b/lib/cib/cib_file.c +index 5562e9e..aa68679 100644 +--- a/lib/cib/cib_file.c ++++ b/lib/cib/cib_file.c +@@ -310,6 +310,12 @@ cib_file_perform_op_delegate(cib_t * cib, const char *op, const char *host, cons + } + crm_trace("Performing %s operation as %s", op, user_name); + #endif ++ ++ /* Mirror the logic in cib_prepare_common() */ ++ if (section != NULL && data != NULL && crm_str_eq(crm_element_name(data), XML_TAG_CIB, TRUE)) { ++ data = get_object_root(section, data); ++ } ++ + rc = cib_perform_op(op, call_options, fn, query, + section, request, data, TRUE, &changed, in_mem_cib, &result_cib, &cib_diff, + &output); +diff --git a/lib/common/xml.c b/lib/common/xml.c +index f7779f5..54f1aa7 100644 +--- a/lib/common/xml.c ++++ b/lib/common/xml.c +@@ -4848,8 +4848,13 @@ replace_xml_child(xmlNode * parent, xmlNode * child, xmlNode * update, gboolean + + xml_accept_changes(tmp); + old = xmlReplaceNode(child, tmp); +- xml_calculate_changes(old, tmp); + ++ if(xml_tracking_changes(tmp)) { ++ /* Replaced sections may have included relevant ACLs */ ++ __xml_acl_apply(tmp); ++ } ++ ++ xml_calculate_changes(old, tmp); + xmlDocSetRootElement(doc, old); + free_xml(old); + } +diff --git a/tools/regression.acls.exp b/tools/regression.acls.exp +index 2cea125..e05e339 100644 +--- a/tools/regression.acls.exp ++++ b/tools/regression.acls.exp +@@ -17,11 +17,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -47,11 +54,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -78,11 +92,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -109,11 +130,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -143,11 +171,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -180,11 +215,18 @@ A new shadow instance was created. To begin using it paste the following into y + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -255,11 +297,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -301,11 +350,18 @@ __xml_acl_post_process: Creation of nvpair=cib-bootstrap-options-stonith-enable + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -345,11 +401,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -384,11 +447,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -425,11 +495,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -486,11 +563,18 @@ __xml_acl_post_process: Creation of nvpair=dummy-meta_attributes-target-role is + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -535,11 +619,18 @@ Stopped + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -582,11 +673,18 @@ Deleted dummy option: id=dummy-meta_attributes-target-role name=target-role + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -631,11 +729,18 @@ __xml_acl_post_process: Creation of nvpair=dummy-meta_attributes-target-role is + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -730,11 +835,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -778,11 +890,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -794,12 +913,12 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - modify attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - modify attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/crm_config/cluster_property_set[@id='cib-bootstrap-options']/nvpair[@id='cib-bootstrap-options-enable-acl'][@value]: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - modify attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - modify attribute ++=#=#=#= End test: niceguy: Replace - modify attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - modify attribute (deny) + + + +@@ -825,11 +944,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -841,12 +967,12 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - delete attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - delete attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/crm_config/cluster_property_set[@id='cib-bootstrap-options']/nvpair[@id='cib-bootstrap-options-enable-acl']: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - delete attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - delete attribute ++=#=#=#= End test: niceguy: Replace - delete attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - delete attribute (deny) + + + +@@ -872,11 +998,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -888,12 +1021,161 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - create attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - create attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/resources/primitive[@id='dummy'][@description]: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - create attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - create attribute ++=#=#=#= End test: niceguy: Replace - create attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - create attribute (deny) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - create attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - create attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - create attribute (allow) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - modify attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - modify attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - modify attribute (allow) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - delete attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - delete attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - delete attribute (allow) + + + !#!#!#!#! Upgrading to pacemaker-2.0 and retesting !#!#!#!#! +@@ -901,6 +1183,8 @@ Call failed: Permission denied + __xml_acl_post_process: Creation of acl_permission=observer-read-1 is allowed + __xml_acl_post_process: Creation of acl_permission=observer-write-1 is allowed + __xml_acl_post_process: Creation of acl_permission=observer-write-2 is allowed ++__xml_acl_post_process: Creation of acl_permission=admin-read-1 is allowed ++__xml_acl_post_process: Creation of acl_permission=admin-write-1 is allowed + __xml_acl_post_process: Creation of acl_permission=crook-nothing is allowed + __xml_acl_post_process: Creation of acl_permission=badidea-resources is allowed + __xml_acl_post_process: Creation of acl_permission=betteridea-nothing is allowed +@@ -917,11 +1201,7 @@ __xml_acl_post_process: Creation of acl_permission=betteridea-resources is allo + + + +- +- +- +- +- ++ + + + +@@ -934,11 +1214,18 @@ __xml_acl_post_process: Creation of acl_permission=betteridea-resources is allo + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1019,11 +1306,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1073,11 +1367,18 @@ Error setting enable-acl=false (section=crm_config, set=): Permission deni + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1126,11 +1427,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1174,11 +1482,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1224,11 +1539,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1294,11 +1616,18 @@ __xml_acl_post_process: Creation of nvpair=dummy-meta_attributes-target-role is + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1352,11 +1681,18 @@ Stopped + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1408,11 +1744,18 @@ Deleted dummy option: id=dummy-meta_attributes-target-role name=target-role + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1466,11 +1809,18 @@ __xml_acl_post_process: Creation of nvpair=dummy-meta_attributes-target-role is + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1574,11 +1924,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1631,11 +1988,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1653,12 +2017,12 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - modify attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - modify attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/crm_config/cluster_property_set[@id='cib-bootstrap-options']/nvpair[@id='cib-bootstrap-options-enable-acl'][@value]: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - modify attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - modify attribute ++=#=#=#= End test: niceguy: Replace - modify attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - modify attribute (deny) + + + +@@ -1687,11 +2051,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1709,12 +2080,12 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - delete attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - delete attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/crm_config/cluster_property_set[@id='cib-bootstrap-options']/nvpair[@id='cib-bootstrap-options-enable-acl']: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - delete attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - delete attribute ++=#=#=#= End test: niceguy: Replace - delete attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - delete attribute (deny) + + + +@@ -1743,11 +2114,18 @@ Call failed: Permission denied + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + + +@@ -1765,9 +2143,185 @@ Call failed: Permission denied + + + +-=#=#=#= Begin test: niceguy: Replace - create attribute =#=#=#= ++=#=#=#= Begin test: niceguy: Replace - create attribute (deny) =#=#=#= + __xml_acl_check: 400 access denied to /cib[@epoch]: default + __xml_acl_check: 400 access denied to /cib/configuration/resources/primitive[@id='dummy'][@description]: default + Call failed: Permission denied +-=#=#=#= End test: niceguy: Replace - create attribute - Permission denied (13) =#=#=#= +-* Passed: cibadmin - niceguy: Replace - create attribute ++=#=#=#= End test: niceguy: Replace - create attribute (deny) - Permission denied (13) =#=#=#= ++* Passed: cibadmin - niceguy: Replace - create attribute (deny) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - create attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - create attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - create attribute (allow) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - modify attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - modify attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - modify attribute (allow) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++=#=#=#= Begin test: bob: Replace - delete attribute (allow) =#=#=#= ++=#=#=#= End test: bob: Replace - delete attribute (allow) - OK (0) =#=#=#= ++* Passed: cibadmin - bob: Replace - delete attribute (allow) +diff --git a/tools/regression.sh b/tools/regression.sh +index 0c4896c..63f4445 100755 +--- a/tools/regression.sh ++++ b/tools/regression.sh +@@ -487,7 +487,7 @@ function test_acl_loop() { + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" crm_attribute -n enable-acl -v false + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql + +- desc="$CIB_user: Replace - modify attribute" ++ desc="$CIB_user: Replace - modify attribute (deny)" + cmd="cibadmin --replace --xml-file /tmp/$$.haxor.xml" + test_assert 13 0 + +@@ -495,7 +495,7 @@ function test_acl_loop() { + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin --replace --xml-text '' + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql + +- desc="$CIB_user: Replace - delete attribute" ++ desc="$CIB_user: Replace - delete attribute (deny)" + cmd="cibadmin --replace --xml-file /tmp/$$.haxor.xml" + test_assert 13 0 + +@@ -503,10 +503,36 @@ function test_acl_loop() { + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin --modify --xml-text '' + CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql + +- desc="$CIB_user: Replace - create attribute" ++ desc="$CIB_user: Replace - create attribute (deny)" + cmd="cibadmin --replace --xml-file /tmp/$$.haxor.xml" + test_assert 13 0 + rm -rf /tmp/$$.haxor.xml ++ ++ ++ CIB_user=bob ++ CIB_user=root cibadmin -Q > /tmp/$$.haxor.xml ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin --modify --xml-text '' ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql ++ ++ desc="$CIB_user: Replace - create attribute (allow)" ++ cmd="cibadmin --replace -o resources --xml-file /tmp/$$.haxor.xml" ++ test_assert 0 0 ++ ++ CIB_user=root cibadmin -Q > /tmp/$$.haxor.xml ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin --modify --xml-text '' ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql ++ ++ desc="$CIB_user: Replace - modify attribute (allow)" ++ cmd="cibadmin --replace -o resources --xml-file /tmp/$$.haxor.xml" ++ test_assert 0 0 ++ ++ CIB_user=root cibadmin -Q > /tmp/$$.haxor.xml ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin --replace -o resources --xml-text '' ++ CIB_user=root CIB_file=/tmp/$$.haxor.xml CIB_shadow="" cibadmin -Ql ++ ++ desc="$CIB_user: Replace - delete attribute (allow)" ++ cmd="cibadmin --replace -o resources --xml-file /tmp/$$.haxor.xml" ++ test_assert 0 0 + } + + function test_acls() { +@@ -522,11 +548,18 @@ function test_acls() { + + + ++ ++ ++ + + + + + ++ ++ ++ ++ + + EOF + diff --git a/SOURCES/pacemaker-fix-orphaned-connection-resources.patch b/SOURCES/pacemaker-fix-orphaned-connection-resources.patch deleted file mode 100644 index 01abbbb..0000000 --- a/SOURCES/pacemaker-fix-orphaned-connection-resources.patch +++ /dev/null @@ -1,2099 +0,0 @@ -commit 261c6b836e4a44c6d20d5abd7550ef1f0b25c17c -Author: David Vossel -Date: Wed Sep 25 17:47:04 2013 -0400 - - fix orphaned connection resources - -diff --git a/crmd/lrm.c b/crmd/lrm.c -index 7157e24..5f4d3bb 100644 ---- a/crmd/lrm.c -+++ b/crmd/lrm.c -@@ -729,6 +729,13 @@ build_active_RAs(lrm_state_t * lrm_state, xmlNode * rsc_list) - crm_xml_add(xml_rsc, XML_AGENT_ATTR_CLASS, entry->rsc.class); - crm_xml_add(xml_rsc, XML_AGENT_ATTR_PROVIDER, entry->rsc.provider); - -+ if (entry->last && entry->last->params) { -+ const char *container = g_hash_table_lookup(entry->last->params, CRM_META"_"XML_RSC_ATTR_CONTAINER); -+ if (container) { -+ crm_trace("Resource %s is a part of container resource %s", entry->id, container); -+ crm_xml_add(xml_rsc, XML_RSC_ATTR_CONTAINER, container); -+ } -+ } - build_operation_update(xml_rsc, &(entry->rsc), entry->last, __FUNCTION__); - build_operation_update(xml_rsc, &(entry->rsc), entry->failed, __FUNCTION__); - for (gIter = entry->recurring_op_list; gIter != NULL; gIter = gIter->next) { -@@ -1930,10 +1937,20 @@ do_update_resource(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_da - build_operation_update(iter, rsc, op, __FUNCTION__); - - if (rsc) { -+ const char *container = NULL; -+ - crm_xml_add(iter, XML_ATTR_TYPE, rsc->type); - crm_xml_add(iter, XML_AGENT_ATTR_CLASS, rsc->class); - crm_xml_add(iter, XML_AGENT_ATTR_PROVIDER, rsc->provider); - -+ if (op->params) { -+ container = g_hash_table_lookup(op->params, CRM_META"_"XML_RSC_ATTR_CONTAINER); -+ } -+ if (container) { -+ crm_trace("Resource %s is a part of container resource %s", op->rsc_id, container); -+ crm_xml_add(iter, XML_RSC_ATTR_CONTAINER, container); -+ } -+ - CRM_CHECK(rsc->type != NULL, crm_err("Resource %s has no value for type", op->rsc_id)); - CRM_CHECK(rsc->class != NULL, crm_err("Resource %s has no value for class", op->rsc_id)); - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index bd3d923..8eb4a1d 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -160,6 +160,7 @@ struct node_s { - # define pe_rsc_orphan 0x00000001ULL - # define pe_rsc_managed 0x00000002ULL - # define pe_rsc_block 0x00000004ULL /* Further operations are prohibited due to failure policy */ -+# define pe_rsc_orphan_container_filler 0x00000008ULL - - # define pe_rsc_notify 0x00000010ULL - # define pe_rsc_unique 0x00000020ULL -diff --git a/lib/cib/cib_attrs.c b/lib/cib/cib_attrs.c -index d1e1b74..5e21eef 100644 ---- a/lib/cib/cib_attrs.c -+++ b/lib/cib/cib_attrs.c -@@ -414,40 +414,54 @@ delete_attr_delegate(cib_t * the_cib, int options, - return rc; - } - --static int --get_remote_node_uuid(cib_t * the_cib, const char *uname, char **uuid) -+static gboolean -+found_remote_node_xpath(cib_t *the_cib, const char *xpath) - { --#define REMOTE_NODE_XPATH "//nvpair[@name='remote-node'][@value='%s']" --#define REMOTE_NODE_XPATH2 "//primitive[@type='remote'][@provider='pacemaker'][@id='%s']" - int rc = pcmk_ok; -- char *xpath_string = NULL; -- size_t len = strlen(REMOTE_NODE_XPATH) + strlen(uname) + 1; - xmlNode *xml_search = NULL; - -- xpath_string = calloc(1, len); -- sprintf(xpath_string, REMOTE_NODE_XPATH, uname); -- rc = cib_internal_op(the_cib, CIB_OP_QUERY, NULL, xpath_string, NULL, &xml_search, -+ rc = cib_internal_op(the_cib, CIB_OP_QUERY, NULL, xpath, NULL, &xml_search, - cib_sync_call | cib_scope_local | cib_xpath, NULL); -- free(xpath_string); - free(xml_search); -- xml_search = NULL; -- xpath_string = NULL; - -- if (rc != pcmk_ok) { -- len = strlen(REMOTE_NODE_XPATH2) + strlen(uname) + 1; -- xpath_string = calloc(1, len); -- sprintf(xpath_string, REMOTE_NODE_XPATH2, uname); -- rc = cib_internal_op(the_cib, CIB_OP_QUERY, NULL, xpath_string, NULL, &xml_search, -- cib_sync_call | cib_scope_local | cib_xpath, NULL); -+ return rc == pcmk_ok ? TRUE : FALSE; -+} - -- free(xpath_string); -- free(xml_search); -+static int -+get_remote_node_uuid(cib_t * the_cib, const char *uname, char **uuid) -+{ -+#define CONTAINER_REMOTE_NODE_XPATH "//" XML_CIB_TAG_NVPAIR "[@name='remote-node'][@value='%s']" -+#define BAREMETAL_REMOTE_NODE_XPATH "//" XML_CIB_TAG_RESOURCE "[@type='remote'][@provider='pacemaker'][@id='%s']" -+#define ORPHAN_REMOTE_NODE_XPATH "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE "[@id='%s'][@remote_node='true']" -+ int len = 128 + strlen(uname); -+ int rc = pcmk_ok; -+ char *xpath_string = calloc(1, len); -+ -+ sprintf(xpath_string, CONTAINER_REMOTE_NODE_XPATH, uname); -+ if (found_remote_node_xpath(the_cib, xpath_string)) { -+ goto found_remote; - } - -- if (rc == pcmk_ok) { -- *uuid = strdup(uname); -+ sprintf(xpath_string, BAREMETAL_REMOTE_NODE_XPATH, uname); -+ if (found_remote_node_xpath(the_cib, xpath_string)) { -+ goto found_remote; -+ } -+ -+ sprintf(xpath_string, ORPHAN_REMOTE_NODE_XPATH, uname); -+ if (found_remote_node_xpath(the_cib, xpath_string)) { -+ goto found_remote; - } - -+ rc = -1; -+found_remote: -+ if (rc == pcmk_ok) { -+ /* reuse allocation */ -+ *uuid = xpath_string; -+ strcpy(*uuid, uname); -+ } else { -+ *uuid = NULL; -+ free(xpath_string); -+ } - return rc; - } - -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 5e2f4e0..8a6049d 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -159,6 +159,10 @@ get_rsc_attributes(GHashTable * meta_hash, resource_t * rsc, - unpack_instance_attributes(data_set->input, rsc->xml, XML_TAG_ATTR_SETS, node_hash, - meta_hash, NULL, FALSE, data_set->now); - -+ if (rsc->container) { -+ g_hash_table_replace(meta_hash, strdup(CRM_META"_"XML_RSC_ATTR_CONTAINER), strdup(rsc->container->id)); -+ } -+ - /* set anything else based on the parent */ - if (rsc->parent != NULL) { - get_rsc_attributes(meta_hash, rsc->parent, node, data_set); -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index b4986dd..26cecb2 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -248,6 +248,7 @@ create_node(const char *id, const char *uname, const char *type, const char *sco - - if (safe_str_eq(type, "remote")) { - new_node->details->type = node_remote; -+ set_bit(data_set->flags, pe_flag_have_remote_nodes); - } else if (type == NULL || safe_str_eq(type, "member") - || safe_str_eq(type, NORMALNODE)) { - new_node->details->type = node_member; -@@ -612,7 +613,6 @@ unpack_remote_nodes(xmlNode * xml_resources, pe_working_set_t * data_set) - } - - if (new_node_id) { -- set_bit(data_set->flags, pe_flag_have_remote_nodes); - crm_trace("detected remote node %s", new_node_id); - create_node(new_node_id, new_node_id, "remote", NULL, data_set); - } -@@ -1399,6 +1399,22 @@ create_fake_resource(const char *rsc_id, xmlNode * rsc_entry, pe_working_set_t * - return NULL; - } - -+ if (is_remote_node(xml_rsc)) { -+ node_t *node; -+ -+ crm_debug("Detected orphaned remote node %s", rsc_id); -+ rsc->is_remote_node = TRUE; -+ node = create_node(rsc_id, rsc_id, "remote", NULL, data_set); -+ -+ CRM_ASSERT(node != NULL); -+ node->details->remote_rsc = rsc; -+ } -+ -+ if (crm_element_value(rsc_entry, XML_RSC_ATTR_CONTAINER)) { -+ /* This orphaned rsc needs to be mapped to a container. */ -+ crm_trace("Detected orphaned container filler %s", rsc_id); -+ set_bit(rsc->flags, pe_rsc_orphan_container_filler); -+ } - set_bit(rsc->flags, pe_rsc_orphan); - data_set->resources = g_list_append(data_set->resources, rsc); - return rsc; -@@ -1860,7 +1876,7 @@ calculate_active_ops(GListPtr sorted_op_list, int *start_index, int *stop_index) - } - } - --static void -+static resource_t * - unpack_lrm_rsc_state(node_t * node, xmlNode * rsc_entry, pe_working_set_t * data_set) - { - GListPtr gIter = NULL; -@@ -1896,7 +1912,7 @@ unpack_lrm_rsc_state(node_t * node, xmlNode * rsc_entry, pe_working_set_t * data - - if (op_list == NULL) { - /* if there are no operations, there is nothing to do */ -- return; -+ return NULL; - } - - /* find the resource */ -@@ -1949,12 +1965,55 @@ unpack_lrm_rsc_state(node_t * node, xmlNode * rsc_entry, pe_working_set_t * data - if (saved_role > rsc->role) { - rsc->role = saved_role; - } -+ -+ return rsc; -+} -+ -+static void -+handle_orphaned_container_fillers(xmlNode * lrm_rsc_list, pe_working_set_t * data_set) -+{ -+ xmlNode *rsc_entry = NULL; -+ for (rsc_entry = __xml_first_child(lrm_rsc_list); rsc_entry != NULL; -+ rsc_entry = __xml_next(rsc_entry)) { -+ -+ resource_t *rsc; -+ resource_t *container; -+ const char *rsc_id; -+ const char *container_id; -+ -+ if (safe_str_neq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE)) { -+ continue; -+ } -+ -+ container_id = crm_element_value(rsc_entry, XML_RSC_ATTR_CONTAINER); -+ rsc_id = crm_element_value(rsc_entry, XML_ATTR_ID); -+ if (container_id == NULL || rsc_id == NULL) { -+ continue; -+ } -+ -+ container = pe_find_resource(data_set->resources, container_id); -+ if (container == NULL) { -+ continue; -+ } -+ -+ rsc = pe_find_resource(data_set->resources, rsc_id); -+ if (rsc == NULL || -+ is_set(rsc->flags, pe_rsc_orphan_container_filler) == FALSE || -+ rsc->container != NULL) { -+ continue; -+ } -+ -+ pe_rsc_trace(rsc, "Mapped orphaned rsc %s's container to %s", rsc->id, container_id); -+ rsc->container = container; -+ container->fillers = g_list_append(container->fillers, rsc); -+ } - } - - gboolean - unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * data_set) - { - xmlNode *rsc_entry = NULL; -+ gboolean found_orphaned_container_filler = FALSE; - - CRM_CHECK(node != NULL, return FALSE); - -@@ -1962,11 +2021,23 @@ unpack_lrm_resources(node_t * node, xmlNode * lrm_rsc_list, pe_working_set_t * d - - for (rsc_entry = __xml_first_child(lrm_rsc_list); rsc_entry != NULL; - rsc_entry = __xml_next(rsc_entry)) { -+ - if (crm_str_eq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE, TRUE)) { -- unpack_lrm_rsc_state(node, rsc_entry, data_set); -+ resource_t *rsc; -+ rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); -+ if (rsc && is_set(rsc->flags, pe_rsc_orphan_container_filler)) { -+ found_orphaned_container_filler = TRUE; -+ } - } - } - -+ /* now that all the resource state has been unpacked for this node -+ * we have to go back and map any orphaned container fillers to their -+ * container resource */ -+ if (found_orphaned_container_filler) { -+ handle_orphaned_container_fillers(lrm_rsc_list, data_set); -+ } -+ - return TRUE; - } - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index bfa8e7b..e535b84 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1576,10 +1576,10 @@ apply_remote_node_ordering(pe_working_set_t *data_set) - - remote_rsc = action->node->details->remote_rsc; - container = remote_rsc->container; -+ - if (safe_str_eq(action->task, "monitor") || - safe_str_eq(action->task, "start") || - safe_str_eq(action->task, "promote") || -- safe_str_eq(action->task, "demote") || - safe_str_eq(action->task, CRM_OP_LRM_REFRESH) || - safe_str_eq(action->task, CRM_OP_CLEAR_FAILCOUNT) || - safe_str_eq(action->task, "delete")) { -@@ -1593,6 +1593,39 @@ apply_remote_node_ordering(pe_working_set_t *data_set) - pe_order_implies_then | pe_order_runnable_left, - data_set); - -+ } else if (safe_str_eq(action->task, "demote")) { -+ -+ /* If the connection is being torn down, we don't want -+ * to build a constraint between a resource's demotion and -+ * the connection resource starting... because the connection -+ * resource can not start. The connection might already be up, -+ * but the START action would not be allowed which in turn would -+ * block the demotion of any resournces living in the remote-node. -+ * -+ * In this case, only build the constraint between the demotion and -+ * the connection's stop action. This allows the connection and all the -+ * resources within the remote-node to be torn down properly. */ -+ if (remote_rsc->next_role == RSC_ROLE_STOPPED) { -+ custom_action_order(action->rsc, -+ NULL, -+ action, -+ remote_rsc, -+ generate_op_key(remote_rsc->id, RSC_STOP, 0), -+ NULL, -+ pe_order_implies_first, -+ data_set); -+ } else { -+ -+ custom_action_order(remote_rsc, -+ generate_op_key(remote_rsc->id, RSC_START, 0), -+ NULL, -+ action->rsc, -+ NULL, -+ action, -+ pe_order_implies_then | pe_order_runnable_left, -+ data_set); -+ } -+ - } else if (safe_str_eq(action->task, "stop") && - container && - is_set(container->flags, pe_rsc_failed)) { -diff --git a/pengine/test10/container-1.exp b/pengine/test10/container-1.exp -index 1924ef8..522b0f1 100644 ---- a/pengine/test10/container-1.exp -+++ b/pengine/test10/container-1.exp -@@ -47,7 +47,7 @@ - - - -- -+ - - - -@@ -60,7 +60,7 @@ - - - -- -+ - - - -@@ -73,7 +73,7 @@ - - - -- -+ - - - -@@ -86,7 +86,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-2.exp b/pengine/test10/container-2.exp -index d699d28..c5f9e9e 100644 ---- a/pengine/test10/container-2.exp -+++ b/pengine/test10/container-2.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -61,7 +61,7 @@ - - - -- -+ - - - -@@ -70,7 +70,7 @@ - - - -- -+ - - - -@@ -83,7 +83,7 @@ - - - -- -+ - - - -@@ -99,7 +99,7 @@ - - - -- -+ - - - -@@ -108,7 +108,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-3.exp b/pengine/test10/container-3.exp -index cc774da..3c2703a 100644 ---- a/pengine/test10/container-3.exp -+++ b/pengine/test10/container-3.exp -@@ -42,7 +42,7 @@ - - - -- -+ - - - -@@ -55,7 +55,7 @@ - - - -- -+ - - - -@@ -68,7 +68,7 @@ - - - -- -+ - - - -@@ -84,7 +84,7 @@ - - - -- -+ - - - -@@ -93,7 +93,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-4.exp b/pengine/test10/container-4.exp -index 72f50cc..d1da381 100644 ---- a/pengine/test10/container-4.exp -+++ b/pengine/test10/container-4.exp -@@ -45,7 +45,7 @@ - - - -- -+ - - - -@@ -58,7 +58,7 @@ - - - -- -+ - - - -@@ -74,7 +74,7 @@ - - - -- -+ - - - -@@ -83,7 +83,7 @@ - - - -- -+ - - - -@@ -96,7 +96,7 @@ - - - -- -+ - - - -@@ -112,7 +112,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-1.exp b/pengine/test10/container-group-1.exp -index a007f84..b14aa4c 100644 ---- a/pengine/test10/container-group-1.exp -+++ b/pengine/test10/container-group-1.exp -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -92,7 +92,7 @@ - - - -- -+ - - - -@@ -111,7 +111,7 @@ - - - -- -+ - - - -@@ -124,7 +124,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-2.exp b/pengine/test10/container-group-2.exp -index 6d5e283..ce32cc3 100644 ---- a/pengine/test10/container-group-2.exp -+++ b/pengine/test10/container-group-2.exp -@@ -113,7 +113,7 @@ - - - -- -+ - - - -@@ -132,7 +132,7 @@ - - - -- -+ - - - -@@ -148,7 +148,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -@@ -183,7 +183,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-3.exp b/pengine/test10/container-group-3.exp -index 4df7279..96d99c6 100644 ---- a/pengine/test10/container-group-3.exp -+++ b/pengine/test10/container-group-3.exp -@@ -101,7 +101,7 @@ - - - -- -+ - - - -@@ -114,7 +114,7 @@ - - - -- -+ - - - -@@ -130,7 +130,7 @@ - - - -- -+ - - - -@@ -143,7 +143,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/container-group-4.exp b/pengine/test10/container-group-4.exp -index dd5aad7..6128599 100644 ---- a/pengine/test10/container-group-4.exp -+++ b/pengine/test10/container-group-4.exp -@@ -113,7 +113,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -@@ -145,7 +145,7 @@ - - - -- -+ - - - -@@ -161,7 +161,7 @@ - - - -- -+ - - - -@@ -174,7 +174,7 @@ - - - -- -+ - - - -@@ -196,7 +196,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-asymmetric.exp b/pengine/test10/whitebox-asymmetric.exp -index 2c7e586..d60cffa 100644 ---- a/pengine/test10/whitebox-asymmetric.exp -+++ b/pengine/test10/whitebox-asymmetric.exp -@@ -32,7 +32,7 @@ - - - -- -+ - - - -@@ -45,7 +45,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail1.exp b/pengine/test10/whitebox-fail1.exp -index 5741955..b298df5 100644 ---- a/pengine/test10/whitebox-fail1.exp -+++ b/pengine/test10/whitebox-fail1.exp -@@ -173,7 +173,7 @@ - - - -- -+ - - - -@@ -189,7 +189,7 @@ - - - -- -+ - - - -@@ -198,7 +198,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail2.exp b/pengine/test10/whitebox-fail2.exp -index 5741955..b298df5 100644 ---- a/pengine/test10/whitebox-fail2.exp -+++ b/pengine/test10/whitebox-fail2.exp -@@ -173,7 +173,7 @@ - - - -- -+ - - - -@@ -189,7 +189,7 @@ - - - -- -+ - - - -@@ -198,7 +198,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail3.exp b/pengine/test10/whitebox-fail3.exp -index 1b8d144..c5a6474 100644 ---- a/pengine/test10/whitebox-fail3.exp -+++ b/pengine/test10/whitebox-fail3.exp -@@ -151,7 +151,7 @@ - - - -- -+ - - - -@@ -164,7 +164,7 @@ - - - -- -+ - - - -@@ -180,7 +180,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-move.exp b/pengine/test10/whitebox-move.exp -index 8dbdda0..60262b6 100644 ---- a/pengine/test10/whitebox-move.exp -+++ b/pengine/test10/whitebox-move.exp -@@ -168,7 +168,7 @@ - - - -- -+ - - - -@@ -181,7 +181,7 @@ - - - -- -+ - - - -@@ -197,7 +197,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-orphan-ms.dot b/pengine/test10/whitebox-orphan-ms.dot -new file mode 100644 -index 0000000..f037179 ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.dot -@@ -0,0 +1,69 @@ -+ digraph "g" { -+"FencingFail_start_0 18node1" [ style=bold color="green" fontcolor="black"] -+"FencingFail_stop_0 18node3" -> "FencingFail_start_0 18node1" [ style = bold] -+"FencingFail_stop_0 18node3" -> "all_stopped" [ style = bold] -+"FencingFail_stop_0 18node3" [ style=bold color="green" fontcolor="black"] -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"container1_delete_0 18node1" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container1_delete_0 18node2" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"container1_delete_0 18node3" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"container1_start_0 " [ style=dashed color="red" fontcolor="black"] -+"container1_stop_0 18node1" -> "all_stopped" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node1" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node2" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node3" [ style = bold] -+"container1_stop_0 18node1" -> "container1_start_0 " [ style = dashed] -+"container1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"container2_stop_0 18node1" -> "all_stopped" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node1" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node2" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node3" [ style = bold] -+"container2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc1" [ style = bold] -+"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc2" [ style = bold] -+"lxc-ms_demote_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] -+"lxc-ms_demote_0 lxc1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc1" [ style = bold] -+"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc2" [ style = bold] -+"lxc-ms_demote_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] -+"lxc-ms_demote_0 lxc2" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_stop_0 lxc1" -> "all_stopped" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node2" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node3" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_stop_0 lxc2" -> "all_stopped" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node2" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node3" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc2" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc1_stop_0 18node1" -> "all_stopped" [ style = bold] -+"lxc1_stop_0 18node1" -> "container1_stop_0 18node1" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node1" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node2" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node3" [ style = bold] -+"lxc1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc2_stop_0 18node1" -> "all_stopped" [ style = bold] -+"lxc2_stop_0 18node1" -> "container2_stop_0 18node1" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node1" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node2" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node3" [ style = bold] -+"lxc2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+} -diff --git a/pengine/test10/whitebox-orphan-ms.exp b/pengine/test10/whitebox-orphan-ms.exp -new file mode 100644 -index 0000000..d36a9be ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.exp -@@ -0,0 +1,366 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/whitebox-orphan-ms.pe.dot b/pengine/test10/whitebox-orphan-ms.pe.dot -new file mode 100644 -index 0000000..81c37eb ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.pe.dot -@@ -0,0 +1,69 @@ -+digraph "g" { -+"FencingFail_start_0 18node1" [ style=bold color="green" fontcolor="black"] -+"FencingFail_stop_0 18node3" -> "FencingFail_start_0 18node1" [ style = bold] -+"FencingFail_stop_0 18node3" -> "all_stopped" [ style = bold] -+"FencingFail_stop_0 18node3" [ style=bold color="green" fontcolor="black"] -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"container1_delete_0 18node1" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container1_delete_0 18node2" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"container1_delete_0 18node3" -> "container1_start_0 " [ style = dashed] -+"container1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"container1_start_0 " [ style=dashed color="red" fontcolor="black"] -+"container1_stop_0 18node1" -> "all_stopped" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node1" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node2" [ style = bold] -+"container1_stop_0 18node1" -> "container1_delete_0 18node3" [ style = bold] -+"container1_stop_0 18node1" -> "container1_start_0 " [ style = dashed] -+"container1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"container2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"container2_stop_0 18node1" -> "all_stopped" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node1" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node2" [ style = bold] -+"container2_stop_0 18node1" -> "container2_delete_0 18node3" [ style = bold] -+"container2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc1" [ style = bold] -+"lxc-ms_demote_0 lxc1" -> "lxc-ms_stop_0 lxc2" [ style = bold] -+"lxc-ms_demote_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] -+"lxc-ms_demote_0 lxc1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc1" [ style = bold] -+"lxc-ms_demote_0 lxc2" -> "lxc-ms_stop_0 lxc2" [ style = bold] -+"lxc-ms_demote_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] -+"lxc-ms_demote_0 lxc2" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_stop_0 lxc1" -> "all_stopped" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node2" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc-ms_delete_0 18node3" [ style = bold] -+"lxc-ms_stop_0 lxc1" -> "lxc1_stop_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc1" [ style=bold color="green" fontcolor="black"] -+"lxc-ms_stop_0 lxc2" -> "all_stopped" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node2" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc-ms_delete_0 18node3" [ style = bold] -+"lxc-ms_stop_0 lxc2" -> "lxc2_stop_0 18node1" [ style = bold] -+"lxc-ms_stop_0 lxc2" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc1_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc1_stop_0 18node1" -> "all_stopped" [ style = bold] -+"lxc1_stop_0 18node1" -> "container1_stop_0 18node1" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node1" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node2" [ style = bold] -+"lxc1_stop_0 18node1" -> "lxc1_delete_0 18node3" [ style = bold] -+"lxc1_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node1" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node2" [ style=bold color="green" fontcolor="black"] -+"lxc2_delete_0 18node3" [ style=bold color="green" fontcolor="black"] -+"lxc2_stop_0 18node1" -> "all_stopped" [ style = bold] -+"lxc2_stop_0 18node1" -> "container2_stop_0 18node1" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node1" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node2" [ style = bold] -+"lxc2_stop_0 18node1" -> "lxc2_delete_0 18node3" [ style = bold] -+"lxc2_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+} -diff --git a/pengine/test10/whitebox-orphan-ms.scores b/pengine/test10/whitebox-orphan-ms.scores -new file mode 100644 -index 0000000..d968052 ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.scores -@@ -0,0 +1,105 @@ -+Allocation scores: -+clone_color: Connectivity allocation score on 18node1: 0 -+clone_color: Connectivity allocation score on 18node2: 0 -+clone_color: Connectivity allocation score on 18node3: 0 -+clone_color: master-1 allocation score on 18node1: 0 -+clone_color: master-1 allocation score on 18node2: 0 -+clone_color: master-1 allocation score on 18node3: 0 -+clone_color: master-1 allocation score on lxc1: -INFINITY -+clone_color: master-1 allocation score on lxc2: -INFINITY -+clone_color: ping-1:0 allocation score on 18node1: 1 -+clone_color: ping-1:0 allocation score on 18node2: 0 -+clone_color: ping-1:0 allocation score on 18node3: 0 -+clone_color: ping-1:1 allocation score on 18node1: 0 -+clone_color: ping-1:1 allocation score on 18node2: 1 -+clone_color: ping-1:1 allocation score on 18node3: 0 -+clone_color: ping-1:2 allocation score on 18node1: 0 -+clone_color: ping-1:2 allocation score on 18node2: 0 -+clone_color: ping-1:2 allocation score on 18node3: 1 -+clone_color: stateful-1:0 allocation score on 18node1: 11 -+clone_color: stateful-1:0 allocation score on 18node2: 0 -+clone_color: stateful-1:0 allocation score on 18node3: 0 -+clone_color: stateful-1:0 allocation score on lxc1: -INFINITY -+clone_color: stateful-1:0 allocation score on lxc2: -INFINITY -+clone_color: stateful-1:1 allocation score on 18node1: 0 -+clone_color: stateful-1:1 allocation score on 18node2: 6 -+clone_color: stateful-1:1 allocation score on 18node3: 0 -+clone_color: stateful-1:1 allocation score on lxc1: -INFINITY -+clone_color: stateful-1:1 allocation score on lxc2: -INFINITY -+clone_color: stateful-1:2 allocation score on 18node1: 0 -+clone_color: stateful-1:2 allocation score on 18node2: 0 -+clone_color: stateful-1:2 allocation score on 18node3: 6 -+clone_color: stateful-1:2 allocation score on lxc1: -INFINITY -+clone_color: stateful-1:2 allocation score on lxc2: -INFINITY -+group_color: group-1 allocation score on 18node1: 0 -+group_color: group-1 allocation score on 18node2: 0 -+group_color: group-1 allocation score on 18node3: 0 -+group_color: r192.168.122.87 allocation score on 18node1: 0 -+group_color: r192.168.122.87 allocation score on 18node2: 0 -+group_color: r192.168.122.87 allocation score on 18node3: 0 -+group_color: r192.168.122.88 allocation score on 18node1: 0 -+group_color: r192.168.122.88 allocation score on 18node2: 0 -+group_color: r192.168.122.88 allocation score on 18node3: 0 -+group_color: r192.168.122.89 allocation score on 18node1: 0 -+group_color: r192.168.122.89 allocation score on 18node2: 0 -+group_color: r192.168.122.89 allocation score on 18node3: 0 -+native_color: Fencing allocation score on 18node1: 0 -+native_color: Fencing allocation score on 18node2: 0 -+native_color: Fencing allocation score on 18node3: 0 -+native_color: FencingFail allocation score on 18node1: 0 -+native_color: FencingFail allocation score on 18node2: 0 -+native_color: FencingFail allocation score on 18node3: 0 -+native_color: FencingPass allocation score on 18node1: 0 -+native_color: FencingPass allocation score on 18node2: 0 -+native_color: FencingPass allocation score on 18node3: 0 -+native_color: lsb-dummy allocation score on 18node1: 0 -+native_color: lsb-dummy allocation score on 18node2: -INFINITY -+native_color: lsb-dummy allocation score on 18node3: -INFINITY -+native_color: migrator allocation score on 18node1: 1 -+native_color: migrator allocation score on 18node2: 0 -+native_color: migrator allocation score on 18node3: 0 -+native_color: ping-1:0 allocation score on 18node1: 1 -+native_color: ping-1:0 allocation score on 18node2: -INFINITY -+native_color: ping-1:0 allocation score on 18node3: -INFINITY -+native_color: ping-1:1 allocation score on 18node1: 0 -+native_color: ping-1:1 allocation score on 18node2: 1 -+native_color: ping-1:1 allocation score on 18node3: 0 -+native_color: ping-1:2 allocation score on 18node1: 0 -+native_color: ping-1:2 allocation score on 18node2: -INFINITY -+native_color: ping-1:2 allocation score on 18node3: 1 -+native_color: r192.168.122.87 allocation score on 18node1: 11 -+native_color: r192.168.122.87 allocation score on 18node2: -INFINITY -+native_color: r192.168.122.87 allocation score on 18node3: -INFINITY -+native_color: r192.168.122.88 allocation score on 18node1: 0 -+native_color: r192.168.122.88 allocation score on 18node2: -INFINITY -+native_color: r192.168.122.88 allocation score on 18node3: -INFINITY -+native_color: r192.168.122.89 allocation score on 18node1: 0 -+native_color: r192.168.122.89 allocation score on 18node2: -INFINITY -+native_color: r192.168.122.89 allocation score on 18node3: -INFINITY -+native_color: rsc_18node1 allocation score on 18node1: 100 -+native_color: rsc_18node1 allocation score on 18node2: 0 -+native_color: rsc_18node1 allocation score on 18node3: 0 -+native_color: rsc_18node2 allocation score on 18node1: 0 -+native_color: rsc_18node2 allocation score on 18node2: 100 -+native_color: rsc_18node2 allocation score on 18node3: 0 -+native_color: rsc_18node3 allocation score on 18node1: 0 -+native_color: rsc_18node3 allocation score on 18node2: 0 -+native_color: rsc_18node3 allocation score on 18node3: 100 -+native_color: stateful-1:0 allocation score on 18node1: 11 -+native_color: stateful-1:0 allocation score on 18node2: -INFINITY -+native_color: stateful-1:0 allocation score on 18node3: -INFINITY -+native_color: stateful-1:0 allocation score on lxc1: -INFINITY -+native_color: stateful-1:0 allocation score on lxc2: -INFINITY -+native_color: stateful-1:1 allocation score on 18node1: 0 -+native_color: stateful-1:1 allocation score on 18node2: 6 -+native_color: stateful-1:1 allocation score on 18node3: 0 -+native_color: stateful-1:1 allocation score on lxc1: -INFINITY -+native_color: stateful-1:1 allocation score on lxc2: -INFINITY -+native_color: stateful-1:2 allocation score on 18node1: 0 -+native_color: stateful-1:2 allocation score on 18node2: -INFINITY -+native_color: stateful-1:2 allocation score on 18node3: 6 -+native_color: stateful-1:2 allocation score on lxc1: -INFINITY -+native_color: stateful-1:2 allocation score on lxc2: -INFINITY -+stateful-1:0 promotion score on 18node1: 10 -+stateful-1:1 promotion score on 18node2: 5 -+stateful-1:2 promotion score on 18node3: 5 -diff --git a/pengine/test10/whitebox-orphan-ms.summary b/pengine/test10/whitebox-orphan-ms.summary -new file mode 100644 -index 0000000..30c6a3b ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.summary -@@ -0,0 +1,85 @@ -+ -+Current cluster status: -+Online: [ 18node1 18node2 18node3 ] -+Containers: [ lxc1:container1 lxc2:container2 ] -+ -+ Fencing (stonith:fence_xvm): Started 18node2 -+ FencingPass (stonith:fence_dummy): Started 18node3 -+ FencingFail (stonith:fence_dummy): Started 18node3 -+ rsc_18node1 (ocf::heartbeat:IPaddr2): Started 18node1 -+ rsc_18node2 (ocf::heartbeat:IPaddr2): Started 18node2 -+ rsc_18node3 (ocf::heartbeat:IPaddr2): Started 18node3 -+ migrator (ocf::pacemaker:Dummy): Started 18node1 -+ Clone Set: Connectivity [ping-1] -+ Started: [ 18node1 18node2 18node3 ] -+ Master/Slave Set: master-1 [stateful-1] -+ Masters: [ 18node1 ] -+ Slaves: [ 18node2 18node3 ] -+ Resource Group: group-1 -+ r192.168.122.87 (ocf::heartbeat:IPaddr2): Started 18node1 -+ r192.168.122.88 (ocf::heartbeat:IPaddr2): Started 18node1 -+ r192.168.122.89 (ocf::heartbeat:IPaddr2): Started 18node1 -+ lsb-dummy (lsb:/usr/share/pacemaker/tests/cts/LSBDummy): Started 18node1 -+ container2 (ocf::heartbeat:VirtualDomain): ORPHANED Started 18node1 -+ lxc1 (ocf::pacemaker:remote): ORPHANED Started 18node1 -+ lxc-ms (ocf::pacemaker:Stateful): ORPHANED Master [ lxc1 lxc2 ] -+ lxc2 (ocf::pacemaker:remote): ORPHANED Started 18node1 -+ container1 (ocf::heartbeat:VirtualDomain): ORPHANED Started 18node1 -+ -+Transition Summary: -+ * Move FencingFail (Started 18node3 -> 18node1) -+ * Stop container2 (18node1) -+ * Stop lxc1 (18node1) -+ * Demote lxc-ms (Master -> Stopped lxc1) -+ * Stop lxc2 (18node1) -+ * Stop container1 (18node1) -+ -+Executing cluster transition: -+ * Resource action: FencingFail stop on 18node3 -+ * Resource action: lxc-ms demote on lxc2 -+ * Resource action: lxc-ms demote on lxc1 -+ * Resource action: FencingFail start on 18node1 -+ * Resource action: lxc-ms stop on lxc2 -+ * Resource action: lxc-ms stop on lxc1 -+ * Resource action: lxc-ms delete on 18node3 -+ * Resource action: lxc-ms delete on 18node2 -+ * Resource action: lxc-ms delete on 18node1 -+ * Resource action: lxc2 stop on 18node1 -+ * Resource action: lxc2 delete on 18node3 -+ * Resource action: lxc2 delete on 18node2 -+ * Resource action: lxc2 delete on 18node1 -+ * Resource action: container2 stop on 18node1 -+ * Resource action: container2 delete on 18node3 -+ * Resource action: container2 delete on 18node2 -+ * Resource action: container2 delete on 18node1 -+ * Resource action: lxc1 stop on 18node1 -+ * Resource action: lxc1 delete on 18node3 -+ * Resource action: lxc1 delete on 18node2 -+ * Resource action: lxc1 delete on 18node1 -+ * Resource action: container1 stop on 18node1 -+ * Resource action: container1 delete on 18node3 -+ * Resource action: container1 delete on 18node2 -+ * Resource action: container1 delete on 18node1 -+ * Pseudo action: all_stopped -+ -+Revised cluster status: -+Online: [ 18node1 18node2 18node3 ] -+ -+ Fencing (stonith:fence_xvm): Started 18node2 -+ FencingPass (stonith:fence_dummy): Started 18node3 -+ FencingFail (stonith:fence_dummy): Started 18node1 -+ rsc_18node1 (ocf::heartbeat:IPaddr2): Started 18node1 -+ rsc_18node2 (ocf::heartbeat:IPaddr2): Started 18node2 -+ rsc_18node3 (ocf::heartbeat:IPaddr2): Started 18node3 -+ migrator (ocf::pacemaker:Dummy): Started 18node1 -+ Clone Set: Connectivity [ping-1] -+ Started: [ 18node1 18node2 18node3 ] -+ Master/Slave Set: master-1 [stateful-1] -+ Masters: [ 18node1 ] -+ Slaves: [ 18node2 18node3 ] -+ Resource Group: group-1 -+ r192.168.122.87 (ocf::heartbeat:IPaddr2): Started 18node1 -+ r192.168.122.88 (ocf::heartbeat:IPaddr2): Started 18node1 -+ r192.168.122.89 (ocf::heartbeat:IPaddr2): Started 18node1 -+ lsb-dummy (lsb:/usr/share/pacemaker/tests/cts/LSBDummy): Started 18node1 -+ -diff --git a/pengine/test10/whitebox-orphan-ms.xml b/pengine/test10/whitebox-orphan-ms.xml -new file mode 100644 -index 0000000..c9a62fa ---- /dev/null -+++ b/pengine/test10/whitebox-orphan-ms.xml -@@ -0,0 +1,436 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/whitebox-start.exp b/pengine/test10/whitebox-start.exp -index 4dcfdc4..19cae49 100644 ---- a/pengine/test10/whitebox-start.exp -+++ b/pengine/test10/whitebox-start.exp -@@ -67,7 +67,7 @@ - - - -- -+ - - - -@@ -80,7 +80,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-stop.exp b/pengine/test10/whitebox-stop.exp -index 643c94c..7720235 100644 ---- a/pengine/test10/whitebox-stop.exp -+++ b/pengine/test10/whitebox-stop.exp -@@ -87,7 +87,7 @@ - - - -- -+ - - - diff --git a/SOURCES/pacemaker-fix-setting-remote-node-attributes.patch b/SOURCES/pacemaker-fix-setting-remote-node-attributes.patch deleted file mode 100644 index f87e9d3..0000000 --- a/SOURCES/pacemaker-fix-setting-remote-node-attributes.patch +++ /dev/null @@ -1,446 +0,0 @@ -commit d9b95435059189843e1fb7b1f7530fc163fdfc13 -Author: David Vossel -Date: Wed Sep 25 17:02:50 2013 -0400 - - properly set remote node attributes - -diff --git a/crmd/lrm.c b/crmd/lrm.c -index 0254a9f..7157e24 100644 ---- a/crmd/lrm.c -+++ b/crmd/lrm.c -@@ -367,7 +367,7 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, - } - - if (counter > 0) { -- do_crm_log(log_level, "%d pending LRM operations at %s%s", counter, when); -+ do_crm_log(log_level, "%d pending LRM operations at %s", counter, when); - - if (cur_state == S_TERMINATE || !is_set(fsa_input_register, R_SENT_RSC_STOP)) { - g_hash_table_iter_init(&gIter, lrm_state->pending_ops); -diff --git a/crmd/membership.c b/crmd/membership.c -index 370d1a2..e2bcd45 100644 ---- a/crmd/membership.c -+++ b/crmd/membership.c -@@ -260,6 +260,13 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) - do_update_node_cib(node, flags, node_list, source); - } - -+ if (crm_remote_peer_cache) { -+ g_hash_table_iter_init(&iter, crm_remote_peer_cache); -+ while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { -+ do_update_node_cib(node, flags, node_list, source); -+ } -+ } -+ - fsa_cib_update(XML_CIB_TAG_STATUS, node_list, call_options, call_id, NULL); - fsa_register_cib_callback(call_id, FALSE, NULL, crmd_node_update_complete); - last_peer_update = call_id; -diff --git a/crmd/messages.c b/crmd/messages.c -index 9aa69cc..057383a 100644 ---- a/crmd/messages.c -+++ b/crmd/messages.c -@@ -930,7 +930,7 @@ send_msg_via_ipc(xmlNode * msg, const char *sys) - crmd_proxy_send(sys, msg); - - } else { -- crm_err("Unknown Sub-system (%s)... discarding message.", crm_str(sys)); -+ crm_debug("Unknown Sub-system (%s)... discarding message.", crm_str(sys)); - send_ok = FALSE; - } - -diff --git a/crmd/pengine.c b/crmd/pengine.c -index 5546d7e..2f3eba8 100644 ---- a/crmd/pengine.c -+++ b/crmd/pengine.c -@@ -271,6 +271,9 @@ do_pe_invoke_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void - - CRM_LOG_ASSERT(output != NULL); - -+ /* refresh our remote-node cache when the pengine is invoked */ -+ crm_remote_peer_cache_refresh(output); -+ - crm_xml_add(output, XML_ATTR_DC_UUID, fsa_our_uuid); - crm_xml_add_int(output, XML_ATTR_HAVE_QUORUM, fsa_has_quorum); - -diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c -index d38d7f0..42ea043 100644 ---- a/crmd/remote_lrmd_ra.c -+++ b/crmd/remote_lrmd_ra.c -@@ -333,7 +333,10 @@ remote_lrm_op_callback(lrmd_event_data_t * op) - - } else { - /* make sure we have a clean status section to start with */ -+ lrm_state_reset_tables(lrm_state); - remote_init_cib_status(lrm_state); -+ erase_status_tag(lrm_state->node_name, XML_CIB_TAG_LRM, cib_scope_local); -+ erase_status_tag(lrm_state->node_name, XML_TAG_TRANSIENT_NODEATTRS, cib_scope_local); - - cmd->rc = PCMK_EXECRA_OK; - cmd->op_status = PCMK_LRM_OP_DONE; -@@ -430,15 +433,6 @@ handle_remote_ra_exec(gpointer user_data) - g_list_free_1(first); - - if (!strcmp(cmd->action, "start") || !strcmp(cmd->action, "migrate_from")) { -- xmlNode *status = create_xml_node(NULL, XML_CIB_TAG_STATE); -- -- /* clear node status in cib */ -- crm_xml_add(status, XML_ATTR_ID, lrm_state->node_name); -- lrm_state_reset_tables(lrm_state); -- fsa_cib_delete(XML_CIB_TAG_STATUS, status, cib_quorum_override, rc, NULL); -- crm_info("Forced a remote LRM refresh before connection start: call=%d", rc); -- crm_log_xml_trace(status, "CLEAR LRM"); -- free_xml(status); - - rc = handle_remote_ra_start(lrm_state, cmd, cmd->timeout); - if (rc == 0) { -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index 54fae04..239af63 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -390,16 +390,7 @@ abort_transition_graph(int abort_priority, enum transition_action abort_action, - if (safe_str_eq(XML_CIB_TAG_STATE, kind) - || safe_str_eq(XML_CIB_TAG_NODE, kind)) { - -- if (crm_is_true(crm_element_value(search, XML_NODE_IS_REMOTE))) { -- /* Remote node uname and uuids are the same. -- * We also don't want them to be present in the -- * peer cache, so we shouldn't look them up with -- * crm_peer_uname() -- */ -- uname = ID(search); -- } else { -- uname = crm_peer_uname(ID(search)); -- } -+ uname = crm_peer_uname(ID(search)); - break; - } - search = search->parent; -diff --git a/include/crm/cluster.h b/include/crm/cluster.h -index 54b7f58..960c3d0 100644 ---- a/include/crm/cluster.h -+++ b/include/crm/cluster.h -@@ -32,6 +32,7 @@ - - extern gboolean crm_have_quorum; - extern GHashTable *crm_peer_cache; -+extern GHashTable *crm_remote_peer_cache; - extern unsigned long long crm_peer_seq; - - # ifndef CRM_SERVICE -@@ -55,12 +56,16 @@ enum crm_join_phase - }; - - /* *INDENT-ON* */ -+enum crm_node_flags -+{ -+ crm_remote_node = 0x0001, -+}; - - typedef struct crm_peer_node_s { - uint32_t id; /* Only used by corosync derivatives */ - uint64_t born; /* Only used by heartbeat and the legacy plugin */ - uint64_t last_seen; -- uint64_t flags; /* Unused, but might be a good place to specify 'remote' */ -+ uint64_t flags; /* Specified by crm_node_flags enum */ - - int32_t votes; /* Only used by the legacy plugin */ - uint32_t processes; -@@ -124,11 +129,25 @@ enum crm_ais_msg_types { - crm_msg_pe = 8, - crm_msg_stonith_ng = 9, - }; -+ -+/* used with crm_get_peer_full */ -+enum crm_get_peer_flags { -+ CRM_GET_PEER_CLUSTER = 0x0001, -+ CRM_GET_PEER_REMOTE = 0x0002, -+}; - /* *INDENT-ON* */ - - gboolean send_cluster_message(crm_node_t * node, enum crm_ais_msg_types service, - xmlNode * data, gboolean ordered); - -+ -+/* Initialize and refresh the remote peer cache from a cib config */ -+void crm_remote_peer_cache_refresh(xmlNode *cib); -+ -+/* allows filtering of remote and cluster nodes using crm_get_peer_flags */ -+crm_node_t *crm_get_peer_full(unsigned int id, const char *uname, int flags); -+ -+/* only searches cluster nodes */ - crm_node_t *crm_get_peer(unsigned int id, const char *uname); - - guint crm_active_peers(void); -diff --git a/lib/cib/cib_attrs.c b/lib/cib/cib_attrs.c -index 4af077c..d1e1b74 100644 ---- a/lib/cib/cib_attrs.c -+++ b/lib/cib/cib_attrs.c -@@ -430,6 +430,8 @@ get_remote_node_uuid(cib_t * the_cib, const char *uname, char **uuid) - cib_sync_call | cib_scope_local | cib_xpath, NULL); - free(xpath_string); - free(xml_search); -+ xml_search = NULL; -+ xpath_string = NULL; - - if (rc != pcmk_ok) { - len = strlen(REMOTE_NODE_XPATH2) + strlen(uname) + 1; -diff --git a/lib/cluster/cluster.c b/lib/cluster/cluster.c -index 5820c8d..5b743f9 100644 ---- a/lib/cluster/cluster.c -+++ b/lib/cluster/cluster.c -@@ -361,6 +361,11 @@ crm_peer_uname(const char *uuid) - - CRM_CHECK(uuid != NULL, return NULL); - -+ /* remote nodes have the same uname and uuid */ -+ if (g_hash_table_lookup(crm_remote_peer_cache, uuid)) { -+ return uuid; -+ } -+ - /* avoid blocking calls where possible */ - g_hash_table_iter_init(&iter, crm_peer_cache); - while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { -diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c -index bc1684e..e3082b4 100644 ---- a/lib/cluster/membership.c -+++ b/lib/cluster/membership.c -@@ -33,9 +33,56 @@ - #include - - GHashTable *crm_peer_cache = NULL; -+GHashTable *crm_remote_peer_cache = NULL; - unsigned long long crm_peer_seq = 0; - gboolean crm_have_quorum = FALSE; - -+static void -+remote_cache_refresh_helper(xmlNode *cib, const char *xpath, const char *field, int flags) -+{ -+ const char *remote = NULL; -+ crm_node_t *node = NULL; -+ xmlXPathObjectPtr xpathObj = NULL; -+ int max = 0; -+ int lpc = 0; -+ -+ xpathObj = xpath_search(cib, xpath); -+ max = numXpathResults(xpathObj); -+ for (lpc = 0; lpc < max; lpc++) { -+ xmlNode *xml = getXpathResult(xpathObj, lpc); -+ -+ CRM_CHECK(xml != NULL, continue); -+ -+ remote = crm_element_value(xml, field); -+ if (remote) { -+ crm_trace("added %s to remote cache", remote); -+ node = calloc(1, sizeof(crm_node_t)); -+ node->flags = flags; -+ CRM_ASSERT(node); -+ node->uname = strdup(remote); -+ node->uuid = strdup(remote); -+ node->state = strdup(CRM_NODE_MEMBER); -+ g_hash_table_replace(crm_remote_peer_cache, node->uname, node); -+ } -+ } -+ freeXpathObject(xpathObj); -+} -+ -+void crm_remote_peer_cache_refresh(xmlNode *cib) -+{ -+ const char *xpath = NULL; -+ -+ g_hash_table_remove_all(crm_remote_peer_cache); -+ -+ /* remote nodes associated with a cluster resource */ -+ xpath = "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE "//" XML_TAG_META_SETS "//" XML_CIB_TAG_NVPAIR "[@name='remote-node']"; -+ remote_cache_refresh_helper(cib, xpath, "value", crm_remote_node); -+ -+ /* remote nodes seen in the status section */ -+ xpath = "//" XML_TAG_CIB "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE "[@remote_node='true']"; -+ remote_cache_refresh_helper(cib, xpath, "id", crm_remote_node); -+} -+ - gboolean - crm_is_peer_active(const crm_node_t * node) - { -@@ -146,6 +193,10 @@ crm_peer_init(void) - if (crm_peer_cache == NULL) { - crm_peer_cache = g_hash_table_new_full(crm_str_hash, g_str_equal, free, destroy_crm_node); - } -+ -+ if (crm_remote_peer_cache == NULL) { -+ crm_remote_peer_cache = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, destroy_crm_node); -+ } - } - - void -@@ -156,6 +207,12 @@ crm_peer_destroy(void) - g_hash_table_destroy(crm_peer_cache); - crm_peer_cache = NULL; - } -+ -+ if (crm_remote_peer_cache != NULL) { -+ crm_trace("Destroying remote peer cache with %d members", g_hash_table_size(crm_remote_peer_cache)); -+ g_hash_table_destroy(crm_remote_peer_cache); -+ crm_remote_peer_cache = NULL; -+ } - } - - void (*crm_status_callback) (enum crm_status_type, crm_node_t *, const void *) = NULL; -@@ -186,6 +243,25 @@ static gboolean crm_hash_find_by_data(gpointer key, gpointer value, gpointer use - return FALSE; - } - -+crm_node_t * -+crm_get_peer_full(unsigned int id, const char *uname, int flags) -+{ -+ crm_node_t *node = NULL; -+ -+ CRM_ASSERT(id > 0 || uname != NULL); -+ -+ crm_peer_init(); -+ -+ if (flags & CRM_GET_PEER_REMOTE) { -+ node = g_hash_table_lookup(crm_remote_peer_cache, uname); -+ } -+ -+ if (node == NULL && (flags & CRM_GET_PEER_CLUSTER)) { -+ node = crm_get_peer(id, uname); -+ } -+ return node; -+} -+ - /* coverity[-alloc] Memory is referenced in one or both hashtables */ - crm_node_t * - crm_get_peer(unsigned int id, const char *uname) -diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c -index bdaf18c..e577293 100644 ---- a/lib/lrmd/lrmd_client.c -+++ b/lib/lrmd/lrmd_client.c -@@ -89,6 +89,11 @@ typedef struct lrmd_private_s { - gnutls_psk_client_credentials_t psk_cred_c; - - int sock; -+ /* since tls requires a round trip across the network for a -+ * request/reply, there are times where we just want to be able -+ * to send a request from the client and not wait around (or even care -+ * about) what the reply is. */ -+ int expected_late_replies; - GList *pending_notify; - crm_trigger_t *process_notify; - #endif -@@ -241,9 +246,7 @@ lrmd_dispatch_internal(lrmd_t * lrmd, xmlNode * msg) - /* this is proxy business */ - lrmd_internal_proxy_dispatch(lrmd, msg); - return 1; -- } -- -- if (!native->callback) { -+ } else if (!native->callback) { - /* no callback set */ - crm_trace("notify event received but client has not set callback"); - return 1; -@@ -371,7 +374,19 @@ lrmd_tls_dispatch(gpointer userdata) - xml = crm_remote_parse_buffer(native->remote); - } - while (xml) { -- lrmd_dispatch_internal(lrmd, xml); -+ const char *msg_type = crm_element_value(xml, F_LRMD_REMOTE_MSG_TYPE); -+ if (safe_str_eq(msg_type, "notify")) { -+ lrmd_dispatch_internal(lrmd, xml); -+ } else if (safe_str_eq(msg_type, "reply")) { -+ if (native->expected_late_replies > 0) { -+ native->expected_late_replies--; -+ } else { -+ int reply_id = 0; -+ crm_element_value_int(xml, F_LRMD_CALLID, &reply_id); -+ /* if this happens, we want to know about it */ -+ crm_err("Got outdated reply %d", reply_id); -+ } -+ } - free_xml(xml); - xml = crm_remote_parse_buffer(native->remote); - } -@@ -617,7 +632,11 @@ lrmd_tls_recv_reply(lrmd_t * lrmd, int total_timeout, int expected_reply_id, int - free_xml(xml); - xml = NULL; - } else if (reply_id != expected_reply_id) { -- crm_err("Got outdated reply, expected id %d got id %d", expected_reply_id, reply_id); -+ if (native->expected_late_replies > 0) { -+ native->expected_late_replies--; -+ } else { -+ crm_err("Got outdated reply, expected id %d got id %d", expected_reply_id, reply_id); -+ } - free_xml(xml); - xml = NULL; - } -@@ -724,6 +743,12 @@ lrmd_send_xml_no_reply(lrmd_t * lrmd, xmlNode * msg) - #ifdef HAVE_GNUTLS_GNUTLS_H - case CRM_CLIENT_TLS: - rc = lrmd_tls_send(lrmd, msg); -+ if (rc == pcmk_ok) { -+ /* we don't want to wait around for the reply, but -+ * since the request/reply protocol needs to behave the same -+ * as libqb, a reply will eventually come later anyway. */ -+ native->expected_late_replies++; -+ } - break; - #endif - default: -diff --git a/lrmd/ipc_proxy.c b/lrmd/ipc_proxy.c -index bbf9b24..3a51a5b 100644 ---- a/lrmd/ipc_proxy.c -+++ b/lrmd/ipc_proxy.c -@@ -313,6 +313,8 @@ ipc_proxy_remove_provider(crm_client_t *ipc_proxy) - GHashTableIter iter; - crm_client_t *ipc_client = NULL; - char *key = NULL; -+ GList *remove_these = NULL; -+ GListPtr gIter = NULL; - - if (ipc_providers == NULL) { - return; -@@ -326,9 +328,19 @@ ipc_proxy_remove_provider(crm_client_t *ipc_proxy) - if (safe_str_eq(proxy_id, ipc_proxy->id)) { - crm_info("ipc proxy connection for client %s pid %d destroyed because cluster node disconnected.", - ipc_client->id, ipc_client->pid); -- qb_ipcs_disconnect(ipc_client->ipcs); -+ /* we can't remove during the iteration, so copy items -+ * to a list we can destroy later */ -+ remove_these = g_list_append(remove_these, ipc_client); - } - } -+ -+ for (gIter = remove_these; gIter != NULL; gIter = gIter->next) { -+ ipc_client = gIter->data; -+ qb_ipcs_disconnect(ipc_client->ipcs); -+ } -+ -+ /* just frees the list, not the elements in the list */ -+ g_list_free(remove_these); - } - - void -diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c -index a4747cb..b5bbea0 100644 ---- a/lrmd/lrmd.c -+++ b/lrmd/lrmd.c -@@ -1297,6 +1297,7 @@ process_lrmd_message(crm_client_t * client, uint32_t id, xmlNode * request) - do_reply = 1; - } else if (crm_str_eq(op, LRMD_OP_POKE, TRUE)) { - do_notify = 1; -+ do_reply = 1; - } else { - rc = -EOPNOTSUPP; - do_reply = 1; -diff --git a/pengine/allocate.c b/pengine/allocate.c -index cf8f4d4..bfa8e7b 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1578,6 +1578,8 @@ apply_remote_node_ordering(pe_working_set_t *data_set) - container = remote_rsc->container; - if (safe_str_eq(action->task, "monitor") || - safe_str_eq(action->task, "start") || -+ safe_str_eq(action->task, "promote") || -+ safe_str_eq(action->task, "demote") || - safe_str_eq(action->task, CRM_OP_LRM_REFRESH) || - safe_str_eq(action->task, CRM_OP_CLEAR_FAILCOUNT) || - safe_str_eq(action->task, "delete")) { diff --git a/SOURCES/pacemaker-fix_cib_correctly_log_short-form_xml_diffs.patch b/SOURCES/pacemaker-fix_cib_correctly_log_short-form_xml_diffs.patch deleted file mode 100644 index 92edab1..0000000 --- a/SOURCES/pacemaker-fix_cib_correctly_log_short-form_xml_diffs.patch +++ /dev/null @@ -1,41 +0,0 @@ -commit 5c055e09858a257d50f2669016da01b808557b08 -Author: Andrew Beekhof -Date: Wed Aug 7 13:32:18 2013 +1000 - - Fix: cib: Correctly log short-form xml diffs - -diff --git a/lib/common/xml.c b/lib/common/xml.c -index d467ce4..25096a6 100644 ---- a/lib/common/xml.c -+++ b/lib/common/xml.c -@@ -1063,14 +1063,6 @@ log_data_element(int log_level, const char *file, const char *function, int line - do_crm_log_alias(log_level, file, function, line, "%s: %s", prefix, - "No data to dump as XML"); - return; -- -- } else if (is_set(options, xml_log_option_diff_short) -- && is_not_set(options, xml_log_option_diff_all)) { -- /* Still searching for the actual change */ -- for (a_child = __xml_first_child(data); a_child != NULL; a_child = __xml_next(a_child)) { -- log_data_element(log_level, file, function, line, prefix, a_child, depth + 1, options); -- } -- return; - } - - name = crm_element_name(data); -@@ -1092,6 +1084,15 @@ log_data_element(int log_level, const char *file, const char *function, int line - } - } - -+ if (is_set(options, xml_log_option_diff_short) -+ && is_not_set(options, xml_log_option_diff_all)) { -+ /* Still searching for the actual change */ -+ for (a_child = __xml_first_child(data); a_child != NULL; a_child = __xml_next(a_child)) { -+ log_data_element(log_level, file, function, line, prefix, a_child, depth + 1, options); -+ } -+ return; -+ } -+ - insert_prefix(options, &buffer, &offset, &max, depth); - if(data->type == XML_COMMENT_NODE) { - buffer_print(buffer, max, offset, "