diff --git a/.gitignore b/.gitignore index 8a90331..1412d55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ SOURCES/nagios-agents-metadata-105ab8a.tar.gz -SOURCES/pacemaker-2b07d5c.tar.gz +SOURCES/pacemaker-c3c624e.tar.gz diff --git a/.pacemaker.metadata b/.pacemaker.metadata index 984e5a1..4ff0e33 100644 --- a/.pacemaker.metadata +++ b/.pacemaker.metadata @@ -1,2 +1,2 @@ ea6c0a27fd0ae8ce02f84a11f08a0d79377041c3 SOURCES/nagios-agents-metadata-105ab8a.tar.gz -cd04ce3689e250b2b0d4ce2406222a0cd9767fea SOURCES/pacemaker-2b07d5c.tar.gz +572f66e455beeb43106974ed547118a26834d099 SOURCES/pacemaker-c3c624e.tar.gz diff --git a/SOURCES/001-new-behavior.patch b/SOURCES/001-new-behavior.patch deleted file mode 100644 index c09405b..0000000 --- a/SOURCES/001-new-behavior.patch +++ /dev/null @@ -1,99 +0,0 @@ -From d0278eca6f2f8d4e707f73d12b4f8161f07e42fe Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 2 Nov 2017 18:26:03 -0500 -Subject: [PATCH 1/2] Feature: tools: enable new crm_resource - --cleanup/--refresh behavior - -it was temporarily disabled by 3576364 ---- - tools/crm_resource.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 92255df..356bb05 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -212,14 +212,11 @@ static struct crm_option long_options[] = { - }, - { - "cleanup", no_argument, NULL, 'C', --#if 0 -- // new behavior disabled until 2.0.0 - "\t\tDelete failed operations from a resource's history allowing its current state to be rechecked.\n" - "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" - }, - { - "refresh", no_argument, NULL, 'R', --#endif - "\t\tDelete resource's history (including failures) so its current state is rechecked.\n" - "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" - "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be cleaned" -@@ -384,7 +381,6 @@ static struct crm_option long_options[] = { - {"un-migrate", no_argument, NULL, 'U', NULL, pcmk_option_hidden}, - {"un-move", no_argument, NULL, 'U', NULL, pcmk_option_hidden}, - -- {"refresh", 0, 0, 'R', NULL, pcmk_option_hidden}, // remove this line for 2.0.0 - {"reprobe", no_argument, NULL, 'P', NULL, pcmk_option_hidden}, - - {"-spacer-", 1, NULL, '-', "\nExamples:", pcmk_option_paragraph}, -@@ -645,7 +641,7 @@ main(int argc, char **argv) - if (cib_file == NULL) { - require_crmd = TRUE; - } -- just_errors = FALSE; // disable until 2.0.0 -+ just_errors = TRUE; - rsc_cmd = 'C'; - find_flags = pe_find_renamed|pe_find_anon; - break; --- -1.8.3.1 - - -From b48ceeb041cee65a9b93b9b76235e475fa1a128f Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Mon, 16 Oct 2017 09:45:18 -0500 -Subject: [PATCH 2/2] Feature: crmd: default record-pending to TRUE - ---- - crmd/lrm.c | 15 ++++++--------- - 1 file changed, 6 insertions(+), 9 deletions(-) - -diff --git a/crmd/lrm.c b/crmd/lrm.c -index eb4e16e..36dc076 100644 ---- a/crmd/lrm.c -+++ b/crmd/lrm.c -@@ -2061,25 +2061,22 @@ stop_recurring_actions(gpointer key, gpointer value, gpointer user_data) - static void - record_pending_op(const char *node_name, lrmd_rsc_info_t *rsc, lrmd_event_data_t *op) - { -+ const char *record_pending = NULL; -+ - CRM_CHECK(node_name != NULL, return); - CRM_CHECK(rsc != NULL, return); - CRM_CHECK(op != NULL, return); - -- if (op->op_type == NULL -+ if ((op->op_type == NULL) || (op->params == NULL) - || safe_str_eq(op->op_type, CRMD_ACTION_CANCEL) - || safe_str_eq(op->op_type, CRMD_ACTION_DELETE)) { - return; - } - -- if (op->params == NULL) { -+ // defaults to true -+ record_pending = crm_meta_value(op->params, XML_OP_ATTR_PENDING); -+ if (record_pending && !crm_is_true(record_pending)) { - return; -- -- } else { -- const char *record_pending = crm_meta_value(op->params, XML_OP_ATTR_PENDING); -- -- if (record_pending == NULL || crm_is_true(record_pending) == FALSE) { -- return; -- } - } - - op->call_id = -1; --- -1.8.3.1 - diff --git a/SOURCES/001-rollup.patch b/SOURCES/001-rollup.patch new file mode 100644 index 0000000..d4f3cf9 --- /dev/null +++ b/SOURCES/001-rollup.patch @@ -0,0 +1,355 @@ +From 28076181217313c7e33bf88cb70eb16c2f8e737f Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 19 Jul 2018 12:38:08 -0500 +Subject: [PATCH 1/4] Low: tools: enable file consolidation in crm_report + +Correct a variable misspelling that resulted in file de-duplication being +skipped. Also, remove an unused variable, and avoid the unreliable "-a". +Found by static analysis. +--- + tools/crm_report.in | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +diff --git a/tools/crm_report.in b/tools/crm_report.in +index 43ed646..695c1f1 100755 +--- a/tools/crm_report.in ++++ b/tools/crm_report.in +@@ -27,7 +27,6 @@ eval set -- "$TEMP" + + progname=$(basename "$0") + rsh="ssh -T" +-times="" + tests="" + nodes="" + compress=1 +@@ -243,10 +242,18 @@ EOF + # check if files have same content in the cluster + # + cibdiff() { +- d1=`dirname $1` +- d2=`dirname $2` +- if [ -f $d1/RUNNING -a -f $d2/RUNNING ] || +- [ -f $d1/STOPPED -a -f $d2/STOPPED ]; then ++ d1=$(dirname $1) ++ d2=$(dirname $2) ++ ++ if [ -f "$d1/RUNNING" ] && [ ! -f "$d2/RUNNING" ]; then ++ DIFF_OK=0 ++ elif [ -f "$d1/STOPPED" ] && [ ! -f "$d2/STOPPED" ]; then ++ DIFF_OK=0 ++ else ++ DIFF_OK=1 ++ fi ++ ++ if [ $DIFF_OK -eq 1 ]; then + if which crm_diff > /dev/null 2>&1; then + crm_diff -c -n $1 -o $2 + else +@@ -277,7 +284,7 @@ esac + # remove duplicates if files are same, make links instead + # + consolidate() { +- for n in $NODES; do ++ for n in $nodes; do + if [ -f $1/$2 ]; then + rm $1/$n/$2 + else +@@ -290,7 +297,7 @@ consolidate() { + analyze_one() { + rc=0 + node0="" +- for n in $NODES; do ++ for n in $nodes; do + if [ "$node0" ]; then + diffcheck $1/$node0/$2 $1/$n/$2 + rc=$(($rc+$?)) +-- +1.8.3.1 + + +From 2db3895359beb0f577c142c03ac2c8e6f44c67cf Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 4 Apr 2018 15:47:18 -0500 +Subject: [PATCH 2/4] Low: tools: get sensor lun in ipmiservicelogd before + using it + +--- + tools/ipmiservicelogd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/ipmiservicelogd.c b/tools/ipmiservicelogd.c +index 47ff220..1047c9c 100644 +--- a/tools/ipmiservicelogd.c ++++ b/tools/ipmiservicelogd.c +@@ -434,14 +434,14 @@ sensor_discrete_event_handler(ipmi_sensor_t * sensor, + instance = ipmi_entity_get_entity_instance(ent); + ipmi_sensor_get_id(sensor, name, sizeof(name)); + ++ ipmi_sensor_get_num(sensor, &sensor_lun, &sensor_number); ++ + sel_id = ipmi_entity_get_entity_id(ent); + sel_type = ipmi_entity_get_type(ent); + generator = ipmi_entity_get_slave_address(ent) | (sensor_lun << 5); /* LUN (2 bits) | SLAVE ADDRESS (5 bits) */ + version = 0x04; + sensor_type = ipmi_sensor_get_sensor_type(sensor); + +- ipmi_sensor_get_num(sensor, &sensor_lun, &sensor_number); +- + event_class = 0; /* @TBD - where does this come from? */ + event_type = ipmi_event_get_type(event); + direction = dir; +-- +1.8.3.1 + + +From 7a79e4ef8315842d4d1078475dab287d8f3327de Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 25 Jul 2018 15:15:38 -0500 +Subject: [PATCH 3/4] Low: tools: notifyServicelogEvent FTBFS on ppc64le + +--- + tools/notifyServicelogEvent.c | 24 ++++++++---------------- + 1 file changed, 8 insertions(+), 16 deletions(-) + +diff --git a/tools/notifyServicelogEvent.c b/tools/notifyServicelogEvent.c +index b7f672c..700f068 100644 +--- a/tools/notifyServicelogEvent.c ++++ b/tools/notifyServicelogEvent.c +@@ -1,24 +1,15 @@ + /* +- * Copyright (C) 2009 International Business Machines, IBM, Mark Hamzy ++ * Copyright 2009-2018 International Business Machines, IBM, Mark Hamzy + * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public +- * License as published by the Free Software Foundation; either +- * version 2 of the License, or (at your option) any later version. +- * +- * This software is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- * +- * You should have received a copy of the GNU General Public +- * License along with this library; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ * This source code is licensed under the GNU General Public License version 2 ++ * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + + /* gcc -o notifyServicelogEvent `pkg-config --cflags servicelog-1` `pkg-config --libs servicelog-1` notifyServicelogEvent.c + */ + ++#include ++ + #include + #include + #include +@@ -27,9 +18,10 @@ + #include + #include + #include ++ + #include + #include +-#include ++#include + + typedef enum { STATUS_GREEN = 1, STATUS_YELLOW, STATUS_RED } STATUS; + +@@ -91,7 +83,7 @@ main(int argc, char *argv[]) + struct sl_event *event = NULL; + uint64_t event_id = 0; + +- crm_log_init_quiet("notifyServicelogEvent", LOG_INFO, FALSE, TRUE, argc, argv); ++ crm_log_cli_init("notifyServicelogEvent"); + crm_set_options(NULL, "event_id ", long_options, + "Gets called upon events written to servicelog database"); + +-- +1.8.3.1 + + +From b408a3ead462c8f02b68a164f24ba1b05bb3cad1 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 25 Jul 2018 16:07:42 -0500 +Subject: [PATCH 4/4] Low: tools: ipmiservicelogd FTBFS on ppc64le + +--- + tools/ipmiservicelogd.c | 53 +++++++++++++++++++++++-------------------------- + 1 file changed, 25 insertions(+), 28 deletions(-) + +diff --git a/tools/ipmiservicelogd.c b/tools/ipmiservicelogd.c +index 1047c9c..4f52865 100644 +--- a/tools/ipmiservicelogd.c ++++ b/tools/ipmiservicelogd.c +@@ -9,13 +9,10 @@ + * Author: Intel Corporation + * Jeff Zheng + * +- * Copyright 2009 International Business Machines, IBM +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public License +- * as published by the Free Software Foundation; either version 2 of +- * the License, or (at your option) any later version. ++ * Copyright 2009-2018 International Business Machines, IBM + * ++ * This source code is licensed under the GNU Lesser General Public License ++ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +@@ -27,10 +24,6 @@ + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this program; if not, write to the Free +- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + /* gcc -o ipmiservicelogd -g `pkg-config --cflags --libs OpenIPMI OpenIPMIposix servicelog-1` ipmiservicelogd.c +@@ -38,6 +31,12 @@ + /* ./ipmiservicelogd smi 0 + */ + ++#include ++ ++#ifndef _GNU_SOURCE ++# define _GNU_SOURCE ++#endif ++ + #include + #include + #include +@@ -68,7 +67,7 @@ + + static os_handler_t *os_hnd; + +-char *getStringExecOutput(char *args[]); ++char *getStringExecOutput(const char *const args[]); + char *getSerialNumber(void); + char *getProductName(void); + static void con_usage(const char *name, const char *help, void *cb_data); +@@ -91,7 +90,7 @@ void setup_done(ipmi_domain_t * domain, int err, unsigned int conn_num, unsigned + int still_connected, void *user_data); + + char * +-getStringExecOutput(char *args[]) ++getStringExecOutput(const char *const args[]) + { + int rc; + pid_t pid; +@@ -201,7 +200,11 @@ getStringExecOutput(char *args[]) + crm_err("Error: child close (pipefd[1]) = %d", errno); + } + +- rc = execvp(args[0], args); ++ /* execvp() takes (char *const *) for backward compatibility, ++ * but POSIX guarantees that it will not modify the strings, ++ * so the cast is safe ++ */ ++ rc = execvp(args[0], (char *const *) args); + + if (rc == -1) { + crm_err("Error: child execvp = %d", errno); +@@ -224,7 +227,7 @@ getStringExecOutput(char *args[]) + char * + getSerialNumber(void) + { +- char *dmiArgs[] = { ++ const char *const dmiArgs[] = { + "dmidecode", + "--string", + "system-serial-number", +@@ -237,7 +240,7 @@ getSerialNumber(void) + char * + getProductName(void) + { +- char *dmiArgs[] = { ++ const char *dmiArgs[] = { + "dmidecode", + "--string", + "system-product-name", +@@ -313,8 +316,8 @@ ipmi2servicelog(struct sl_data_bmc *bmc_data) + sl_event.machine_serial = serial_number; + sl_event.machine_model = product_name; /* it may not have the serial # within the first 20 chars */ + sl_event.nodename = name.nodename; +- sl_event.refcode = "ipmi"; +- sl_event.description = "ipmi event"; ++ sl_event.refcode = strdup("ipmi"); ++ sl_event.description = strdup("ipmi event"); + sl_event.serviceable = 1; /* 1 or 0 */ + sl_event.predictive = 0; /* 1 or 0 */ + sl_event.disposition = SL_DISP_RECOVERABLE; /* one of SL_DISP_* */ +@@ -336,6 +339,8 @@ ipmi2servicelog(struct sl_data_bmc *bmc_data) + crm_debug("Sending to servicelog database"); + } + ++ free(sl_event.refcode); ++ free(sl_event.description); + free(serial_number); + free(product_name); + +@@ -352,7 +357,6 @@ sensor_threshold_event_handler(ipmi_sensor_t * sensor, + double value, void *cb_data, ipmi_event_t * event) + { + ipmi_entity_t *ent = ipmi_sensor_get_entity(sensor); +- int id, instance; + char name[IPMI_ENTITY_NAME_LEN]; + struct sl_data_bmc bmc_data; + uint32_t sel_id; +@@ -366,8 +370,6 @@ sensor_threshold_event_handler(ipmi_sensor_t * sensor, + uint8_t event_type; + int direction; + +- id = ipmi_entity_get_entity_id(ent); +- instance = ipmi_entity_get_entity_instance(ent); + ipmi_sensor_get_id(sensor, name, sizeof(name)); + + ipmi_sensor_get_num(sensor, &sensor_lun, &sensor_number); +@@ -416,7 +418,6 @@ sensor_discrete_event_handler(ipmi_sensor_t * sensor, + int severity, int prev_severity, void *cb_data, ipmi_event_t * event) + { + ipmi_entity_t *ent = ipmi_sensor_get_entity(sensor); +- int id, instance; + char name[IPMI_ENTITY_NAME_LEN]; + struct sl_data_bmc bmc_data; + uint32_t sel_id; +@@ -430,8 +431,6 @@ sensor_discrete_event_handler(ipmi_sensor_t * sensor, + uint8_t event_type; + int direction; + +- id = ipmi_entity_get_entity_id(ent); +- instance = ipmi_entity_get_entity_instance(ent); + ipmi_sensor_get_id(sensor, name, sizeof(name)); + + ipmi_sensor_get_num(sensor, &sensor_lun, &sensor_number); +@@ -501,10 +500,7 @@ static void + entity_change(enum ipmi_update_e op, ipmi_domain_t * domain, ipmi_entity_t * entity, void *cb_data) + { + int rv; +- int id, instance; + +- id = ipmi_entity_get_entity_id(entity); +- instance = ipmi_entity_get_entity_instance(entity); + if (op == IPMI_ADDED) { + /* Register callback so that when the status of a + sensor changes, sensor_change is called */ +@@ -564,8 +560,9 @@ main(int argc, char *argv[]) + #endif + + crm_make_daemon("ipmiservicelogd", TRUE, "/var/run/ipmiservicelogd.pid0"); +- +- crm_log_init("ipmiservicelogd", LOG_INFO, FALSE, TRUE, argc, argv); ++ crm_log_cli_init("ipmiservicelogd"); ++ // Maybe this should log like a daemon instead? ++ // crm_log_init("ipmiservicelogd", LOG_INFO, TRUE, FALSE, argc, argv, FALSE); + + #ifdef COMPLEX + rv = ipmi_args_setup_con(args, os_hnd, NULL, &con); +-- +1.8.3.1 + diff --git a/SOURCES/002-fixes.patch b/SOURCES/002-fixes.patch deleted file mode 100644 index 02d563d..0000000 --- a/SOURCES/002-fixes.patch +++ /dev/null @@ -1,7624 +0,0 @@ -From 87856f05a85e2d20b7265b78373657e97dbf18e4 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Wed, 29 Nov 2017 17:21:29 -0600 -Subject: [PATCH 01/16] Fix: attrd: ensure node name is broadcast at start-up - (CLBZ#5330) - -This fixes a regression introduced in 1.1.18. - -Since c9d1c3cd, the crmd no longer explicitly clears the terminate and shutdown -node attributes at first join. An unwanted side effect of this was that the -attrd writer no longer reliably learned a joining node's name. If a node is -known only by its ID, the writer can not write its attributes to the CIB. - -The worst outcome is that the joining node would be unable to shut down, -since the shutdown attribute would never trigger the policy engine. The window -was limited because the writer learns the node's name if a new attrd -election was required, or a node attribute was set locally on the joining node. - -The fix is to set a new private attribute, #attrd-protocol, at attrd start-up, -with the supported attrd protocol version. This has the additional benefit of -allowing any node to determine the minimum supported protocol version across -all active cluster nodes. ---- - attrd/commands.c | 30 ++++++++++++++++++++++++------ - attrd/internal.h | 1 + - attrd/main.c | 7 +++++++ - include/crm/crm.h | 1 + - 4 files changed, 33 insertions(+), 6 deletions(-) - -diff --git a/attrd/commands.c b/attrd/commands.c -index 967703f..0a20b26 100644 ---- a/attrd/commands.c -+++ b/attrd/commands.c -@@ -35,8 +35,9 @@ - * heartbeat, CMAN, or corosync-plugin stacks) is unversioned. - * - * With atomic attrd, each attrd will send ATTRD_PROTOCOL_VERSION with every -- * peer request and reply. Currently, there is no way to know the minimum -- * version supported by all peers, which limits its usefulness. -+ * peer request and reply. As of Pacemaker 2.0.0, at start-up each attrd will -+ * also set a private attribute for itself with its version, so any attrd can -+ * determine the minimum version supported by all peers. - * - * Protocol Pacemaker Significant changes - * -------- --------- ------------------- -@@ -289,11 +290,10 @@ void - attrd_client_clear_failure(xmlNode *xml) - { - #if 0 -- /* @TODO This would be most efficient, but there is currently no way to -- * verify that all peers support the op. If that ever changes, we could -- * enable this code. -+ /* @TODO Track the minimum supported protocol version across all nodes, -+ * then enable this more-efficient code. - */ -- if (all_peers_support_clear_failure) { -+ if (compare_version("2", minimum_protocol_version) <= 0) { - /* Propagate to all peers (including ourselves). - * This ends up at attrd_peer_message(). - */ -@@ -523,6 +523,24 @@ attrd_peer_clear_failure(crm_node_t *peer, xmlNode *xml) - regfree(®ex); - } - -+/*! -+ \internal -+ \brief Broadcast private attribute for local node with protocol version -+*/ -+void -+attrd_broadcast_protocol() -+{ -+ xmlNode *attrd_op = create_xml_node(NULL, __FUNCTION__); -+ -+ crm_xml_add(attrd_op, F_TYPE, T_ATTRD); -+ crm_xml_add(attrd_op, F_ORIG, crm_system_name); -+ crm_xml_add(attrd_op, F_ATTRD_TASK, ATTRD_OP_UPDATE); -+ crm_xml_add(attrd_op, F_ATTRD_ATTRIBUTE, CRM_ATTR_PROTOCOL); -+ crm_xml_add(attrd_op, F_ATTRD_VALUE, ATTRD_PROTOCOL_VERSION); -+ crm_xml_add_int(attrd_op, F_ATTRD_IS_PRIVATE, 1); -+ attrd_client_update(attrd_op); -+} -+ - void - attrd_peer_message(crm_node_t *peer, xmlNode *xml) - { -diff --git a/attrd/internal.h b/attrd/internal.h -index 99fc3fd..23bcbda 100644 ---- a/attrd/internal.h -+++ b/attrd/internal.h -@@ -53,6 +53,7 @@ election_t *writer; - crm_ipcs_send_ack((client), (id), (flags), "ack", __FUNCTION__, __LINE__) - - void write_attributes(bool all); -+void attrd_broadcast_protocol(void); - void attrd_peer_message(crm_node_t *client, xmlNode *msg); - void attrd_client_peer_remove(const char *client_name, xmlNode *xml); - void attrd_client_clear_failure(xmlNode *xml); -diff --git a/attrd/main.c b/attrd/main.c -index 2670dc5..7721439 100644 ---- a/attrd/main.c -+++ b/attrd/main.c -@@ -220,6 +220,13 @@ attrd_cib_connect(int max_retry) - // Always read the CIB at start-up - mainloop_set_trigger(attrd_config_read); - -+ /* Set a private attribute for ourselves with the protocol version we -+ * support. This lets all nodes determine the minimum supported version -+ * across all nodes. It also ensures that the writer learns our node name, -+ * so it can send our attributes to the CIB. -+ */ -+ attrd_broadcast_protocol(); -+ - return pcmk_ok; - - cleanup: -diff --git a/include/crm/crm.h b/include/crm/crm.h -index 05ec555..6e2bcfa 100644 ---- a/include/crm/crm.h -+++ b/include/crm/crm.h -@@ -106,6 +106,7 @@ extern char *crm_system_name; - # define CRM_ATTR_DIGESTS_ALL "#digests-all" - # define CRM_ATTR_DIGESTS_SECURE "#digests-secure" - # define CRM_ATTR_RA_VERSION "#ra-version" -+# define CRM_ATTR_PROTOCOL "#attrd-protocol" - - /* Valid operations */ - # define CRM_OP_NOOP "noop" --- -1.8.3.1 - - -From a87421042f5030e6dd7823cd80d7632b91296519 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 1 Dec 2017 11:02:54 -0600 -Subject: [PATCH 02/16] Refactor: pengine: functionize checking whether node - was unfenced - -reduces code duplication and enhances readability ---- - pengine/native.c | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - -diff --git a/pengine/native.c b/pengine/native.c -index e72dec4..c998e4b 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -429,6 +429,14 @@ rsc_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, const c - return work; - } - -+static inline bool -+node_has_been_unfenced(node_t *node) -+{ -+ const char *unfenced = pe_node_attribute_raw(node, CRM_ATTR_UNFENCED); -+ -+ return unfenced && strcmp("0", unfenced); -+} -+ - node_t * - native_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) - { -@@ -2524,10 +2532,9 @@ StopRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * d - - if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { - action_t *unfence = pe_fence_op(current, "on", TRUE, NULL, data_set); -- const char *unfenced = pe_node_attribute_raw(current, CRM_ATTR_UNFENCED); - - order_actions(stop, unfence, pe_order_implies_first); -- if (unfenced == NULL || safe_str_eq("0", unfenced)) { -+ if (!node_has_been_unfenced(current)) { - pe_proc_err("Stopping %s until %s can be unfenced", rsc->id, current->details->uname); - } - } -@@ -2547,11 +2554,9 @@ StartRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * - - if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { - action_t *unfence = pe_fence_op(next, "on", TRUE, NULL, data_set); -- const char *unfenced = pe_node_attribute_raw(next, CRM_ATTR_UNFENCED); - - order_actions(unfence, start, pe_order_implies_then); -- -- if (unfenced == NULL || safe_str_eq("0", unfenced)) { -+ if (!node_has_been_unfenced(next)) { - char *reason = crm_strdup_printf("Required by %s", rsc->id); - trigger_unfencing(NULL, next, reason, NULL, data_set); - free(reason); --- -1.8.3.1 - - -From b6b3fb9e8c6c6b34fb39c9d7f0b89ef41e9486fa Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 1 Dec 2017 11:45:31 -0600 -Subject: [PATCH 03/16] Refactor: pengine: functionize checking for unfence - device - -Reduces code duplication and enhances readability. This also comments out some -dead code from when probe_complete was still used. ---- - pengine/native.c | 24 ++++++++++++++---------- - 1 file changed, 14 insertions(+), 10 deletions(-) - -diff --git a/pengine/native.c b/pengine/native.c -index c998e4b..e57fbc7 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -437,6 +437,13 @@ node_has_been_unfenced(node_t *node) - return unfenced && strcmp("0", unfenced); - } - -+static inline bool -+is_unfence_device(resource_t *rsc, pe_working_set_t *data_set) -+{ -+ return is_set(rsc->flags, pe_rsc_fence_device) -+ && is_set(data_set->flags, pe_flag_enable_unfencing); -+} -+ - node_t * - native_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) - { -@@ -3015,12 +3022,8 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - crm_debug("Probing %s on %s (%s) %d %p", rsc->id, node->details->uname, role2text(rsc->role), - is_set(probe->flags, pe_action_runnable), rsc->running_on); - -- if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { -+ if (is_unfence_device(rsc, data_set) || !pe_rsc_is_clone(top)) { - top = rsc; -- -- } else if (pe_rsc_is_clone(top) == FALSE) { -- top = rsc; -- - } else { - crm_trace("Probing %s on %s (%s) as %s", rsc->id, node->details->uname, role2text(rsc->role), top->id); - } -@@ -3041,17 +3044,18 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, - top, reload_key(rsc), NULL, - pe_order_optional, data_set); - -- if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { -+#if 0 -+ // complete is always null currently -+ if (!is_unfence_device(rsc, data_set)) { - /* 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. -+ * on rsc.probe. But this can't be the case for fence devices -+ * with unfencing, as it would create graph loops. - * - * So instead we explicitly order 'rsc.probe then rsc.start' - */ -- -- } else { - order_actions(probe, complete, pe_order_implies_then); - } -+#endif - return TRUE; - } - --- -1.8.3.1 - - -From 63431baae2e544dc3b21d51b035942dfeeca5561 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 1 Dec 2017 12:06:16 -0600 -Subject: [PATCH 04/16] Fix: pengine: unfence before probing or starting fence - devices - -Regression since 7f8ba307 ---- - pengine/native.c | 62 ++++++++++++++++++++++++++++++++------------------------ - 1 file changed, 35 insertions(+), 27 deletions(-) - -diff --git a/pengine/native.c b/pengine/native.c -index e57fbc7..0013e33 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -2550,6 +2550,39 @@ StopRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * d - return TRUE; - } - -+static void -+order_after_unfencing(resource_t *rsc, pe_node_t *node, action_t *action, -+ enum pe_ordering order, pe_working_set_t *data_set) -+{ -+ /* When unfencing is in use, we order unfence actions before any probe or -+ * start of resources that require unfencing, and also of fence devices. -+ * -+ * This might seem to violate the principle that fence devices require -+ * only quorum. However, fence agents that unfence often don't have enough -+ * information to even probe or start unless the node is first unfenced. -+ */ -+ if (is_unfence_device(rsc, data_set) -+ || is_set(rsc->flags, pe_rsc_needs_unfencing)) { -+ -+ /* Start with an optional ordering. Requiring unfencing would result in -+ * the node being unfenced, and all its resources being stopped, -+ * whenever a new resource is added -- which would be highly suboptimal. -+ */ -+ action_t *unfence = pe_fence_op(node, "on", TRUE, NULL, data_set); -+ -+ order_actions(unfence, action, order); -+ -+ if (!node_has_been_unfenced(node)) { -+ // But unfencing is required if it has never been done -+ char *reason = crm_strdup_printf("required by %s %s", -+ rsc->id, action->task); -+ -+ trigger_unfencing(NULL, node, reason, NULL, data_set); -+ free(reason); -+ } -+ } -+} -+ - gboolean - StartRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * data_set) - { -@@ -2559,16 +2592,7 @@ StartRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * - pe_rsc_trace(rsc, "%s on %s %d %d", rsc->id, next ? next->details->uname : "N/A", optional, next ? next->weight : 0); - start = start_action(rsc, next, TRUE); - -- if(is_set(rsc->flags, pe_rsc_needs_unfencing)) { -- action_t *unfence = pe_fence_op(next, "on", TRUE, NULL, data_set); -- -- order_actions(unfence, start, pe_order_implies_then); -- if (!node_has_been_unfenced(next)) { -- char *reason = crm_strdup_printf("Required by %s", rsc->id); -- trigger_unfencing(NULL, next, reason, NULL, data_set); -- free(reason); -- } -- } -+ order_after_unfencing(rsc, next, start, pe_order_implies_then, data_set); - - if (is_set(start->flags, pe_action_runnable) && optional == FALSE) { - update_action_flags(start, pe_action_optional | pe_action_clear, __FUNCTION__, __LINE__); -@@ -2989,23 +3013,7 @@ 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, __FUNCTION__, __LINE__); - -- /* 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_needs_unfencing)) { -- action_t *unfence = pe_fence_op(node, "on", TRUE, NULL, data_set); -- order_actions(unfence, probe, pe_order_optional); -- } -+ order_after_unfencing(rsc, node, probe, pe_order_optional, data_set); - - /* - * We need to know if it's running_on (not just known_on) this node --- -1.8.3.1 - - -From 9d3840f374122f6258ddfe44bf85ff43d394d209 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 1 Dec 2017 12:24:55 -0600 -Subject: [PATCH 05/16] Test: PE: update regression tests for unfencing change - ---- - pengine/test10/start-then-stop-with-unfence.dot | 3 +++ - pengine/test10/start-then-stop-with-unfence.exp | 15 +++++++++++++-- - pengine/test10/start-then-stop-with-unfence.summary | 10 +++++----- - pengine/test10/unfence-definition.dot | 2 ++ - pengine/test10/unfence-definition.exp | 9 ++++++++- - pengine/test10/unfence-definition.summary | 4 ++-- - pengine/test10/unfence-parameters.dot | 2 ++ - pengine/test10/unfence-parameters.exp | 9 ++++++++- - pengine/test10/unfence-parameters.summary | 4 ++-- - pengine/test10/unfence-startup.dot | 1 + - pengine/test10/unfence-startup.exp | 6 +++++- - pengine/test10/unfence-startup.summary | 4 ++-- - 12 files changed, 53 insertions(+), 16 deletions(-) - -diff --git a/pengine/test10/start-then-stop-with-unfence.dot b/pengine/test10/start-then-stop-with-unfence.dot -index 6e9569b..b324339 100644 ---- a/pengine/test10/start-then-stop-with-unfence.dot -+++ b/pengine/test10/start-then-stop-with-unfence.dot -@@ -23,5 +23,8 @@ digraph "g" { - "mpath-node2_monitor_0 rhel7-node1.example.com" [ style=bold color="green" fontcolor="black"] - "stonith 'on' rhel7-node1.example.com" -> "ip1_start_0 rhel7-node1.example.com" [ style = bold] - "stonith 'on' rhel7-node1.example.com" -> "jrummy_start_0 rhel7-node1.example.com" [ style = bold] -+"stonith 'on' rhel7-node1.example.com" -> "mpath-node1_monitor_0 rhel7-node1.example.com" [ style = bold] -+"stonith 'on' rhel7-node1.example.com" -> "mpath-node1_start_0 rhel7-node1.example.com" [ style = bold] -+"stonith 'on' rhel7-node1.example.com" -> "mpath-node2_monitor_0 rhel7-node1.example.com" [ style = bold] - "stonith 'on' rhel7-node1.example.com" [ style=bold color="green" fontcolor="black"] - } -diff --git a/pengine/test10/start-then-stop-with-unfence.exp b/pengine/test10/start-then-stop-with-unfence.exp -index 75cb356..715ba40 100644 ---- a/pengine/test10/start-then-stop-with-unfence.exp -+++ b/pengine/test10/start-then-stop-with-unfence.exp -@@ -6,7 +6,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -30,6 +34,9 @@ - - - -+ -+ -+ - - - -@@ -41,7 +48,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -diff --git a/pengine/test10/start-then-stop-with-unfence.summary b/pengine/test10/start-then-stop-with-unfence.summary -index 2e02a21..b2114d7 100644 ---- a/pengine/test10/start-then-stop-with-unfence.summary -+++ b/pengine/test10/start-then-stop-with-unfence.summary -@@ -11,23 +11,23 @@ Online: [ rhel7-node1.example.com rhel7-node2.example.com ] - Stopped: [ rhel7-node1.example.com ] - - Transition Summary: -- * Fence (on) rhel7-node1.example.com 'Required by ip1' -+ * Fence (on) rhel7-node1.example.com 'required by mpath-node2 monitor' - * Start mpath-node1 (rhel7-node1.example.com) - * Move ip1 ( rhel7-node2.example.com -> rhel7-node1.example.com ) - * Start jrummy:1 (rhel7-node1.example.com) - - Executing cluster transition: -- * Resource action: mpath-node2 monitor on rhel7-node1.example.com -- * Resource action: mpath-node1 monitor on rhel7-node1.example.com - * Pseudo action: jrummy-clone_start_0 - * Fencing rhel7-node1.example.com (on) -- * Resource action: mpath-node1 start on rhel7-node1.example.com -+ * Resource action: mpath-node2 monitor on rhel7-node1.example.com -+ * Resource action: mpath-node1 monitor on rhel7-node1.example.com - * Resource action: jrummy start on rhel7-node1.example.com - * Pseudo action: jrummy-clone_running_0 -- * Resource action: mpath-node1 monitor=60000 on rhel7-node1.example.com -+ * Resource action: mpath-node1 start on rhel7-node1.example.com - * Resource action: ip1 stop on rhel7-node2.example.com - * Resource action: jrummy monitor=10000 on rhel7-node1.example.com - * Pseudo action: all_stopped -+ * Resource action: mpath-node1 monitor=60000 on rhel7-node1.example.com - * Resource action: ip1 start on rhel7-node1.example.com - * Resource action: ip1 monitor=10000 on rhel7-node1.example.com - -diff --git a/pengine/test10/unfence-definition.dot b/pengine/test10/unfence-definition.dot -index 3bc29d3..c42391a 100644 ---- a/pengine/test10/unfence-definition.dot -+++ b/pengine/test10/unfence-definition.dot -@@ -66,11 +66,13 @@ digraph "g" { - "fencing_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-1" -> "clvmd_start_0 virt-1" [ style = bold] - "stonith 'on' virt-1" -> "dlm_start_0 virt-1" [ style = bold] -+"stonith 'on' virt-1" -> "fencing_start_0 virt-1" [ style = bold] - "stonith 'on' virt-1" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-3" -> "clvmd:2_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_start_0 virt-3" [ 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 b1e241a..25c5674 100644 ---- a/pengine/test10/unfence-definition.exp -+++ b/pengine/test10/unfence-definition.exp -@@ -11,6 +11,9 @@ - - - -+ -+ -+ - - - -@@ -28,7 +31,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -diff --git a/pengine/test10/unfence-definition.summary b/pengine/test10/unfence-definition.summary -index 4ca9344..2051c51 100644 ---- a/pengine/test10/unfence-definition.summary -+++ b/pengine/test10/unfence-definition.summary -@@ -13,7 +13,7 @@ Online: [ virt-1 virt-2 virt-3 ] - - Transition Summary: - * Fence (reboot) virt-4 'node is unclean' -- * Fence (on) virt-3 'Required by dlm:2' -+ * Fence (on) virt-3 'required by fencing monitor' - * Fence (on) virt-1 'Device definition changed' - * Restart fencing ( virt-1 ) - * Restart dlm:0 ( virt-1 ) due to required stonith -@@ -23,13 +23,13 @@ Transition Summary: - * Start clvmd:2 (virt-3) - - Executing cluster transition: -- * Resource action: fencing monitor on virt-3 - * Resource action: fencing stop on virt-1 - * Resource action: clvmd monitor on virt-2 - * Pseudo action: clvmd-clone_stop_0 - * Fencing virt-4 (reboot) - * Pseudo action: stonith_complete - * Fencing virt-3 (on) -+ * Resource action: fencing monitor on virt-3 - * Resource action: fencing delete on virt-1 - * Resource action: dlm monitor on virt-3 - * Resource action: clvmd stop on virt-1 -diff --git a/pengine/test10/unfence-parameters.dot b/pengine/test10/unfence-parameters.dot -index ce006c4..3c27b22 100644 ---- a/pengine/test10/unfence-parameters.dot -+++ b/pengine/test10/unfence-parameters.dot -@@ -63,11 +63,13 @@ digraph "g" { - "fencing_stop_0 virt-1" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-1" -> "clvmd_start_0 virt-1" [ style = bold] - "stonith 'on' virt-1" -> "dlm_start_0 virt-1" [ style = bold] -+"stonith 'on' virt-1" -> "fencing_start_0 virt-1" [ style = bold] - "stonith 'on' virt-1" [ style=bold color="green" fontcolor="black"] - "stonith 'on' virt-3" -> "clvmd:2_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_start_0 virt-3" [ 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 b8053c7..3b73fc7 100644 ---- a/pengine/test10/unfence-parameters.exp -+++ b/pengine/test10/unfence-parameters.exp -@@ -15,7 +15,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -29,6 +33,9 @@ - - - -+ -+ -+ - - - -diff --git a/pengine/test10/unfence-parameters.summary b/pengine/test10/unfence-parameters.summary -index 5b582d9..2cc9e27 100644 ---- a/pengine/test10/unfence-parameters.summary -+++ b/pengine/test10/unfence-parameters.summary -@@ -13,7 +13,7 @@ Online: [ virt-1 virt-2 virt-3 ] - - Transition Summary: - * Fence (reboot) virt-4 'node is unclean' -- * Fence (on) virt-3 'Required by dlm:2' -+ * Fence (on) virt-3 'required by fencing monitor' - * Fence (on) virt-1 'Device parameters changed (reload)' - * Restart fencing ( virt-1 ) due to resource definition change - * Restart dlm:0 ( virt-1 ) due to required stonith -@@ -24,12 +24,12 @@ Transition Summary: - - Executing cluster transition: - * Resource action: fencing stop on virt-1 -- * Resource action: fencing monitor on virt-3 - * Resource action: clvmd monitor on virt-2 - * Pseudo action: clvmd-clone_stop_0 - * Fencing virt-4 (reboot) - * Pseudo action: stonith_complete - * Fencing virt-3 (on) -+ * Resource action: fencing monitor on virt-3 - * Resource action: dlm monitor on virt-3 - * Resource action: clvmd stop on virt-1 - * Resource action: clvmd monitor on virt-3 -diff --git a/pengine/test10/unfence-startup.dot b/pengine/test10/unfence-startup.dot -index d496956..642f795 100644 ---- a/pengine/test10/unfence-startup.dot -+++ b/pengine/test10/unfence-startup.dot -@@ -29,6 +29,7 @@ digraph "g" { - "stonith 'on' virt-3" -> "clvmd:2_start_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_monitor_0 virt-3" [ style = bold] - "stonith 'on' virt-3" -> "dlm:2_start_0 virt-3" [ 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 70c1686..bfd24c8 100644 ---- a/pengine/test10/unfence-startup.exp -+++ b/pengine/test10/unfence-startup.exp -@@ -6,7 +6,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -diff --git a/pengine/test10/unfence-startup.summary b/pengine/test10/unfence-startup.summary -index 276358c..4601f31 100644 ---- a/pengine/test10/unfence-startup.summary -+++ b/pengine/test10/unfence-startup.summary -@@ -13,18 +13,18 @@ Online: [ virt-1 virt-2 virt-3 ] - - Transition Summary: - * Fence (reboot) virt-4 'node is unclean' -- * Fence (on) virt-3 'Required by dlm:2' -+ * Fence (on) virt-3 'required by fencing monitor' - * Start dlm:2 (virt-3) - * Start clvmd:1 (virt-2) - * Start clvmd:2 (virt-3) - - Executing cluster transition: -- * Resource action: fencing monitor on virt-3 - * Resource action: clvmd monitor on virt-2 - * Fencing virt-4 (reboot) - * Pseudo action: stonith_complete - * Fencing virt-3 (on) - * Pseudo action: all_stopped -+ * Resource action: fencing monitor on virt-3 - * Resource action: dlm monitor on virt-3 - * Pseudo action: dlm-clone_start_0 - * Resource action: clvmd monitor on virt-3 --- -1.8.3.1 - - -From c11d10ef4f04bbdb2e6b7e6251b88e50faccaaca Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 1 Dec 2017 14:36:03 -0600 -Subject: [PATCH 06/16] Test: PE: add regression test for unfencing with only - fence devices - ---- - pengine/regression.sh | 1 + - pengine/test10/unfence-device.dot | 18 ++++++ - pengine/test10/unfence-device.exp | 100 ++++++++++++++++++++++++++++++++++ - pengine/test10/unfence-device.scores | 5 ++ - pengine/test10/unfence-device.summary | 29 ++++++++++ - pengine/test10/unfence-device.xml | 66 ++++++++++++++++++++++ - 6 files changed, 219 insertions(+) - create mode 100644 pengine/test10/unfence-device.dot - create mode 100644 pengine/test10/unfence-device.exp - create mode 100644 pengine/test10/unfence-device.scores - create mode 100644 pengine/test10/unfence-device.summary - create mode 100644 pengine/test10/unfence-device.xml - -diff --git a/pengine/regression.sh b/pengine/regression.sh -index db101e7..47cf0ba 100755 ---- a/pengine/regression.sh -+++ b/pengine/regression.sh -@@ -393,6 +393,7 @@ 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" -+do_test unfence-device "Unfencing when a cluster has only fence devices" - - echo "" - do_test master-0 "Stopped -> Slave" -diff --git a/pengine/test10/unfence-device.dot b/pengine/test10/unfence-device.dot -new file mode 100644 -index 0000000..e383fd2 ---- /dev/null -+++ b/pengine/test10/unfence-device.dot -@@ -0,0 +1,18 @@ -+digraph "g" { -+"fence_scsi_monitor_0 virt-008" -> "fence_scsi_start_0 virt-008" [ style = bold] -+"fence_scsi_monitor_0 virt-008" [ style=bold color="green" fontcolor="black"] -+"fence_scsi_monitor_0 virt-009" -> "fence_scsi_start_0 virt-008" [ style = bold] -+"fence_scsi_monitor_0 virt-009" [ style=bold color="green" fontcolor="black"] -+"fence_scsi_monitor_0 virt-013" -> "fence_scsi_start_0 virt-008" [ style = bold] -+"fence_scsi_monitor_0 virt-013" [ style=bold color="green" fontcolor="black"] -+"fence_scsi_monitor_60000 virt-008" [ style=bold color="green" fontcolor="black"] -+"fence_scsi_start_0 virt-008" -> "fence_scsi_monitor_60000 virt-008" [ style = bold] -+"fence_scsi_start_0 virt-008" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-008" -> "fence_scsi_monitor_0 virt-008" [ style = bold] -+"stonith 'on' virt-008" -> "fence_scsi_start_0 virt-008" [ style = bold] -+"stonith 'on' virt-008" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-009" -> "fence_scsi_monitor_0 virt-009" [ style = bold] -+"stonith 'on' virt-009" [ style=bold color="green" fontcolor="black"] -+"stonith 'on' virt-013" -> "fence_scsi_monitor_0 virt-013" [ style = bold] -+"stonith 'on' virt-013" [ style=bold color="green" fontcolor="black"] -+} -diff --git a/pengine/test10/unfence-device.exp b/pengine/test10/unfence-device.exp -new file mode 100644 -index 0000000..98cb548 ---- /dev/null -+++ b/pengine/test10/unfence-device.exp -@@ -0,0 +1,100 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/unfence-device.scores b/pengine/test10/unfence-device.scores -new file mode 100644 -index 0000000..8ea5036 ---- /dev/null -+++ b/pengine/test10/unfence-device.scores -@@ -0,0 +1,5 @@ -+Allocation scores: -+Using the original execution date of: 2017-11-30 10:44:29Z -+native_color: fence_scsi allocation score on virt-008: 0 -+native_color: fence_scsi allocation score on virt-009: 0 -+native_color: fence_scsi allocation score on virt-013: 0 -diff --git a/pengine/test10/unfence-device.summary b/pengine/test10/unfence-device.summary -new file mode 100644 -index 0000000..181724b ---- /dev/null -+++ b/pengine/test10/unfence-device.summary -@@ -0,0 +1,29 @@ -+Using the original execution date of: 2017-11-30 10:44:29Z -+ -+Current cluster status: -+Online: [ virt-008 virt-009 virt-013 ] -+ -+ fence_scsi (stonith:fence_scsi): Stopped -+ -+Transition Summary: -+ * Fence (on) virt-013 'required by fence_scsi monitor' -+ * Fence (on) virt-009 'required by fence_scsi monitor' -+ * Fence (on) virt-008 'required by fence_scsi monitor' -+ * Start fence_scsi ( virt-008 ) -+ -+Executing cluster transition: -+ * Fencing virt-013 (on) -+ * Fencing virt-009 (on) -+ * Fencing virt-008 (on) -+ * Resource action: fence_scsi monitor on virt-013 -+ * Resource action: fence_scsi monitor on virt-009 -+ * Resource action: fence_scsi monitor on virt-008 -+ * Resource action: fence_scsi start on virt-008 -+ * Resource action: fence_scsi monitor=60000 on virt-008 -+Using the original execution date of: 2017-11-30 10:44:29Z -+ -+Revised cluster status: -+Online: [ virt-008 virt-009 virt-013 ] -+ -+ fence_scsi (stonith:fence_scsi): Started virt-008 -+ -diff --git a/pengine/test10/unfence-device.xml b/pengine/test10/unfence-device.xml -new file mode 100644 -index 0000000..e977d9b ---- /dev/null -+++ b/pengine/test10/unfence-device.xml -@@ -0,0 +1,66 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ --- -1.8.3.1 - - -From 2948a8e329cda42e5e7e106c0374d49d93b65481 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Wed, 6 Dec 2017 14:05:05 +1100 -Subject: [PATCH 07/16] Fix: PE: Passing boolean instead of a pointer - ---- - lib/pengine/container.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/pengine/container.c b/lib/pengine/container.c -index 52b60a4..4d2d876 100644 ---- a/lib/pengine/container.c -+++ b/lib/pengine/container.c -@@ -557,7 +557,7 @@ create_remote_resource( - * remote should be ordered relative to docker. - */ - xml_remote = pe_create_remote_xml(NULL, id, tuple->docker->id, -- XML_BOOLEAN_FALSE, NULL, "60s", NULL, -+ NULL, NULL, "60s", NULL, - NULL, connect_name, - (data->control_port? - data->control_port : port_s)); --- -1.8.3.1 - - -From f3593e410643dcafa81e28da27c3a623e306fa61 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Wed, 6 Dec 2017 14:48:57 +1100 -Subject: [PATCH 08/16] Fix: PE: Ordering bundle child stops/demotes after - container fencing causes graph loops - ---- - include/crm/pengine/status.h | 6 ++++++ - lib/pengine/utils.c | 2 +- - pengine/allocate.c | 4 +++- - pengine/native.c | 9 +++++++-- - pengine/test10/bundle-order-fencing.dot | 5 ----- - pengine/test10/bundle-order-fencing.exp | 15 --------------- - 6 files changed, 17 insertions(+), 24 deletions(-) - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index f2a8910..fca7f12 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -517,4 +517,10 @@ pe_rsc_is_anon_clone(resource_t *rsc) - return pe_rsc_is_clone(rsc) && is_not_set(rsc->flags, pe_rsc_unique); - } - -+static inline bool -+pe_rsc_is_bundled(resource_t *rsc) -+{ -+ return uber_parent(rsc)->parent != NULL; -+} -+ - #endif -diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c -index 0ce0e30..a875226 100644 ---- a/lib/pengine/utils.c -+++ b/lib/pengine/utils.c -@@ -1015,7 +1015,7 @@ unpack_operation(action_t * action, xmlNode * xml_obj, resource_t * container, - value = "nothing (resource)"; - } - -- pe_rsc_trace(action->rsc, "\tAction %s requires: %s", action->task, value); -+ pe_rsc_trace(action->rsc, "\tAction %s requires: %s", action->uuid, value); - - value = unpack_operation_on_fail(action); - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 98464a9..2ae491c 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1470,7 +1470,9 @@ fence_guest(pe_node_t *node, pe_action_t *done, pe_working_set_t *data_set) - - /* Order/imply other actions relative to pseudo-fence as with real fence */ - stonith_constraints(node, stonith_op, data_set); -- order_actions(stonith_op, done, pe_order_implies_then); -+ if(done) { -+ order_actions(stonith_op, done, pe_order_implies_then); -+ } - } - - /* -diff --git a/pengine/native.c b/pengine/native.c -index 0013e33..96c9a26 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -3164,7 +3164,9 @@ native_stop_constraints(resource_t * rsc, action_t * stonith_op, pe_working_set_ - */ - flags |= pe_order_preserve; - } -- order_actions(stonith_op, action, flags); -+ if (pe_rsc_is_bundled(rsc) == FALSE) { -+ order_actions(stonith_op, action, flags); -+ } - order_actions(stonith_op, parent_stop, flags); - } - -@@ -3252,7 +3254,10 @@ native_stop_constraints(resource_t * rsc, action_t * stonith_op, pe_working_set_ - update_action_flags(action, pe_action_pseudo, __FUNCTION__, __LINE__); - update_action_flags(action, pe_action_runnable, __FUNCTION__, __LINE__); - -- if (start == NULL || start->needs > rsc_req_quorum) { -+ if (pe_rsc_is_bundled(rsc)) { -+ /* Do nothing, let the recovery be ordered after the parent's implied stop */ -+ -+ } else if (start == NULL || start->needs > rsc_req_quorum) { - order_actions(stonith_op, action, pe_order_preserve|pe_order_optional); - } - } -diff --git a/pengine/test10/bundle-order-fencing.dot b/pengine/test10/bundle-order-fencing.dot -index a7e5805..64b6326 100644 ---- a/pengine/test10/bundle-order-fencing.dot -+++ b/pengine/test10/bundle-order-fencing.dot -@@ -403,19 +403,14 @@ digraph "g" { - "redis_stop_0 redis-bundle-0" -> "redis_start_0 redis-bundle-0" [ style = dashed] - "redis_stop_0 redis-bundle-0" [ style=bold color="green" fontcolor="orange"] - "stonith 'off' galera-bundle-0" -> "galera-bundle-master_stop_0" [ style = bold] --"stonith 'off' galera-bundle-0" -> "galera_demote_0 galera-bundle-0" [ style = bold] --"stonith 'off' galera-bundle-0" -> "galera_stop_0 galera-bundle-0" [ style = bold] - "stonith 'off' galera-bundle-0" -> "stonith_complete" [ style = bold] - "stonith 'off' galera-bundle-0" [ style=bold color="green" fontcolor="orange"] - "stonith 'off' rabbitmq-bundle-0" -> "rabbitmq-bundle-clone_stop_0" [ style = bold] - "stonith 'off' rabbitmq-bundle-0" -> "rabbitmq_post_notify_stonith_0" [ style = bold] --"stonith 'off' rabbitmq-bundle-0" -> "rabbitmq_stop_0 rabbitmq-bundle-0" [ style = bold] - "stonith 'off' rabbitmq-bundle-0" -> "stonith_complete" [ style = bold] - "stonith 'off' rabbitmq-bundle-0" [ style=bold color="green" fontcolor="orange"] - "stonith 'off' redis-bundle-0" -> "redis-bundle-master_stop_0" [ style = bold] --"stonith 'off' redis-bundle-0" -> "redis_demote_0 redis-bundle-0" [ style = bold] - "stonith 'off' redis-bundle-0" -> "redis_post_notify_stonith_0" [ style = bold] --"stonith 'off' redis-bundle-0" -> "redis_stop_0 redis-bundle-0" [ style = bold] - "stonith 'off' redis-bundle-0" -> "stonith_complete" [ style = bold] - "stonith 'off' redis-bundle-0" [ style=bold color="green" fontcolor="orange"] - "stonith 'reboot' controller-0" -> "galera-bundle-0_stop_0 controller-0" [ style = bold] -diff --git a/pengine/test10/bundle-order-fencing.exp b/pengine/test10/bundle-order-fencing.exp -index 8e35f32..78ce675 100644 ---- a/pengine/test10/bundle-order-fencing.exp -+++ b/pengine/test10/bundle-order-fencing.exp -@@ -55,9 +55,6 @@ - - - -- -- -- - - - -@@ -440,9 +437,6 @@ - - - -- -- -- - - - -@@ -455,9 +449,6 @@ - - - -- -- -- - - - -@@ -701,9 +692,6 @@ - - - -- -- -- - - - -@@ -716,9 +704,6 @@ - - - -- -- -- - - - --- -1.8.3.1 - - -From 906cd4a9e6b871eefb6d113354f9045c1826711a Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Wed, 6 Dec 2017 15:04:21 +1100 -Subject: [PATCH 09/16] Fix: PE: Only allowed nodes need to be considered when - ordering resource startup after _all_ recovery - ---- - pengine/native.c | 1 + - pengine/test10/bundle-order-fencing.dot | 2 -- - pengine/test10/bundle-order-fencing.exp | 6 ------ - pengine/test10/bundle-order-fencing.summary | 8 ++++---- - 4 files changed, 5 insertions(+), 12 deletions(-) - -diff --git a/pengine/native.c b/pengine/native.c -index 96c9a26..d4f1ff7 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -3088,6 +3088,7 @@ native_start_constraints(resource_t * rsc, action_t * stonith_op, pe_working_set - order_actions(stonith_done, action, pe_order_optional); - - } else if (safe_str_eq(action->task, RSC_START) -+ && NULL != pe_hash_table_lookup(rsc->allowed_nodes, target->details->id) - && NULL == pe_hash_table_lookup(rsc->known_on, target->details->id)) { - /* if known == NULL, then we don't know if - * the resource is active on the node -diff --git a/pengine/test10/bundle-order-fencing.dot b/pengine/test10/bundle-order-fencing.dot -index 64b6326..d653250 100644 ---- a/pengine/test10/bundle-order-fencing.dot -+++ b/pengine/test10/bundle-order-fencing.dot -@@ -3,8 +3,6 @@ digraph "g" { - "Cancel redis_monitor_45000 redis-bundle-1" [ style=bold color="green" fontcolor="black"] - "Cancel redis_monitor_60000 redis-bundle-1" -> "redis_promote_0 redis-bundle-1" [ style = bold] - "Cancel redis_monitor_60000 redis-bundle-1" [ style=bold color="green" fontcolor="black"] --"all_stopped" -> "stonith-fence_ipmilan-5254000dcb3f_start_0 controller-2" [ style = bold] --"all_stopped" -> "stonith-fence_ipmilan-5254003e8e97_start_0 controller-1" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "galera-bundle-0_monitor_0 controller-1" -> "galera-bundle-0_start_0 controller-2" [ style = dashed] - "galera-bundle-0_monitor_0 controller-1" [ style=bold color="green" fontcolor="black"] -diff --git a/pengine/test10/bundle-order-fencing.exp b/pengine/test10/bundle-order-fencing.exp -index 78ce675..708815f 100644 ---- a/pengine/test10/bundle-order-fencing.exp -+++ b/pengine/test10/bundle-order-fencing.exp -@@ -1624,9 +1624,6 @@ - - - -- -- -- - - - -@@ -1661,9 +1658,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/bundle-order-fencing.summary b/pengine/test10/bundle-order-fencing.summary -index e78c531..ee2c361 100644 ---- a/pengine/test10/bundle-order-fencing.summary -+++ b/pengine/test10/bundle-order-fencing.summary -@@ -91,6 +91,8 @@ Executing cluster transition: - * Pseudo action: redis-bundle-master_demote_0 - * Pseudo action: redis-bundle-0_stop_0 - * Pseudo action: haproxy-bundle-docker-0_stop_0 -+ * Resource action: stonith-fence_ipmilan-5254003e8e97 start on controller-1 -+ * Resource action: stonith-fence_ipmilan-5254000dcb3f start on controller-2 - * Pseudo action: stonith-redis-bundle-0-off on redis-bundle-0 - * Pseudo action: stonith-rabbitmq-bundle-0-off on rabbitmq-bundle-0 - * Pseudo action: stonith-galera-bundle-0-off on galera-bundle-0 -@@ -107,6 +109,8 @@ Executing cluster transition: - * Pseudo action: ip-192.168.24.7_stop_0 - * Pseudo action: ip-10.0.0.109_stop_0 - * Pseudo action: ip-172.17.4.11_stop_0 -+ * Resource action: stonith-fence_ipmilan-5254003e8e97 monitor=60000 on controller-1 -+ * Resource action: stonith-fence_ipmilan-5254000dcb3f monitor=60000 on controller-2 - * Pseudo action: galera-bundle_demoted_0 - * Pseudo action: galera-bundle_stop_0 - * Pseudo action: rabbitmq_stop_0 -@@ -172,11 +176,7 @@ Executing cluster transition: - * Pseudo action: rabbitmq-bundle_running_0 - * Pseudo action: all_stopped - * Pseudo action: redis-bundle-master_running_0 -- * Resource action: stonith-fence_ipmilan-5254003e8e97 start on controller-1 -- * Resource action: stonith-fence_ipmilan-5254000dcb3f start on controller-2 - * Pseudo action: redis-bundle-master_post_notify_running_0 -- * Resource action: stonith-fence_ipmilan-5254003e8e97 monitor=60000 on controller-1 -- * Resource action: stonith-fence_ipmilan-5254000dcb3f monitor=60000 on controller-2 - * Resource action: redis notify on redis-bundle-0 - * Resource action: redis notify on redis-bundle-1 - * Resource action: redis notify on redis-bundle-2 --- -1.8.3.1 - - -From c6d208dfbda95d8610519de50075087e56a4f8c0 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Wed, 6 Dec 2017 23:50:12 +1100 -Subject: [PATCH 10/16] Fix: PE: Remote connection resources are safe to to - require only quorum - ---- - lib/pengine/complex.c | 6 ++++ - pengine/test10/bug-rh-1097457.dot | 2 +- - pengine/test10/bug-rh-1097457.exp | 6 ++-- - pengine/test10/bug-rh-1097457.summary | 14 ++++---- - pengine/test10/bundle-order-fencing.dot | 6 ---- - pengine/test10/bundle-order-fencing.exp | 18 ++-------- - pengine/test10/bundle-order-fencing.summary | 8 ++--- - pengine/test10/guest-node-host-dies.dot | 6 ++-- - pengine/test10/guest-node-host-dies.exp | 24 +++++--------- - pengine/test10/guest-node-host-dies.summary | 12 +++---- - pengine/test10/remote-fence-unclean.dot | 2 +- - pengine/test10/remote-fence-unclean.exp | 2 +- - pengine/test10/remote-partial-migrate2.dot | 6 +--- - pengine/test10/remote-partial-migrate2.exp | 27 ++++----------- - pengine/test10/remote-partial-migrate2.summary | 38 +++++++++++----------- - pengine/test10/remote-recover-all.dot | 3 +- - pengine/test10/remote-recover-all.exp | 10 ++---- - pengine/test10/remote-recover-all.summary | 8 ++--- - pengine/test10/remote-recover-connection.dot | 6 ---- - pengine/test10/remote-recover-connection.exp | 27 ++------------- - pengine/test10/remote-recover-connection.summary | 24 +++++++------- - pengine/test10/remote-recover-fail.dot | 2 +- - pengine/test10/remote-recover-fail.exp | 2 +- - pengine/test10/remote-recover-no-resources.dot | 3 +- - pengine/test10/remote-recover-no-resources.exp | 10 ++---- - pengine/test10/remote-recover-no-resources.summary | 8 ++--- - pengine/test10/remote-recover-unknown.dot | 3 +- - pengine/test10/remote-recover-unknown.exp | 10 ++---- - pengine/test10/remote-recover-unknown.summary | 8 ++--- - pengine/test10/remote-recovery.dot | 6 ---- - pengine/test10/remote-recovery.exp | 27 ++------------- - pengine/test10/remote-recovery.summary | 24 +++++++------- - pengine/test10/remote-unclean2.dot | 2 +- - pengine/test10/remote-unclean2.exp | 2 +- - pengine/test10/whitebox-fail1.dot | 2 +- - pengine/test10/whitebox-fail1.exp | 6 ++-- - pengine/test10/whitebox-fail1.summary | 8 ++--- - pengine/test10/whitebox-fail2.dot | 2 +- - pengine/test10/whitebox-fail2.exp | 6 ++-- - pengine/test10/whitebox-fail2.summary | 8 ++--- - pengine/test10/whitebox-imply-stop-on-fence.dot | 6 ++-- - pengine/test10/whitebox-imply-stop-on-fence.exp | 24 +++++--------- - .../test10/whitebox-imply-stop-on-fence.summary | 20 ++++++------ - pengine/test10/whitebox-ms-ordering.dot | 4 +-- - pengine/test10/whitebox-ms-ordering.exp | 12 +++---- - pengine/test10/whitebox-ms-ordering.summary | 8 ++--- - pengine/test10/whitebox-unexpectedly-running.dot | 2 ++ - pengine/test10/whitebox-unexpectedly-running.exp | 6 ++++ - 48 files changed, 182 insertions(+), 294 deletions(-) - -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 3e0abed..d58d6be 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -784,6 +784,12 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - if(is_set((*rsc)->flags, pe_rsc_fence_device)) { - value = "quorum"; - -+ } else if (safe_str_eq(crm_element_value((*rsc)->xml, XML_AGENT_ATTR_CLASS), "ocf") -+ && safe_str_eq(crm_element_value((*rsc)->xml, XML_AGENT_ATTR_PROVIDER), "pacemaker") -+ && safe_str_eq(crm_element_value((*rsc)->xml, XML_ATTR_TYPE), "remote") -+ ) { -+ value = "quorum"; -+ - } else if (is_set(data_set->flags, pe_flag_enable_unfencing)) { - value = "unfencing"; - -diff --git a/pengine/test10/bug-rh-1097457.dot b/pengine/test10/bug-rh-1097457.dot -index 5984811..94ffe13 100644 ---- a/pengine/test10/bug-rh-1097457.dot -+++ b/pengine/test10/bug-rh-1097457.dot -@@ -80,6 +80,7 @@ digraph "g" { - "VM2_stop_0 lama3" -> "all_stopped" [ style = bold] - "VM2_stop_0 lama3" -> "stonith 'reboot' lamaVM2" [ style = bold] - "VM2_stop_0 lama3" [ style=bold color="green" fontcolor="black"] -+"all_stopped" -> "lamaVM2_start_0 lama3" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "lamaVM2-G4_running_0" [ style=bold color="green" fontcolor="orange"] - "lamaVM2-G4_start_0" -> "FAKE4-IP_start_0 lamaVM2" [ style = bold] -@@ -121,6 +122,5 @@ digraph "g" { - "stonith_complete" -> "FSlun3_start_0 lama2" [ style = bold] - "stonith_complete" -> "VM2_start_0 lama3" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "lamaVM2_start_0 lama3" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/bug-rh-1097457.exp b/pengine/test10/bug-rh-1097457.exp -index 4eedd91..f1451b5 100644 ---- a/pengine/test10/bug-rh-1097457.exp -+++ b/pengine/test10/bug-rh-1097457.exp -@@ -599,13 +599,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-rh-1097457.summary b/pengine/test10/bug-rh-1097457.summary -index e23c6ad..0e7d2e0 100644 ---- a/pengine/test10/bug-rh-1097457.summary -+++ b/pengine/test10/bug-rh-1097457.summary -@@ -70,26 +70,26 @@ Executing cluster transition: - * Pseudo action: lamaVM2-G4_stop_0 - * Pseudo action: FAKE4-IP_stop_0 - * Pseudo action: FAKE6-clone_stop_0 -- * Resource action: lamaVM2 start on lama3 -- * Resource action: lamaVM2 monitor=30000 on lama3 -- * Resource action: FSlun3 monitor=10000 on lamaVM2 - * Pseudo action: FAKE4_stop_0 - * Pseudo action: FAKE6_stop_0 - * Pseudo action: FAKE6-clone_stopped_0 - * Pseudo action: FAKE6-clone_start_0 - * Pseudo action: lamaVM2-G4_stopped_0 -- * Resource action: FAKE6 start on lamaVM2 -- * Resource action: FAKE6 monitor=30000 on lamaVM2 -- * Pseudo action: FAKE6-clone_running_0 - * Pseudo action: FSlun3_stop_0 - * Pseudo action: all_stopped - * Resource action: FSlun3 start on lama2 - * Pseudo action: lamaVM2-G4_start_0 -+ * Resource action: lamaVM2 start on lama3 -+ * Resource action: lamaVM2 monitor=30000 on lama3 -+ * Resource action: FSlun3 monitor=10000 on lama2 -+ * Resource action: FSlun3 monitor=10000 on lamaVM2 - * Resource action: FAKE4 start on lamaVM2 - * Resource action: FAKE4 monitor=30000 on lamaVM2 - * Resource action: FAKE4-IP start on lamaVM2 - * Resource action: FAKE4-IP monitor=30000 on lamaVM2 -- * Resource action: FSlun3 monitor=10000 on lama2 -+ * Resource action: FAKE6 start on lamaVM2 -+ * Resource action: FAKE6 monitor=30000 on lamaVM2 -+ * Pseudo action: FAKE6-clone_running_0 - * Pseudo action: lamaVM2-G4_running_0 - - Revised cluster status: -diff --git a/pengine/test10/bundle-order-fencing.dot b/pengine/test10/bundle-order-fencing.dot -index d653250..980bab4 100644 ---- a/pengine/test10/bundle-order-fencing.dot -+++ b/pengine/test10/bundle-order-fencing.dot -@@ -411,15 +411,12 @@ digraph "g" { - "stonith 'off' redis-bundle-0" -> "redis_post_notify_stonith_0" [ style = bold] - "stonith 'off' redis-bundle-0" -> "stonith_complete" [ style = bold] - "stonith 'off' redis-bundle-0" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-0" -> "galera-bundle-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "galera-bundle-docker-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "haproxy-bundle-docker-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "ip-10.0.0.109_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "ip-172.17.4.11_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "ip-192.168.24.7_stop_0 controller-0" [ style = bold] --"stonith 'reboot' controller-0" -> "rabbitmq-bundle-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "rabbitmq-bundle-docker-0_stop_0 controller-0" [ style = bold] --"stonith 'reboot' controller-0" -> "redis-bundle-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "redis-bundle-docker-0_stop_0 controller-0" [ style = bold] - "stonith 'reboot' controller-0" -> "stonith 'off' galera-bundle-0" [ style = bold] - "stonith 'reboot' controller-0" -> "stonith 'off' rabbitmq-bundle-0" [ style = bold] -@@ -439,14 +436,11 @@ digraph "g" { - "stonith-fence_ipmilan-5254003e8e97_stop_0 controller-0" -> "stonith-fence_ipmilan-5254003e8e97_start_0 controller-1" [ style = bold] - "stonith-fence_ipmilan-5254003e8e97_stop_0 controller-0" [ style=bold color="green" fontcolor="orange"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-bundle-0_start_0 controller-2" [ style = dashed] - "stonith_complete" -> "galera_start_0 galera-bundle-0" [ style = dashed] - "stonith_complete" -> "ip-10.0.0.109_start_0 controller-1" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-1" [ style = bold] - "stonith_complete" -> "ip-192.168.24.7_start_0 controller-2" [ style = bold] --"stonith_complete" -> "rabbitmq-bundle-0_start_0 controller-1" [ style = dashed] - "stonith_complete" -> "rabbitmq_start_0 rabbitmq-bundle-0" [ style = dashed] --"stonith_complete" -> "redis-bundle-0_start_0 controller-1" [ style = dashed] - "stonith_complete" -> "redis_promote_0 redis-bundle-1" [ style = bold] - "stonith_complete" -> "redis_start_0 redis-bundle-0" [ style = dashed] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] -diff --git a/pengine/test10/bundle-order-fencing.exp b/pengine/test10/bundle-order-fencing.exp -index 708815f..dc4c5c9 100644 ---- a/pengine/test10/bundle-order-fencing.exp -+++ b/pengine/test10/bundle-order-fencing.exp -@@ -379,11 +379,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -565,11 +561,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -1413,11 +1405,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/bundle-order-fencing.summary b/pengine/test10/bundle-order-fencing.summary -index ee2c361..0457f83 100644 ---- a/pengine/test10/bundle-order-fencing.summary -+++ b/pengine/test10/bundle-order-fencing.summary -@@ -56,10 +56,12 @@ Transition Summary: - - Executing cluster transition: - * Pseudo action: rabbitmq-bundle-clone_pre_notify_stop_0 -+ * Pseudo action: rabbitmq-bundle-0_stop_0 - * Resource action: rabbitmq-bundle-0 monitor on controller-2 - * Resource action: rabbitmq-bundle-0 monitor on controller-1 - * Resource action: rabbitmq-bundle-1 monitor on controller-2 - * Resource action: rabbitmq-bundle-2 monitor on controller-1 -+ * Pseudo action: galera-bundle-0_stop_0 - * Resource action: galera-bundle-0 monitor on controller-2 - * Resource action: galera-bundle-0 monitor on controller-1 - * Resource action: galera-bundle-1 monitor on controller-2 -@@ -67,6 +69,7 @@ Executing cluster transition: - * Resource action: redis cancel=45000 on redis-bundle-1 - * Resource action: redis cancel=60000 on redis-bundle-1 - * Pseudo action: redis-bundle-master_pre_notify_demote_0 -+ * Pseudo action: redis-bundle-0_stop_0 - * Resource action: redis-bundle-0 monitor on controller-2 - * Resource action: redis-bundle-0 monitor on controller-1 - * Resource action: redis-bundle-1 monitor on controller-2 -@@ -82,14 +85,12 @@ Executing cluster transition: - * Resource action: rabbitmq notify on rabbitmq-bundle-1 - * Resource action: rabbitmq notify on rabbitmq-bundle-2 - * Pseudo action: rabbitmq-bundle-clone_confirmed-pre_notify_stop_0 -- * Pseudo action: rabbitmq-bundle-0_stop_0 -+ * Pseudo action: rabbitmq-bundle-docker-0_stop_0 - * Pseudo action: galera-bundle-master_demote_0 -- * Pseudo action: galera-bundle-0_stop_0 - * Resource action: redis notify on redis-bundle-1 - * Resource action: redis notify on redis-bundle-2 - * Pseudo action: redis-bundle-master_confirmed-pre_notify_demote_0 - * Pseudo action: redis-bundle-master_demote_0 -- * Pseudo action: redis-bundle-0_stop_0 - * Pseudo action: haproxy-bundle-docker-0_stop_0 - * Resource action: stonith-fence_ipmilan-5254003e8e97 start on controller-1 - * Resource action: stonith-fence_ipmilan-5254000dcb3f start on controller-2 -@@ -100,7 +101,6 @@ Executing cluster transition: - * Pseudo action: haproxy-bundle_stopped_0 - * Pseudo action: rabbitmq_post_notify_stop_0 - * Pseudo action: rabbitmq-bundle-clone_stop_0 -- * Pseudo action: rabbitmq-bundle-docker-0_stop_0 - * Pseudo action: galera_demote_0 - * Pseudo action: galera-bundle-master_demoted_0 - * Pseudo action: redis_post_notify_stop_0 -diff --git a/pengine/test10/guest-node-host-dies.dot b/pengine/test10/guest-node-host-dies.dot -index a85250d..c50e071 100644 ---- a/pengine/test10/guest-node-host-dies.dot -+++ b/pengine/test10/guest-node-host-dies.dot -@@ -6,6 +6,8 @@ digraph "g" { - "Fencing_stop_0 rhel7-4" -> "all_stopped" [ style = bold] - "Fencing_stop_0 rhel7-4" [ style=bold color="green" fontcolor="black"] - "all_stopped" -> "Fencing_start_0 rhel7-4" [ style = bold] -+"all_stopped" -> "lxc1_start_0 rhel7-2" [ style = bold] -+"all_stopped" -> "lxc2_start_0 rhel7-3" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "container1_start_0 rhel7-2" -> "lxc-ms_promote_0 lxc1" [ style = bold] - "container1_start_0 rhel7-2" -> "lxc-ms_start_0 lxc1" [ style = bold] -@@ -115,8 +117,6 @@ digraph "g" { - "stonith 'reboot' lxc2" [ style=bold color="green" fontcolor="orange"] - "stonith 'reboot' rhel7-1" -> "container1_stop_0 rhel7-1" [ style = bold] - "stonith 'reboot' rhel7-1" -> "container2_stop_0 rhel7-1" [ style = bold] --"stonith 'reboot' rhel7-1" -> "lxc1_stop_0 rhel7-1" [ style = bold] --"stonith 'reboot' rhel7-1" -> "lxc2_stop_0 rhel7-1" [ style = bold] - "stonith 'reboot' rhel7-1" -> "rsc_rhel7-1_stop_0 rhel7-1" [ style = bold] - "stonith 'reboot' rhel7-1" -> "stonith_complete" [ style = bold] - "stonith 'reboot' rhel7-1" [ style=bold color="green" fontcolor="black"] -@@ -126,8 +126,6 @@ digraph "g" { - "stonith_complete" -> "lxc-ms_promote_0 lxc1" [ style = bold] - "stonith_complete" -> "lxc-ms_start_0 lxc1" [ style = bold] - "stonith_complete" -> "lxc-ms_start_0 lxc2" [ style = bold] --"stonith_complete" -> "lxc1_start_0 rhel7-2" [ style = bold] --"stonith_complete" -> "lxc2_start_0 rhel7-3" [ style = bold] - "stonith_complete" -> "rsc_rhel7-1_start_0 rhel7-5" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/guest-node-host-dies.exp b/pengine/test10/guest-node-host-dies.exp -index 8dbadde..b5a34ea 100644 ---- a/pengine/test10/guest-node-host-dies.exp -+++ b/pengine/test10/guest-node-host-dies.exp -@@ -432,6 +432,9 @@ - - - -+ -+ -+ - - - -@@ -446,9 +449,6 @@ - - - -- -- -- - - - -@@ -457,11 +457,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -512,6 +508,9 @@ - - - -+ -+ -+ - - - -@@ -526,9 +525,6 @@ - - - -- -- -- - - - -@@ -537,11 +533,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/guest-node-host-dies.summary b/pengine/test10/guest-node-host-dies.summary -index 4feee88..9813d2b 100644 ---- a/pengine/test10/guest-node-host-dies.summary -+++ b/pengine/test10/guest-node-host-dies.summary -@@ -26,16 +26,16 @@ Transition Summary: - Executing cluster transition: - * Resource action: Fencing stop on rhel7-4 - * Pseudo action: lxc-ms-master_demote_0 -+ * Pseudo action: lxc1_stop_0 - * Resource action: lxc1 monitor on rhel7-5 - * Resource action: lxc1 monitor on rhel7-4 - * Resource action: lxc1 monitor on rhel7-3 -+ * Pseudo action: lxc2_stop_0 - * Resource action: lxc2 monitor on rhel7-5 - * Resource action: lxc2 monitor on rhel7-4 - * Resource action: lxc2 monitor on rhel7-2 - * Fencing rhel7-1 (reboot) - * Pseudo action: rsc_rhel7-1_stop_0 -- * Pseudo action: lxc1_stop_0 -- * Pseudo action: lxc2_stop_0 - * Pseudo action: container1_stop_0 - * Pseudo action: container2_stop_0 - * Pseudo action: stonith-lxc2-reboot on lxc2 -@@ -47,21 +47,21 @@ Executing cluster transition: - * Pseudo action: lxc-ms_demote_0 - * Pseudo action: lxc-ms-master_demoted_0 - * Pseudo action: lxc-ms-master_stop_0 -- * Resource action: lxc1 start on rhel7-2 -- * Resource action: lxc2 start on rhel7-3 - * Resource action: rsc_rhel7-1 monitor=5000 on rhel7-5 - * Pseudo action: lxc-ms_stop_0 - * Pseudo action: lxc-ms_stop_0 - * Pseudo action: lxc-ms-master_stopped_0 - * Pseudo action: lxc-ms-master_start_0 -- * Resource action: lxc1 monitor=30000 on rhel7-2 -- * Resource action: lxc2 monitor=30000 on rhel7-3 - * Pseudo action: all_stopped - * Resource action: Fencing start on rhel7-4 - * Resource action: Fencing monitor=120000 on rhel7-4 -+ * Resource action: lxc1 start on rhel7-2 -+ * Resource action: lxc2 start on rhel7-3 - * Resource action: lxc-ms start on lxc1 - * Resource action: lxc-ms start on lxc2 - * Pseudo action: lxc-ms-master_running_0 -+ * Resource action: lxc1 monitor=30000 on rhel7-2 -+ * Resource action: lxc2 monitor=30000 on rhel7-3 - * Resource action: lxc-ms monitor=10000 on lxc2 - * Pseudo action: lxc-ms-master_promote_0 - * Resource action: lxc-ms promote on lxc1 -diff --git a/pengine/test10/remote-fence-unclean.dot b/pengine/test10/remote-fence-unclean.dot -index b2829a7..76a676d 100644 ---- a/pengine/test10/remote-fence-unclean.dot -+++ b/pengine/test10/remote-fence-unclean.dot -@@ -18,6 +18,7 @@ - "FAKE4_stop_0 18node1" -> "FAKE4_start_0 18node2" [ style = bold] - "FAKE4_stop_0 18node1" -> "all_stopped" [ style = bold] - "FAKE4_stop_0 18node1" [ style=bold color="green" fontcolor="black"] -+"all_stopped" -> "remote1_start_0 18node1" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "remote1_monitor_60000 18node1" [ style=bold color="green" fontcolor="black"] - "remote1_start_0 18node1" -> "remote1_monitor_60000 18node1" [ style = bold] -@@ -32,6 +33,5 @@ - "stonith_complete" -> "FAKE3_start_0 18node1" [ style = bold] - "stonith_complete" -> "FAKE4_start_0 18node2" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "remote1_start_0 18node1" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/remote-fence-unclean.exp b/pengine/test10/remote-fence-unclean.exp -index 3a07384..f77d7f6 100644 ---- a/pengine/test10/remote-fence-unclean.exp -+++ b/pengine/test10/remote-fence-unclean.exp -@@ -11,7 +11,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/remote-partial-migrate2.dot b/pengine/test10/remote-partial-migrate2.dot -index a8bf29b..17c8bf3 100644 ---- a/pengine/test10/remote-partial-migrate2.dot -+++ b/pengine/test10/remote-partial-migrate2.dot -@@ -89,6 +89,7 @@ - "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" -> "pcmk_remote5_start_0 pcmk2" [ style = bold] - "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] -@@ -150,10 +151,5 @@ - "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 -index abf281f..bae190c 100644 ---- a/pengine/test10/remote-partial-migrate2.exp -+++ b/pengine/test10/remote-partial-migrate2.exp -@@ -6,11 +6,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -38,9 +34,6 @@ - - - -- -- -- - - - -@@ -76,11 +69,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -102,11 +91,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -129,13 +114,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-partial-migrate2.summary b/pengine/test10/remote-partial-migrate2.summary -index 2a242bd..6b6428d 100644 ---- a/pengine/test10/remote-partial-migrate2.summary -+++ b/pengine/test10/remote-partial-migrate2.summary -@@ -84,6 +84,10 @@ Transition Summary: - * Move FAKE49 ( pcmk_remote3 -> pcmk_remote4 ) - - Executing cluster transition: -+ * 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 stop on pcmk1 - * Resource action: FAKE9 stop on pcmk2 - * Resource action: FAKE12 stop on pcmk1 -@@ -99,11 +103,15 @@ Executing cluster transition: - * Resource action: FAKE48 stop on pcmk1 - * Resource action: FAKE49 stop on pcmk_remote3 - * Fencing pcmk4 (reboot) -+ * 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: FAKE41 stop on pcmk_remote2 - * 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 -+ * Pseudo action: all_stopped -+ * Resource action: pcmk_remote2 monitor=60000 on pcmk1 -+ * Pseudo action: pcmk_remote5_start_0 - * Resource action: FAKE5 start on pcmk_remote4 - * Resource action: FAKE9 start on pcmk_remote4 - * Resource action: FAKE12 start on pcmk2 -@@ -114,12 +122,12 @@ Executing cluster transition: - * Resource action: FAKE30 start on pcmk_remote1 - * Resource action: FAKE33 start on pcmk_remote4 - * Resource action: FAKE38 start on pcmk_remote1 -+ * Resource action: FAKE39 start on pcmk_remote2 -+ * Resource action: FAKE41 start on pcmk_remote4 -+ * Resource action: FAKE47 start on pcmk_remote2 - * 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: pcmk_remote5 monitor=60000 on pcmk2 - * Resource action: FAKE5 monitor=10000 on pcmk_remote4 - * Resource action: FAKE9 monitor=10000 on pcmk_remote4 - * Resource action: FAKE12 monitor=10000 on pcmk2 -@@ -130,19 +138,11 @@ Executing cluster transition: - * 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 -+ * Resource action: FAKE47 monitor=10000 on pcmk_remote2 -+ * Resource action: FAKE48 monitor=10000 on pcmk_remote3 -+ * Resource action: FAKE49 monitor=10000 on pcmk_remote4 - - Revised cluster status: - Online: [ pcmk1 pcmk2 pcmk3 ] -diff --git a/pengine/test10/remote-recover-all.dot b/pengine/test10/remote-recover-all.dot -index ad421e6..5b79602 100644 ---- a/pengine/test10/remote-recover-all.dot -+++ b/pengine/test10/remote-recover-all.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "galera-0_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-5254005bdbb5_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400b4f6bd_start_0 controller-0" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] -@@ -114,7 +115,6 @@ digraph "g" { - "redis_stop_0 controller-1" -> "all_stopped" [ style = bold] - "redis_stop_0 controller-1" -> "redis-master_stopped_0" [ style = bold] - "redis_stop_0 controller-1" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-1" -> "galera-0_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "galera-2_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy-clone_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy_stop_0 controller-1" [ style = bold] -@@ -156,7 +156,6 @@ digraph "g" { - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-0_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.14_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.17_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-2" [ style = bold] -diff --git a/pengine/test10/remote-recover-all.exp b/pengine/test10/remote-recover-all.exp -index b0af5c4..556ccfd 100644 ---- a/pengine/test10/remote-recover-all.exp -+++ b/pengine/test10/remote-recover-all.exp -@@ -36,10 +36,10 @@ - - - -- -+ - - -- -+ - - - -@@ -49,11 +49,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/remote-recover-all.summary b/pengine/test10/remote-recover-all.summary -index 6c9f058..ba074e5 100644 ---- a/pengine/test10/remote-recover-all.summary -+++ b/pengine/test10/remote-recover-all.summary -@@ -56,13 +56,13 @@ Transition Summary: - * Move stonith-fence_ipmilan-5254005bdbb5 ( controller-1 -> controller-2 ) - - Executing cluster transition: -+ * Pseudo action: galera-0_stop_0 - * Pseudo action: galera-master_demote_0 - * Pseudo action: redis-master_pre_notify_stop_0 - * Resource action: stonith-fence_ipmilan-525400bbf613 stop on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd stop on controller-0 - * Pseudo action: stonith-fence_ipmilan-5254005bdbb5_stop_0 - * Fencing controller-1 (reboot) -- * Pseudo action: galera-0_stop_0 - * Pseudo action: redis_post_notify_stop_0 - * Resource action: redis notify on controller-0 - * Resource action: redis notify on controller-2 -@@ -79,17 +79,14 @@ Executing cluster transition: - * Pseudo action: haproxy-clone_stopped_0 - * Fencing messaging-1 (reboot) - * Pseudo action: stonith_complete -- * Resource action: galera-0 start on controller-2 - * Pseudo action: rabbitmq_post_notify_stop_0 - * Pseudo action: rabbitmq-clone_stop_0 - * Pseudo action: galera_stop_0 -- * Resource action: galera monitor=10000 on galera-0 - * Pseudo action: galera-master_stopped_0 - * Pseudo action: redis-master_post_notify_stopped_0 - * Pseudo action: ip-172.17.1.14_stop_0 - * Pseudo action: ip-172.17.1.17_stop_0 - * Pseudo action: ip-172.17.4.11_stop_0 -- * Resource action: galera-0 monitor=20000 on controller-2 - * Pseudo action: galera-2_stop_0 - * Resource action: rabbitmq notify on messaging-2 - * Resource action: rabbitmq notify on messaging-0 -@@ -108,11 +105,14 @@ Executing cluster transition: - * Resource action: ip-172.17.1.17 monitor=10000 on controller-2 - * Resource action: ip-172.17.4.11 monitor=10000 on controller-2 - * Pseudo action: all_stopped -+ * Resource action: galera-0 start on controller-2 -+ * Resource action: galera monitor=10000 on galera-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 start on controller-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd start on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 start on controller-2 -+ * Resource action: galera-0 monitor=20000 on controller-2 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 monitor=60000 on controller-2 - Using the original execution date of: 2017-05-03 13:33:24Z - -diff --git a/pengine/test10/remote-recover-connection.dot b/pengine/test10/remote-recover-connection.dot -index d6fdefe..6cd342f 100644 ---- a/pengine/test10/remote-recover-connection.dot -+++ b/pengine/test10/remote-recover-connection.dot -@@ -89,14 +89,11 @@ digraph "g" { - "redis_stop_0 controller-1" -> "all_stopped" [ style = bold] - "redis_stop_0 controller-1" -> "redis-master_stopped_0" [ style = bold] - "redis_stop_0 controller-1" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-1" -> "galera-0_stop_0 controller-1" [ style = bold] --"stonith 'reboot' controller-1" -> "galera-2_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy-clone_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.1.14_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.1.17_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.4.11_stop_0 controller-1" [ style = bold] --"stonith 'reboot' controller-1" -> "messaging-1_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "redis-master_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "redis_post_notify_stonith_0" [ style = bold] - "stonith 'reboot' controller-1" -> "redis_stop_0 controller-1" [ style = bold] -@@ -121,11 +118,8 @@ digraph "g" { - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-0_start_0 controller-2" [ style = bold] --"stonith_complete" -> "galera-2_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.14_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.17_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-2" [ style = bold] --"stonith_complete" -> "messaging-1_start_0 controller-2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/remote-recover-connection.exp b/pengine/test10/remote-recover-connection.exp -index cf74efb..40338b4 100644 ---- a/pengine/test10/remote-recover-connection.exp -+++ b/pengine/test10/remote-recover-connection.exp -@@ -23,9 +23,6 @@ - - - -- -- -- - - - -@@ -34,11 +31,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -64,9 +57,6 @@ - - - -- -- -- - - - -@@ -75,11 +65,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -105,9 +91,6 @@ - - - -- -- -- - - - -@@ -116,11 +99,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/remote-recover-connection.summary b/pengine/test10/remote-recover-connection.summary -index b0433fe..8246cd9 100644 ---- a/pengine/test10/remote-recover-connection.summary -+++ b/pengine/test10/remote-recover-connection.summary -@@ -52,6 +52,9 @@ Transition Summary: - * Move stonith-fence_ipmilan-5254005bdbb5 ( controller-1 -> controller-2 ) - - Executing cluster transition: -+ * Pseudo action: messaging-1_stop_0 -+ * Pseudo action: galera-0_stop_0 -+ * Pseudo action: galera-2_stop_0 - * Pseudo action: redis-master_pre_notify_stop_0 - * Resource action: stonith-fence_ipmilan-525400bbf613 stop on controller-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 start on controller-0 -@@ -61,9 +64,12 @@ Executing cluster transition: - * Resource action: stonith-fence_ipmilan-525400b4f6bd monitor=60000 on controller-0 - * Pseudo action: stonith-fence_ipmilan-5254005bdbb5_stop_0 - * Fencing controller-1 (reboot) -- * Pseudo action: messaging-1_stop_0 -- * Pseudo action: galera-0_stop_0 -- * Pseudo action: galera-2_stop_0 -+ * Resource action: messaging-1 start on controller-2 -+ * Resource action: galera-0 start on controller-2 -+ * Resource action: galera-2 start on controller-2 -+ * Resource action: rabbitmq monitor=10000 on messaging-1 -+ * Resource action: galera monitor=10000 on galera-2 -+ * Resource action: galera monitor=10000 on galera-0 - * Pseudo action: redis_post_notify_stop_0 - * Resource action: redis notify on controller-0 - * Resource action: redis notify on controller-2 -@@ -72,20 +78,14 @@ Executing cluster transition: - * Pseudo action: haproxy-clone_stop_0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 start on controller-2 - * Pseudo action: stonith_complete -- * Resource action: messaging-1 start on controller-2 -- * Resource action: galera-0 start on controller-2 -- * Resource action: galera-2 start on controller-2 -- * Resource action: rabbitmq monitor=10000 on messaging-1 -- * Resource action: galera monitor=10000 on galera-2 -- * Resource action: galera monitor=10000 on galera-0 -+ * Resource action: messaging-1 monitor=20000 on controller-2 -+ * Resource action: galera-0 monitor=20000 on controller-2 -+ * Resource action: galera-2 monitor=20000 on controller-2 - * Pseudo action: redis_stop_0 - * Pseudo action: redis-master_stopped_0 - * Pseudo action: haproxy_stop_0 - * Pseudo action: haproxy-clone_stopped_0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 monitor=60000 on controller-2 -- * Resource action: messaging-1 monitor=20000 on controller-2 -- * Resource action: galera-0 monitor=20000 on controller-2 -- * Resource action: galera-2 monitor=20000 on controller-2 - * Pseudo action: redis-master_post_notify_stopped_0 - * Pseudo action: ip-172.17.1.14_stop_0 - * Pseudo action: ip-172.17.1.17_stop_0 -diff --git a/pengine/test10/remote-recover-fail.dot b/pengine/test10/remote-recover-fail.dot -index 7b6edaa..3375687 100644 ---- a/pengine/test10/remote-recover-fail.dot -+++ b/pengine/test10/remote-recover-fail.dot -@@ -18,6 +18,7 @@ - "FAKE6_stop_0 rhel7-auto4" -> "all_stopped" [ style = bold] - "FAKE6_stop_0 rhel7-auto4" -> "rhel7-auto4_stop_0 rhel7-auto2" [ style = bold] - "FAKE6_stop_0 rhel7-auto4" [ style=bold color="green" fontcolor="orange"] -+"all_stopped" -> "rhel7-auto4_start_0 rhel7-auto2" [ style = bold] - "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] -@@ -33,6 +34,5 @@ - "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 -index bd014ae..f908566 100644 ---- a/pengine/test10/remote-recover-fail.exp -+++ b/pengine/test10/remote-recover-fail.exp -@@ -24,7 +24,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/remote-recover-no-resources.dot b/pengine/test10/remote-recover-no-resources.dot -index 1e16221..8c2f783 100644 ---- a/pengine/test10/remote-recover-no-resources.dot -+++ b/pengine/test10/remote-recover-no-resources.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "galera-0_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-5254005bdbb5_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400b4f6bd_start_0 controller-0" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] -@@ -98,7 +99,6 @@ digraph "g" { - "redis_stop_0 controller-1" -> "all_stopped" [ style = bold] - "redis_stop_0 controller-1" -> "redis-master_stopped_0" [ style = bold] - "redis_stop_0 controller-1" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-1" -> "galera-0_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "galera-2_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy-clone_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy_stop_0 controller-1" [ style = bold] -@@ -135,7 +135,6 @@ digraph "g" { - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-0_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.14_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.17_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-2" [ style = bold] -diff --git a/pengine/test10/remote-recover-no-resources.exp b/pengine/test10/remote-recover-no-resources.exp -index 987acfd..0a57e27 100644 ---- a/pengine/test10/remote-recover-no-resources.exp -+++ b/pengine/test10/remote-recover-no-resources.exp -@@ -36,10 +36,10 @@ - - - -- -+ - - -- -+ - - - -@@ -49,11 +49,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/remote-recover-no-resources.summary b/pengine/test10/remote-recover-no-resources.summary -index b682e5f..bed02d0 100644 ---- a/pengine/test10/remote-recover-no-resources.summary -+++ b/pengine/test10/remote-recover-no-resources.summary -@@ -54,12 +54,12 @@ Transition Summary: - * Move stonith-fence_ipmilan-5254005bdbb5 ( controller-1 -> controller-2 ) - - Executing cluster transition: -+ * Pseudo action: galera-0_stop_0 - * Pseudo action: redis-master_pre_notify_stop_0 - * Resource action: stonith-fence_ipmilan-525400bbf613 stop on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd stop on controller-0 - * Pseudo action: stonith-fence_ipmilan-5254005bdbb5_stop_0 - * Fencing controller-1 (reboot) -- * Pseudo action: galera-0_stop_0 - * Pseudo action: galera-2_stop_0 - * Pseudo action: redis_post_notify_stop_0 - * Resource action: redis notify on controller-0 -@@ -69,15 +69,12 @@ Executing cluster transition: - * Pseudo action: haproxy-clone_stop_0 - * Fencing messaging-1 (reboot) - * Pseudo action: stonith_complete -- * Resource action: galera-0 start on controller-2 - * Pseudo action: rabbitmq_post_notify_stop_0 - * Pseudo action: rabbitmq-clone_stop_0 -- * Resource action: galera monitor=10000 on galera-0 - * Pseudo action: redis_stop_0 - * Pseudo action: redis-master_stopped_0 - * Pseudo action: haproxy_stop_0 - * Pseudo action: haproxy-clone_stopped_0 -- * Resource action: galera-0 monitor=20000 on controller-2 - * Resource action: rabbitmq notify on messaging-2 - * Resource action: rabbitmq notify on messaging-0 - * Pseudo action: rabbitmq_notified_0 -@@ -99,11 +96,14 @@ Executing cluster transition: - * Resource action: ip-172.17.1.17 monitor=10000 on controller-2 - * Resource action: ip-172.17.4.11 monitor=10000 on controller-2 - * Pseudo action: all_stopped -+ * Resource action: galera-0 start on controller-2 -+ * Resource action: galera monitor=10000 on galera-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 start on controller-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd start on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 start on controller-2 -+ * Resource action: galera-0 monitor=20000 on controller-2 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 monitor=60000 on controller-2 - Using the original execution date of: 2017-05-03 13:33:24Z - -diff --git a/pengine/test10/remote-recover-unknown.dot b/pengine/test10/remote-recover-unknown.dot -index a8b4e18..8ce59b4 100644 ---- a/pengine/test10/remote-recover-unknown.dot -+++ b/pengine/test10/remote-recover-unknown.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "galera-0_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-5254005bdbb5_start_0 controller-2" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400b4f6bd_start_0 controller-0" [ style = bold] - "all_stopped" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] -@@ -99,7 +100,6 @@ digraph "g" { - "redis_stop_0 controller-1" -> "all_stopped" [ style = bold] - "redis_stop_0 controller-1" -> "redis-master_stopped_0" [ style = bold] - "redis_stop_0 controller-1" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-1" -> "galera-0_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "galera-2_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy-clone_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy_stop_0 controller-1" [ style = bold] -@@ -138,7 +138,6 @@ digraph "g" { - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-0_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.14_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.17_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-2" [ style = bold] -diff --git a/pengine/test10/remote-recover-unknown.exp b/pengine/test10/remote-recover-unknown.exp -index b8d51be..0d7b318 100644 ---- a/pengine/test10/remote-recover-unknown.exp -+++ b/pengine/test10/remote-recover-unknown.exp -@@ -36,10 +36,10 @@ - - - -- -+ - - -- -+ - - - -@@ -49,11 +49,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/remote-recover-unknown.summary b/pengine/test10/remote-recover-unknown.summary -index 09f10d8..d47f174 100644 ---- a/pengine/test10/remote-recover-unknown.summary -+++ b/pengine/test10/remote-recover-unknown.summary -@@ -55,12 +55,12 @@ Transition Summary: - * Move stonith-fence_ipmilan-5254005bdbb5 ( controller-1 -> controller-2 ) - - Executing cluster transition: -+ * Pseudo action: galera-0_stop_0 - * Pseudo action: redis-master_pre_notify_stop_0 - * Resource action: stonith-fence_ipmilan-525400bbf613 stop on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd stop on controller-0 - * Pseudo action: stonith-fence_ipmilan-5254005bdbb5_stop_0 - * Fencing controller-1 (reboot) -- * Pseudo action: galera-0_stop_0 - * Pseudo action: galera-2_stop_0 - * Pseudo action: redis_post_notify_stop_0 - * Resource action: redis notify on controller-0 -@@ -71,15 +71,12 @@ Executing cluster transition: - * Fencing galera-2 (reboot) - * Fencing messaging-1 (reboot) - * Pseudo action: stonith_complete -- * Resource action: galera-0 start on controller-2 - * Pseudo action: rabbitmq_post_notify_stop_0 - * Pseudo action: rabbitmq-clone_stop_0 -- * Resource action: galera monitor=10000 on galera-0 - * Pseudo action: redis_stop_0 - * Pseudo action: redis-master_stopped_0 - * Pseudo action: haproxy_stop_0 - * Pseudo action: haproxy-clone_stopped_0 -- * Resource action: galera-0 monitor=20000 on controller-2 - * Resource action: rabbitmq notify on messaging-2 - * Resource action: rabbitmq notify on messaging-0 - * Pseudo action: rabbitmq_notified_0 -@@ -101,11 +98,14 @@ Executing cluster transition: - * Resource action: ip-172.17.1.17 monitor=10000 on controller-2 - * Resource action: ip-172.17.4.11 monitor=10000 on controller-2 - * Pseudo action: all_stopped -+ * Resource action: galera-0 start on controller-2 -+ * Resource action: galera monitor=10000 on galera-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 start on controller-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd start on controller-0 - * Resource action: stonith-fence_ipmilan-525400b4f6bd monitor=60000 on controller-0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 start on controller-2 -+ * Resource action: galera-0 monitor=20000 on controller-2 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 monitor=60000 on controller-2 - Using the original execution date of: 2017-05-03 13:33:24Z - -diff --git a/pengine/test10/remote-recovery.dot b/pengine/test10/remote-recovery.dot -index d6fdefe..6cd342f 100644 ---- a/pengine/test10/remote-recovery.dot -+++ b/pengine/test10/remote-recovery.dot -@@ -89,14 +89,11 @@ digraph "g" { - "redis_stop_0 controller-1" -> "all_stopped" [ style = bold] - "redis_stop_0 controller-1" -> "redis-master_stopped_0" [ style = bold] - "redis_stop_0 controller-1" [ style=bold color="green" fontcolor="orange"] --"stonith 'reboot' controller-1" -> "galera-0_stop_0 controller-1" [ style = bold] --"stonith 'reboot' controller-1" -> "galera-2_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy-clone_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "haproxy_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.1.14_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.1.17_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "ip-172.17.4.11_stop_0 controller-1" [ style = bold] --"stonith 'reboot' controller-1" -> "messaging-1_stop_0 controller-1" [ style = bold] - "stonith 'reboot' controller-1" -> "redis-master_stop_0" [ style = bold] - "stonith 'reboot' controller-1" -> "redis_post_notify_stonith_0" [ style = bold] - "stonith 'reboot' controller-1" -> "redis_stop_0 controller-1" [ style = bold] -@@ -121,11 +118,8 @@ digraph "g" { - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" -> "stonith-fence_ipmilan-525400bbf613_start_0 controller-0" [ style = bold] - "stonith-fence_ipmilan-525400bbf613_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] - "stonith_complete" -> "all_stopped" [ style = bold] --"stonith_complete" -> "galera-0_start_0 controller-2" [ style = bold] --"stonith_complete" -> "galera-2_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.14_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.1.17_start_0 controller-2" [ style = bold] - "stonith_complete" -> "ip-172.17.4.11_start_0 controller-2" [ style = bold] --"stonith_complete" -> "messaging-1_start_0 controller-2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/remote-recovery.exp b/pengine/test10/remote-recovery.exp -index cf74efb..40338b4 100644 ---- a/pengine/test10/remote-recovery.exp -+++ b/pengine/test10/remote-recovery.exp -@@ -23,9 +23,6 @@ - - - -- -- -- - - - -@@ -34,11 +31,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -64,9 +57,6 @@ - - - -- -- -- - - - -@@ -75,11 +65,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -105,9 +91,6 @@ - - - -- -- -- - - - -@@ -116,11 +99,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/remote-recovery.summary b/pengine/test10/remote-recovery.summary -index b0433fe..8246cd9 100644 ---- a/pengine/test10/remote-recovery.summary -+++ b/pengine/test10/remote-recovery.summary -@@ -52,6 +52,9 @@ Transition Summary: - * Move stonith-fence_ipmilan-5254005bdbb5 ( controller-1 -> controller-2 ) - - Executing cluster transition: -+ * Pseudo action: messaging-1_stop_0 -+ * Pseudo action: galera-0_stop_0 -+ * Pseudo action: galera-2_stop_0 - * Pseudo action: redis-master_pre_notify_stop_0 - * Resource action: stonith-fence_ipmilan-525400bbf613 stop on controller-0 - * Resource action: stonith-fence_ipmilan-525400bbf613 start on controller-0 -@@ -61,9 +64,12 @@ Executing cluster transition: - * Resource action: stonith-fence_ipmilan-525400b4f6bd monitor=60000 on controller-0 - * Pseudo action: stonith-fence_ipmilan-5254005bdbb5_stop_0 - * Fencing controller-1 (reboot) -- * Pseudo action: messaging-1_stop_0 -- * Pseudo action: galera-0_stop_0 -- * Pseudo action: galera-2_stop_0 -+ * Resource action: messaging-1 start on controller-2 -+ * Resource action: galera-0 start on controller-2 -+ * Resource action: galera-2 start on controller-2 -+ * Resource action: rabbitmq monitor=10000 on messaging-1 -+ * Resource action: galera monitor=10000 on galera-2 -+ * Resource action: galera monitor=10000 on galera-0 - * Pseudo action: redis_post_notify_stop_0 - * Resource action: redis notify on controller-0 - * Resource action: redis notify on controller-2 -@@ -72,20 +78,14 @@ Executing cluster transition: - * Pseudo action: haproxy-clone_stop_0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 start on controller-2 - * Pseudo action: stonith_complete -- * Resource action: messaging-1 start on controller-2 -- * Resource action: galera-0 start on controller-2 -- * Resource action: galera-2 start on controller-2 -- * Resource action: rabbitmq monitor=10000 on messaging-1 -- * Resource action: galera monitor=10000 on galera-2 -- * Resource action: galera monitor=10000 on galera-0 -+ * Resource action: messaging-1 monitor=20000 on controller-2 -+ * Resource action: galera-0 monitor=20000 on controller-2 -+ * Resource action: galera-2 monitor=20000 on controller-2 - * Pseudo action: redis_stop_0 - * Pseudo action: redis-master_stopped_0 - * Pseudo action: haproxy_stop_0 - * Pseudo action: haproxy-clone_stopped_0 - * Resource action: stonith-fence_ipmilan-5254005bdbb5 monitor=60000 on controller-2 -- * Resource action: messaging-1 monitor=20000 on controller-2 -- * Resource action: galera-0 monitor=20000 on controller-2 -- * Resource action: galera-2 monitor=20000 on controller-2 - * Pseudo action: redis-master_post_notify_stopped_0 - * Pseudo action: ip-172.17.1.14_stop_0 - * Pseudo action: ip-172.17.1.17_stop_0 -diff --git a/pengine/test10/remote-unclean2.dot b/pengine/test10/remote-unclean2.dot -index 3f8981b..2311a72 100644 ---- a/pengine/test10/remote-unclean2.dot -+++ b/pengine/test10/remote-unclean2.dot -@@ -1,4 +1,5 @@ - digraph "g" { -+"all_stopped" -> "rhel7-auto4_start_0 rhel7-auto1" [ style = bold] - "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] -@@ -9,6 +10,5 @@ - "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 -index ca0b3ba..2c73d82 100644 ---- a/pengine/test10/remote-unclean2.exp -+++ b/pengine/test10/remote-unclean2.exp -@@ -11,7 +11,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail1.dot b/pengine/test10/whitebox-fail1.dot -index bfff4bf..9b755f9 100644 ---- a/pengine/test10/whitebox-fail1.dot -+++ b/pengine/test10/whitebox-fail1.dot -@@ -26,6 +26,7 @@ digraph "g" { - "M_stop_0 lxc1" -> "M_start_0 lxc1" [ style = bold] - "M_stop_0 lxc1" -> "all_stopped" [ style = bold] - "M_stop_0 lxc1" [ style=bold color="green" fontcolor="orange"] -+"all_stopped" -> "lxc1_start_0 18node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "container1_start_0 18node2" -> "B_start_0 lxc1" [ style = bold] - "container1_start_0 18node2" -> "M_start_0 lxc1" [ style = bold] -@@ -55,6 +56,5 @@ digraph "g" { - "stonith_complete" -> "M_start_0 lxc1" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "container1_start_0 18node2" [ style = bold] --"stonith_complete" -> "lxc1_start_0 18node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/whitebox-fail1.exp b/pengine/test10/whitebox-fail1.exp -index 901a1e3..1532c6e 100644 ---- a/pengine/test10/whitebox-fail1.exp -+++ b/pengine/test10/whitebox-fail1.exp -@@ -227,13 +227,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail1.summary b/pengine/test10/whitebox-fail1.summary -index d1f3480..a5b85dd 100644 ---- a/pengine/test10/whitebox-fail1.summary -+++ b/pengine/test10/whitebox-fail1.summary -@@ -31,17 +31,17 @@ Executing cluster transition: - * Resource action: container1 start on 18node2 - * Pseudo action: M-clone_stop_0 - * Pseudo action: B_stop_0 -- * Resource action: lxc1 start on 18node2 -- * Resource action: lxc1 monitor=30000 on 18node2 - * Pseudo action: M_stop_0 - * Pseudo action: M-clone_stopped_0 - * Pseudo action: M-clone_start_0 -- * Resource action: B start on lxc1 - * Pseudo action: all_stopped -+ * Resource action: lxc1 start on 18node2 -+ * Resource action: lxc1 monitor=30000 on 18node2 - * Resource action: M start on lxc1 - * Pseudo action: M-clone_running_0 -- * Resource action: B monitor=10000 on lxc1 -+ * Resource action: B start on lxc1 - * Resource action: M monitor=10000 on lxc1 -+ * Resource action: B monitor=10000 on lxc1 - - Revised cluster status: - Online: [ 18node1 18node2 18node3 ] -diff --git a/pengine/test10/whitebox-fail2.dot b/pengine/test10/whitebox-fail2.dot -index bfff4bf..9b755f9 100644 ---- a/pengine/test10/whitebox-fail2.dot -+++ b/pengine/test10/whitebox-fail2.dot -@@ -26,6 +26,7 @@ digraph "g" { - "M_stop_0 lxc1" -> "M_start_0 lxc1" [ style = bold] - "M_stop_0 lxc1" -> "all_stopped" [ style = bold] - "M_stop_0 lxc1" [ style=bold color="green" fontcolor="orange"] -+"all_stopped" -> "lxc1_start_0 18node2" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "container1_start_0 18node2" -> "B_start_0 lxc1" [ style = bold] - "container1_start_0 18node2" -> "M_start_0 lxc1" [ style = bold] -@@ -55,6 +56,5 @@ digraph "g" { - "stonith_complete" -> "M_start_0 lxc1" [ style = bold] - "stonith_complete" -> "all_stopped" [ style = bold] - "stonith_complete" -> "container1_start_0 18node2" [ style = bold] --"stonith_complete" -> "lxc1_start_0 18node2" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/whitebox-fail2.exp b/pengine/test10/whitebox-fail2.exp -index 901a1e3..1532c6e 100644 ---- a/pengine/test10/whitebox-fail2.exp -+++ b/pengine/test10/whitebox-fail2.exp -@@ -227,13 +227,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/whitebox-fail2.summary b/pengine/test10/whitebox-fail2.summary -index ebf6c51..afee261 100644 ---- a/pengine/test10/whitebox-fail2.summary -+++ b/pengine/test10/whitebox-fail2.summary -@@ -31,17 +31,17 @@ Executing cluster transition: - * Resource action: container1 start on 18node2 - * Pseudo action: M-clone_stop_0 - * Pseudo action: B_stop_0 -- * Resource action: lxc1 start on 18node2 -- * Resource action: lxc1 monitor=30000 on 18node2 - * Pseudo action: M_stop_0 - * Pseudo action: M-clone_stopped_0 - * Pseudo action: M-clone_start_0 -- * Resource action: B start on lxc1 - * Pseudo action: all_stopped -+ * Resource action: lxc1 start on 18node2 -+ * Resource action: lxc1 monitor=30000 on 18node2 - * Resource action: M start on lxc1 - * Pseudo action: M-clone_running_0 -- * Resource action: B monitor=10000 on lxc1 -+ * Resource action: B start on lxc1 - * Resource action: M monitor=10000 on lxc1 -+ * Resource action: B monitor=10000 on lxc1 - - Revised cluster status: - Online: [ 18node1 18node2 18node3 ] -diff --git a/pengine/test10/whitebox-imply-stop-on-fence.dot b/pengine/test10/whitebox-imply-stop-on-fence.dot -index 7b536ea..1ef3cba 100644 ---- a/pengine/test10/whitebox-imply-stop-on-fence.dot -+++ b/pengine/test10/whitebox-imply-stop-on-fence.dot -@@ -18,6 +18,8 @@ - "R-lxc-02_kiff-01_stop_0 kiff-01" -> "vm-fs_start_0 lxc-01_kiff-01" [ style = bold] - "R-lxc-02_kiff-01_stop_0 kiff-01" [ style=bold color="green" fontcolor="orange"] - "all_stopped" -> "fence-kiff-02_start_0 kiff-02" [ style = bold] -+"all_stopped" -> "lxc-01_kiff-01_start_0 kiff-02" [ style = bold] -+"all_stopped" -> "lxc-02_kiff-01_start_0 kiff-02" [ style = bold] - "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] -@@ -78,8 +80,6 @@ - "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" -> "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 'reboot' lxc-01_kiff-01" [ style = bold] -@@ -94,8 +94,6 @@ - "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_0 lxc-01_kiff-02" -> "vm-fs_start_0 lxc-01_kiff-01" [ style = bold] -diff --git a/pengine/test10/whitebox-imply-stop-on-fence.exp b/pengine/test10/whitebox-imply-stop-on-fence.exp -index f80dde1..c73d1d2 100644 ---- a/pengine/test10/whitebox-imply-stop-on-fence.exp -+++ b/pengine/test10/whitebox-imply-stop-on-fence.exp -@@ -421,13 +421,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -437,11 +437,7 @@ - - - -- -- -- -- -- -+ - - - -@@ -465,13 +461,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -481,11 +477,7 @@ - - - -- -- -- -- -- -+ - - - -diff --git a/pengine/test10/whitebox-imply-stop-on-fence.summary b/pengine/test10/whitebox-imply-stop-on-fence.summary -index d272b25..5ce580e 100644 ---- a/pengine/test10/whitebox-imply-stop-on-fence.summary -+++ b/pengine/test10/whitebox-imply-stop-on-fence.summary -@@ -48,29 +48,23 @@ Executing cluster transition: - * Resource action: shared0 monitor on lxc-01_kiff-02 - * Resource action: vm-fs monitor on lxc-02_kiff-02 - * Resource action: vm-fs monitor on lxc-01_kiff-02 -- * Fencing kiff-01 (reboot) - * Pseudo action: lxc-01_kiff-01_stop_0 - * Pseudo action: lxc-02_kiff-01_stop_0 -+ * Fencing kiff-01 (reboot) -+ * Pseudo action: R-lxc-01_kiff-01_stop_0 -+ * Pseudo action: R-lxc-02_kiff-01_stop_0 - * Pseudo action: stonith-lxc-02_kiff-01-reboot on lxc-02_kiff-01 - * Pseudo action: stonith-lxc-01_kiff-01-reboot on lxc-01_kiff-01 - * Pseudo action: stonith_complete -- * Pseudo action: R-lxc-01_kiff-01_stop_0 -- * Pseudo action: R-lxc-02_kiff-01_stop_0 -- * Pseudo action: vm-fs_stop_0 - * 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: vm-fs_stop_0 - * 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: 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 -- * Resource action: vm-fs monitor=20000 on lxc-01_kiff-01 - * Pseudo action: clvmd_stop_0 - * Pseudo action: clvmd-clone_stopped_0 - * Pseudo action: dlm-clone_stop_0 -@@ -78,7 +72,13 @@ Executing cluster transition: - * Pseudo action: dlm-clone_stopped_0 - * Pseudo action: all_stopped - * Resource action: fence-kiff-02 start on kiff-02 -+ * Resource action: lxc-01_kiff-01 start on kiff-02 -+ * Resource action: lxc-02_kiff-01 start on kiff-02 - * Resource action: fence-kiff-02 monitor=60000 on kiff-02 -+ * Resource action: vm-fs start 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 -+ * Resource action: vm-fs monitor=20000 on lxc-01_kiff-01 - - Revised cluster status: - Online: [ kiff-02 ] -diff --git a/pengine/test10/whitebox-ms-ordering.dot b/pengine/test10/whitebox-ms-ordering.dot -index 1f4d95b..d5112b9 100644 ---- a/pengine/test10/whitebox-ms-ordering.dot -+++ b/pengine/test10/whitebox-ms-ordering.dot -@@ -1,4 +1,6 @@ - digraph "g" { -+"all_stopped" -> "lxc1_start_0 18node1" [ style = bold] -+"all_stopped" -> "lxc2_start_0 18node1" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "container1_monitor_0 18node1" -> "container1_start_0 18node1" [ style = bold] - "container1_monitor_0 18node1" [ style=bold color="green" fontcolor="black"] -@@ -106,7 +108,5 @@ - "stonith_complete" -> "lxc-ms_promote_0 lxc1" [ style = bold] - "stonith_complete" -> "lxc-ms_start_0 lxc1" [ style = bold] - "stonith_complete" -> "lxc-ms_start_0 lxc2" [ style = bold] --"stonith_complete" -> "lxc1_start_0 18node1" [ style = bold] --"stonith_complete" -> "lxc2_start_0 18node1" [ style = bold] - "stonith_complete" [ style=bold color="green" fontcolor="orange"] - } -diff --git a/pengine/test10/whitebox-ms-ordering.exp b/pengine/test10/whitebox-ms-ordering.exp -index c8fee5e..d5608e4 100644 ---- a/pengine/test10/whitebox-ms-ordering.exp -+++ b/pengine/test10/whitebox-ms-ordering.exp -@@ -419,6 +419,9 @@ - - - -+ -+ -+ - - - -@@ -430,9 +433,6 @@ - - - -- -- -- - - - -@@ -484,6 +484,9 @@ - - - -+ -+ -+ - - - -@@ -495,9 +498,6 @@ - - - -- -- -- - - - -diff --git a/pengine/test10/whitebox-ms-ordering.summary b/pengine/test10/whitebox-ms-ordering.summary -index d8ff62c..46fe9d1 100644 ---- a/pengine/test10/whitebox-ms-ordering.summary -+++ b/pengine/test10/whitebox-ms-ordering.summary -@@ -43,18 +43,18 @@ Executing cluster transition: - * Pseudo action: lxc-ms_demote_0 - * Pseudo action: lxc-ms-master_demoted_0 - * Pseudo action: lxc-ms-master_stop_0 -- * Resource action: lxc1 start on 18node1 -- * Resource action: lxc2 start on 18node1 - * Pseudo action: lxc-ms_stop_0 - * Pseudo action: lxc-ms_stop_0 - * Pseudo action: lxc-ms-master_stopped_0 - * Pseudo action: lxc-ms-master_start_0 -- * Resource action: lxc1 monitor=30000 on 18node1 -- * Resource action: lxc2 monitor=30000 on 18node1 - * Pseudo action: all_stopped -+ * Resource action: lxc1 start on 18node1 -+ * Resource action: lxc2 start on 18node1 - * Resource action: lxc-ms start on lxc1 - * Resource action: lxc-ms start on lxc2 - * Pseudo action: lxc-ms-master_running_0 -+ * Resource action: lxc1 monitor=30000 on 18node1 -+ * Resource action: lxc2 monitor=30000 on 18node1 - * Resource action: lxc-ms monitor=10000 on lxc2 - * Pseudo action: lxc-ms-master_promote_0 - * Resource action: lxc-ms promote on lxc1 -diff --git a/pengine/test10/whitebox-unexpectedly-running.dot b/pengine/test10/whitebox-unexpectedly-running.dot -index fa1171e..f16e705 100644 ---- a/pengine/test10/whitebox-unexpectedly-running.dot -+++ b/pengine/test10/whitebox-unexpectedly-running.dot -@@ -8,6 +8,8 @@ - "FAKE-crashed_stop_0 18builder" -> "stonith 'reboot' remote2" [ style = bold] - "FAKE-crashed_stop_0 18builder" [ style=bold color="green" fontcolor="black"] - "FAKE_monitor_60000 18builder" [ style=bold color="green" fontcolor="black"] -+"all_stopped" -> "remote1_start_0 18builder" [ style = bold] -+"all_stopped" -> "remote2_start_0 18builder" [ style = bold] - "all_stopped" [ style=bold color="green" fontcolor="orange"] - "remote1_monitor_0 18builder" -> "remote1_start_0 18builder" [ style = bold] - "remote1_monitor_0 18builder" [ style=bold color="green" fontcolor="black"] -diff --git a/pengine/test10/whitebox-unexpectedly-running.exp b/pengine/test10/whitebox-unexpectedly-running.exp -index c4e13b9..46376a5 100644 ---- a/pengine/test10/whitebox-unexpectedly-running.exp -+++ b/pengine/test10/whitebox-unexpectedly-running.exp -@@ -65,6 +65,9 @@ - - - -+ -+ -+ - - - -@@ -100,6 +103,9 @@ - - - -+ -+ -+ - - - --- -1.8.3.1 - - -From b04b392925daa70af17f2abdef9a6198127c5608 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Fri, 8 Dec 2017 13:53:36 +1100 -Subject: [PATCH 11/16] Fix: PE: Ensure stop operations occur after stopped - remote connections have been brought up - ---- - pengine/allocate.c | 55 +++++++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 40 insertions(+), 15 deletions(-) - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 2ae491c..1c95e97 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -48,6 +48,25 @@ enum remote_connection_state { - remote_state_stopped = 4 - }; - -+static const char * -+state2text(enum remote_connection_state state) -+{ -+ switch (state) { -+ case remote_state_unknown: -+ return "unknown"; -+ case remote_state_alive: -+ return "alive"; -+ case remote_state_resting: -+ return "resting"; -+ case remote_state_failed: -+ return "failed"; -+ case remote_state_stopped: -+ return "stopped"; -+ } -+ -+ return "impossible"; -+} -+ - resource_alloc_functions_t resource_class_alloc_functions[] = { - { - native_merge_weights, -@@ -2011,10 +2030,10 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - cluster_node = remote_rsc->running_on->data; - } - -- crm_trace("Order %s action %s relative to %s%s (state %d)", -+ crm_trace("Order %s action %s relative to %s%s (state: %s)", - action->task, action->uuid, - is_set(remote_rsc->flags, pe_rsc_failed)? "failed " : "", -- remote_rsc->id, state); -+ remote_rsc->id, state2text(state)); - - if (safe_str_eq(action->task, CRMD_ACTION_MIGRATE) - || safe_str_eq(action->task, CRMD_ACTION_MIGRATE)) { -@@ -2042,23 +2061,29 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - /* Handle special case with remote node where stop actions need to be - * ordered after the connection resource starts somewhere else. - */ -- if(state == remote_state_resting) { -- /* Wait for the connection resource to be up and assume everything is as we left it */ -- order_start_then_action(remote_rsc, action, pe_order_none, -- data_set); -+ if(state == remote_state_alive) { -+ order_action_then_stop(action, remote_rsc, -+ pe_order_implies_first, data_set); - -- } else { -- if(state == remote_state_failed) { -- /* We would only be here if the resource is -- * running on the remote node. Since we have no -- * way to stop it, it is necessary to fence the -- * node. -- */ -- pe_fence_node(data_set, action->node, "resources are active and the connection is unrecoverable"); -- } -+ } else if(state == remote_state_failed) { -+ /* We would only be here if the resource is -+ * running on the remote node. Since we have no -+ * way to stop it, it is necessary to fence the -+ * node. -+ */ -+ pe_fence_node(data_set, action->node, "resources are active and the connection is unrecoverable"); -+ order_action_then_stop(action, remote_rsc, -+ pe_order_implies_first, data_set); - -+ } else if(remote_rsc->next_role == RSC_ROLE_STOPPED) { -+ /* If its not coming back up, better do what we need first */ - order_action_then_stop(action, remote_rsc, - pe_order_implies_first, data_set); -+ -+ } else { -+ /* Wait for the connection resource to be up and assume everything is as we left it */ -+ order_start_then_action(remote_rsc, action, pe_order_none, data_set); -+ - } - break; - --- -1.8.3.1 - - -From 502770c763807bc7ac19bf2b2fd50d4a0e195df0 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Fri, 8 Dec 2017 13:56:03 +1100 -Subject: [PATCH 12/16] Test: PE: Ensure stop operations occur after stopped - remote connections have been brought up - ---- - pengine/regression.sh | 1 + - pengine/test10/bundle-order-stop-on-remote.dot | 307 ++++ - pengine/test10/bundle-order-stop-on-remote.exp | 1607 ++++++++++++++++++++ - pengine/test10/bundle-order-stop-on-remote.scores | 934 ++++++++++++ - pengine/test10/bundle-order-stop-on-remote.summary | 224 +++ - pengine/test10/bundle-order-stop-on-remote.xml | 1165 ++++++++++++++ - 6 files changed, 4238 insertions(+) - create mode 100644 pengine/test10/bundle-order-stop-on-remote.dot - create mode 100644 pengine/test10/bundle-order-stop-on-remote.exp - create mode 100644 pengine/test10/bundle-order-stop-on-remote.scores - create mode 100644 pengine/test10/bundle-order-stop-on-remote.summary - create mode 100644 pengine/test10/bundle-order-stop-on-remote.xml - -diff --git a/pengine/regression.sh b/pengine/regression.sh -index 47cf0ba..cf1824a 100755 ---- a/pengine/regression.sh -+++ b/pengine/regression.sh -@@ -819,6 +819,7 @@ do_test bundle-order-partial-start "Bundle startup ordering when some dependanci - do_test bundle-order-partial-start-2 "Bundle startup ordering when some dependancies and the container are already running" - do_test bundle-order-stop "Bundle stop ordering" - do_test bundle-order-partial-stop "Bundle startup ordering when some dependancies are already stopped" -+do_test bundle-order-stop-on-remote "Stop nested resource after bringing up the connection" - - do_test bundle-order-startup-clone "Prevent startup because bundle isn't promoted" - do_test bundle-order-startup-clone-2 "Bundle startup with clones" -diff --git a/pengine/test10/bundle-order-stop-on-remote.dot b/pengine/test10/bundle-order-stop-on-remote.dot -new file mode 100644 -index 0000000..f0b6336 ---- /dev/null -+++ b/pengine/test10/bundle-order-stop-on-remote.dot -@@ -0,0 +1,307 @@ -+digraph "g" { -+"all_stopped" [ style=bold color="green" fontcolor="orange"] -+"database-0_monitor_20000 controller-0" [ style=bold color="green" fontcolor="black"] -+"database-0_start_0 controller-0" -> "database-0_monitor_20000 controller-0" [ style = bold] -+"database-0_start_0 controller-0" -> "galera-bundle-docker-0_monitor_60000 database-0" [ style = bold] -+"database-0_start_0 controller-0" -> "galera-bundle-docker-0_start_0 database-0" [ style = bold] -+"database-0_start_0 controller-0" -> "galera-bundle-docker-0_stop_0 database-0" [ style = bold] -+"database-0_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"database-2_monitor_20000 controller-1" [ style=bold color="green" fontcolor="black"] -+"database-2_start_0 controller-1" -> "database-2_monitor_20000 controller-1" [ style = bold] -+"database-2_start_0 controller-1" -> "galera-bundle-docker-2_monitor_60000 database-2" [ style = bold] -+"database-2_start_0 controller-1" -> "galera-bundle-docker-2_start_0 database-2" [ style = bold] -+"database-2_start_0 controller-1" -> "galera-bundle-docker-2_stop_0 database-2" [ style = bold] -+"database-2_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-0_monitor_0 controller-1" -> "galera-bundle-0_start_0 controller-0" [ style = bold] -+"galera-bundle-0_monitor_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-0_monitor_60000 controller-0" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-0_start_0 controller-0" -> "galera-bundle-0_monitor_60000 controller-0" [ style = bold] -+"galera-bundle-0_start_0 controller-0" -> "galera_monitor_10000 galera-bundle-0" [ style = bold] -+"galera-bundle-0_start_0 controller-0" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"galera-bundle-0_start_0 controller-0" -> "galera_start_0 galera-bundle-0" [ style = bold] -+"galera-bundle-0_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-2_monitor_0 controller-1" -> "galera-bundle-2_start_0 controller-1" [ style = bold] -+"galera-bundle-2_monitor_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-2_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-2_start_0 controller-1" -> "galera-bundle-2_monitor_60000 controller-1" [ style = bold] -+"galera-bundle-2_start_0 controller-1" -> "galera_monitor_10000 galera-bundle-2" [ style = bold] -+"galera-bundle-2_start_0 controller-1" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"galera-bundle-2_start_0 controller-1" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"galera-bundle-2_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-0_monitor_60000 database-0" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-0_start_0 database-0" -> "galera-bundle-0_monitor_0 controller-1" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" -> "galera-bundle-0_start_0 controller-0" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" -> "galera-bundle-docker-0_monitor_60000 database-0" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" -> "galera-bundle_running_0" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" -> "galera_start_0 galera-bundle-0" [ style = bold] -+"galera-bundle-docker-0_start_0 database-0" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-0_stop_0 database-0" -> "all_stopped" [ style = bold] -+"galera-bundle-docker-0_stop_0 database-0" -> "galera-bundle-docker-0_start_0 database-0" [ style = bold] -+"galera-bundle-docker-0_stop_0 database-0" -> "galera-bundle_stopped_0" [ style = bold] -+"galera-bundle-docker-0_stop_0 database-0" -> "stonith 'reboot' galera-bundle-0" [ style = bold] -+"galera-bundle-docker-0_stop_0 database-0" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-2_monitor_60000 database-2" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-2_start_0 database-2" -> "galera-bundle-2_monitor_0 controller-1" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" -> "galera-bundle-2_start_0 controller-1" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" -> "galera-bundle-docker-2_monitor_60000 database-2" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" -> "galera-bundle_running_0" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"galera-bundle-docker-2_start_0 database-2" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-docker-2_stop_0 database-2" -> "all_stopped" [ style = bold] -+"galera-bundle-docker-2_stop_0 database-2" -> "galera-bundle-docker-2_start_0 database-2" [ style = bold] -+"galera-bundle-docker-2_stop_0 database-2" -> "galera-bundle_stopped_0" [ style = bold] -+"galera-bundle-docker-2_stop_0 database-2" -> "stonith 'reboot' galera-bundle-2" [ style = bold] -+"galera-bundle-docker-2_stop_0 database-2" [ style=bold color="green" fontcolor="black"] -+"galera-bundle-master_demote_0" -> "galera-bundle-master_demoted_0" [ style = bold] -+"galera-bundle-master_demote_0" -> "galera_demote_0 galera-bundle-0" [ style = bold] -+"galera-bundle-master_demote_0" -> "galera_demote_0 galera-bundle-2" [ style = bold] -+"galera-bundle-master_demote_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_demoted_0" -> "galera-bundle-master_promote_0" [ style = bold] -+"galera-bundle-master_demoted_0" -> "galera-bundle-master_start_0" [ style = bold] -+"galera-bundle-master_demoted_0" -> "galera-bundle-master_stop_0" [ style = bold] -+"galera-bundle-master_demoted_0" -> "galera-bundle_demoted_0" [ style = bold] -+"galera-bundle-master_demoted_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_promote_0" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"galera-bundle-master_promote_0" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"galera-bundle-master_promote_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_promoted_0" -> "galera-bundle_promoted_0" [ style = bold] -+"galera-bundle-master_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_running_0" -> "galera-bundle-master_promote_0" [ style = bold] -+"galera-bundle-master_running_0" -> "galera-bundle_running_0" [ style = bold] -+"galera-bundle-master_running_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_start_0" -> "galera-bundle-master_running_0" [ style = bold] -+"galera-bundle-master_start_0" -> "galera_start_0 galera-bundle-0" [ style = bold] -+"galera-bundle-master_start_0" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"galera-bundle-master_start_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_stop_0" -> "galera-bundle-master_stopped_0" [ style = bold] -+"galera-bundle-master_stop_0" -> "galera_stop_0 galera-bundle-0" [ style = bold] -+"galera-bundle-master_stop_0" -> "galera_stop_0 galera-bundle-2" [ style = bold] -+"galera-bundle-master_stop_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle-master_stopped_0" -> "galera-bundle-master_promote_0" [ style = bold] -+"galera-bundle-master_stopped_0" -> "galera-bundle-master_start_0" [ style = bold] -+"galera-bundle-master_stopped_0" -> "galera-bundle_stopped_0" [ style = bold] -+"galera-bundle-master_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_demote_0" -> "galera-bundle-master_demote_0" [ style = bold] -+"galera-bundle_demote_0" -> "galera-bundle_demoted_0" [ style = bold] -+"galera-bundle_demote_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_demoted_0" -> "galera-bundle_promote_0" [ style = bold] -+"galera-bundle_demoted_0" -> "galera-bundle_start_0" [ style = bold] -+"galera-bundle_demoted_0" -> "galera-bundle_stop_0" [ style = bold] -+"galera-bundle_demoted_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_promote_0" -> "galera-bundle-master_promote_0" [ style = bold] -+"galera-bundle_promote_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_running_0" -> "galera-bundle_promote_0" [ style = bold] -+"galera-bundle_running_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_start_0" -> "galera-bundle-docker-0_start_0 database-0" [ style = bold] -+"galera-bundle_start_0" -> "galera-bundle-docker-2_start_0 database-2" [ style = bold] -+"galera-bundle_start_0" -> "galera-bundle-master_start_0" [ style = bold] -+"galera-bundle_start_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_stop_0" -> "galera-bundle-docker-0_stop_0 database-0" [ style = bold] -+"galera-bundle_stop_0" -> "galera-bundle-docker-2_stop_0 database-2" [ style = bold] -+"galera-bundle_stop_0" -> "galera-bundle-master_stop_0" [ style = bold] -+"galera-bundle_stop_0" -> "galera_stop_0 galera-bundle-0" [ style = bold] -+"galera-bundle_stop_0" -> "galera_stop_0 galera-bundle-2" [ style = bold] -+"galera-bundle_stop_0" [ style=bold color="green" fontcolor="orange"] -+"galera-bundle_stopped_0" -> "galera-bundle_promote_0" [ style = bold] -+"galera-bundle_stopped_0" -> "galera-bundle_start_0" [ style = bold] -+"galera-bundle_stopped_0" [ style=bold color="green" fontcolor="orange"] -+"galera_demote_0 galera-bundle-0" -> "galera-bundle-master_demoted_0" [ style = bold] -+"galera_demote_0 galera-bundle-0" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"galera_demote_0 galera-bundle-0" -> "galera_stop_0 galera-bundle-0" [ style = bold] -+"galera_demote_0 galera-bundle-0" [ style=bold color="green" fontcolor="orange"] -+"galera_demote_0 galera-bundle-2" -> "galera-bundle-master_demoted_0" [ style = bold] -+"galera_demote_0 galera-bundle-2" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"galera_demote_0 galera-bundle-2" -> "galera_stop_0 galera-bundle-2" [ style = bold] -+"galera_demote_0 galera-bundle-2" [ style=bold color="green" fontcolor="orange"] -+"galera_monitor_10000 galera-bundle-0" [ style=bold color="green" fontcolor="black"] -+"galera_monitor_10000 galera-bundle-2" [ style=bold color="green" fontcolor="black"] -+"galera_promote_0 galera-bundle-0" -> "galera-bundle-master_promoted_0" [ style = bold] -+"galera_promote_0 galera-bundle-0" -> "galera_monitor_10000 galera-bundle-0" [ style = bold] -+"galera_promote_0 galera-bundle-0" [ style=bold color="green" fontcolor="black"] -+"galera_promote_0 galera-bundle-2" -> "galera-bundle-master_promoted_0" [ style = bold] -+"galera_promote_0 galera-bundle-2" -> "galera_monitor_10000 galera-bundle-2" [ style = bold] -+"galera_promote_0 galera-bundle-2" [ style=bold color="green" fontcolor="black"] -+"galera_start_0 galera-bundle-0" -> "galera-bundle-master_running_0" [ style = bold] -+"galera_start_0 galera-bundle-0" -> "galera_monitor_10000 galera-bundle-0" [ style = bold] -+"galera_start_0 galera-bundle-0" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"galera_start_0 galera-bundle-0" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"galera_start_0 galera-bundle-0" [ style=bold color="green" fontcolor="black"] -+"galera_start_0 galera-bundle-2" -> "galera-bundle-master_running_0" [ style = bold] -+"galera_start_0 galera-bundle-2" -> "galera_monitor_10000 galera-bundle-2" [ style = bold] -+"galera_start_0 galera-bundle-2" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"galera_start_0 galera-bundle-2" [ style=bold color="green" fontcolor="black"] -+"galera_stop_0 galera-bundle-0" -> "all_stopped" [ style = bold] -+"galera_stop_0 galera-bundle-0" -> "galera-bundle-master_stopped_0" [ style = bold] -+"galera_stop_0 galera-bundle-0" -> "galera_start_0 galera-bundle-0" [ style = bold] -+"galera_stop_0 galera-bundle-0" [ style=bold color="green" fontcolor="orange"] -+"galera_stop_0 galera-bundle-2" -> "all_stopped" [ style = bold] -+"galera_stop_0 galera-bundle-2" -> "galera-bundle-master_stopped_0" [ style = bold] -+"galera_stop_0 galera-bundle-2" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"galera_stop_0 galera-bundle-2" -> "galera_stop_0 galera-bundle-0" [ style = bold] -+"galera_stop_0 galera-bundle-2" [ style=bold color="green" fontcolor="orange"] -+"haproxy-bundle-docker-1_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"haproxy-bundle-docker-1_start_0 controller-1" -> "haproxy-bundle-docker-1_monitor_60000 controller-1" [ style = bold] -+"haproxy-bundle-docker-1_start_0 controller-1" -> "haproxy-bundle_running_0" [ style = bold] -+"haproxy-bundle-docker-1_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"haproxy-bundle_running_0" [ style=bold color="green" fontcolor="orange"] -+"haproxy-bundle_start_0" -> "haproxy-bundle-docker-1_start_0 controller-1" [ style = bold] -+"haproxy-bundle_start_0" [ style=bold color="green" fontcolor="orange"] -+"ip-10.0.0.104_monitor_10000 controller-1" [ style=bold color="green" fontcolor="black"] -+"ip-10.0.0.104_start_0 controller-1" -> "haproxy-bundle_start_0" [ style = bold] -+"ip-10.0.0.104_start_0 controller-1" -> "ip-10.0.0.104_monitor_10000 controller-1" [ style = bold] -+"ip-10.0.0.104_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"ip-172.17.1.11_monitor_10000 controller-0" [ style=bold color="green" fontcolor="black"] -+"ip-172.17.1.11_start_0 controller-0" -> "haproxy-bundle_start_0" [ style = bold] -+"ip-172.17.1.11_start_0 controller-0" -> "ip-172.17.1.11_monitor_10000 controller-0" [ style = bold] -+"ip-172.17.1.11_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"ip-172.17.3.13_monitor_10000 controller-1" [ style=bold color="green" fontcolor="black"] -+"ip-172.17.3.13_start_0 controller-1" -> "haproxy-bundle_start_0" [ style = bold] -+"ip-172.17.3.13_start_0 controller-1" -> "ip-172.17.3.13_monitor_10000 controller-1" [ style = bold] -+"ip-172.17.3.13_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"ip-192.168.24.11_monitor_10000 controller-0" [ style=bold color="green" fontcolor="black"] -+"ip-192.168.24.11_start_0 controller-0" -> "haproxy-bundle_start_0" [ style = bold] -+"ip-192.168.24.11_start_0 controller-0" -> "ip-192.168.24.11_monitor_10000 controller-0" [ style = bold] -+"ip-192.168.24.11_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"openstack-cinder-volume_monitor_60000 controller-0" [ style=bold color="green" fontcolor="black"] -+"openstack-cinder-volume_start_0 controller-0" -> "openstack-cinder-volume_monitor_60000 controller-0" [ style = bold] -+"openstack-cinder-volume_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-1_monitor_0 controller-1" -> "redis-bundle-1_start_0 controller-1" [ style = bold] -+"redis-bundle-1_monitor_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-1_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-1_start_0 controller-1" -> "redis-bundle-1_monitor_60000 controller-1" [ style = bold] -+"redis-bundle-1_start_0 controller-1" -> "redis:1_monitor_45000 redis-bundle-1" [ style = bold] -+"redis-bundle-1_start_0 controller-1" -> "redis:1_monitor_60000 redis-bundle-1" [ style = bold] -+"redis-bundle-1_start_0 controller-1" -> "redis:1_start_0 redis-bundle-1" [ style = bold] -+"redis-bundle-1_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-docker-1_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-docker-1_start_0 controller-1" -> "redis-bundle-1_monitor_0 controller-1" [ style = bold] -+"redis-bundle-docker-1_start_0 controller-1" -> "redis-bundle-1_start_0 controller-1" [ style = bold] -+"redis-bundle-docker-1_start_0 controller-1" -> "redis-bundle-docker-1_monitor_60000 controller-1" [ style = bold] -+"redis-bundle-docker-1_start_0 controller-1" -> "redis-bundle_running_0" [ style = bold] -+"redis-bundle-docker-1_start_0 controller-1" -> "redis:1_start_0 redis-bundle-1" [ style = bold] -+"redis-bundle-docker-1_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"redis-bundle-master_confirmed-post_notify_promoted_0" -> "redis-bundle_promoted_0" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_promoted_0" -> "redis:1_monitor_45000 redis-bundle-1" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_promoted_0" -> "redis:1_monitor_60000 redis-bundle-1" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_promoted_0" -> "redis_monitor_20000 redis-bundle-0" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_confirmed-post_notify_running_0" -> "redis-bundle-master_pre_notify_promote_0" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_running_0" -> "redis-bundle_running_0" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_running_0" -> "redis:1_monitor_45000 redis-bundle-1" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_running_0" -> "redis:1_monitor_60000 redis-bundle-1" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_20000 redis-bundle-0" [ style = bold] -+"redis-bundle-master_confirmed-post_notify_running_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_confirmed-pre_notify_promote_0" -> "redis-bundle-master_post_notify_promoted_0" [ style = bold] -+"redis-bundle-master_confirmed-pre_notify_promote_0" -> "redis-bundle-master_promote_0" [ style = bold] -+"redis-bundle-master_confirmed-pre_notify_promote_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_confirmed-pre_notify_start_0" -> "redis-bundle-master_post_notify_running_0" [ style = bold] -+"redis-bundle-master_confirmed-pre_notify_start_0" -> "redis-bundle-master_start_0" [ style = bold] -+"redis-bundle-master_confirmed-pre_notify_start_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_post_notify_promoted_0" -> "redis-bundle-master_confirmed-post_notify_promoted_0" [ style = bold] -+"redis-bundle-master_post_notify_promoted_0" -> "redis:1_post_notify_promote_0 redis-bundle-1" [ style = bold] -+"redis-bundle-master_post_notify_promoted_0" -> "redis_post_notify_promoted_0 redis-bundle-0" [ style = bold] -+"redis-bundle-master_post_notify_promoted_0" -> "redis_post_notify_promoted_0 redis-bundle-2" [ style = bold] -+"redis-bundle-master_post_notify_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_post_notify_running_0" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] -+"redis-bundle-master_post_notify_running_0" -> "redis:1_post_notify_start_0 redis-bundle-1" [ style = bold] -+"redis-bundle-master_post_notify_running_0" -> "redis_post_notify_running_0 redis-bundle-0" [ style = bold] -+"redis-bundle-master_post_notify_running_0" -> "redis_post_notify_running_0 redis-bundle-2" [ style = bold] -+"redis-bundle-master_post_notify_running_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_pre_notify_promote_0" -> "redis-bundle-master_confirmed-pre_notify_promote_0" [ style = bold] -+"redis-bundle-master_pre_notify_promote_0" -> "redis:1_pre_notify_promote_0 redis-bundle-1" [ style = bold] -+"redis-bundle-master_pre_notify_promote_0" -> "redis_pre_notify_promote_0 redis-bundle-0" [ style = bold] -+"redis-bundle-master_pre_notify_promote_0" -> "redis_pre_notify_promote_0 redis-bundle-2" [ style = bold] -+"redis-bundle-master_pre_notify_promote_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_pre_notify_start_0" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] -+"redis-bundle-master_pre_notify_start_0" -> "redis_pre_notify_start_0 redis-bundle-0" [ style = bold] -+"redis-bundle-master_pre_notify_start_0" -> "redis_pre_notify_start_0 redis-bundle-2" [ style = bold] -+"redis-bundle-master_pre_notify_start_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_promote_0" -> "redis_promote_0 redis-bundle-0" [ style = bold] -+"redis-bundle-master_promote_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_promoted_0" -> "redis-bundle-master_post_notify_promoted_0" [ style = bold] -+"redis-bundle-master_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_running_0" -> "redis-bundle-master_post_notify_running_0" [ style = bold] -+"redis-bundle-master_running_0" -> "redis-bundle-master_promote_0" [ style = bold] -+"redis-bundle-master_running_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle-master_start_0" -> "redis-bundle-master_running_0" [ style = bold] -+"redis-bundle-master_start_0" -> "redis:1_start_0 redis-bundle-1" [ style = bold] -+"redis-bundle-master_start_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle_promote_0" -> "redis-bundle-master_promote_0" [ style = bold] -+"redis-bundle_promote_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle_promoted_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle_running_0" -> "redis-bundle_promote_0" [ style = bold] -+"redis-bundle_running_0" [ style=bold color="green" fontcolor="orange"] -+"redis-bundle_start_0" -> "redis-bundle-docker-1_start_0 controller-1" [ style = bold] -+"redis-bundle_start_0" -> "redis-bundle-master_start_0" [ style = bold] -+"redis-bundle_start_0" [ style=bold color="green" fontcolor="orange"] -+"redis:1_monitor_45000 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis:1_monitor_60000 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis:1_post_notify_promote_0 redis-bundle-1" -> "redis-bundle-master_confirmed-post_notify_promoted_0" [ style = bold] -+"redis:1_post_notify_promote_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis:1_post_notify_start_0 redis-bundle-1" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] -+"redis:1_post_notify_start_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis:1_pre_notify_promote_0 redis-bundle-1" -> "redis-bundle-master_confirmed-pre_notify_promote_0" [ style = bold] -+"redis:1_pre_notify_promote_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis:1_start_0 redis-bundle-1" -> "redis-bundle-master_running_0" [ style = bold] -+"redis:1_start_0 redis-bundle-1" -> "redis:1_monitor_45000 redis-bundle-1" [ style = bold] -+"redis:1_start_0 redis-bundle-1" -> "redis:1_monitor_60000 redis-bundle-1" [ style = bold] -+"redis:1_start_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -+"redis_monitor_20000 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"redis_post_notify_promoted_0 redis-bundle-0" -> "redis-bundle-master_confirmed-post_notify_promoted_0" [ style = bold] -+"redis_post_notify_promoted_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"redis_post_notify_promoted_0 redis-bundle-2" -> "redis-bundle-master_confirmed-post_notify_promoted_0" [ style = bold] -+"redis_post_notify_promoted_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] -+"redis_post_notify_running_0 redis-bundle-0" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] -+"redis_post_notify_running_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"redis_post_notify_running_0 redis-bundle-2" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] -+"redis_post_notify_running_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] -+"redis_pre_notify_promote_0 redis-bundle-0" -> "redis-bundle-master_confirmed-pre_notify_promote_0" [ style = bold] -+"redis_pre_notify_promote_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"redis_pre_notify_promote_0 redis-bundle-2" -> "redis-bundle-master_confirmed-pre_notify_promote_0" [ style = bold] -+"redis_pre_notify_promote_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] -+"redis_pre_notify_start_0 redis-bundle-0" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] -+"redis_pre_notify_start_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"redis_pre_notify_start_0 redis-bundle-2" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] -+"redis_pre_notify_start_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] -+"redis_promote_0 redis-bundle-0" -> "redis-bundle-master_promoted_0" [ style = bold] -+"redis_promote_0 redis-bundle-0" -> "redis_monitor_20000 redis-bundle-0" [ style = bold] -+"redis_promote_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] -+"stonith 'reboot' galera-bundle-0" -> "galera-bundle-master_stop_0" [ style = bold] -+"stonith 'reboot' galera-bundle-0" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' galera-bundle-0" [ style=bold color="green" fontcolor="orange"] -+"stonith 'reboot' galera-bundle-2" -> "galera-bundle-master_stop_0" [ style = bold] -+"stonith 'reboot' galera-bundle-2" -> "stonith_complete" [ style = bold] -+"stonith 'reboot' galera-bundle-2" [ style=bold color="green" fontcolor="orange"] -+"stonith-fence_ipmilan-525400498d34_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-525400498d34_start_0 controller-1" -> "stonith-fence_ipmilan-525400498d34_monitor_60000 controller-1" [ style = bold] -+"stonith-fence_ipmilan-525400498d34_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-525400542c06_monitor_60000 controller-0" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-525400542c06_start_0 controller-0" -> "stonith-fence_ipmilan-525400542c06_monitor_60000 controller-0" [ style = bold] -+"stonith-fence_ipmilan-525400542c06_start_0 controller-0" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-5254005ea387_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-5254005ea387_start_0 controller-1" -> "stonith-fence_ipmilan-5254005ea387_monitor_60000 controller-1" [ style = bold] -+"stonith-fence_ipmilan-5254005ea387_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-525400c709f7_monitor_60000 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith-fence_ipmilan-525400c709f7_start_0 controller-1" -> "stonith-fence_ipmilan-525400c709f7_monitor_60000 controller-1" [ style = bold] -+"stonith-fence_ipmilan-525400c709f7_start_0 controller-1" [ style=bold color="green" fontcolor="black"] -+"stonith_complete" -> "all_stopped" [ style = bold] -+"stonith_complete" -> "galera-bundle-docker-0_start_0 database-0" [ style = bold] -+"stonith_complete" -> "galera-bundle-docker-2_start_0 database-2" [ style = bold] -+"stonith_complete" -> "galera_promote_0 galera-bundle-0" [ style = bold] -+"stonith_complete" -> "galera_promote_0 galera-bundle-2" [ style = bold] -+"stonith_complete" -> "galera_start_0 galera-bundle-0" [ style = bold] -+"stonith_complete" -> "galera_start_0 galera-bundle-2" [ style = bold] -+"stonith_complete" -> "haproxy-bundle-docker-1_start_0 controller-1" [ style = bold] -+"stonith_complete" -> "ip-10.0.0.104_start_0 controller-1" [ style = bold] -+"stonith_complete" -> "ip-172.17.1.11_start_0 controller-0" [ style = bold] -+"stonith_complete" -> "ip-172.17.3.13_start_0 controller-1" [ style = bold] -+"stonith_complete" -> "ip-192.168.24.11_start_0 controller-0" [ style = bold] -+"stonith_complete" -> "openstack-cinder-volume_start_0 controller-0" [ style = bold] -+"stonith_complete" -> "redis-bundle-docker-1_start_0 controller-1" [ style = bold] -+"stonith_complete" -> "redis:1_start_0 redis-bundle-1" [ style = bold] -+"stonith_complete" -> "redis_promote_0 redis-bundle-0" [ style = bold] -+"stonith_complete" [ style=bold color="green" fontcolor="orange"] -+} -diff --git a/pengine/test10/bundle-order-stop-on-remote.exp b/pengine/test10/bundle-order-stop-on-remote.exp -new file mode 100644 -index 0000000..db5386b ---- /dev/null -+++ b/pengine/test10/bundle-order-stop-on-remote.exp -@@ -0,0 +1,1607 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/pengine/test10/bundle-order-stop-on-remote.scores b/pengine/test10/bundle-order-stop-on-remote.scores -new file mode 100644 -index 0000000..e26f511 ---- /dev/null -+++ b/pengine/test10/bundle-order-stop-on-remote.scores -@@ -0,0 +1,934 @@ -+Allocation scores: -+clone_color: galera-bundle-master allocation score on controller-0: -INFINITY -+clone_color: galera-bundle-master allocation score on controller-1: -INFINITY -+clone_color: galera-bundle-master allocation score on controller-2: -INFINITY -+clone_color: galera-bundle-master allocation score on database-0: -INFINITY -+clone_color: galera-bundle-master allocation score on database-1: -INFINITY -+clone_color: galera-bundle-master allocation score on database-2: -INFINITY -+clone_color: galera-bundle-master allocation score on galera-bundle-0: 0 -+clone_color: galera-bundle-master allocation score on galera-bundle-1: 0 -+clone_color: galera-bundle-master allocation score on galera-bundle-2: 0 -+clone_color: galera-bundle-master allocation score on messaging-0: -INFINITY -+clone_color: galera-bundle-master allocation score on messaging-1: -INFINITY -+clone_color: galera-bundle-master allocation score on messaging-2: -INFINITY -+clone_color: galera:0 allocation score on galera-bundle-0: INFINITY -+clone_color: galera:1 allocation score on galera-bundle-1: INFINITY -+clone_color: galera:2 allocation score on galera-bundle-2: INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on controller-0: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on controller-1: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on controller-2: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on database-0: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on database-1: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on database-2: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on messaging-0: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on messaging-1: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on messaging-2: -INFINITY -+clone_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: 0 -+clone_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: 0 -+clone_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: 0 -+clone_color: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY -+clone_color: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY -+clone_color: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY -+clone_color: redis-bundle-master allocation score on controller-0: -INFINITY -+clone_color: redis-bundle-master allocation score on controller-1: -INFINITY -+clone_color: redis-bundle-master allocation score on controller-2: -INFINITY -+clone_color: redis-bundle-master allocation score on database-0: -INFINITY -+clone_color: redis-bundle-master allocation score on database-1: -INFINITY -+clone_color: redis-bundle-master allocation score on database-2: -INFINITY -+clone_color: redis-bundle-master allocation score on messaging-0: -INFINITY -+clone_color: redis-bundle-master allocation score on messaging-1: -INFINITY -+clone_color: redis-bundle-master allocation score on messaging-2: -INFINITY -+clone_color: redis-bundle-master allocation score on redis-bundle-0: 0 -+clone_color: redis-bundle-master allocation score on redis-bundle-1: 0 -+clone_color: redis-bundle-master allocation score on redis-bundle-2: 0 -+clone_color: redis:0 allocation score on redis-bundle-0: INFINITY -+clone_color: redis:1 allocation score on redis-bundle-1: INFINITY -+clone_color: redis:2 allocation score on redis-bundle-2: INFINITY -+container_color: galera-bundle allocation score on controller-0: -INFINITY -+container_color: galera-bundle allocation score on controller-1: -INFINITY -+container_color: galera-bundle allocation score on controller-2: -INFINITY -+container_color: galera-bundle allocation score on database-0: 0 -+container_color: galera-bundle allocation score on database-1: 0 -+container_color: galera-bundle allocation score on database-2: 0 -+container_color: galera-bundle allocation score on messaging-0: -INFINITY -+container_color: galera-bundle allocation score on messaging-1: -INFINITY -+container_color: galera-bundle allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-0 allocation score on controller-0: 0 -+container_color: galera-bundle-0 allocation score on controller-1: 0 -+container_color: galera-bundle-0 allocation score on controller-2: 0 -+container_color: galera-bundle-0 allocation score on database-0: -INFINITY -+container_color: galera-bundle-0 allocation score on database-1: -INFINITY -+container_color: galera-bundle-0 allocation score on database-2: -INFINITY -+container_color: galera-bundle-0 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-0 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-0 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-1 allocation score on controller-0: 0 -+container_color: galera-bundle-1 allocation score on controller-1: 0 -+container_color: galera-bundle-1 allocation score on controller-2: INFINITY -+container_color: galera-bundle-1 allocation score on database-0: -INFINITY -+container_color: galera-bundle-1 allocation score on database-1: -INFINITY -+container_color: galera-bundle-1 allocation score on database-2: -INFINITY -+container_color: galera-bundle-1 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-1 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-1 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-2 allocation score on controller-0: 0 -+container_color: galera-bundle-2 allocation score on controller-1: 0 -+container_color: galera-bundle-2 allocation score on controller-2: 0 -+container_color: galera-bundle-2 allocation score on database-0: -INFINITY -+container_color: galera-bundle-2 allocation score on database-1: -INFINITY -+container_color: galera-bundle-2 allocation score on database-2: -INFINITY -+container_color: galera-bundle-2 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-2 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-2 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on controller-0: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on controller-1: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on database-0: INFINITY -+container_color: galera-bundle-docker-0 allocation score on database-1: 0 -+container_color: galera-bundle-docker-0 allocation score on database-2: 0 -+container_color: galera-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on controller-1: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on database-0: 0 -+container_color: galera-bundle-docker-1 allocation score on database-1: INFINITY -+container_color: galera-bundle-docker-1 allocation score on database-2: 0 -+container_color: galera-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on controller-0: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on controller-1: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on controller-2: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on database-0: 0 -+container_color: galera-bundle-docker-2 allocation score on database-1: 0 -+container_color: galera-bundle-docker-2 allocation score on database-2: INFINITY -+container_color: galera-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: galera-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: galera-bundle-master allocation score on controller-0: 0 -+container_color: galera-bundle-master allocation score on controller-1: 0 -+container_color: galera-bundle-master allocation score on controller-2: 0 -+container_color: galera-bundle-master allocation score on database-0: 0 -+container_color: galera-bundle-master allocation score on database-1: 0 -+container_color: galera-bundle-master allocation score on database-2: 0 -+container_color: galera-bundle-master allocation score on galera-bundle-0: -INFINITY -+container_color: galera-bundle-master allocation score on galera-bundle-1: -INFINITY -+container_color: galera-bundle-master allocation score on galera-bundle-2: -INFINITY -+container_color: galera-bundle-master allocation score on messaging-0: 0 -+container_color: galera-bundle-master allocation score on messaging-1: 0 -+container_color: galera-bundle-master allocation score on messaging-2: 0 -+container_color: galera:0 allocation score on galera-bundle-0: INFINITY -+container_color: galera:1 allocation score on galera-bundle-1: INFINITY -+container_color: galera:2 allocation score on galera-bundle-2: INFINITY -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-0: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-1: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on controller-2: 0 -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-0: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-1: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on database-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on controller-2: 0 -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on controller-2: 0 -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: rabbitmq-bundle allocation score on controller-0: -INFINITY -+container_color: rabbitmq-bundle allocation score on controller-1: -INFINITY -+container_color: rabbitmq-bundle allocation score on controller-2: -INFINITY -+container_color: rabbitmq-bundle allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle allocation score on messaging-0: 0 -+container_color: rabbitmq-bundle allocation score on messaging-1: 0 -+container_color: rabbitmq-bundle allocation score on messaging-2: 0 -+container_color: rabbitmq-bundle-0 allocation score on controller-0: 0 -+container_color: rabbitmq-bundle-0 allocation score on controller-1: 0 -+container_color: rabbitmq-bundle-0 allocation score on controller-2: INFINITY -+container_color: rabbitmq-bundle-0 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-0 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-0 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-0 allocation score on messaging-0: -INFINITY -+container_color: rabbitmq-bundle-0 allocation score on messaging-1: -INFINITY -+container_color: rabbitmq-bundle-0 allocation score on messaging-2: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on controller-0: 0 -+container_color: rabbitmq-bundle-1 allocation score on controller-1: 0 -+container_color: rabbitmq-bundle-1 allocation score on controller-2: INFINITY -+container_color: rabbitmq-bundle-1 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on messaging-0: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on messaging-1: -INFINITY -+container_color: rabbitmq-bundle-1 allocation score on messaging-2: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on controller-0: 0 -+container_color: rabbitmq-bundle-2 allocation score on controller-1: 0 -+container_color: rabbitmq-bundle-2 allocation score on controller-2: INFINITY -+container_color: rabbitmq-bundle-2 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on messaging-0: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on messaging-1: -INFINITY -+container_color: rabbitmq-bundle-2 allocation score on messaging-2: -INFINITY -+container_color: rabbitmq-bundle-clone allocation score on controller-0: 0 -+container_color: rabbitmq-bundle-clone allocation score on controller-1: 0 -+container_color: rabbitmq-bundle-clone allocation score on controller-2: 0 -+container_color: rabbitmq-bundle-clone allocation score on database-0: 0 -+container_color: rabbitmq-bundle-clone allocation score on database-1: 0 -+container_color: rabbitmq-bundle-clone allocation score on database-2: 0 -+container_color: rabbitmq-bundle-clone allocation score on messaging-0: 0 -+container_color: rabbitmq-bundle-clone allocation score on messaging-1: 0 -+container_color: rabbitmq-bundle-clone allocation score on messaging-2: 0 -+container_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: -INFINITY -+container_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: -INFINITY -+container_color: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on controller-0: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on controller-1: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on controller-2: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on messaging-0: INFINITY -+container_color: rabbitmq-bundle-docker-0 allocation score on messaging-1: 0 -+container_color: rabbitmq-bundle-docker-0 allocation score on messaging-2: 0 -+container_color: rabbitmq-bundle-docker-1 allocation score on controller-0: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on controller-1: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on controller-2: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on messaging-0: 0 -+container_color: rabbitmq-bundle-docker-1 allocation score on messaging-1: INFINITY -+container_color: rabbitmq-bundle-docker-1 allocation score on messaging-2: 0 -+container_color: rabbitmq-bundle-docker-2 allocation score on controller-0: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on controller-1: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on controller-2: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: rabbitmq-bundle-docker-2 allocation score on messaging-0: 0 -+container_color: rabbitmq-bundle-docker-2 allocation score on messaging-1: 0 -+container_color: rabbitmq-bundle-docker-2 allocation score on messaging-2: INFINITY -+container_color: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY -+container_color: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY -+container_color: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY -+container_color: redis-bundle allocation score on controller-0: 0 -+container_color: redis-bundle allocation score on controller-1: 0 -+container_color: redis-bundle allocation score on controller-2: 0 -+container_color: redis-bundle allocation score on database-0: -INFINITY -+container_color: redis-bundle allocation score on database-1: -INFINITY -+container_color: redis-bundle allocation score on database-2: -INFINITY -+container_color: redis-bundle allocation score on messaging-0: -INFINITY -+container_color: redis-bundle allocation score on messaging-1: -INFINITY -+container_color: redis-bundle allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-0 allocation score on controller-0: INFINITY -+container_color: redis-bundle-0 allocation score on controller-1: 0 -+container_color: redis-bundle-0 allocation score on controller-2: 0 -+container_color: redis-bundle-0 allocation score on database-0: -INFINITY -+container_color: redis-bundle-0 allocation score on database-1: -INFINITY -+container_color: redis-bundle-0 allocation score on database-2: -INFINITY -+container_color: redis-bundle-0 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-0 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-0 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-1 allocation score on controller-0: 0 -+container_color: redis-bundle-1 allocation score on controller-1: 0 -+container_color: redis-bundle-1 allocation score on controller-2: 0 -+container_color: redis-bundle-1 allocation score on database-0: -INFINITY -+container_color: redis-bundle-1 allocation score on database-1: -INFINITY -+container_color: redis-bundle-1 allocation score on database-2: -INFINITY -+container_color: redis-bundle-1 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-1 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-1 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-2 allocation score on controller-0: 0 -+container_color: redis-bundle-2 allocation score on controller-1: 0 -+container_color: redis-bundle-2 allocation score on controller-2: INFINITY -+container_color: redis-bundle-2 allocation score on database-0: -INFINITY -+container_color: redis-bundle-2 allocation score on database-1: -INFINITY -+container_color: redis-bundle-2 allocation score on database-2: -INFINITY -+container_color: redis-bundle-2 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-2 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-2 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on controller-0: INFINITY -+container_color: redis-bundle-docker-0 allocation score on controller-1: 0 -+container_color: redis-bundle-docker-0 allocation score on controller-2: 0 -+container_color: redis-bundle-docker-0 allocation score on database-0: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on database-1: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on database-2: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-docker-0 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on controller-0: 0 -+container_color: redis-bundle-docker-1 allocation score on controller-1: 0 -+container_color: redis-bundle-docker-1 allocation score on controller-2: 0 -+container_color: redis-bundle-docker-1 allocation score on database-0: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on database-1: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on database-2: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-docker-1 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on controller-0: 0 -+container_color: redis-bundle-docker-2 allocation score on controller-1: 0 -+container_color: redis-bundle-docker-2 allocation score on controller-2: INFINITY -+container_color: redis-bundle-docker-2 allocation score on database-0: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on database-1: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on database-2: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on messaging-0: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on messaging-1: -INFINITY -+container_color: redis-bundle-docker-2 allocation score on messaging-2: -INFINITY -+container_color: redis-bundle-master allocation score on controller-0: 0 -+container_color: redis-bundle-master allocation score on controller-1: 0 -+container_color: redis-bundle-master allocation score on controller-2: 0 -+container_color: redis-bundle-master allocation score on database-0: 0 -+container_color: redis-bundle-master allocation score on database-1: 0 -+container_color: redis-bundle-master allocation score on database-2: 0 -+container_color: redis-bundle-master allocation score on messaging-0: 0 -+container_color: redis-bundle-master allocation score on messaging-1: 0 -+container_color: redis-bundle-master allocation score on messaging-2: 0 -+container_color: redis-bundle-master allocation score on redis-bundle-0: -INFINITY -+container_color: redis-bundle-master allocation score on redis-bundle-1: -INFINITY -+container_color: redis-bundle-master allocation score on redis-bundle-2: -INFINITY -+container_color: redis:0 allocation score on redis-bundle-0: INFINITY -+container_color: redis:1 allocation score on redis-bundle-1: 500 -+container_color: redis:2 allocation score on redis-bundle-2: INFINITY -+galera:0 promotion score on galera-bundle-0: 100 -+galera:1 promotion score on galera-bundle-1: 100 -+galera:2 promotion score on galera-bundle-2: 100 -+native_color: database-0 allocation score on controller-0: 0 -+native_color: database-0 allocation score on controller-1: 0 -+native_color: database-0 allocation score on controller-2: 0 -+native_color: database-0 allocation score on database-0: -INFINITY -+native_color: database-0 allocation score on database-1: -INFINITY -+native_color: database-0 allocation score on database-2: -INFINITY -+native_color: database-0 allocation score on messaging-0: -INFINITY -+native_color: database-0 allocation score on messaging-1: -INFINITY -+native_color: database-0 allocation score on messaging-2: -INFINITY -+native_color: database-1 allocation score on controller-0: 0 -+native_color: database-1 allocation score on controller-1: 0 -+native_color: database-1 allocation score on controller-2: INFINITY -+native_color: database-1 allocation score on database-0: -INFINITY -+native_color: database-1 allocation score on database-1: -INFINITY -+native_color: database-1 allocation score on database-2: -INFINITY -+native_color: database-1 allocation score on messaging-0: -INFINITY -+native_color: database-1 allocation score on messaging-1: -INFINITY -+native_color: database-1 allocation score on messaging-2: -INFINITY -+native_color: database-2 allocation score on controller-0: 0 -+native_color: database-2 allocation score on controller-1: 0 -+native_color: database-2 allocation score on controller-2: 0 -+native_color: database-2 allocation score on database-0: -INFINITY -+native_color: database-2 allocation score on database-1: -INFINITY -+native_color: database-2 allocation score on database-2: -INFINITY -+native_color: database-2 allocation score on messaging-0: -INFINITY -+native_color: database-2 allocation score on messaging-1: -INFINITY -+native_color: database-2 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-0 allocation score on controller-0: 0 -+native_color: galera-bundle-0 allocation score on controller-1: -INFINITY -+native_color: galera-bundle-0 allocation score on controller-2: -INFINITY -+native_color: galera-bundle-0 allocation score on database-0: -INFINITY -+native_color: galera-bundle-0 allocation score on database-1: -INFINITY -+native_color: galera-bundle-0 allocation score on database-2: -INFINITY -+native_color: galera-bundle-0 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-0 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-0 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-1 allocation score on controller-0: -INFINITY -+native_color: galera-bundle-1 allocation score on controller-1: -INFINITY -+native_color: galera-bundle-1 allocation score on controller-2: INFINITY -+native_color: galera-bundle-1 allocation score on database-0: -INFINITY -+native_color: galera-bundle-1 allocation score on database-1: -INFINITY -+native_color: galera-bundle-1 allocation score on database-2: -INFINITY -+native_color: galera-bundle-1 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-1 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-1 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-2 allocation score on controller-0: -INFINITY -+native_color: galera-bundle-2 allocation score on controller-1: 0 -+native_color: galera-bundle-2 allocation score on controller-2: -INFINITY -+native_color: galera-bundle-2 allocation score on database-0: -INFINITY -+native_color: galera-bundle-2 allocation score on database-1: -INFINITY -+native_color: galera-bundle-2 allocation score on database-2: -INFINITY -+native_color: galera-bundle-2 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-2 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-2 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on controller-0: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on controller-1: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on controller-2: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on database-0: INFINITY -+native_color: galera-bundle-docker-0 allocation score on database-1: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on database-2: -10000 -+native_color: galera-bundle-docker-0 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-docker-0 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on controller-0: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on controller-1: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on controller-2: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on database-0: -10000 -+native_color: galera-bundle-docker-1 allocation score on database-1: INFINITY -+native_color: galera-bundle-docker-1 allocation score on database-2: -10000 -+native_color: galera-bundle-docker-1 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-docker-1 allocation score on messaging-2: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on controller-0: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on controller-1: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on controller-2: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on database-0: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on database-1: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on database-2: INFINITY -+native_color: galera-bundle-docker-2 allocation score on messaging-0: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on messaging-1: -INFINITY -+native_color: galera-bundle-docker-2 allocation score on messaging-2: -INFINITY -+native_color: galera:0 allocation score on galera-bundle-0: INFINITY -+native_color: galera:1 allocation score on galera-bundle-1: INFINITY -+native_color: galera:2 allocation score on galera-bundle-2: INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on controller-0: INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on controller-1: 0 -+native_color: haproxy-bundle-docker-0 allocation score on controller-2: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on database-0: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on database-1: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on database-2: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on messaging-0: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on messaging-1: -INFINITY -+native_color: haproxy-bundle-docker-0 allocation score on messaging-2: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on controller-0: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on controller-1: 0 -+native_color: haproxy-bundle-docker-1 allocation score on controller-2: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on database-0: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on database-1: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on database-2: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on messaging-0: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on messaging-1: -INFINITY -+native_color: haproxy-bundle-docker-1 allocation score on messaging-2: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on controller-0: 0 -+native_color: haproxy-bundle-docker-2 allocation score on controller-1: 0 -+native_color: haproxy-bundle-docker-2 allocation score on controller-2: INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on database-0: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on database-1: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on database-2: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on messaging-0: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on messaging-1: -INFINITY -+native_color: haproxy-bundle-docker-2 allocation score on messaging-2: -INFINITY -+native_color: ip-10.0.0.104 allocation score on controller-0: 0 -+native_color: ip-10.0.0.104 allocation score on controller-1: 0 -+native_color: ip-10.0.0.104 allocation score on controller-2: 0 -+native_color: ip-10.0.0.104 allocation score on database-0: -INFINITY -+native_color: ip-10.0.0.104 allocation score on database-1: -INFINITY -+native_color: ip-10.0.0.104 allocation score on database-2: -INFINITY -+native_color: ip-10.0.0.104 allocation score on messaging-0: -INFINITY -+native_color: ip-10.0.0.104 allocation score on messaging-1: -INFINITY -+native_color: ip-10.0.0.104 allocation score on messaging-2: -INFINITY -+native_color: ip-172.17.1.11 allocation score on controller-0: 0 -+native_color: ip-172.17.1.11 allocation score on controller-1: 0 -+native_color: ip-172.17.1.11 allocation score on controller-2: 0 -+native_color: ip-172.17.1.11 allocation score on database-0: -INFINITY -+native_color: ip-172.17.1.11 allocation score on database-1: -INFINITY -+native_color: ip-172.17.1.11 allocation score on database-2: -INFINITY -+native_color: ip-172.17.1.11 allocation score on messaging-0: -INFINITY -+native_color: ip-172.17.1.11 allocation score on messaging-1: -INFINITY -+native_color: ip-172.17.1.11 allocation score on messaging-2: -INFINITY -+native_color: ip-172.17.1.19 allocation score on controller-0: 0 -+native_color: ip-172.17.1.19 allocation score on controller-1: 0 -+native_color: ip-172.17.1.19 allocation score on controller-2: INFINITY -+native_color: ip-172.17.1.19 allocation score on database-0: -INFINITY -+native_color: ip-172.17.1.19 allocation score on database-1: -INFINITY -+native_color: ip-172.17.1.19 allocation score on database-2: -INFINITY -+native_color: ip-172.17.1.19 allocation score on messaging-0: -INFINITY -+native_color: ip-172.17.1.19 allocation score on messaging-1: -INFINITY -+native_color: ip-172.17.1.19 allocation score on messaging-2: -INFINITY -+native_color: ip-172.17.3.13 allocation score on controller-0: 0 -+native_color: ip-172.17.3.13 allocation score on controller-1: 0 -+native_color: ip-172.17.3.13 allocation score on controller-2: 0 -+native_color: ip-172.17.3.13 allocation score on database-0: -INFINITY -+native_color: ip-172.17.3.13 allocation score on database-1: -INFINITY -+native_color: ip-172.17.3.13 allocation score on database-2: -INFINITY -+native_color: ip-172.17.3.13 allocation score on messaging-0: -INFINITY -+native_color: ip-172.17.3.13 allocation score on messaging-1: -INFINITY -+native_color: ip-172.17.3.13 allocation score on messaging-2: -INFINITY -+native_color: ip-172.17.4.19 allocation score on controller-0: 0 -+native_color: ip-172.17.4.19 allocation score on controller-1: 0 -+native_color: ip-172.17.4.19 allocation score on controller-2: INFINITY -+native_color: ip-172.17.4.19 allocation score on database-0: -INFINITY -+native_color: ip-172.17.4.19 allocation score on database-1: -INFINITY -+native_color: ip-172.17.4.19 allocation score on database-2: -INFINITY -+native_color: ip-172.17.4.19 allocation score on messaging-0: -INFINITY -+native_color: ip-172.17.4.19 allocation score on messaging-1: -INFINITY -+native_color: ip-172.17.4.19 allocation score on messaging-2: -INFINITY -+native_color: ip-192.168.24.11 allocation score on controller-0: 0 -+native_color: ip-192.168.24.11 allocation score on controller-1: 0 -+native_color: ip-192.168.24.11 allocation score on controller-2: 0 -+native_color: ip-192.168.24.11 allocation score on database-0: -INFINITY -+native_color: ip-192.168.24.11 allocation score on database-1: -INFINITY -+native_color: ip-192.168.24.11 allocation score on database-2: -INFINITY -+native_color: ip-192.168.24.11 allocation score on messaging-0: -INFINITY -+native_color: ip-192.168.24.11 allocation score on messaging-1: -INFINITY -+native_color: ip-192.168.24.11 allocation score on messaging-2: -INFINITY -+native_color: messaging-0 allocation score on controller-0: 0 -+native_color: messaging-0 allocation score on controller-1: 0 -+native_color: messaging-0 allocation score on controller-2: INFINITY -+native_color: messaging-0 allocation score on database-0: -INFINITY -+native_color: messaging-0 allocation score on database-1: -INFINITY -+native_color: messaging-0 allocation score on database-2: -INFINITY -+native_color: messaging-0 allocation score on messaging-0: -INFINITY -+native_color: messaging-0 allocation score on messaging-1: -INFINITY -+native_color: messaging-0 allocation score on messaging-2: -INFINITY -+native_color: messaging-1 allocation score on controller-0: 0 -+native_color: messaging-1 allocation score on controller-1: 0 -+native_color: messaging-1 allocation score on controller-2: INFINITY -+native_color: messaging-1 allocation score on database-0: -INFINITY -+native_color: messaging-1 allocation score on database-1: -INFINITY -+native_color: messaging-1 allocation score on database-2: -INFINITY -+native_color: messaging-1 allocation score on messaging-0: -INFINITY -+native_color: messaging-1 allocation score on messaging-1: -INFINITY -+native_color: messaging-1 allocation score on messaging-2: -INFINITY -+native_color: messaging-2 allocation score on controller-0: 0 -+native_color: messaging-2 allocation score on controller-1: 0 -+native_color: messaging-2 allocation score on controller-2: INFINITY -+native_color: messaging-2 allocation score on database-0: -INFINITY -+native_color: messaging-2 allocation score on database-1: -INFINITY -+native_color: messaging-2 allocation score on database-2: -INFINITY -+native_color: messaging-2 allocation score on messaging-0: -INFINITY -+native_color: messaging-2 allocation score on messaging-1: -INFINITY -+native_color: messaging-2 allocation score on messaging-2: -INFINITY -+native_color: openstack-cinder-volume allocation score on controller-0: 0 -+native_color: openstack-cinder-volume allocation score on controller-1: 0 -+native_color: openstack-cinder-volume allocation score on controller-2: 0 -+native_color: openstack-cinder-volume allocation score on database-0: -INFINITY -+native_color: openstack-cinder-volume allocation score on database-1: -INFINITY -+native_color: openstack-cinder-volume allocation score on database-2: -INFINITY -+native_color: openstack-cinder-volume allocation score on messaging-0: -INFINITY -+native_color: openstack-cinder-volume allocation score on messaging-1: -INFINITY -+native_color: openstack-cinder-volume allocation score on messaging-2: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on controller-2: INFINITY -+native_color: rabbitmq-bundle-0 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on messaging-0: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on messaging-1: -INFINITY -+native_color: rabbitmq-bundle-0 allocation score on messaging-2: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on controller-2: INFINITY -+native_color: rabbitmq-bundle-1 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on messaging-0: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on messaging-1: -INFINITY -+native_color: rabbitmq-bundle-1 allocation score on messaging-2: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on controller-2: INFINITY -+native_color: rabbitmq-bundle-2 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on messaging-0: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on messaging-1: -INFINITY -+native_color: rabbitmq-bundle-2 allocation score on messaging-2: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on controller-2: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on messaging-0: INFINITY -+native_color: rabbitmq-bundle-docker-0 allocation score on messaging-1: -10000 -+native_color: rabbitmq-bundle-docker-0 allocation score on messaging-2: -10000 -+native_color: rabbitmq-bundle-docker-1 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on controller-2: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on messaging-0: -INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on messaging-1: INFINITY -+native_color: rabbitmq-bundle-docker-1 allocation score on messaging-2: -10000 -+native_color: rabbitmq-bundle-docker-2 allocation score on controller-0: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on controller-1: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on controller-2: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on database-0: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on database-1: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on database-2: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on messaging-0: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on messaging-1: -INFINITY -+native_color: rabbitmq-bundle-docker-2 allocation score on messaging-2: INFINITY -+native_color: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY -+native_color: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY -+native_color: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY -+native_color: redis-bundle-0 allocation score on controller-0: INFINITY -+native_color: redis-bundle-0 allocation score on controller-1: 0 -+native_color: redis-bundle-0 allocation score on controller-2: 0 -+native_color: redis-bundle-0 allocation score on database-0: -INFINITY -+native_color: redis-bundle-0 allocation score on database-1: -INFINITY -+native_color: redis-bundle-0 allocation score on database-2: -INFINITY -+native_color: redis-bundle-0 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-0 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-0 allocation score on messaging-2: -INFINITY -+native_color: redis-bundle-1 allocation score on controller-0: 0 -+native_color: redis-bundle-1 allocation score on controller-1: 10000 -+native_color: redis-bundle-1 allocation score on controller-2: 0 -+native_color: redis-bundle-1 allocation score on database-0: -INFINITY -+native_color: redis-bundle-1 allocation score on database-1: -INFINITY -+native_color: redis-bundle-1 allocation score on database-2: -INFINITY -+native_color: redis-bundle-1 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-1 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-1 allocation score on messaging-2: -INFINITY -+native_color: redis-bundle-2 allocation score on controller-0: 0 -+native_color: redis-bundle-2 allocation score on controller-1: 0 -+native_color: redis-bundle-2 allocation score on controller-2: INFINITY -+native_color: redis-bundle-2 allocation score on database-0: -INFINITY -+native_color: redis-bundle-2 allocation score on database-1: -INFINITY -+native_color: redis-bundle-2 allocation score on database-2: -INFINITY -+native_color: redis-bundle-2 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-2 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-2 allocation score on messaging-2: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on controller-0: INFINITY -+native_color: redis-bundle-docker-0 allocation score on controller-1: 0 -+native_color: redis-bundle-docker-0 allocation score on controller-2: 0 -+native_color: redis-bundle-docker-0 allocation score on database-0: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on database-1: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on database-2: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-docker-0 allocation score on messaging-2: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on controller-0: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on controller-1: 0 -+native_color: redis-bundle-docker-1 allocation score on controller-2: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on database-0: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on database-1: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on database-2: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-docker-1 allocation score on messaging-2: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on controller-0: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on controller-1: 0 -+native_color: redis-bundle-docker-2 allocation score on controller-2: INFINITY -+native_color: redis-bundle-docker-2 allocation score on database-0: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on database-1: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on database-2: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on messaging-0: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on messaging-1: -INFINITY -+native_color: redis-bundle-docker-2 allocation score on messaging-2: -INFINITY -+native_color: redis:0 allocation score on redis-bundle-0: INFINITY -+native_color: redis:1 allocation score on redis-bundle-1: INFINITY -+native_color: redis:2 allocation score on redis-bundle-2: INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on controller-2: INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400244e09 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on controller-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on controller-2: 0 -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400498d34 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on controller-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400542c06 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on controller-2: 0 -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-5254005ea387 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on controller-2: INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400a25787 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on controller-0: INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on controller-2: 0 -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400a7f9e0 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on controller-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on controller-2: INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400aac413 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on controller-2: 0 -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400c709f7 allocation score on messaging-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on controller-0: 0 -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on controller-1: 0 -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on controller-2: INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on database-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on database-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on database-2: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on messaging-0: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on messaging-1: -INFINITY -+native_color: stonith-fence_ipmilan-525400cdec10 allocation score on messaging-2: -INFINITY -+redis:0 promotion score on redis-bundle-0: 1 -+redis:1 promotion score on redis-bundle-1: -1 -+redis:2 promotion score on redis-bundle-2: 1 -diff --git a/pengine/test10/bundle-order-stop-on-remote.summary b/pengine/test10/bundle-order-stop-on-remote.summary -new file mode 100644 -index 0000000..8a04599 ---- /dev/null -+++ b/pengine/test10/bundle-order-stop-on-remote.summary -@@ -0,0 +1,224 @@ -+ -+Current cluster status: -+RemoteNode database-0: UNCLEAN (offline) -+RemoteNode database-2: UNCLEAN (offline) -+Online: [ controller-0 controller-1 controller-2 ] -+RemoteOnline: [ database-1 messaging-0 messaging-1 messaging-2 ] -+Containers: [ galera-bundle-1:galera-bundle-docker-1 rabbitmq-bundle-0:rabbitmq-bundle-docker-0 rabbitmq-bundle-1:rabbitmq-bundle-docker-1 rabbitmq-bundle-2:rabbitmq-bundle-docker-2 redis-bundle-0:redis-bundle-docker-0 redis-bundle-2:redis-bundle-docker-2 ] -+ -+ database-0 (ocf::pacemaker:remote): Stopped -+ database-1 (ocf::pacemaker:remote): Started controller-2 -+ database-2 (ocf::pacemaker:remote): Stopped -+ messaging-0 (ocf::pacemaker:remote): Started controller-2 -+ messaging-1 (ocf::pacemaker:remote): Started controller-2 -+ messaging-2 (ocf::pacemaker:remote): Started controller-2 -+ Docker container set: rabbitmq-bundle [192.168.24.1:8787/rhosp12/openstack-rabbitmq-docker:pcmklatest] -+ rabbitmq-bundle-0 (ocf::heartbeat:rabbitmq-cluster): Started messaging-0 -+ rabbitmq-bundle-1 (ocf::heartbeat:rabbitmq-cluster): Started messaging-1 -+ rabbitmq-bundle-2 (ocf::heartbeat:rabbitmq-cluster): Started messaging-2 -+ Docker container set: galera-bundle [192.168.24.1:8787/rhosp12/openstack-mariadb-docker:pcmklatest] -+ galera-bundle-0 (ocf::heartbeat:galera): FAILED Master database-0 (UNCLEAN) -+ galera-bundle-1 (ocf::heartbeat:galera): Master database-1 -+ galera-bundle-2 (ocf::heartbeat:galera): FAILED Master database-2 (UNCLEAN) -+ Docker container set: redis-bundle [192.168.24.1:8787/rhosp12/openstack-redis-docker:pcmklatest] -+ redis-bundle-0 (ocf::heartbeat:redis): Slave controller-0 -+ redis-bundle-1 (ocf::heartbeat:redis): Stopped -+ redis-bundle-2 (ocf::heartbeat:redis): Slave controller-2 -+ ip-192.168.24.11 (ocf::heartbeat:IPaddr2): Stopped -+ ip-10.0.0.104 (ocf::heartbeat:IPaddr2): Stopped -+ ip-172.17.1.19 (ocf::heartbeat:IPaddr2): Started controller-2 -+ ip-172.17.1.11 (ocf::heartbeat:IPaddr2): Stopped -+ ip-172.17.3.13 (ocf::heartbeat:IPaddr2): Stopped -+ ip-172.17.4.19 (ocf::heartbeat:IPaddr2): Started controller-2 -+ Docker container set: haproxy-bundle [192.168.24.1:8787/rhosp12/openstack-haproxy-docker:pcmklatest] -+ haproxy-bundle-docker-0 (ocf::heartbeat:docker): Started controller-0 -+ haproxy-bundle-docker-1 (ocf::heartbeat:docker): Stopped -+ haproxy-bundle-docker-2 (ocf::heartbeat:docker): Started controller-2 -+ openstack-cinder-volume (systemd:openstack-cinder-volume): Stopped -+ stonith-fence_ipmilan-525400244e09 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400cdec10 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400c709f7 (stonith:fence_ipmilan): Stopped -+ stonith-fence_ipmilan-525400a7f9e0 (stonith:fence_ipmilan): Started controller-0 -+ stonith-fence_ipmilan-525400a25787 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-5254005ea387 (stonith:fence_ipmilan): Stopped -+ stonith-fence_ipmilan-525400542c06 (stonith:fence_ipmilan): Stopped -+ stonith-fence_ipmilan-525400aac413 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400498d34 (stonith:fence_ipmilan): Stopped -+ -+Transition Summary: -+ * Fence (reboot) galera-bundle-2 (resource: galera-bundle-docker-2) 'guest is unclean' -+ * Fence (reboot) galera-bundle-0 (resource: galera-bundle-docker-0) 'guest is unclean' -+ * Start database-0 ( controller-0 ) -+ * Start database-2 ( controller-1 ) -+ * Recover galera-bundle-docker-0 ( database-0 ) -+ * Start galera-bundle-0 ( controller-0 ) -+ * Recover galera:0 ( Master galera-bundle-0 ) -+ * Recover galera-bundle-docker-2 ( database-2 ) -+ * Start galera-bundle-2 ( controller-1 ) -+ * Recover galera:2 ( Master galera-bundle-2 ) -+ * Promote redis:0 ( Slave -> Master redis-bundle-0 ) -+ * Start redis-bundle-docker-1 ( controller-1 ) -+ * Start redis-bundle-1 ( controller-1 ) -+ * Start redis:1 ( redis-bundle-1 ) -+ * Start ip-192.168.24.11 ( controller-0 ) -+ * Start ip-10.0.0.104 ( controller-1 ) -+ * Start ip-172.17.1.11 ( controller-0 ) -+ * Start ip-172.17.3.13 ( controller-1 ) -+ * Start haproxy-bundle-docker-1 ( controller-1 ) -+ * Start openstack-cinder-volume ( controller-0 ) -+ * Start stonith-fence_ipmilan-525400c709f7 ( controller-1 ) -+ * Start stonith-fence_ipmilan-5254005ea387 ( controller-1 ) -+ * Start stonith-fence_ipmilan-525400542c06 ( controller-0 ) -+ * Start stonith-fence_ipmilan-525400498d34 ( controller-1 ) -+ -+Executing cluster transition: -+ * Resource action: database-0 start on controller-0 -+ * Resource action: database-2 start on controller-1 -+ * Pseudo action: redis-bundle-master_pre_notify_start_0 -+ * Resource action: stonith-fence_ipmilan-525400c709f7 start on controller-1 -+ * Resource action: stonith-fence_ipmilan-5254005ea387 start on controller-1 -+ * Resource action: stonith-fence_ipmilan-525400542c06 start on controller-0 -+ * Resource action: stonith-fence_ipmilan-525400498d34 start on controller-1 -+ * Pseudo action: redis-bundle_start_0 -+ * Pseudo action: galera-bundle_demote_0 -+ * Resource action: database-0 monitor=20000 on controller-0 -+ * Resource action: database-2 monitor=20000 on controller-1 -+ * Pseudo action: galera-bundle-master_demote_0 -+ * Resource action: redis notify on redis-bundle-0 -+ * Resource action: redis notify on redis-bundle-2 -+ * Pseudo action: redis-bundle-master_confirmed-pre_notify_start_0 -+ * Pseudo action: redis-bundle-master_start_0 -+ * Resource action: stonith-fence_ipmilan-525400c709f7 monitor=60000 on controller-1 -+ * Resource action: stonith-fence_ipmilan-5254005ea387 monitor=60000 on controller-1 -+ * Resource action: stonith-fence_ipmilan-525400542c06 monitor=60000 on controller-0 -+ * Resource action: stonith-fence_ipmilan-525400498d34 monitor=60000 on controller-1 -+ * Pseudo action: galera_demote_0 -+ * Pseudo action: galera_demote_0 -+ * Pseudo action: galera-bundle-master_demoted_0 -+ * Pseudo action: galera-bundle_demoted_0 -+ * Pseudo action: galera-bundle_stop_0 -+ * Resource action: galera-bundle-docker-0 stop on database-0 -+ * Resource action: galera-bundle-docker-2 stop on database-2 -+ * Pseudo action: stonith-galera-bundle-2-reboot on galera-bundle-2 -+ * Pseudo action: stonith-galera-bundle-0-reboot on galera-bundle-0 -+ * Pseudo action: stonith_complete -+ * Pseudo action: galera-bundle-master_stop_0 -+ * Resource action: redis-bundle-docker-1 start on controller-1 -+ * Resource action: redis-bundle-1 monitor on controller-1 -+ * Resource action: ip-192.168.24.11 start on controller-0 -+ * Resource action: ip-10.0.0.104 start on controller-1 -+ * Resource action: ip-172.17.1.11 start on controller-0 -+ * Resource action: ip-172.17.3.13 start on controller-1 -+ * Resource action: openstack-cinder-volume start on controller-0 -+ * Pseudo action: haproxy-bundle_start_0 -+ * Pseudo action: galera_stop_0 -+ * Resource action: redis-bundle-docker-1 monitor=60000 on controller-1 -+ * Resource action: redis-bundle-1 start on controller-1 -+ * Resource action: ip-192.168.24.11 monitor=10000 on controller-0 -+ * Resource action: ip-10.0.0.104 monitor=10000 on controller-1 -+ * Resource action: ip-172.17.1.11 monitor=10000 on controller-0 -+ * Resource action: ip-172.17.3.13 monitor=10000 on controller-1 -+ * Resource action: haproxy-bundle-docker-1 start on controller-1 -+ * Resource action: openstack-cinder-volume monitor=60000 on controller-0 -+ * Pseudo action: haproxy-bundle_running_0 -+ * Pseudo action: galera_stop_0 -+ * Pseudo action: galera-bundle-master_stopped_0 -+ * Resource action: redis start on redis-bundle-1 -+ * Pseudo action: redis-bundle-master_running_0 -+ * Resource action: redis-bundle-1 monitor=60000 on controller-1 -+ * Resource action: haproxy-bundle-docker-1 monitor=60000 on controller-1 -+ * Pseudo action: galera-bundle_stopped_0 -+ * Pseudo action: galera-bundle_start_0 -+ * Pseudo action: all_stopped -+ * Pseudo action: galera-bundle-master_start_0 -+ * Resource action: galera-bundle-docker-0 start on database-0 -+ * Resource action: galera-bundle-0 monitor on controller-1 -+ * Resource action: galera-bundle-docker-2 start on database-2 -+ * Resource action: galera-bundle-2 monitor on controller-1 -+ * Pseudo action: redis-bundle-master_post_notify_running_0 -+ * Resource action: galera-bundle-docker-0 monitor=60000 on database-0 -+ * Resource action: galera-bundle-0 start on controller-0 -+ * Resource action: galera-bundle-docker-2 monitor=60000 on database-2 -+ * Resource action: galera-bundle-2 start on controller-1 -+ * Resource action: redis notify on redis-bundle-0 -+ * Resource action: redis notify on redis-bundle-1 -+ * Resource action: redis notify on redis-bundle-2 -+ * Pseudo action: redis-bundle-master_confirmed-post_notify_running_0 -+ * Pseudo action: redis-bundle_running_0 -+ * Resource action: galera start on galera-bundle-0 -+ * Resource action: galera start on galera-bundle-2 -+ * Pseudo action: galera-bundle-master_running_0 -+ * Resource action: galera-bundle-0 monitor=60000 on controller-0 -+ * Resource action: galera-bundle-2 monitor=60000 on controller-1 -+ * Pseudo action: redis-bundle-master_pre_notify_promote_0 -+ * Pseudo action: redis-bundle_promote_0 -+ * Pseudo action: galera-bundle_running_0 -+ * Resource action: redis notify on redis-bundle-0 -+ * Resource action: redis notify on redis-bundle-1 -+ * Resource action: redis notify on redis-bundle-2 -+ * Pseudo action: redis-bundle-master_confirmed-pre_notify_promote_0 -+ * Pseudo action: redis-bundle-master_promote_0 -+ * Pseudo action: galera-bundle_promote_0 -+ * Pseudo action: galera-bundle-master_promote_0 -+ * Resource action: redis promote on redis-bundle-0 -+ * Pseudo action: redis-bundle-master_promoted_0 -+ * Resource action: galera promote on galera-bundle-0 -+ * Resource action: galera promote on galera-bundle-2 -+ * Pseudo action: galera-bundle-master_promoted_0 -+ * Pseudo action: redis-bundle-master_post_notify_promoted_0 -+ * Pseudo action: galera-bundle_promoted_0 -+ * Resource action: galera monitor=10000 on galera-bundle-0 -+ * Resource action: galera monitor=10000 on galera-bundle-2 -+ * Resource action: redis notify on redis-bundle-0 -+ * Resource action: redis notify on redis-bundle-1 -+ * Resource action: redis notify on redis-bundle-2 -+ * Pseudo action: redis-bundle-master_confirmed-post_notify_promoted_0 -+ * Pseudo action: redis-bundle_promoted_0 -+ * Resource action: redis monitor=20000 on redis-bundle-0 -+ * Resource action: redis monitor=60000 on redis-bundle-1 -+ * Resource action: redis monitor=45000 on redis-bundle-1 -+ -+Revised cluster status: -+Online: [ controller-0 controller-1 controller-2 ] -+RemoteOnline: [ database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] -+Containers: [ galera-bundle-0:galera-bundle-docker-0 galera-bundle-1:galera-bundle-docker-1 galera-bundle-2:galera-bundle-docker-2 rabbitmq-bundle-0:rabbitmq-bundle-docker-0 rabbitmq-bundle-1:rabbitmq-bundle-docker-1 rabbitmq-bundle-2:rabbitmq-bundle-docker-2 redis-bundle-0:redis-bundle-docker-0 redis-bundle-1:redis-bundle-docker-1 redis-bundle-2:redis-bundle-docker-2 ] -+ -+ database-0 (ocf::pacemaker:remote): Started controller-0 -+ database-1 (ocf::pacemaker:remote): Started controller-2 -+ database-2 (ocf::pacemaker:remote): Started controller-1 -+ messaging-0 (ocf::pacemaker:remote): Started controller-2 -+ messaging-1 (ocf::pacemaker:remote): Started controller-2 -+ messaging-2 (ocf::pacemaker:remote): Started controller-2 -+ Docker container set: rabbitmq-bundle [192.168.24.1:8787/rhosp12/openstack-rabbitmq-docker:pcmklatest] -+ rabbitmq-bundle-0 (ocf::heartbeat:rabbitmq-cluster): Started messaging-0 -+ rabbitmq-bundle-1 (ocf::heartbeat:rabbitmq-cluster): Started messaging-1 -+ rabbitmq-bundle-2 (ocf::heartbeat:rabbitmq-cluster): Started messaging-2 -+ Docker container set: galera-bundle [192.168.24.1:8787/rhosp12/openstack-mariadb-docker:pcmklatest] -+ galera-bundle-0 (ocf::heartbeat:galera): Master database-0 -+ galera-bundle-1 (ocf::heartbeat:galera): Master database-1 -+ galera-bundle-2 (ocf::heartbeat:galera): Master database-2 -+ Docker container set: redis-bundle [192.168.24.1:8787/rhosp12/openstack-redis-docker:pcmklatest] -+ redis-bundle-0 (ocf::heartbeat:redis): Master controller-0 -+ redis-bundle-1 (ocf::heartbeat:redis): Slave controller-1 -+ redis-bundle-2 (ocf::heartbeat:redis): Slave controller-2 -+ ip-192.168.24.11 (ocf::heartbeat:IPaddr2): Started controller-0 -+ ip-10.0.0.104 (ocf::heartbeat:IPaddr2): Started controller-1 -+ ip-172.17.1.19 (ocf::heartbeat:IPaddr2): Started controller-2 -+ ip-172.17.1.11 (ocf::heartbeat:IPaddr2): Started controller-0 -+ ip-172.17.3.13 (ocf::heartbeat:IPaddr2): Started controller-1 -+ ip-172.17.4.19 (ocf::heartbeat:IPaddr2): Started controller-2 -+ Docker container set: haproxy-bundle [192.168.24.1:8787/rhosp12/openstack-haproxy-docker:pcmklatest] -+ haproxy-bundle-docker-0 (ocf::heartbeat:docker): Started controller-0 -+ haproxy-bundle-docker-1 (ocf::heartbeat:docker): Started controller-1 -+ haproxy-bundle-docker-2 (ocf::heartbeat:docker): Started controller-2 -+ openstack-cinder-volume (systemd:openstack-cinder-volume): Started controller-0 -+ stonith-fence_ipmilan-525400244e09 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400cdec10 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400c709f7 (stonith:fence_ipmilan): Started controller-1 -+ stonith-fence_ipmilan-525400a7f9e0 (stonith:fence_ipmilan): Started controller-0 -+ stonith-fence_ipmilan-525400a25787 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-5254005ea387 (stonith:fence_ipmilan): Started controller-1 -+ stonith-fence_ipmilan-525400542c06 (stonith:fence_ipmilan): Started controller-0 -+ stonith-fence_ipmilan-525400aac413 (stonith:fence_ipmilan): Started controller-2 -+ stonith-fence_ipmilan-525400498d34 (stonith:fence_ipmilan): Started controller-1 -+ -diff --git a/pengine/test10/bundle-order-stop-on-remote.xml b/pengine/test10/bundle-order-stop-on-remote.xml -new file mode 100644 -index 0000000..d3b87c8 ---- /dev/null -+++ b/pengine/test10/bundle-order-stop-on-remote.xml -@@ -0,0 +1,1165 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ --- -1.8.3.1 - - -From 47a5f6f5cd1fba2c6bac140329e563abd34b2ef4 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 8 Dec 2017 16:54:07 -0600 -Subject: [PATCH 13/16] Low: PE: correct mispelled constant - -original intention of 2b1aae07 ---- - pengine/allocate.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 1c95e97..481a0ec 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1870,7 +1870,7 @@ apply_container_ordering(action_t *action, pe_working_set_t *data_set) - container->id); - - if (safe_str_eq(action->task, CRMD_ACTION_MIGRATE) -- || safe_str_eq(action->task, CRMD_ACTION_MIGRATE)) { -+ || safe_str_eq(action->task, CRMD_ACTION_MIGRATED)) { - /* Migration ops map to "no_action", but we need to apply the same - * ordering as for stop or demote (see get_router_node()). - */ -@@ -2036,7 +2036,7 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - remote_rsc->id, state2text(state)); - - if (safe_str_eq(action->task, CRMD_ACTION_MIGRATE) -- || safe_str_eq(action->task, CRMD_ACTION_MIGRATE)) { -+ || safe_str_eq(action->task, CRMD_ACTION_MIGRATED)) { - /* Migration ops map to "no_action", but we need to apply the same - * ordering as for stop or demote (see get_router_node()). - */ --- -1.8.3.1 - - -From 55c9b5ef9c6f531ea808926abaaea5c7c8890dad Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 8 Dec 2017 17:31:23 -0600 -Subject: [PATCH 14/16] Doc: PE: update remote stop ordering comments for - recent changes - ---- - pengine/allocate.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 481a0ec..7ae4e02 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -2058,9 +2058,6 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - break; - - case stop_rsc: -- /* Handle special case with remote node where stop actions need to be -- * ordered after the connection resource starts somewhere else. -- */ - if(state == remote_state_alive) { - order_action_then_stop(action, remote_rsc, - pe_order_implies_first, data_set); -@@ -2076,14 +2073,18 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - pe_order_implies_first, data_set); - - } else if(remote_rsc->next_role == RSC_ROLE_STOPPED) { -- /* If its not coming back up, better do what we need first */ -+ /* State must be remote_state_unknown or remote_state_stopped. -+ * Since the connection is not coming back up in this -+ * transition, stop this resource first. -+ */ - order_action_then_stop(action, remote_rsc, - pe_order_implies_first, data_set); - - } else { -- /* Wait for the connection resource to be up and assume everything is as we left it */ -+ /* The connection is going to be started somewhere else, so -+ * stop this resource after that completes. -+ */ - order_start_then_action(remote_rsc, action, pe_order_none, data_set); -- - } - break; - --- -1.8.3.1 - - -From 39441fa1dfe625cf00af463269052d4c2dafaa16 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 8 Dec 2017 17:16:55 -0600 -Subject: [PATCH 15/16] Low: libpe_status: limit resource type check to - primitives - ---- - lib/pengine/complex.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index d58d6be..86f290c 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -784,7 +784,9 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, - if(is_set((*rsc)->flags, pe_rsc_fence_device)) { - value = "quorum"; - -- } else if (safe_str_eq(crm_element_value((*rsc)->xml, XML_AGENT_ATTR_CLASS), "ocf") -+ } else if (((*rsc)->variant == pe_native) -+ && safe_str_eq(crm_element_value((*rsc)->xml, XML_AGENT_ATTR_CLASS), -+ PCMK_RESOURCE_CLASS_OCF) - && safe_str_eq(crm_element_value((*rsc)->xml, XML_AGENT_ATTR_PROVIDER), "pacemaker") - && safe_str_eq(crm_element_value((*rsc)->xml, XML_ATTR_TYPE), "remote") - ) { --- -1.8.3.1 - - -From 68438917c3b1ed305af6da2acd23454cd777e1d1 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 8 Dec 2017 18:00:12 -0600 -Subject: [PATCH 16/16] Fix: lrmd: always use most recent remote proxy - -Any working proxy is sufficient, but the newest connection is the most likely -to be working. We want to avoid using an old proxy that has failed but whose -TCP connection has not yet timed out. ---- - lrmd/ipc_proxy.c | 41 +++++++++++++---------------------------- - 1 file changed, 13 insertions(+), 28 deletions(-) - -diff --git a/lrmd/ipc_proxy.c b/lrmd/ipc_proxy.c -index 5d6ab34..4d1ee01 100644 ---- a/lrmd/ipc_proxy.c -+++ b/lrmd/ipc_proxy.c -@@ -42,7 +42,7 @@ static qb_ipcs_service_t *crmd_ipcs = NULL; - static qb_ipcs_service_t *stonith_ipcs = NULL; - - /* ipc providers == crmd clients connecting from cluster nodes */ --static GHashTable *ipc_providers = NULL; -+static GList *ipc_providers = NULL; - /* ipc clients == things like cibadmin, crm_resource, connecting locally */ - static GHashTable *ipc_clients = NULL; - -@@ -52,24 +52,14 @@ static GHashTable *ipc_clients = NULL; - * - * \return Pointer to a provider if one exists, NULL otherwise - * -- * \note Grab the first provider available; any provider will work, and usually -- * there will be only one. These are client connections originating from a -- * cluster node's crmd. -+ * \note Grab the first provider, which is the most recent connection. That way, -+ * if we haven't yet timed out an old, failed connection, we don't try to -+ * use it. - */ - crm_client_t * - ipc_proxy_get_provider() - { -- if (ipc_providers) { -- GHashTableIter iter; -- gpointer key = NULL; -- gpointer value = NULL; -- -- g_hash_table_iter_init(&iter, ipc_providers); -- if (g_hash_table_iter_next(&iter, &key, &value)) { -- return (crm_client_t*)value; -- } -- } -- return NULL; -+ return ipc_providers? (crm_client_t*) (ipc_providers->data) : NULL; - } - - static int32_t -@@ -378,10 +368,8 @@ static struct qb_ipcs_service_handlers cib_proxy_callbacks_rw = { - void - ipc_proxy_add_provider(crm_client_t *ipc_proxy) - { -- if (ipc_providers == NULL) { -- return; -- } -- g_hash_table_insert(ipc_providers, ipc_proxy->id, ipc_proxy); -+ // Prepending ensures the most recent connection is always first -+ ipc_providers = g_list_prepend(ipc_providers, ipc_proxy); - } - - void -@@ -393,11 +381,7 @@ ipc_proxy_remove_provider(crm_client_t *ipc_proxy) - GList *remove_these = NULL; - GListPtr gIter = NULL; - -- if (ipc_providers == NULL) { -- return; -- } -- -- g_hash_table_remove(ipc_providers, ipc_proxy->id); -+ ipc_providers = g_list_remove(ipc_providers, ipc_proxy); - - g_hash_table_iter_init(&iter, ipc_clients); - while (g_hash_table_iter_next(&iter, (gpointer *) & key, (gpointer *) & ipc_client)) { -@@ -413,6 +397,8 @@ ipc_proxy_remove_provider(crm_client_t *ipc_proxy) - - for (gIter = remove_these; gIter != NULL; gIter = gIter->next) { - ipc_client = gIter->data; -+ -+ // Disconnection callback will free the client here - qb_ipcs_disconnect(ipc_client->ipcs); - } - -@@ -424,7 +410,6 @@ void - ipc_proxy_init(void) - { - ipc_clients = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, NULL); -- ipc_providers = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, NULL); - - cib_ipc_servers_init(&cib_ro, - &cib_rw, -@@ -446,10 +431,12 @@ void - ipc_proxy_cleanup(void) - { - if (ipc_providers) { -- g_hash_table_destroy(ipc_providers); -+ g_list_free(ipc_providers); -+ ipc_providers = NULL; - } - if (ipc_clients) { - g_hash_table_destroy(ipc_clients); -+ ipc_clients = NULL; - } - cib_ipc_servers_destroy(cib_ro, cib_rw, cib_shm); - qb_ipcs_destroy(attrd_ipcs); -@@ -458,6 +445,4 @@ ipc_proxy_cleanup(void) - cib_ro = NULL; - cib_rw = NULL; - cib_shm = NULL; -- ipc_providers = NULL; -- ipc_clients = NULL; - } --- -1.8.3.1 - diff --git a/SOURCES/002-ppc64le.patch b/SOURCES/002-ppc64le.patch new file mode 100644 index 0000000..bb28909 --- /dev/null +++ b/SOURCES/002-ppc64le.patch @@ -0,0 +1,54 @@ +From 46201f029e4a5ac3ba0aaf05cb6df80341729566 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Mon, 30 Jul 2018 14:17:49 -0500 +Subject: [PATCH] Doc: tools: add --help/--version options to ipmiservicelogd + +allows ppc64le build when relevant dependencies are installed +--- + tools/ipmiservicelogd.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/tools/ipmiservicelogd.c b/tools/ipmiservicelogd.c +index 4f52865..865eae0 100644 +--- a/tools/ipmiservicelogd.c ++++ b/tools/ipmiservicelogd.c +@@ -253,7 +253,7 @@ getProductName(void) + static void + con_usage(const char *name, const char *help, void *cb_data) + { +- printf("\n%s%s", name, help); ++ printf("%s\n", help); + } + + static void +@@ -261,7 +261,7 @@ usage(const char *progname) + { + printf("Usage:\n"); + printf(" %s \n", progname); +- printf(" Where is one of:"); ++ printf(" Where is one of:\n"); + ipmi_parse_args_iter_help(con_usage, NULL); + } + +@@ -550,6 +550,18 @@ main(int argc, char *argv[]) + /* Initialize the OpenIPMI library. */ + ipmi_init(os_hnd); + ++ // Check for pacemaker-standard help and version options ++ if (argc > 1) { ++ for (char **arg = &argv[1]; *arg != NULL; ++arg) { ++ if (!strcmp(*arg, "--help") || !strcmp(*arg, "-?")) { ++ usage(argv[0]); ++ return 0; ++ } else if (!strcmp(*arg, "--version") || !strcmp(*arg, "-$")) { ++ crm_help('$', 0); ++ } ++ } ++ } ++ + #ifdef COMPLEX + rv = ipmi_parse_args2(&curr_arg, argc, argv, &args); + if (rv) { +-- +1.8.3.1 + diff --git a/SOURCES/003-cleanup.patch b/SOURCES/003-cleanup.patch deleted file mode 100644 index 6ce9476..0000000 --- a/SOURCES/003-cleanup.patch +++ /dev/null @@ -1,157 +0,0 @@ -From c2d5c19a863f407a034a63f2877eb5faf7036d59 Mon Sep 17 00:00:00 2001 -From: "Gao,Yan" -Date: Fri, 8 Dec 2017 14:47:40 +0100 -Subject: [PATCH 1/2] Refactor: tools: crm_resource - Functionize cleaning up - resource failures - ---- - tools/crm_resource.c | 26 ++------------------------ - tools/crm_resource.h | 3 +++ - tools/crm_resource_runtime.c | 36 ++++++++++++++++++++++++++++++++++++ - 3 files changed, 41 insertions(+), 24 deletions(-) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index f93f688..4ddcef4 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -1094,31 +1094,9 @@ main(int argc, char **argv) - - } else if (rsc_cmd == 'C' && just_errors) { - crmd_replies_needed = 0; -- for (xmlNode *xml_op = __xml_first_child(data_set.failed); xml_op != NULL; -- xml_op = __xml_next(xml_op)) { -- -- const char *node = crm_element_value(xml_op, XML_ATTR_UNAME); -- const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); -- const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); -- const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); -- -- if(resource_name == NULL) { -- continue; -- } else if(host_uname && safe_str_neq(host_uname, node)) { -- continue; -- } else if(rsc_id && safe_str_neq(rsc_id, resource_name)) { -- continue; -- } else if(operation && safe_str_neq(operation, task)) { -- continue; -- } else if(interval && safe_str_neq(interval, task_interval)) { -- continue; -- } - -- crm_debug("Erasing %s failure for %s (%s detected) on %s", -- task, rsc->id, resource_name, node); -- rc = cli_resource_delete(crmd_channel, node, rsc, task, -- task_interval, &data_set); -- } -+ rc = cli_resource_delete_failures(crmd_channel, host_uname, rsc, operation, -+ interval, &data_set); - - if(rsc && (rc == pcmk_ok) && (BE_QUIET == FALSE)) { - /* Now check XML_RSC_ATTR_TARGET_ROLE and XML_RSC_ATTR_MANAGED */ -diff --git a/tools/crm_resource.h b/tools/crm_resource.h -index 0b8dd2a..e28c9ef 100644 ---- a/tools/crm_resource.h -+++ b/tools/crm_resource.h -@@ -76,6 +76,9 @@ int cli_resource_search(resource_t *rsc, const char *requested_name, - int cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, - resource_t *rsc, const char *operation, - const char *interval, pe_working_set_t *data_set); -+int cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, -+ resource_t *rsc, const char *operation, -+ const char *interval, pe_working_set_t *data_set); - int cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib); - int cli_resource_move(resource_t *rsc, const char *rsc_id, - const char *host_name, cib_t *cib, -diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index ffe4e5d..d250a07 100644 ---- a/tools/crm_resource_runtime.c -+++ b/tools/crm_resource_runtime.c -@@ -655,6 +655,42 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, - return rc; - } - -+int -+cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, -+ resource_t *rsc, const char *operation, -+ const char *interval, pe_working_set_t *data_set) -+{ -+ int rc = pcmk_ok; -+ -+ for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; -+ xml_op = __xml_next(xml_op)) { -+ -+ const char *node = crm_element_value(xml_op, XML_ATTR_UNAME); -+ const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); -+ const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); -+ const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); -+ -+ if(resource_name == NULL) { -+ continue; -+ } else if(host_uname && safe_str_neq(host_uname, node)) { -+ continue; -+ } else if(rsc->id && safe_str_neq(rsc->id, resource_name)) { -+ continue; -+ } else if(operation && safe_str_neq(operation, task)) { -+ continue; -+ } else if(interval && safe_str_neq(interval, task_interval)) { -+ continue; -+ } -+ -+ crm_debug("Erasing %s failure for %s (%s detected) on %s", -+ task, rsc->id, resource_name, node); -+ rc = cli_resource_delete(crmd_channel, node, rsc, task, -+ task_interval, data_set); -+ } -+ -+ return rc; -+} -+ - void - cli_resource_check(cib_t * cib_conn, resource_t *rsc) - { --- -1.8.3.1 - - -From 170ec0afcddb01fcfb8c2e8c86bc0e53594a42f9 Mon Sep 17 00:00:00 2001 -From: "Gao,Yan" -Date: Fri, 8 Dec 2017 16:22:54 +0100 -Subject: [PATCH 2/2] Fix: tools: crm_resource --cleanup for non-primitive - resources - ---- - tools/crm_resource_runtime.c | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index d250a07..1048636 100644 ---- a/tools/crm_resource_runtime.c -+++ b/tools/crm_resource_runtime.c -@@ -662,6 +662,24 @@ cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, - { - int rc = pcmk_ok; - -+ if (rsc == NULL) { -+ return -ENXIO; -+ -+ } else if (rsc->children) { -+ GListPtr lpc = NULL; -+ -+ for (lpc = rsc->children; lpc != NULL; lpc = lpc->next) { -+ resource_t *child = (resource_t *) lpc->data; -+ -+ rc = cli_resource_delete_failures(crmd_channel, host_uname, child, operation, -+ interval, data_set); -+ if(rc != pcmk_ok) { -+ return rc; -+ } -+ } -+ return pcmk_ok; -+ } -+ - for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; - xml_op = __xml_next(xml_op)) { - --- -1.8.3.1 - diff --git a/SOURCES/003-static-analysis.patch b/SOURCES/003-static-analysis.patch new file mode 100644 index 0000000..d0297d6 --- /dev/null +++ b/SOURCES/003-static-analysis.patch @@ -0,0 +1,66 @@ +From 1307b6f238fb7f4cada95f6af02c1a4caae3eb63 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 3 Aug 2018 18:30:47 -0500 +Subject: [PATCH 1/2] Refactor: scheduler: remove unused variable setting + +makes static analysis happy +--- + lib/pengine/container.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/lib/pengine/container.c b/lib/pengine/container.c +index d82948a..1526f37 100644 +--- a/lib/pengine/container.c ++++ b/lib/pengine/container.c +@@ -780,7 +780,6 @@ container_fix_remote_addr(resource_t *rsc) + } + + for (int lpc = 0; lpc < DIMOF(attr_list); lpc++) { +- name = attr_list[lpc]; + value = crm_element_value(rsc->xml, attr_list[lpc]); + if (safe_str_eq(value, value_list[lpc]) == FALSE) { + return FALSE; +-- +1.8.3.1 + + +From 1a95cbae653df8835906314d77e74091f55ab319 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 3 Aug 2018 18:32:08 -0500 +Subject: [PATCH 2/2] Refactor: libcrmcommon: remove dead code + +makes static analysis happy +--- + lib/common/iso8601.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lib/common/iso8601.c b/lib/common/iso8601.c +index c95fa13..b661fce 100644 +--- a/lib/common/iso8601.c ++++ b/lib/common/iso8601.c +@@ -1384,7 +1384,7 @@ crm_time_format_hr(const char *format, crm_time_hr_t * hr_dt) + { + const char *mark_s; + int max = 128, scanned_pos = 0, printed_pos = 0, fmt_pos = 0, +- date_len = 0, nano_digits = 0, fmt_len; ++ date_len = 0, nano_digits = 0; + char nano_s[10], date_s[max+1], nanofmt_s[5] = "%", *tmp_fmt_s; + struct tm tm; + crm_time_t dt; +@@ -1397,11 +1397,11 @@ crm_time_format_hr(const char *format, crm_time_hr_t * hr_dt) + sprintf(nano_s, "%06d000", hr_dt->useconds); + + while ((format[scanned_pos]) != '\0') { +- fmt_len = 0; + mark_s = strchr(&format[scanned_pos], '%'); + if (mark_s) { ++ int fmt_len = 1; ++ + fmt_pos = mark_s - format; +- fmt_len = 1; + while ((format[fmt_pos+fmt_len] != '\0') && + (format[fmt_pos+fmt_len] >= '0') && + (format[fmt_pos+fmt_len] <= '9')) { +-- +1.8.3.1 + diff --git a/SOURCES/004-cleanup.patch b/SOURCES/004-cleanup.patch index 3ec7535..9a5a3bc 100644 --- a/SOURCES/004-cleanup.patch +++ b/SOURCES/004-cleanup.patch @@ -1,7 +1,165 @@ -From 7a813755269f00d7b815e819636841af991762c0 Mon Sep 17 00:00:00 2001 +From 039b778b07f256dd564171430c5427dfb9489a58 Mon Sep 17 00:00:00 2001 +From: "Gao,Yan" +Date: Fri, 8 Dec 2017 14:47:40 +0100 +Subject: [PATCH 1/8] Refactor: tools: crm_resource - Functionize cleaning up + resource failures + +--- + tools/crm_resource.c | 26 ++------------------------ + tools/crm_resource.h | 3 +++ + tools/crm_resource_runtime.c | 36 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 41 insertions(+), 24 deletions(-) + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index 0557892..331adf6 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -1103,31 +1103,9 @@ main(int argc, char **argv) + + } else if (rsc_cmd == 'C' && just_errors) { + crmd_replies_needed = 0; +- for (xmlNode *xml_op = __xml_first_child(data_set.failed); xml_op != NULL; +- xml_op = __xml_next(xml_op)) { +- +- const char *node = crm_element_value(xml_op, XML_ATTR_UNAME); +- const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); +- const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); +- const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); +- +- if(resource_name == NULL) { +- continue; +- } else if(host_uname && safe_str_neq(host_uname, node)) { +- continue; +- } else if(rsc_id && safe_str_neq(rsc_id, resource_name)) { +- continue; +- } else if(operation && safe_str_neq(operation, task)) { +- continue; +- } else if(interval && safe_str_neq(interval, task_interval)) { +- continue; +- } + +- crm_debug("Erasing %s failure for %s (%s detected) on %s", +- task, rsc->id, resource_name, node); +- rc = cli_resource_delete(crmd_channel, node, rsc, task, +- task_interval, &data_set); +- } ++ rc = cli_resource_delete_failures(crmd_channel, host_uname, rsc, operation, ++ interval, &data_set); + + if(rsc && (rc == pcmk_ok) && (BE_QUIET == FALSE)) { + /* Now check XML_RSC_ATTR_TARGET_ROLE and XML_RSC_ATTR_MANAGED */ +diff --git a/tools/crm_resource.h b/tools/crm_resource.h +index 0b8dd2a..e28c9ef 100644 +--- a/tools/crm_resource.h ++++ b/tools/crm_resource.h +@@ -76,6 +76,9 @@ int cli_resource_search(resource_t *rsc, const char *requested_name, + int cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, + resource_t *rsc, const char *operation, + const char *interval, pe_working_set_t *data_set); ++int cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, ++ resource_t *rsc, const char *operation, ++ const char *interval, pe_working_set_t *data_set); + int cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib); + int cli_resource_move(resource_t *rsc, const char *rsc_id, + const char *host_name, cib_t *cib, +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index 5004935..9aa7b7e 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -681,6 +681,42 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, + return rc; + } + ++int ++cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, ++ resource_t *rsc, const char *operation, ++ const char *interval, pe_working_set_t *data_set) ++{ ++ int rc = pcmk_ok; ++ ++ for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; ++ xml_op = __xml_next(xml_op)) { ++ ++ const char *node = crm_element_value(xml_op, XML_ATTR_UNAME); ++ const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); ++ const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); ++ const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); ++ ++ if(resource_name == NULL) { ++ continue; ++ } else if(host_uname && safe_str_neq(host_uname, node)) { ++ continue; ++ } else if(rsc->id && safe_str_neq(rsc->id, resource_name)) { ++ continue; ++ } else if(operation && safe_str_neq(operation, task)) { ++ continue; ++ } else if(interval && safe_str_neq(interval, task_interval)) { ++ continue; ++ } ++ ++ crm_debug("Erasing %s failure for %s (%s detected) on %s", ++ task, rsc->id, resource_name, node); ++ rc = cli_resource_delete(crmd_channel, node, rsc, task, ++ task_interval, data_set); ++ } ++ ++ return rc; ++} ++ + void + cli_resource_check(cib_t * cib_conn, resource_t *rsc) + { +-- +1.8.3.1 + + +From 4ae40b495305b87f59e439de3298910c243c171d Mon Sep 17 00:00:00 2001 +From: "Gao,Yan" +Date: Fri, 8 Dec 2017 16:22:54 +0100 +Subject: [PATCH 2/8] Fix: tools: crm_resource --cleanup for non-primitive + resources + +--- + tools/crm_resource_runtime.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index 9aa7b7e..98cd27f 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -688,6 +688,24 @@ cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname, + { + int rc = pcmk_ok; + ++ if (rsc == NULL) { ++ return -ENXIO; ++ ++ } else if (rsc->children) { ++ GListPtr lpc = NULL; ++ ++ for (lpc = rsc->children; lpc != NULL; lpc = lpc->next) { ++ resource_t *child = (resource_t *) lpc->data; ++ ++ rc = cli_resource_delete_failures(crmd_channel, host_uname, child, operation, ++ interval, data_set); ++ if(rc != pcmk_ok) { ++ return rc; ++ } ++ } ++ return pcmk_ok; ++ } ++ + for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; + xml_op = __xml_next(xml_op)) { + +-- +1.8.3.1 + + +From 6ce88cdbcbe15b7e81a4234eb92a93663243a7ff Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Mon, 11 Dec 2017 12:23:06 -0600 -Subject: [PATCH] Fix: tools: crm_resource --cleanup +Subject: [PATCH 3/8] Fix: tools: crm_resource --cleanup The new "failures only" mode of crm_resource --cleanup had multiple issues, including not working without --resource specified, comparing a @@ -15,10 +173,10 @@ but only when clearing LRM history entries. 3 files changed, 202 insertions(+), 100 deletions(-) diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 4ddcef4..5152004 100644 +index 331adf6..e3f8f86 100644 --- a/tools/crm_resource.c +++ b/tools/crm_resource.c -@@ -1092,14 +1092,20 @@ main(int argc, char **argv) +@@ -1101,14 +1101,20 @@ main(int argc, char **argv) rc = cli_resource_delete_attribute(rsc, rsc_id, prop_set, prop_id, prop_name, cib_conn, &data_set); @@ -44,7 +202,7 @@ index 4ddcef4..5152004 100644 cli_resource_check(cib_conn, rsc); } -@@ -1107,22 +1113,9 @@ main(int argc, char **argv) +@@ -1116,22 +1122,9 @@ main(int argc, char **argv) start_mainloop(); } @@ -91,10 +249,10 @@ index e28c9ef..0ac51f2 100644 int cli_resource_move(resource_t *rsc, const char *rsc_id, const char *host_name, cib_t *cib, diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index 1048636..bdebb0b 100644 +index 98cd27f..2cc2bec 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c -@@ -532,15 +532,129 @@ rsc_fail_name(resource_t *rsc) +@@ -558,15 +558,129 @@ rsc_fail_name(resource_t *rsc) return is_set(rsc->flags, pe_rsc_unique)? strdup(name) : clone_strip(name); } @@ -227,7 +385,7 @@ index 1048636..bdebb0b 100644 if (rsc == NULL) { return -ENXIO; -@@ -552,8 +666,8 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, +@@ -578,8 +692,8 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, resource_t *child = (resource_t *) lpc->data; rc = cli_resource_delete(crmd_channel, host_uname, child, operation, @@ -238,7 +396,7 @@ index 1048636..bdebb0b 100644 return rc; } } -@@ -585,8 +699,13 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, +@@ -611,8 +725,13 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, node = (node_t *) lpc->data; if (node->details->online) { @@ -254,7 +412,7 @@ index 1048636..bdebb0b 100644 } } -@@ -611,102 +730,91 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, +@@ -637,102 +756,91 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname, if (crmd_channel == NULL) { printf("Dry run: skipping clean-up of %s on %s due to CIB_file\n", rsc->id, host_uname); @@ -417,3 +575,381 @@ index 1048636..bdebb0b 100644 -- 1.8.3.1 + +From 0b6c3b3064401c8f0ebb48ccfd11f43dc2dc2b1b Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Tue, 12 Dec 2017 10:02:22 -0600 +Subject: [PATCH 4/8] Fix: tools: crm_resource --cleanup with no resource + specified + +7a813755 failed to completely fix --cleanup without --resource +--- + tools/crm_resource_runtime.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index 2cc2bec..ce86a49 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -595,6 +595,7 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, + { + int rc = pcmk_ok; + const char *failed_value = NULL; ++ const char *failed_id = NULL; + const char *interval_ms_str = NULL; + GHashTable *rscs = NULL; + GHashTableIter iter; +@@ -613,11 +614,14 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, + for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; + xml_op = __xml_next(xml_op)) { + ++ failed_id = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); ++ if (failed_id == NULL) { ++ // Malformed history entry, should never happen ++ continue; ++ } ++ + // No resource specified means all resources match +- failed_value = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); +- if (rsc_id == NULL) { +- rsc_id = failed_value; +- } else if (safe_str_neq(rsc_id, failed_value)) { ++ if (rsc_id && safe_str_neq(rsc_id, failed_id)) { + continue; + } + +@@ -641,13 +645,13 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, + } + } + +- g_hash_table_add(rscs, (gpointer) rsc_id); ++ g_hash_table_add(rscs, (gpointer) failed_id); + } + + g_hash_table_iter_init(&iter, rscs); +- while (g_hash_table_iter_next(&iter, (gpointer *) &rsc_id, NULL)) { +- crm_debug("Erasing failures of %s on %s", rsc_id, node_name); +- rc = clear_rsc_history(crmd_channel, node_name, rsc_id, data_set); ++ while (g_hash_table_iter_next(&iter, (gpointer *) &failed_id, NULL)) { ++ crm_debug("Erasing failures of %s on %s", failed_id, node_name); ++ rc = clear_rsc_history(crmd_channel, node_name, failed_id, data_set); + if (rc != pcmk_ok) { + return rc; + } +-- +1.8.3.1 + + +From 9d5a1dae23a44db190782560d8dbdf50343b3692 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 24 Jan 2018 10:51:34 -0600 +Subject: [PATCH 5/8] Low: tools: crm_resource --refresh should ignore + --operation and --interval + +It already did when a resource was not specified. +Also update help text to clarify cleanup vs refresh. +--- + tools/crm_resource.c | 23 +++++++++++------------ + 1 file changed, 11 insertions(+), 12 deletions(-) + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index e3f8f86..d00c8f2 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -214,15 +214,17 @@ static struct crm_option long_options[] = { + "cleanup", no_argument, NULL, 'C', + #if 0 + // new behavior disabled until 2.0.0 +- "\t\tDelete failed operations from a resource's history allowing its current state to be rechecked.\n" ++ "\t\tIf resource has any past failures, clear its history and fail count.\n" + "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" ++ "\t\t\t\t--operation and --interval apply to fail counts, but entire history is always cleared,\n" ++ "\t\t\t\tto allow current state to be rechecked.\n" + }, + { + "refresh", no_argument, NULL, 'R', + #endif + "\t\tDelete resource's history (including failures) so its current state is rechecked.\n" +- "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" +- "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be cleaned" ++ "\t\t\t\tOptionally filtered by --resource and --node (otherwise all).\n" ++ "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be refreshed." + }, + { + "set-parameter", required_argument, NULL, 'p', +@@ -442,7 +444,6 @@ main(int argc, char **argv) + bool require_resource = TRUE; /* whether command requires that resource be specified */ + bool require_dataset = TRUE; /* whether command requires populated dataset instance */ + bool require_crmd = FALSE; /* whether command requires connection to CRMd */ +- bool just_errors = TRUE; /* whether cleanup command deletes all history or just errors */ + + int rc = pcmk_ok; + int is_ocf_rc = 0; +@@ -634,8 +635,7 @@ main(int argc, char **argv) + if (cib_file == NULL) { + require_crmd = TRUE; + } +- just_errors = FALSE; +- rsc_cmd = 'C'; ++ rsc_cmd = 'R'; + find_flags = pe_find_renamed|pe_find_anon; + break; + +@@ -645,7 +645,6 @@ main(int argc, char **argv) + if (cib_file == NULL) { + require_crmd = TRUE; + } +- just_errors = FALSE; // disable until 2.0.0 + rsc_cmd = 'C'; + find_flags = pe_find_renamed|pe_find_anon; + break; +@@ -1101,7 +1100,7 @@ main(int argc, char **argv) + rc = cli_resource_delete_attribute(rsc, rsc_id, prop_set, prop_id, + prop_name, cib_conn, &data_set); + +- } else if ((rsc_cmd == 'C') && rsc) { ++ } else if ((rsc_cmd == 'R') && rsc) { + if (do_force == FALSE) { + rsc = uber_parent(rsc); + } +@@ -1110,8 +1109,8 @@ main(int argc, char **argv) + crm_debug("%s of %s (%s requested) on %s", + (just_errors? "Clearing failures" : "Re-checking the state"), + rsc->id, rsc_id, (host_uname? host_uname : "all hosts")); +- rc = cli_resource_delete(crmd_channel, host_uname, rsc, operation, +- interval, just_errors, &data_set); ++ rc = cli_resource_delete(crmd_channel, host_uname, rsc, NULL, 0, ++ &data_set); + + if ((rc == pcmk_ok) && !BE_QUIET) { + // Show any reasons why resource might stay stopped +@@ -1122,14 +1121,14 @@ main(int argc, char **argv) + start_mainloop(); + } + +- } else if (rsc_cmd == 'C' && just_errors) { ++ } else if (rsc_cmd == 'C') { + rc = cli_cleanup_all(crmd_channel, host_uname, operation, interval, + &data_set); + if (rc == pcmk_ok) { + start_mainloop(); + } + +- } else if (rsc_cmd == 'C') { ++ } else if (rsc_cmd == 'R') { + #if HAVE_ATOMIC_ATTRD + const char *router_node = host_uname; + xmlNode *msg_data = NULL; +-- +1.8.3.1 + + +From 035bebd78c1936b0749ae64fe949deb5d77effe9 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Tue, 13 Feb 2018 12:43:48 -0600 +Subject: [PATCH 6/8] Fix: tools: auto-merge was insufficient + +The master and 2.0 branches had taken different approaches to crm_resource +clean-up refactoring in response to different issues. It was necessary to +combine the code more carefully. +--- + tools/crm_resource.c | 13 ++----------- + tools/crm_resource_runtime.c | 16 +++++++++++----- + 2 files changed, 13 insertions(+), 16 deletions(-) + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index d00c8f2..fc46cc0 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -628,6 +628,7 @@ main(int argc, char **argv) + timeout_ms = crm_get_msec(optarg); + break; + ++ case 'C': + case 'R': + case 'P': + crm_log_args(argc, argv); +@@ -635,17 +636,7 @@ main(int argc, char **argv) + if (cib_file == NULL) { + require_crmd = TRUE; + } +- rsc_cmd = 'R'; +- find_flags = pe_find_renamed|pe_find_anon; +- break; +- +- case 'C': +- crm_log_args(argc, argv); +- require_resource = FALSE; +- if (cib_file == NULL) { +- require_crmd = TRUE; +- } +- rsc_cmd = 'C'; ++ rsc_cmd = 'R'; // disable new behavior until 2.0 + find_flags = pe_find_renamed|pe_find_anon; + break; + +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index ce86a49..e02cc44 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -621,8 +621,14 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, + } + + // No resource specified means all resources match +- if (rsc_id && safe_str_neq(rsc_id, failed_id)) { +- continue; ++ if (rsc_id) { ++ resource_t *fail_rsc = pe_find_resource_with_flags(data_set->resources, ++ failed_id, ++ pe_find_renamed|pe_find_anon); ++ ++ if (!fail_rsc || safe_str_neq(rsc_id, fail_rsc->id)) { ++ continue; ++ } + } + + // Host name should always have been provided by this point +@@ -790,8 +796,8 @@ cli_cleanup_all(crm_ipc_t *crmd_channel, const char *node_name, + const char *operation, const char *interval, + pe_working_set_t *data_set) + { +- int attr_options = attrd_opt_none; + int rc = pcmk_ok; ++ int attr_options = attrd_opt_none; + const char *display_name = node_name? node_name : "all nodes"; + + if (crmd_channel == NULL) { +@@ -836,8 +842,8 @@ cli_cleanup_all(crm_ipc_t *crmd_channel, const char *node_name, + rc = clear_rsc_failures(crmd_channel, node->details->uname, NULL, + operation, interval, data_set); + if (rc != pcmk_ok) { +- printf("Cleaned all resource failures on all nodes, but unable to clean history on %s: %s\n", +- node->details->uname, pcmk_strerror(rc)); ++ printf("Cleaned all resource failures on all nodes, but unable to clean history: %s\n", ++ pcmk_strerror(rc)); + return rc; + } + } +-- +1.8.3.1 + + +From 5fa351ec714de6b67c456fb1a85a8ebdb658f604 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Tue, 7 Aug 2018 10:42:59 -0500 +Subject: [PATCH 7/8] Low: tools: update crm_resource for 1.1 vs 2.0 + differences + +--- + tools/crm_resource.c | 37 +++++++++++++++++++++++++++---------- + 1 file changed, 27 insertions(+), 10 deletions(-) + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index fc46cc0..128d075 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -352,11 +352,13 @@ static struct crm_option long_options[] = { + }, + { + "operation", required_argument, NULL, 'n', +- "\tOperation to clear instead of all (with -C -r)" ++ "\tOperation to clear instead of all (with -C -r)", ++ pcmk_option_hidden // only used with 2.0 -C behavior + }, + { + "interval", required_argument, NULL, 'I', +- "\tInterval of operation to clear (default 0) (with -C -r -n)" ++ "\tInterval of operation to clear (default 0) (with -C -r -n)", ++ pcmk_option_hidden // only used with 2.0 -C behavior + }, + { + "set-name", required_argument, NULL, 's', +@@ -1091,17 +1093,16 @@ main(int argc, char **argv) + rc = cli_resource_delete_attribute(rsc, rsc_id, prop_set, prop_id, + prop_name, cib_conn, &data_set); + +- } else if ((rsc_cmd == 'R') && rsc) { ++ } else if ((rsc_cmd == 'C') && rsc) { + if (do_force == FALSE) { + rsc = uber_parent(rsc); + } + crmd_replies_needed = 0; + +- crm_debug("%s of %s (%s requested) on %s", +- (just_errors? "Clearing failures" : "Re-checking the state"), +- rsc->id, rsc_id, (host_uname? host_uname : "all hosts")); +- rc = cli_resource_delete(crmd_channel, host_uname, rsc, NULL, 0, +- &data_set); ++ crm_debug("Erasing failures of %s (%s requested) on %s", ++ rsc->id, rsc_id, (host_uname? host_uname: "all nodes")); ++ rc = cli_resource_delete(crmd_channel, host_uname, rsc, ++ operation, interval, TRUE, &data_set); + + if ((rc == pcmk_ok) && !BE_QUIET) { + // Show any reasons why resource might stay stopped +@@ -1119,6 +1120,22 @@ main(int argc, char **argv) + start_mainloop(); + } + ++ } else if ((rsc_cmd == 'R') && rsc) { ++ if (do_force == FALSE) { ++ rsc = uber_parent(rsc); ++ } ++ crmd_replies_needed = 0; ++ ++ crm_debug("Re-checking the state of %s (%s requested) on %s", ++ rsc->id, rsc_id, (host_uname? host_uname: "all nodes")); ++ rc = cli_resource_delete(crmd_channel, host_uname, rsc, ++ NULL, 0, FALSE, &data_set); ++ ++ if ((rc == pcmk_ok) && !BE_QUIET) { ++ // Show any reasons why resource might stay stopped ++ cli_resource_check(cib_conn, rsc); ++ } ++ + } else if (rsc_cmd == 'R') { + #if HAVE_ATOMIC_ATTRD + const char *router_node = host_uname; +@@ -1174,8 +1191,8 @@ main(int argc, char **argv) + crmd_replies_needed = 0; + for (rIter = data_set.resources; rIter; rIter = rIter->next) { + rsc = rIter->data; +- cli_resource_delete(crmd_channel, host_uname, rsc, NULL, NULL, +- &data_set); ++ cli_resource_delete(crmd_channel, host_uname, rsc, NULL, 0, ++ FALSE, &data_set); + } + + start_mainloop(); +-- +1.8.3.1 + + +From 555bdce4ceaf9a406059150c9dee047151fb3d94 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Tue, 7 Aug 2018 14:11:50 -0500 +Subject: [PATCH 8/8] Low: tools: avoid function not available until glib + 2.32.0 + +--- + tools/crm_resource_runtime.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index e02cc44..41cc742 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -651,7 +651,10 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, + } + } + ++ /* not available until glib 2.32 + g_hash_table_add(rscs, (gpointer) failed_id); ++ */ ++ g_hash_table_insert(rscs, (gpointer) failed_id, (gpointer) failed_id); + } + + g_hash_table_iter_init(&iter, rscs); +-- +1.8.3.1 + diff --git a/SOURCES/005-cleanup.patch b/SOURCES/005-cleanup.patch deleted file mode 100644 index 8e568b1..0000000 --- a/SOURCES/005-cleanup.patch +++ /dev/null @@ -1,62 +0,0 @@ -From a2305469012b5fe3713427412c12459085ed61a1 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Tue, 12 Dec 2017 10:02:22 -0600 -Subject: [PATCH] Fix: tools: crm_resource --cleanup with no resource specified - -7a813755 failed to completely fix --cleanup without --resource ---- - tools/crm_resource_runtime.c | 20 ++++++++++++-------- - 1 file changed, 12 insertions(+), 8 deletions(-) - -diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index bdebb0b..79f8b98 100644 ---- a/tools/crm_resource_runtime.c -+++ b/tools/crm_resource_runtime.c -@@ -569,6 +569,7 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, - { - int rc = pcmk_ok; - const char *failed_value = NULL; -+ const char *failed_id = NULL; - const char *interval_ms_str = NULL; - GHashTable *rscs = NULL; - GHashTableIter iter; -@@ -587,11 +588,14 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, - for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL; - xml_op = __xml_next(xml_op)) { - -+ failed_id = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); -+ if (failed_id == NULL) { -+ // Malformed history entry, should never happen -+ continue; -+ } -+ - // No resource specified means all resources match -- failed_value = crm_element_value(xml_op, XML_LRM_ATTR_RSCID); -- if (rsc_id == NULL) { -- rsc_id = failed_value; -- } else if (safe_str_neq(rsc_id, failed_value)) { -+ if (rsc_id && safe_str_neq(rsc_id, failed_id)) { - continue; - } - -@@ -615,13 +619,13 @@ clear_rsc_failures(crm_ipc_t *crmd_channel, const char *node_name, - } - } - -- g_hash_table_add(rscs, (gpointer) rsc_id); -+ g_hash_table_add(rscs, (gpointer) failed_id); - } - - g_hash_table_iter_init(&iter, rscs); -- while (g_hash_table_iter_next(&iter, (gpointer *) &rsc_id, NULL)) { -- crm_debug("Erasing failures of %s on %s", rsc_id, node_name); -- rc = clear_rsc_history(crmd_channel, node_name, rsc_id, data_set); -+ while (g_hash_table_iter_next(&iter, (gpointer *) &failed_id, NULL)) { -+ crm_debug("Erasing failures of %s on %s", failed_id, node_name); -+ rc = clear_rsc_history(crmd_channel, node_name, failed_id, data_set); - if (rc != pcmk_ok) { - return rc; - } --- -1.8.3.1 - diff --git a/SOURCES/005-corosync.patch b/SOURCES/005-corosync.patch new file mode 100644 index 0000000..19ca4e3 --- /dev/null +++ b/SOURCES/005-corosync.patch @@ -0,0 +1,71 @@ +From 041026835bce4d4ae2390daccade0e74c4fa3c1c Mon Sep 17 00:00:00 2001 +From: Christine Caulfield +Date: Thu, 26 Jul 2018 08:06:45 +0100 +Subject: [PATCH] Shutdown corosync after a fatal error + +If pacemaker shuts down due to being fenced by a non-power (eg fabric) +fence agent then it should also take down corosync so that full cluster +service on that node is lost, rather than just resource management. + +https://bugzilla.redhat.com/show_bug.cgi?id=1448221 + +Signed-off-by: Christine Caulfield +--- + mcp/pacemaker.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +diff --git a/mcp/pacemaker.c b/mcp/pacemaker.c +index f57fc25..40a2de2 100644 +--- a/mcp/pacemaker.c ++++ b/mcp/pacemaker.c +@@ -21,6 +21,9 @@ + #include + #include + #include ++#ifdef SUPPORT_COROSYNC ++#include ++#endif + + #include + #include +@@ -142,6 +145,28 @@ pcmk_process_exit(pcmk_child_t * child) + } + } + ++static void pcmk_exit_with_cluster(int exitcode) ++{ ++#ifdef SUPPORT_COROSYNC ++ corosync_cfg_handle_t cfg_handle; ++ cs_error_t err; ++ ++ if (exitcode == DAEMON_RESPAWN_STOP) { ++ crm_info("Asking Corosync to shut down"); ++ err = corosync_cfg_initialize(&cfg_handle, NULL); ++ if (err != CS_OK) { ++ crm_warn("Unable to open handle to corosync to close it down. err=%d", err); ++ } ++ err = corosync_cfg_try_shutdown(cfg_handle, COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE); ++ if (err != CS_OK) { ++ crm_warn("Corosync shutdown failed. err=%d", err); ++ } ++ corosync_cfg_finalize(cfg_handle); ++ } ++#endif ++ crm_exit(exitcode); ++} ++ + static void + pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitcode) + { +@@ -423,7 +448,7 @@ pcmk_shutdown_worker(gpointer user_data) + + if (fatal_error) { + crm_notice("Attempting to inhibit respawning after fatal error"); +- crm_exit(DAEMON_RESPAWN_STOP); ++ pcmk_exit_with_cluster(DAEMON_RESPAWN_STOP); + } + + return TRUE; +-- +1.8.3.1 + diff --git a/SOURCES/006-fail-count.patch b/SOURCES/006-fail-count.patch new file mode 100644 index 0000000..d902549 --- /dev/null +++ b/SOURCES/006-fail-count.patch @@ -0,0 +1,31 @@ +From cdbc6bfc8995ecc86da3fe81a463d8fc4ce1f8fd Mon Sep 17 00:00:00 2001 +From: Hideo Yamauchi +Date: Mon, 30 Jul 2018 07:33:09 +0900 +Subject: [PATCH] Mid: controld: No update by already confirmed events. + +--- + crmd/te_events.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/crmd/te_events.c b/crmd/te_events.c +index 7b5ca2a..1f7a34c 100644 +--- a/crmd/te_events.c ++++ b/crmd/te_events.c +@@ -510,6 +510,14 @@ process_graph_event(xmlNode *event, const char *event_node) + abort_transition(INFINITY, tg_restart, "Unknown event", event); + + } else { ++ ++ /* Actions already confirmed skip matching. */ ++ /* ex. Ignoring xxx_last_0 or xxx_last_failure_0 generated by create_operation_update() in order to prevent duplicate fail-count from increasing. */ ++ if (action->confirmed == TRUE) { ++ crm_log_xml_debug(event, "No update by already confirmed events :"); ++ goto bail; ++ } ++ + ignore_failures = safe_str_eq( + crm_meta_value(action->params, XML_OP_ATTR_ON_FAIL), "ignore"); + match_graph_event(action, event, status, rc, target_rc, ignore_failures); +-- +1.8.3.1 + diff --git a/SOURCES/006-leaks.patch b/SOURCES/006-leaks.patch deleted file mode 100644 index ab9fb37..0000000 --- a/SOURCES/006-leaks.patch +++ /dev/null @@ -1,296 +0,0 @@ -From 5042a3b19a2f2bfa3d09b4d1029f53e6b674918b Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 14 Dec 2017 09:16:47 -0600 -Subject: [PATCH 1/5] Test: CTS: remove dead code - -makes static analysis happy ---- - cts/CTSaudits.py | 1 - - cts/environment.py | 1 - - cts/remote.py | 5 +---- - cts/watcher.py | 6 +++--- - 4 files changed, 4 insertions(+), 9 deletions(-) - -diff --git a/cts/CTSaudits.py b/cts/CTSaudits.py -index aff897f..d9fbeb9 100755 ---- a/cts/CTSaudits.py -+++ b/cts/CTSaudits.py -@@ -190,7 +190,6 @@ class DiskAudit(ClusterAudit): - - if answer and answer == "n": - raise ValueError("Disk full on %s" % (node)) -- ret = 0 - - elif remaining_mb < 100 or used_percent > 90: - self.CM.log("WARN: Low on log disk space (%dMB) on %s" % (remaining_mb, node)) -diff --git a/cts/environment.py b/cts/environment.py -index 75a18c8..6c4831c 100644 ---- a/cts/environment.py -+++ b/cts/environment.py -@@ -182,7 +182,6 @@ class Environment: - - else: - raise ValueError("Unknown stack: "+name) -- sys.exit(1) - - def get_stack_short(self): - # Create the Cluster Manager object -diff --git a/cts/remote.py b/cts/remote.py -index 8c36918..7cef40e 100644 ---- a/cts/remote.py -+++ b/cts/remote.py -@@ -220,10 +220,7 @@ class RemoteExec: - - if not silent: - for err in errors: -- if stdout == 3: -- result.append("error: "+err) -- else: -- self.debug("cmd: stderr: %s" % err) -+ self.debug("cmd: stderr: %s" % err) - - if stdout == 0: - if not silent and result: -diff --git a/cts/watcher.py b/cts/watcher.py -index de032f7..42685ad 100644 ---- a/cts/watcher.py -+++ b/cts/watcher.py -@@ -337,19 +337,19 @@ class LogWatcher(RemoteExec): - self.kind = kind - else: - raise -- self.kind = self.Env["LogWatcher"] -+ #self.kind = self.Env["LogWatcher"] - - if log: - self.filename = log - else: - raise -- self.filename = self.Env["LogFileName"] -+ #self.filename = self.Env["LogFileName"] - - if hosts: - self.hosts = hosts - else: - raise -- self.hosts = self.Env["nodes"] -+ #self.hosts = self.Env["nodes"] - - if trace_lw: - self.debug_level = 3 --- -1.8.3.1 - - -From 570929eba229558b1a6900ffc54e4d5ee4150f74 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 14 Dec 2017 09:23:03 -0600 -Subject: [PATCH 2/5] Refactor: pengine: validate more function arguments - -not an issue with current code, but makes static analysis happy ---- - pengine/clone.c | 3 ++- - pengine/utilization.c | 1 + - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/pengine/clone.c b/pengine/clone.c -index 99bac7e..e81dbc8 100644 ---- a/pengine/clone.c -+++ b/pengine/clone.c -@@ -955,6 +955,7 @@ is_child_compatible(resource_t *child_rsc, node_t * local_node, enum rsc_role_e - node_t *node = NULL; - enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, current); - -+ CRM_CHECK(child_rsc && local_node, return FALSE); - if (is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) { - /* We only want instances that haven't failed */ - node = child_rsc->fns->location(child_rsc, NULL, current); -@@ -965,7 +966,7 @@ is_child_compatible(resource_t *child_rsc, node_t * local_node, enum rsc_role_e - return FALSE; - } - -- if (node && local_node && node->details == local_node->details) { -+ if (node && (node->details == local_node->details)) { - return TRUE; - - } else if (node) { -diff --git a/pengine/utilization.c b/pengine/utilization.c -index f42c85d..05f8d78 100644 ---- a/pengine/utilization.c -+++ b/pengine/utilization.c -@@ -341,6 +341,7 @@ process_utilization(resource_t * rsc, node_t ** prefer, pe_working_set_t * data_ - { - int alloc_details = scores_log_level + 1; - -+ CRM_CHECK(rsc && prefer && data_set, return); - if (safe_str_neq(data_set->placement_strategy, "default")) { - GHashTableIter iter; - GListPtr colocated_rscs = NULL; --- -1.8.3.1 - - -From db2fdc9a452fef11d397e25202fde8ba1bad4cd3 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 14 Dec 2017 10:36:20 -0600 -Subject: [PATCH 3/5] Low: libcrmservice: avoid memory leak on DBus error - ---- - lib/services/dbus.c | 47 +++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 37 insertions(+), 10 deletions(-) - -diff --git a/lib/services/dbus.c b/lib/services/dbus.c -index fb3e867..58df927 100644 ---- a/lib/services/dbus.c -+++ b/lib/services/dbus.c -@@ -23,6 +23,15 @@ struct db_getall_data { - void (*callback)(const char *name, const char *value, void *userdata); - }; - -+static void -+free_db_getall_data(struct db_getall_data *data) -+{ -+ free(data->target); -+ free(data->object); -+ free(data->name); -+ free(data); -+} -+ - DBusConnection * - pcmk_dbus_connect(void) - { -@@ -196,6 +205,20 @@ pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, - return reply; - } - -+/*! -+ * \internal -+ * \brief Send a DBus message with a callback for the reply -+ * -+ * \param[in] msg DBus message to send -+ * \param[in,out] connection DBus connection to send on -+ * \param[in] done Function to call when pending call completes -+ * \param[in] user_data Data to pass to done callback -+ * -+ * \return Handle for reply on success, NULL on error -+ * \note The caller can assume that the done callback is called always and -+ * only when the return value is non-NULL. (This allows the caller to -+ * know where it should free dynamically allocated user_data.) -+ */ - DBusPendingCall * - pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, - void(*done)(DBusPendingCall *pending, void *user_data), -@@ -359,11 +382,7 @@ pcmk_dbus_lookup_result(DBusMessage *reply, struct db_getall_data *data) - } - - cleanup: -- free(data->target); -- free(data->object); -- free(data->name); -- free(data); -- -+ free_db_getall_data(data); - return output; - } - -@@ -424,11 +443,19 @@ pcmk_dbus_get_property(DBusConnection *connection, const char *target, - query_data->name = strdup(name); - } - -- if(query_data->callback) { -- DBusPendingCall* _pending; -- _pending = pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb, query_data, timeout); -- if (pending != NULL) { -- *pending = _pending; -+ if (query_data->callback) { -+ DBusPendingCall *local_pending; -+ -+ local_pending = pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb, -+ query_data, timeout); -+ if (local_pending == NULL) { -+ // pcmk_dbus_lookup_cb() was not called in this case -+ free_db_getall_data(query_data); -+ query_data = NULL; -+ } -+ -+ if (pending) { -+ *pending = local_pending; - } - - } else { --- -1.8.3.1 - - -From 4a774710ec7269ec3a1427ae09fc6ca435c66e92 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 14 Dec 2017 12:44:04 -0600 -Subject: [PATCH 4/5] Build: systemd unit files: restore DBus dependency - -06e2e26 removed the unit files' DBus dependency on the advice of a -systemd developer, but it is necessary ---- - lrmd/pacemaker_remote.service.in | 3 +++ - mcp/pacemaker.service.in | 4 ++++ - 2 files changed, 7 insertions(+) - -diff --git a/lrmd/pacemaker_remote.service.in b/lrmd/pacemaker_remote.service.in -index d5717f6..1c596e1 100644 ---- a/lrmd/pacemaker_remote.service.in -+++ b/lrmd/pacemaker_remote.service.in -@@ -2,8 +2,11 @@ - Description=Pacemaker Remote Service - Documentation=man:pacemaker_remoted http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html/Pacemaker_Remote/index.html - -+# See main pacemaker unit file for descriptions of why these are needed - After=network.target - After=time-sync.target -+After=dbus.service -+Wants=dbus.service - After=resource-agents-deps.target - Wants=resource-agents-deps.target - After=syslog.service -diff --git a/mcp/pacemaker.service.in b/mcp/pacemaker.service.in -index 516de0f..e532ea2 100644 ---- a/mcp/pacemaker.service.in -+++ b/mcp/pacemaker.service.in -@@ -14,6 +14,10 @@ After=network.target - # and failure timestamps, so wait until it's done. - After=time-sync.target - -+# Managing systemd resources requires DBus. -+After=dbus.service -+Wants=dbus.service -+ - # Some OCF resources may have dependencies that aren't managed by the cluster; - # these must be started before Pacemaker and stopped after it. The - # resource-agents package provides this target, which lets system adminstrators --- -1.8.3.1 - - -From 69de188a7263ba66afa0e8a3a46a64f07a7facca Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 14 Dec 2017 16:05:12 -0600 -Subject: [PATCH 5/5] Low: attrd: avoid small memory leak at start-up - -introduced by 3518544 ---- - attrd/commands.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/attrd/commands.c b/attrd/commands.c -index 0a20b26..20bd82f 100644 ---- a/attrd/commands.c -+++ b/attrd/commands.c -@@ -539,6 +539,7 @@ attrd_broadcast_protocol() - crm_xml_add(attrd_op, F_ATTRD_VALUE, ATTRD_PROTOCOL_VERSION); - crm_xml_add_int(attrd_op, F_ATTRD_IS_PRIVATE, 1); - attrd_client_update(attrd_op); -+ free_xml(attrd_op); - } - - void --- -1.8.3.1 - diff --git a/SOURCES/007-bundles.patch b/SOURCES/007-bundles.patch deleted file mode 100644 index 28ea0ef..0000000 --- a/SOURCES/007-bundles.patch +++ /dev/null @@ -1,92 +0,0 @@ -From 2ce5fc46463ff7b9a5a2c68602d8c5b35a7c37d7 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Tue, 16 Jan 2018 19:05:31 +1100 -Subject: [PATCH 1/2] Bug rhbz#1519812 - Prevent notify actions from causing - --wait to hang - ---- - tools/crm_resource_runtime.c | 21 ++++++++++++++++----- - 1 file changed, 16 insertions(+), 5 deletions(-) - -diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index 22bdebf..189d1b3 100644 ---- a/tools/crm_resource_runtime.c -+++ b/tools/crm_resource_runtime.c -@@ -1343,10 +1343,19 @@ done: - return rc; - } - --#define action_is_pending(action) \ -- ((is_set((action)->flags, pe_action_optional) == FALSE) \ -- && (is_set((action)->flags, pe_action_runnable) == TRUE) \ -- && (is_set((action)->flags, pe_action_pseudo) == FALSE)) -+static inline int action_is_pending(action_t *action) -+{ -+ if(is_set(action->flags, pe_action_optional)) { -+ return FALSE; -+ } else if(is_set(action->flags, pe_action_runnable) == FALSE) { -+ return FALSE; -+ } else if(is_set(action->flags, pe_action_pseudo)) { -+ return FALSE; -+ } else if(safe_str_eq("notify", action->task)) { -+ return FALSE; -+ } -+ return TRUE; -+} - - /*! - * \internal -@@ -1362,7 +1371,9 @@ actions_are_pending(GListPtr actions) - GListPtr action; - - for (action = actions; action != NULL; action = action->next) { -- if (action_is_pending((action_t *) action->data)) { -+ action_t *a = (action_t *)action->data; -+ if (action_is_pending(a)) { -+ crm_notice("Waiting for %s (flags=0x%.8x)", a->uuid, a->flags); - return TRUE; - } - } --- -1.8.3.1 - - -From ef15ea4f687e7f9ba1f8a99548ee1e0bf9d4b50a Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Mon, 22 Jan 2018 21:18:46 +1100 -Subject: [PATCH 2/2] Fix: rhbz#1527072 - Correctly observe colocation - constraints with bundles in the Master role - ---- - pengine/container.c | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -diff --git a/pengine/container.c b/pengine/container.c -index f5d916c..15d094d 100644 ---- a/pengine/container.c -+++ b/pengine/container.c -@@ -486,10 +486,18 @@ container_rsc_colocation_rh(resource_t * rsc_lh, resource_t * rsc, rsc_colocatio - } else { - node_t *chosen = tuple->docker->fns->location(tuple->docker, NULL, FALSE); - -- if (chosen != NULL && is_set_recursive(tuple->docker, pe_rsc_block, TRUE) == FALSE) { -- pe_rsc_trace(rsc, "Allowing %s: %s %d", constraint->id, chosen->details->uname, chosen->weight); -- allocated_rhs = g_list_prepend(allocated_rhs, chosen); -+ if (chosen == NULL || is_set_recursive(tuple->docker, pe_rsc_block, TRUE)) { -+ continue; -+ } -+ if(constraint->role_rh >= RSC_ROLE_MASTER && tuple->child == NULL) { -+ continue; - } -+ if(constraint->role_rh >= RSC_ROLE_MASTER && tuple->child->next_role < RSC_ROLE_MASTER) { -+ continue; -+ } -+ -+ pe_rsc_trace(rsc, "Allowing %s: %s %d", constraint->id, chosen->details->uname, chosen->weight); -+ allocated_rhs = g_list_prepend(allocated_rhs, chosen); - } - } - --- -1.8.3.1 - diff --git a/SOURCES/007-stderr.patch b/SOURCES/007-stderr.patch new file mode 100644 index 0000000..e71570a --- /dev/null +++ b/SOURCES/007-stderr.patch @@ -0,0 +1,30 @@ +From d351a328ec7d785b1ab3a39c34cb29f870164733 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 21 Sep 2018 16:07:37 -0500 +Subject: [PATCH] Low: tools: ensure crm_resource --force-* commands get stderr + messages + +--- + tools/crm_resource_runtime.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c +index 1b6a3f3..1a360a0 100644 +--- a/tools/crm_resource_runtime.c ++++ b/tools/crm_resource_runtime.c +@@ -1757,6 +1757,12 @@ cli_resource_execute(resource_t *rsc, const char *requested_name, + setenv("OCF_TRACE_RA", "1", 1); + } + ++ /* A resource agent using the standard ocf-shellfuncs library will not print ++ * messages to stderr if it doesn't have a controlling terminal (e.g. if ++ * crm_resource is called via script or ssh). This forces it to do so. ++ */ ++ setenv("OCF_TRACE_FILE", "/dev/stderr", 0); ++ + if (override_hash) { + GHashTableIter iter; + char *name = NULL; +-- +1.8.3.1 + diff --git a/SOURCES/008-quorum.patch b/SOURCES/008-quorum.patch deleted file mode 100644 index 0d2dece..0000000 --- a/SOURCES/008-quorum.patch +++ /dev/null @@ -1,145 +0,0 @@ -From 7c322f4b9a7f36eba1d3ca74d7dd8fe1093ca7bd Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Mon, 22 Jan 2018 11:38:22 -0600 -Subject: [PATCH] Low: crmd: quorum gain should always cause new transition - -0b689055 aborted the transition on quorum loss, but quorum can also be acquired -without triggering a new transition, if corosync gives quorum without a node -joining (e.g. forced via corosync-cmapctl, or perhaps via heuristics). - -This aborts the transition when quorum is gained, but only after a 5-second -delay, if the transition has not been aborted in that time. This avoids an -unnecessary abort in the vast majority of cases where an abort is already done, -and it allows some time for all nodes to connect when quorum is gained, rather -than immediately fencing remaining unseen nodes. ---- - crmd/membership.c | 22 +++++++++++++++++----- - crmd/te_utils.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- - crmd/tengine.h | 2 ++ - 3 files changed, 65 insertions(+), 7 deletions(-) - -diff --git a/crmd/membership.c b/crmd/membership.c -index c36dbed..4f2fa8a 100644 ---- a/crmd/membership.c -+++ b/crmd/membership.c -@@ -438,12 +438,24 @@ crm_update_quorum(gboolean quorum, gboolean force_update) - fsa_register_cib_callback(call_id, FALSE, NULL, cib_quorum_update_complete); - free_xml(update); - -- /* If a node not running any resources is cleanly shut down and drops us -- * below quorum, we won't necessarily abort the transition, so abort it -- * here to be safe. -+ /* Quorum changes usually cause a new transition via other activity: -+ * quorum gained via a node joining will abort via the node join, -+ * and quorum lost via a node leaving will usually abort via resource -+ * activity and/or fencing. -+ * -+ * However, it is possible that nothing else causes a transition (e.g. -+ * someone forces quorum via corosync-cmaptcl, or quorum is lost due to -+ * a node in standby shutting down cleanly), so here ensure a new -+ * transition is triggered. - */ -- if (quorum == FALSE) { -- abort_transition(INFINITY, tg_restart, "Quorum loss", NULL); -+ if (quorum) { -+ /* If quorum was gained, abort after a short delay, in case multiple -+ * nodes are joining around the same time, so the one that brings us -+ * to quorum doesn't cause all the remaining ones to be fenced. -+ */ -+ abort_after_delay(INFINITY, tg_restart, "Quorum gained", 5000); -+ } else { -+ abort_transition(INFINITY, tg_restart, "Quorum lost", NULL); - } - } - fsa_has_quorum = quorum; -diff --git a/crmd/te_utils.c b/crmd/te_utils.c -index dab02d3..8d105dc 100644 ---- a/crmd/te_utils.c -+++ b/crmd/te_utils.c -@@ -530,6 +530,46 @@ trigger_graph_processing(const char *fn, int line) - mainloop_set_trigger(transition_trigger); - } - -+static struct abort_timer_s { -+ bool aborted; -+ guint id; -+ int priority; -+ enum transition_action action; -+ const char *text; -+} abort_timer = { 0, }; -+ -+static gboolean -+abort_timer_popped(gpointer data) -+{ -+ if (abort_timer.aborted == FALSE) { -+ abort_transition(abort_timer.priority, abort_timer.action, -+ abort_timer.text, NULL); -+ } -+ abort_timer.id = 0; -+ return FALSE; // do not immediately reschedule timer -+} -+ -+/*! -+ * \internal -+ * \brief Abort transition after delay, if not already aborted in that time -+ * -+ * \param[in] abort_text Must be literal string -+ */ -+void -+abort_after_delay(int abort_priority, enum transition_action abort_action, -+ const char *abort_text, guint delay_ms) -+{ -+ if (abort_timer.id) { -+ // Timer already in progress, stop and reschedule -+ g_source_remove(abort_timer.id); -+ } -+ abort_timer.aborted = FALSE; -+ abort_timer.priority = abort_priority; -+ abort_timer.action = abort_action; -+ abort_timer.text = abort_text; -+ abort_timer.id = g_timeout_add(delay_ms, abort_timer_popped, NULL); -+} -+ - void - abort_transition_graph(int abort_priority, enum transition_action abort_action, - const char *abort_text, xmlNode * reason, const char *fn, int line) -@@ -557,6 +597,8 @@ abort_transition_graph(int abort_priority, enum transition_action abort_action, - break; - } - -+ abort_timer.aborted = TRUE; -+ - /* Make sure any queued calculations are discarded ASAP */ - free(fsa_pe_ref); - fsa_pe_ref = NULL; -@@ -660,10 +702,12 @@ abort_transition_graph(int abort_priority, enum transition_action abort_action, - (transition_graph->complete? "true" : "false")); - - } else { -+ const char *id = ID(reason); -+ - do_crm_log(level, "Transition aborted by %s.%s '%s': %s " - CRM_XS " cib=%d.%d.%d source=%s:%d path=%s complete=%s", -- TYPE(reason), ID(reason), (op? op : "change"), abort_text, -- add[0], add[1], add[2], fn, line, path, -+ TYPE(reason), (id? id : ""), (op? op : "change"), -+ abort_text, add[0], add[1], add[2], fn, line, path, - (transition_graph->complete? "true" : "false")); - } - } -diff --git a/crmd/tengine.h b/crmd/tengine.h -index 7205c16..6a75a08 100644 ---- a/crmd/tengine.h -+++ b/crmd/tengine.h -@@ -59,6 +59,8 @@ extern void notify_crmd(crm_graph_t * graph); - # include - - extern void trigger_graph_processing(const char *fn, int line); -+void abort_after_delay(int abort_priority, enum transition_action abort_action, -+ const char *abort_text, guint delay_ms); - extern void abort_transition_graph(int abort_priority, enum transition_action abort_action, - const char *abort_text, xmlNode * reason, const char *fn, - int line); --- -1.8.3.1 - diff --git a/SOURCES/009-crm_resource.patch b/SOURCES/009-crm_resource.patch deleted file mode 100644 index 9a877e5..0000000 --- a/SOURCES/009-crm_resource.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 30eb9a980db152f6c803a35d3b261a563ad4ee75 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Wed, 24 Jan 2018 10:51:34 -0600 -Subject: [PATCH 1/2] Low: tools: crm_resource --refresh should ignore - --operation and --interval - -It already did when a resource was not specified. -Also update help text to clarify cleanup vs refresh. ---- - tools/crm_resource.c | 26 ++++++++++++++++----------- - 1 file changed, 16 insertions(+), 10 deletions(-) - -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index 3fbc6e1..d007668 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -212,14 +212,16 @@ static struct crm_option long_options[] = { - }, - { - "cleanup", no_argument, NULL, 'C', -- "\t\tDelete failed operations from a resource's history allowing its current state to be rechecked.\n" -+ "\t\tIf resource has any past failures, clear its history and fail count.\n" - "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" -+ "\t\t\t\t--operation and --interval apply to fail counts, but entire history is always cleared,\n" -+ "\t\t\t\tto allow current state to be rechecked.\n" - }, - { - "refresh", no_argument, NULL, 'R', - "\t\tDelete resource's history (including failures) so its current state is rechecked.\n" -- "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" -- "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be cleaned" -+ "\t\t\t\tOptionally filtered by --resource and --node (otherwise all).\n" -+ "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be refreshed." - }, - { - "set-parameter", required_argument, NULL, 'p', -@@ -438,7 +440,6 @@ main(int argc, char **argv) - bool require_resource = TRUE; /* whether command requires that resource be specified */ - bool require_dataset = TRUE; /* whether command requires populated dataset instance */ - bool require_crmd = FALSE; /* whether command requires connection to CRMd */ -- bool just_errors = TRUE; /* whether cleanup command deletes all history or just errors */ - - int rc = pcmk_ok; - int is_ocf_rc = 0; -@@ -630,8 +631,7 @@ main(int argc, char **argv) - if (cib_file == NULL) { - require_crmd = TRUE; - } -- just_errors = FALSE; -- rsc_cmd = 'C'; -+ rsc_cmd = 'R'; - find_flags = pe_find_renamed|pe_find_anon; - break; - -@@ -641,7 +641,6 @@ main(int argc, char **argv) - if (cib_file == NULL) { - require_crmd = TRUE; - } -- just_errors = TRUE; - rsc_cmd = 'C'; - find_flags = pe_find_renamed|pe_find_anon; - break; -@@ -1092,7 +1091,14 @@ main(int argc, char **argv) - rc = cli_resource_delete_attribute(rsc, rsc_id, prop_set, prop_id, - prop_name, cib_conn, &data_set); - -- } else if ((rsc_cmd == 'C') && rsc) { -+ } else if (((rsc_cmd == 'C') || (rsc_cmd == 'R')) && rsc) { -+ bool just_errors = TRUE; -+ -+ if (rsc_cmd == 'R') { -+ just_errors = FALSE; -+ operation = NULL; -+ interval = 0; -+ } - if (do_force == FALSE) { - rsc = uber_parent(rsc); - } -@@ -1113,14 +1119,14 @@ main(int argc, char **argv) - start_mainloop(); - } - -- } else if (rsc_cmd == 'C' && just_errors) { -+ } else if (rsc_cmd == 'C') { - rc = cli_cleanup_all(crmd_channel, host_uname, operation, interval, - &data_set); - if (rc == pcmk_ok) { - start_mainloop(); - } - -- } else if (rsc_cmd == 'C') { -+ } else if (rsc_cmd == 'R') { - #if HAVE_ATOMIC_ATTRD - const char *router_node = host_uname; - xmlNode *msg_data = NULL; --- -1.8.3.1 diff --git a/SOURCES/010-crm_master.patch b/SOURCES/010-crm_master.patch deleted file mode 100644 index 61d5083..0000000 --- a/SOURCES/010-crm_master.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 18572d4e1e84c9d1f293b9a3082190133367154e Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 26 Jan 2018 12:31:09 -0600 -Subject: [PATCH] Fix: tools: crm_master should always work on node attribute - -Before ccbdb2a, crm_master would always set --node, thus ensuring crm_attribute -would treat the value as a node attribute. That commit removed that so that -crm_attribute could determine the local node name properly, but that introduced -an issue where the master value would be set as a cluster property instead of a -node attribute if --lifetime (or --node) was not set explicitly. - -This fixes it by setting the default value of --lifetime explicitly. ---- - tools/crm_master | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/tools/crm_master b/tools/crm_master -index 7e31cea..f4a0772 100755 ---- a/tools/crm_master -+++ b/tools/crm_master -@@ -8,6 +8,10 @@ if [ $? != 0 ] ; then echo "crm_master - A convenience wrapper for crm_attribute - # Note the quotes around `$TEMP': they are essential! - eval set -- "$TEMP" - -+# Explicitly set the (usual default) lifetime, so the attribute gets set as a -+# node attribute and not a cluster property. -+options="--lifetime forever" -+ - while true ; do - case "$1" in - -N|--node|-U|--uname) options="$options $1 $2"; shift; shift;; --- -1.8.3.1 - diff --git a/SOURCES/011-regression-tests.patch b/SOURCES/011-regression-tests.patch deleted file mode 100644 index 2610aec..0000000 --- a/SOURCES/011-regression-tests.patch +++ /dev/null @@ -1,122 +0,0 @@ -From eb76099e924b787ddc026441d87f77871ead9884 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Tue, 13 Feb 2018 17:21:37 -0600 -Subject: [PATCH 1/2] Low: libcrmcommon: use /tmp when creating temporary XML - file - -... instead of CRM_STATE_DIR, which may not be usable from an ordinary user's -account, thus generating incorrect CLI regression test output when run from a -checkout. ---- - lib/common/schemas.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/lib/common/schemas.c b/lib/common/schemas.c -index b529ff5..7e76af3 100644 ---- a/lib/common/schemas.c -+++ b/lib/common/schemas.c -@@ -625,9 +625,13 @@ validate_xml_verbose(xmlNode *xml_blob) - xmlDoc *doc = NULL; - xmlNode *xml = NULL; - gboolean rc = FALSE; -- char *filename = strdup(CRM_STATE_DIR "/cib-invalid.XXXXXX"); -+ const char *tmpdir = getenv("TMPDIR"); -+ char *filename = NULL; - -- CRM_CHECK(filename != NULL, return FALSE); -+ if ((tmpdir == NULL) || (*tmpdir != '/')) { -+ tmpdir = "/tmp"; -+ } -+ filename = crm_strdup_printf("%s/cib-invalid.XXXXXX", tmpdir); - - umask(S_IWGRP | S_IWOTH | S_IROTH); - fd = mkstemp(filename); --- -1.8.3.1 - - -From 48c9a80a7c3a621bd606ffcc14ae8a86072e41e0 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Tue, 13 Feb 2018 17:24:04 -0600 -Subject: [PATCH 2/2] Test: tools: update regression test with correct output - -Verbose XML wasn't been shown from an ordinary user's checkout previously due -to a bug that has since been fixed. ---- - tools/regression.validity.exp | 46 +++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 46 insertions(+) - -diff --git a/tools/regression.validity.exp b/tools/regression.validity.exp -index 7474746..7557454 100644 ---- a/tools/regression.validity.exp -+++ b/tools/regression.validity.exp -@@ -3,6 +3,21 @@ Setting up shadow instance - A new shadow instance was created. To begin using it paste the following into your shell: - CIB_shadow=tools-regression ; export CIB_shadow - =#=#=#= Begin test: Try to make resulting CIB invalid (enum violation) =#=#=#= -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 10 -+ 11 -+ 12 -+ 13 -+ 14 -+ 15 - Call failed: Update does not conform to the configured schema - =#=#=#= Current cib after: Try to make resulting CIB invalid (enum violation) =#=#=#= - -@@ -78,6 +93,21 @@ Your current configuration pacemaker-1.2 could not validate with any schema in r - =#=#=#= End test: Run crm_simulate with invalid CIB (enum violation) - Required key not available (126) =#=#=#= - * Passed: crm_simulate - Run crm_simulate with invalid CIB (enum violation) - =#=#=#= Begin test: Try to make resulting CIB invalid (unrecognized validate-with) =#=#=#= -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 10 -+ 11 -+ 12 -+ 13 -+ 14 -+ 15 - Call failed: Update does not conform to the configured schema - =#=#=#= Current cib after: Try to make resulting CIB invalid (unrecognized validate-with) =#=#=#= - -@@ -161,6 +191,22 @@ Your current configuration pacemaker-9999.0 could not validate with any schema i - =#=#=#= End test: Run crm_simulate with invalid CIB (unrecognized validate-with) - Required key not available (126) =#=#=#= - * Passed: crm_simulate - Run crm_simulate with invalid CIB (unrecognized validate-with) - =#=#=#= Begin test: Try to make resulting CIB invalid, but possibly recoverable (valid with X.Y+1) =#=#=#= -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 10 -+ 11 -+ 12 -+ 13 -+ 14 -+ 15 -+ 16 - Call failed: Update does not conform to the configured schema - =#=#=#= Current cib after: Try to make resulting CIB invalid, but possibly recoverable (valid with X.Y+1) =#=#=#= - --- -1.8.3.1 - diff --git a/SOURCES/012-notifs.patch b/SOURCES/012-notifs.patch deleted file mode 100644 index b121780..0000000 --- a/SOURCES/012-notifs.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 191c5be52b1633a8642d28868505a9879b5d5622 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Tue, 3 Apr 2018 13:56:22 +1000 -Subject: [PATCH] Fix: rhbz#1545449 - Do not perform notifications for events - we know wont be executed - ---- - pengine/notif.c | 40 +++++++++++++++++++++++++++++++++++++--- - 1 file changed, 37 insertions(+), 3 deletions(-) - -diff --git a/pengine/notif.c b/pengine/notif.c -index 39d8c72..7ce8f57 100644 ---- a/pengine/notif.c -+++ b/pengine/notif.c -@@ -498,12 +498,18 @@ collect_notification_data(resource_t * rsc, gboolean state, gboolean activity, - action_t *op = (action_t *) gIter->data; - - if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) { -+ task = text2task(op->task); -+ -+ if(task == stop_rsc && op->node->details->unclean) { -+ /* Create one anyway,, some additional noise if op->node cannot be fenced */ -+ } else if(is_not_set(op->flags, pe_action_runnable)) { -+ continue; -+ } - - entry = calloc(1, sizeof(notify_entry_t)); - entry->node = op->node; - entry->rsc = rsc; - -- task = text2task(op->task); - switch (task) { - case start_rsc: - n_data->start = g_list_prepend(n_data->start, entry); -@@ -656,8 +662,7 @@ create_notifications(resource_t * rsc, notify_data_t * n_data, pe_working_set_t - - /* Copy notification details into standard ops */ - -- gIter = rsc->actions; -- for (; gIter != NULL; gIter = gIter->next) { -+ for (gIter = rsc->actions; gIter != NULL; gIter = gIter->next) { - action_t *op = (action_t *) gIter->data; - - if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) { -@@ -676,6 +681,35 @@ create_notifications(resource_t * rsc, notify_data_t * n_data, pe_working_set_t - } - } - -+ switch (task) { -+ case start_rsc: -+ if(g_list_length(n_data->start) == 0) { -+ pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)", -+ n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role)); -+ return; -+ } -+ break; -+ case action_promote: -+ if(g_list_length(n_data->promote) == 0) { -+ pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)", -+ n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role)); -+ return; -+ } -+ break; -+ case action_demote: -+ if(g_list_length(n_data->demote) == 0) { -+ pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)", -+ n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role)); -+ return; -+ } -+ break; -+ default: -+ /* We cannot do the same for stop_rsc/n_data->stop at it -+ * might be implied by fencing -+ */ -+ break; -+ } -+ - pe_rsc_trace(rsc, "Creating notifications for: %s.%s (%s->%s)", - n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role)); - --- -1.8.3.1 - diff --git a/SOURCES/013-notifs-tests.patch b/SOURCES/013-notifs-tests.patch deleted file mode 100644 index 2565eb9..0000000 --- a/SOURCES/013-notifs-tests.patch +++ /dev/null @@ -1,5310 +0,0 @@ -From ef683f4767d75aae7a9483b1c325b13fc39f2821 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Fri, 6 Apr 2018 12:53:26 -0500 -Subject: [PATCH] Test: pengine: update regression tests for notification - changes - ---- - pengine/test10/a-demote-then-b-migrate.exp | 32 +- - pengine/test10/a-promote-then-b-migrate.exp | 16 +- - pengine/test10/bug-1572-2.exp | 28 +- - pengine/test10/bug-1685.exp | 16 +- - pengine/test10/bug-5143-ms-shuffle.exp | 16 +- - pengine/test10/bug-cl-5168.exp | 16 +- - pengine/test10/bug-cl-5212.exp | 12 +- - pengine/test10/bug-cl-5247.exp | 12 +- - pengine/test10/bug-lf-2153.exp | 12 +- - pengine/test10/bug-lf-2317.exp | 16 +- - pengine/test10/bundle-order-fencing.dot | 34 -- - pengine/test10/bundle-order-fencing.exp | 527 +++++++-------------- - pengine/test10/bundle-order-fencing.summary | 10 - - pengine/test10/bundle-order-partial-start-2.exp | 8 +- - pengine/test10/bundle-order-partial-start.exp | 8 +- - pengine/test10/bundle-order-partial-stop.dot | 3 - - pengine/test10/bundle-order-partial-stop.exp | 14 +- - pengine/test10/bundle-order-startup-clone.dot | 3 - - pengine/test10/bundle-order-stop-clone.exp | 20 +- - pengine/test10/bundle-order-stop-on-remote.exp | 44 +- - pengine/test10/bundle-order-stop.dot | 3 - - pengine/test10/bundle-order-stop.exp | 14 +- - pengine/test10/colo_master_w_native.exp | 32 +- - pengine/test10/colo_slave_w_native.exp | 32 +- - pengine/test10/group-dependents.exp | 32 +- - pengine/test10/inc10.exp | 28 +- - pengine/test10/interleave-pseudo-stop.exp | 12 +- - pengine/test10/interleave-stop.exp | 36 +- - pengine/test10/master-13.exp | 32 +- - pengine/test10/master-demote.exp | 16 +- - pengine/test10/master-dependent-ban.exp | 16 +- - pengine/test10/master-failed-demote.exp | 36 +- - pengine/test10/master-move.exp | 32 +- - pengine/test10/master-notify.exp | 24 +- - pengine/test10/master-partially-demoted-group.exp | 32 +- - pengine/test10/novell-239082.exp | 36 +- - pengine/test10/novell-252693.exp | 36 +- - .../test10/one-or-more-unrunnable-instances.exp | 12 +- - pengine/test10/order_constraint_stops_master.dot | 1 - - pengine/test10/order_constraint_stops_master.exp | 10 +- - pengine/test10/order_constraint_stops_slave.dot | 1 - - pengine/test10/order_constraint_stops_slave.exp | 4 +- - pengine/test10/probe-0.exp | 8 +- - pengine/test10/probe-2.exp | 48 +- - pengine/test10/remote-recover-all.exp | 8 +- - pengine/test10/remote-recover-connection.exp | 8 +- - pengine/test10/remote-recover-no-resources.exp | 8 +- - pengine/test10/remote-recover-unknown.exp | 8 +- - pengine/test10/remote-recovery.exp | 8 +- - 49 files changed, 719 insertions(+), 922 deletions(-) - -diff --git a/pengine/test10/a-demote-then-b-migrate.exp b/pengine/test10/a-demote-then-b-migrate.exp -index 2b12db2..e31e125 100644 ---- a/pengine/test10/a-demote-then-b-migrate.exp -+++ b/pengine/test10/a-demote-then-b-migrate.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -110,7 +110,7 @@ - - - -- -+ - - - -@@ -123,7 +123,7 @@ - - - -- -+ - - - -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -202,10 +202,10 @@ - - - -- -+ - - -- -+ - - - -@@ -235,10 +235,10 @@ - - - -- -+ - - -- -+ - - - -@@ -288,10 +288,10 @@ - - - -- -+ - - -- -+ - - - -@@ -321,10 +321,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/a-promote-then-b-migrate.exp b/pengine/test10/a-promote-then-b-migrate.exp -index 26cd1b1..f5ef735 100644 ---- a/pengine/test10/a-promote-then-b-migrate.exp -+++ b/pengine/test10/a-promote-then-b-migrate.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -103,10 +103,10 @@ - - - -- -+ - - -- -+ - - - -@@ -136,10 +136,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-1572-2.exp b/pengine/test10/bug-1572-2.exp -index a854f62..58885e2 100644 ---- a/pengine/test10/bug-1572-2.exp -+++ b/pengine/test10/bug-1572-2.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -92,7 +92,7 @@ - - - -- -+ - - - -@@ -127,10 +127,10 @@ - - - -- -+ - - -- -+ - - - -@@ -160,10 +160,10 @@ - - - -- -+ - - -- -+ - - - -@@ -216,7 +216,7 @@ - - - -- -+ - - - -@@ -246,10 +246,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-1685.exp b/pengine/test10/bug-1685.exp -index 8b46500..7d6f29b 100644 ---- a/pengine/test10/bug-1685.exp -+++ b/pengine/test10/bug-1685.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -88,10 +88,10 @@ - - - -- -+ - - -- -+ - - - -@@ -121,10 +121,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-5143-ms-shuffle.exp b/pengine/test10/bug-5143-ms-shuffle.exp -index e8fb58c..caa1474 100644 ---- a/pengine/test10/bug-5143-ms-shuffle.exp -+++ b/pengine/test10/bug-5143-ms-shuffle.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -104,10 +104,10 @@ - - - -- -+ - - -- -+ - - - -@@ -137,10 +137,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-cl-5168.exp b/pengine/test10/bug-cl-5168.exp -index f4b3b79..729c7a6 100644 ---- a/pengine/test10/bug-cl-5168.exp -+++ b/pengine/test10/bug-cl-5168.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -104,10 +104,10 @@ - - - -- -+ - - -- -+ - - - -@@ -137,10 +137,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-cl-5212.exp b/pengine/test10/bug-cl-5212.exp -index 344711b..4ee6d88 100644 ---- a/pengine/test10/bug-cl-5212.exp -+++ b/pengine/test10/bug-cl-5212.exp -@@ -41,9 +41,9 @@ - - - -- -+ - -- -+ - - - -@@ -54,9 +54,9 @@ - - - -- -+ - -- -+ - - - -@@ -76,7 +76,7 @@ - - - -- -+ - - - -@@ -106,7 +106,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-cl-5247.exp b/pengine/test10/bug-cl-5247.exp -index 7f55c64..c21ed7d 100644 ---- a/pengine/test10/bug-cl-5247.exp -+++ b/pengine/test10/bug-cl-5247.exp -@@ -451,7 +451,7 @@ - - - -- -+ - - - -@@ -464,7 +464,7 @@ - - - -- -+ - - - -@@ -477,7 +477,7 @@ - - - -- -+ - - - -@@ -534,7 +534,7 @@ - - - -- -+ - - - -@@ -564,7 +564,7 @@ - - - -- -+ - - - -@@ -644,7 +644,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2153.exp b/pengine/test10/bug-lf-2153.exp -index abe1554..6b8713c 100644 ---- a/pengine/test10/bug-lf-2153.exp -+++ b/pengine/test10/bug-lf-2153.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -62,7 +62,7 @@ - - - -- -+ - - - -@@ -92,10 +92,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bug-lf-2317.exp b/pengine/test10/bug-lf-2317.exp -index cf84cd5..a50bce3 100644 ---- a/pengine/test10/bug-lf-2317.exp -+++ b/pengine/test10/bug-lf-2317.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -103,10 +103,10 @@ - - - -- -+ - - -- -+ - - - -@@ -136,10 +136,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-fencing.dot b/pengine/test10/bundle-order-fencing.dot -index 980bab4..e53a062 100644 ---- a/pengine/test10/bundle-order-fencing.dot -+++ b/pengine/test10/bundle-order-fencing.dot -@@ -114,7 +114,6 @@ digraph "g" { - "rabbitmq-bundle-1_monitor_0 controller-2" [ style=bold color="green" fontcolor="black"] - "rabbitmq-bundle-2_monitor_0 controller-1" [ style=bold color="green" fontcolor="black"] - "rabbitmq-bundle-clone_confirmed-post_notify_running_0" -> "rabbitmq-bundle_running_0" [ style = bold] --"rabbitmq-bundle-clone_confirmed-post_notify_running_0" -> "rabbitmq_monitor_10000 rabbitmq-bundle-0" [ style = dashed] - "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "rabbitmq-bundle-clone_pre_notify_start_0" [ style = bold] -@@ -127,17 +126,12 @@ digraph "g" { - "rabbitmq-bundle-clone_confirmed-pre_notify_stop_0" -> "rabbitmq-bundle-clone_stop_0" [ style = bold] - "rabbitmq-bundle-clone_confirmed-pre_notify_stop_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq-bundle-clone_post_notify_running_0" -> "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style = bold] --"rabbitmq-bundle-clone_post_notify_running_0" -> "rabbitmq_post_notify_running_0 rabbitmq-bundle-0" [ style = bold] --"rabbitmq-bundle-clone_post_notify_running_0" -> "rabbitmq_post_notify_running_0 rabbitmq-bundle-1" [ style = bold] --"rabbitmq-bundle-clone_post_notify_running_0" -> "rabbitmq_post_notify_running_0 rabbitmq-bundle-2" [ style = bold] - "rabbitmq-bundle-clone_post_notify_running_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq-bundle-clone_post_notify_stopped_0" -> "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" [ style = bold] - "rabbitmq-bundle-clone_post_notify_stopped_0" -> "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-1" [ style = bold] - "rabbitmq-bundle-clone_post_notify_stopped_0" -> "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-2" [ style = bold] - "rabbitmq-bundle-clone_post_notify_stopped_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq-bundle-clone_pre_notify_start_0" -> "rabbitmq-bundle-clone_confirmed-pre_notify_start_0" [ style = bold] --"rabbitmq-bundle-clone_pre_notify_start_0" -> "rabbitmq_pre_notify_start_0 rabbitmq-bundle-1" [ style = bold] --"rabbitmq-bundle-clone_pre_notify_start_0" -> "rabbitmq_pre_notify_start_0 rabbitmq-bundle-2" [ style = bold] - "rabbitmq-bundle-clone_pre_notify_start_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq-bundle-clone_pre_notify_stop_0" -> "rabbitmq-bundle-clone_confirmed-pre_notify_stop_0" [ style = bold] - "rabbitmq-bundle-clone_pre_notify_stop_0" -> "rabbitmq_pre_notify_stop_0 rabbitmq-bundle-1" [ style = bold] -@@ -168,12 +162,6 @@ digraph "g" { - "rabbitmq_confirmed-post_notify_stonith_0" -> "all_stopped" [ style = bold] - "rabbitmq_confirmed-post_notify_stonith_0" [ style=bold color="green" fontcolor="orange"] - "rabbitmq_monitor_10000 rabbitmq-bundle-0" [ style=dashed color="red" fontcolor="black"] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-0" -> "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style = bold] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-0" [ style=bold color="green" fontcolor="black"] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-1" -> "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style = bold] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-1" [ style=bold color="green" fontcolor="black"] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-2" -> "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style = bold] --"rabbitmq_post_notify_running_0 rabbitmq-bundle-2" [ style=bold color="green" fontcolor="black"] - "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-1" -> "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" [ style = bold] - "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-1" -> "rabbitmq_confirmed-post_notify_stonith_0" [ style = bold] - "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-1" [ style=bold color="green" fontcolor="black"] -@@ -184,10 +172,6 @@ digraph "g" { - "rabbitmq_post_notify_stonith_0" -> "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-1" [ style = bold] - "rabbitmq_post_notify_stonith_0" -> "rabbitmq_post_notify_stonith_0 rabbitmq-bundle-2" [ style = bold] - "rabbitmq_post_notify_stonith_0" [ style=bold color="green" fontcolor="orange"] --"rabbitmq_pre_notify_start_0 rabbitmq-bundle-1" -> "rabbitmq-bundle-clone_confirmed-pre_notify_start_0" [ style = bold] --"rabbitmq_pre_notify_start_0 rabbitmq-bundle-1" [ style=bold color="green" fontcolor="black"] --"rabbitmq_pre_notify_start_0 rabbitmq-bundle-2" -> "rabbitmq-bundle-clone_confirmed-pre_notify_start_0" [ style = bold] --"rabbitmq_pre_notify_start_0 rabbitmq-bundle-2" [ style=bold color="green" fontcolor="black"] - "rabbitmq_pre_notify_stop_0 rabbitmq-bundle-1" -> "rabbitmq-bundle-clone_confirmed-pre_notify_stop_0" [ style = bold] - "rabbitmq_pre_notify_stop_0 rabbitmq-bundle-1" [ style=bold color="green" fontcolor="black"] - "rabbitmq_pre_notify_stop_0 rabbitmq-bundle-2" -> "rabbitmq-bundle-clone_confirmed-pre_notify_stop_0" [ style = bold] -@@ -231,9 +215,6 @@ digraph "g" { - "redis-bundle-master_confirmed-post_notify_promoted_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_confirmed-post_notify_running_0" -> "redis-bundle-master_pre_notify_promote_0" [ style = bold] - "redis-bundle-master_confirmed-post_notify_running_0" -> "redis-bundle_running_0" [ style = bold] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_20000 redis-bundle-1" [ style = bold] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_45000 redis-bundle-0" [ style = dashed] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_60000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_running_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "redis-bundle-master_pre_notify_promote_0" [ style = bold] -@@ -271,9 +252,6 @@ digraph "g" { - "redis-bundle-master_post_notify_promoted_0" -> "redis_post_notify_promoted_0 redis-bundle-2" [ style = bold] - "redis-bundle-master_post_notify_promoted_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_post_notify_running_0" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] --"redis-bundle-master_post_notify_running_0" -> "redis_post_notify_running_0 redis-bundle-0" [ style = bold] --"redis-bundle-master_post_notify_running_0" -> "redis_post_notify_running_0 redis-bundle-1" [ style = bold] --"redis-bundle-master_post_notify_running_0" -> "redis_post_notify_running_0 redis-bundle-2" [ style = bold] - "redis-bundle-master_post_notify_running_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_post_notify_stopped_0" -> "redis-bundle-master_confirmed-post_notify_stopped_0" [ style = bold] - "redis-bundle-master_post_notify_stopped_0" -> "redis_post_notify_stonith_0 redis-bundle-1" [ style = bold] -@@ -289,8 +267,6 @@ digraph "g" { - "redis-bundle-master_pre_notify_promote_0" -> "redis_pre_notify_promote_0 redis-bundle-2" [ style = bold] - "redis-bundle-master_pre_notify_promote_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_pre_notify_start_0" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] --"redis-bundle-master_pre_notify_start_0" -> "redis_pre_notify_start_0 redis-bundle-1" [ style = bold] --"redis-bundle-master_pre_notify_start_0" -> "redis_pre_notify_start_0 redis-bundle-2" [ style = bold] - "redis-bundle-master_pre_notify_start_0" [ style=bold color="green" fontcolor="orange"] - "redis-bundle-master_pre_notify_stop_0" -> "redis-bundle-master_confirmed-pre_notify_stop_0" [ style = bold] - "redis-bundle-master_pre_notify_stop_0" -> "redis_pre_notify_stop_0 redis-bundle-1" [ style = bold] -@@ -355,12 +331,6 @@ digraph "g" { - "redis_post_notify_promoted_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] - "redis_post_notify_promoted_0 redis-bundle-2" -> "redis-bundle-master_confirmed-post_notify_promoted_0" [ style = bold] - "redis_post_notify_promoted_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] --"redis_post_notify_running_0 redis-bundle-0" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] --"redis_post_notify_running_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] --"redis_post_notify_running_0 redis-bundle-1" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] --"redis_post_notify_running_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] --"redis_post_notify_running_0 redis-bundle-2" -> "redis-bundle-master_confirmed-post_notify_running_0" [ style = bold] --"redis_post_notify_running_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] - "redis_post_notify_stonith_0 redis-bundle-1" -> "redis-bundle-master_confirmed-post_notify_stopped_0" [ style = bold] - "redis_post_notify_stonith_0 redis-bundle-1" -> "redis_confirmed-post_notify_stonith_0" [ style = bold] - "redis_post_notify_stonith_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] -@@ -381,10 +351,6 @@ digraph "g" { - "redis_pre_notify_promote_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] - "redis_pre_notify_promote_0 redis-bundle-2" -> "redis-bundle-master_confirmed-pre_notify_promote_0" [ style = bold] - "redis_pre_notify_promote_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] --"redis_pre_notify_start_0 redis-bundle-1" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] --"redis_pre_notify_start_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] --"redis_pre_notify_start_0 redis-bundle-2" -> "redis-bundle-master_confirmed-pre_notify_start_0" [ style = bold] --"redis_pre_notify_start_0 redis-bundle-2" [ style=bold color="green" fontcolor="black"] - "redis_pre_notify_stop_0 redis-bundle-1" -> "redis-bundle-master_confirmed-pre_notify_stop_0" [ style = bold] - "redis_pre_notify_stop_0 redis-bundle-1" [ style=bold color="green" fontcolor="black"] - "redis_pre_notify_stop_0 redis-bundle-2" -> "redis-bundle-master_confirmed-pre_notify_stop_0" [ style = bold] -diff --git a/pengine/test10/bundle-order-fencing.exp b/pengine/test10/bundle-order-fencing.exp -index dc4c5c9..599c299 100644 ---- a/pengine/test10/bundle-order-fencing.exp -+++ b/pengine/test10/bundle-order-fencing.exp -@@ -1,19 +1,6 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- - - - -@@ -30,7 +17,7 @@ - - - -- -+ - - - -@@ -42,10 +29,10 @@ - - - -- -+ - - -- -+ - - - -@@ -57,11 +44,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -70,37 +57,11 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ - - - -- -+ - - - -@@ -112,11 +73,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -125,37 +86,11 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ - - - -- -+ - - - -@@ -167,7 +102,7 @@ - - - -- -+ - - - -@@ -185,7 +120,7 @@ - - - -- -+ - - - -@@ -200,7 +135,7 @@ - - - -- -+ - - - -@@ -211,14 +146,14 @@ - - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -226,7 +161,7 @@ - - - -- -+ - - - -@@ -241,7 +176,7 @@ - - - -- -+ - - - -@@ -259,7 +194,7 @@ - - - -- -+ - - - -@@ -269,18 +204,9 @@ - - - -- -- -- -- -- -- -- -- -- - - -- -+ - - - -@@ -295,7 +221,7 @@ - - - -- -+ - - - -@@ -305,15 +231,9 @@ - - - -- -- -- -- -- -- - - -- -+ - - - -@@ -325,7 +245,7 @@ - - - -- -+ - - - -@@ -337,7 +257,7 @@ - - - -- -+ - - - -@@ -355,7 +275,7 @@ - - - -- -+ - - - -@@ -373,7 +293,7 @@ - - - -- -+ - - - -@@ -381,7 +301,7 @@ - - - -- -+ - - - -@@ -390,7 +310,7 @@ - - - -- -+ - - - -@@ -399,7 +319,7 @@ - - - -- -+ - - - -@@ -408,7 +328,7 @@ - - - -- -+ - - - -@@ -417,7 +337,7 @@ - - - -- -+ - - - -@@ -435,7 +355,7 @@ - - - -- -+ - - - -@@ -447,7 +367,7 @@ - - - -- -+ - - - -@@ -462,7 +382,7 @@ - - - -- -+ - - - -@@ -474,7 +394,7 @@ - - - -- -+ - - - -@@ -489,7 +409,7 @@ - - - -- -+ - - - -@@ -507,7 +427,7 @@ - - - -- -+ - - - -@@ -519,7 +439,7 @@ - - - -- -+ - - - -@@ -537,7 +457,7 @@ - - - -- -+ - - - -@@ -555,7 +475,7 @@ - - - -- -+ - - - -@@ -563,7 +483,7 @@ - - - -- -+ - - - -@@ -572,7 +492,7 @@ - - - -- -+ - - - -@@ -581,7 +501,7 @@ - - - -- -+ - - - -@@ -590,7 +510,7 @@ - - - -- -+ - - - -@@ -599,11 +519,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -612,11 +532,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -625,20 +545,7 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ - - - -@@ -656,7 +563,7 @@ - - - -- -+ - - - -@@ -668,10 +575,10 @@ - - - -- -+ - - -- -+ - - - -@@ -686,10 +593,10 @@ - - - -- -+ - - -- -+ - - - -@@ -698,11 +605,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -711,11 +618,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -724,11 +631,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -737,11 +644,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -750,11 +657,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -763,37 +670,11 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ - - - -- -+ - - - -@@ -805,7 +686,7 @@ - - - -- -+ - - - -@@ -817,9 +698,6 @@ - - - -- -- -- - - - -@@ -833,11 +711,11 @@ - - - -- -+ - - - -- -+ - - - -@@ -855,7 +733,7 @@ - - - -- -+ - - - -@@ -864,7 +742,7 @@ - - - -- -+ - - - -@@ -873,11 +751,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -886,11 +764,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -899,11 +777,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -912,11 +790,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -925,11 +803,11 @@ - - - -- -+ - -- -+ - -- -+ - - - -@@ -938,37 +816,11 @@ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ - - - -- -+ - - - -@@ -980,7 +832,7 @@ - - - -- -+ - - - -@@ -991,14 +843,14 @@ - - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -1013,7 +865,7 @@ - - - -- -+ - - - -@@ -1024,14 +876,14 @@ - - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -1039,7 +891,7 @@ - - - -- -+ - - - -@@ -1054,7 +906,7 @@ - - - -- -+ - - - -@@ -1069,7 +921,7 @@ - - - -- -+ - - - -@@ -1080,17 +932,17 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -1105,7 +957,7 @@ - - - -- -+ - - - -@@ -1116,17 +968,17 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -1144,7 +996,7 @@ - - - -- -+ - - - -@@ -1156,7 +1008,7 @@ - - - -- -+ - - - -@@ -1180,7 +1032,7 @@ - - - -- -+ - - - -@@ -1198,7 +1050,7 @@ - - - -- -+ - - - -@@ -1213,7 +1065,7 @@ - - - -- -+ - - - -@@ -1224,14 +1076,14 @@ - - - -- -+ - - -- -+ - - - -- -+ - - - -@@ -1243,7 +1095,7 @@ - - - -- -+ - - - -@@ -1258,7 +1110,7 @@ - - - -- -+ - - - -@@ -1279,7 +1131,7 @@ - - - -- -+ - - - -@@ -1289,18 +1141,9 @@ - - - -- -- -- -- -- -- -- -- -- - - -- -+ - - - -@@ -1315,7 +1158,7 @@ - - - -- -+ - - - -@@ -1325,15 +1168,9 @@ - - - -- -- -- -- -- -- - - -- -+ - - - -@@ -1348,7 +1185,7 @@ - - - -- -+ - - - -@@ -1360,7 +1197,7 @@ - - - -- -+ - - - -@@ -1381,7 +1218,7 @@ - - - -- -+ - - - -@@ -1399,7 +1236,7 @@ - - - -- -+ - - - -@@ -1407,7 +1244,7 @@ - - - -- -+ - - - -@@ -1416,7 +1253,7 @@ - - - -- -+ - - - -@@ -1425,7 +1262,7 @@ - - - -- -+ - - - -@@ -1434,7 +1271,7 @@ - - - -- -+ - - - -@@ -1443,7 +1280,7 @@ - - - -- -+ - - - -@@ -1456,7 +1293,7 @@ - - - -- -+ - - - -@@ -1472,7 +1309,7 @@ - - - -- -+ - - - -@@ -1487,7 +1324,7 @@ - - - -- -+ - - - -@@ -1500,7 +1337,7 @@ - - - -- -+ - - - -@@ -1516,7 +1353,7 @@ - - - -- -+ - - - -@@ -1531,7 +1368,7 @@ - - - -- -+ - - - -@@ -1544,7 +1381,7 @@ - - - -- -+ - - - -@@ -1560,7 +1397,7 @@ - - - -- -+ - - - -@@ -1575,7 +1412,7 @@ - - - -- -+ - - - -@@ -1590,7 +1427,7 @@ - - - -- -+ - - - -@@ -1603,7 +1440,7 @@ - - - -- -+ - - - -@@ -1616,7 +1453,7 @@ - - - -- -+ - - - -@@ -1624,7 +1461,7 @@ - - - -- -+ - - - -@@ -1637,7 +1474,7 @@ - - - -- -+ - - - -@@ -1650,7 +1487,7 @@ - - - -- -+ - - - -@@ -1658,7 +1495,7 @@ - - - -- -+ - - - -@@ -1673,7 +1510,7 @@ - - - -- -+ - - - -@@ -1688,7 +1525,7 @@ - - - -- -+ - - - -@@ -1703,7 +1540,7 @@ - - - -- -+ - - - -@@ -1724,7 +1561,7 @@ - - - -- -+ - - - -@@ -1736,7 +1573,7 @@ - - - -- -+ - - - -@@ -1744,7 +1581,7 @@ - - - -- -+ - - - -@@ -1759,7 +1596,7 @@ - - - -- -+ - - - -@@ -1767,7 +1604,7 @@ - - - -- -+ - - - -@@ -1779,7 +1616,7 @@ - - - -- -+ - - - -@@ -1797,7 +1634,7 @@ - - - -- -+ - - - -@@ -1812,7 +1649,7 @@ - - - -- -+ - - - -@@ -1824,7 +1661,7 @@ - - - -- -+ - - - -@@ -1836,7 +1673,7 @@ - - - -- -+ - - - -@@ -1851,7 +1688,7 @@ - - - -- -+ - - - -@@ -1866,7 +1703,7 @@ - - - -- -+ - - - -@@ -1874,7 +1711,7 @@ - - - -- -+ - - - -@@ -1889,7 +1726,7 @@ - - - -- -+ - - - -@@ -1901,7 +1738,7 @@ - - - -- -+ - - - -@@ -1913,7 +1750,7 @@ - - - -- -+ - - - -@@ -1928,7 +1765,7 @@ - - - -- -+ - - - -@@ -1943,7 +1780,7 @@ - - - -- -+ - - - -@@ -1951,7 +1788,7 @@ - - - -- -+ - - - -@@ -1963,7 +1800,7 @@ - - - -- -+ - - - -@@ -1971,7 +1808,7 @@ - - - -- -+ - - - -@@ -2040,7 +1877,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-fencing.summary b/pengine/test10/bundle-order-fencing.summary -index 0457f83..d398a12 100644 ---- a/pengine/test10/bundle-order-fencing.summary -+++ b/pengine/test10/bundle-order-fencing.summary -@@ -147,8 +147,6 @@ Executing cluster transition: - * Pseudo action: redis-bundle-docker-0_stop_0 - * Pseudo action: rabbitmq-bundle_stopped_0 - * Pseudo action: rabbitmq_notified_0 -- * Resource action: rabbitmq notify on rabbitmq-bundle-1 -- * Resource action: rabbitmq notify on rabbitmq-bundle-2 - * Pseudo action: rabbitmq-bundle-clone_confirmed-pre_notify_start_0 - * Pseudo action: rabbitmq-bundle-clone_start_0 - * Pseudo action: galera-bundle-master_running_0 -@@ -164,22 +162,14 @@ Executing cluster transition: - * Pseudo action: redis-bundle-master_pre_notify_start_0 - * Pseudo action: redis-bundle_stopped_0 - * Pseudo action: redis-bundle_start_0 -- * Resource action: rabbitmq notify on rabbitmq-bundle-0 -- * Resource action: rabbitmq notify on rabbitmq-bundle-1 -- * Resource action: rabbitmq notify on rabbitmq-bundle-2 - * Pseudo action: rabbitmq-bundle-clone_confirmed-post_notify_running_0 - * Pseudo action: redis_notified_0 -- * Resource action: redis notify on redis-bundle-1 -- * Resource action: redis notify on redis-bundle-2 - * Pseudo action: redis-bundle-master_confirmed-pre_notify_start_0 - * Pseudo action: redis-bundle-master_start_0 - * Pseudo action: rabbitmq-bundle_running_0 - * Pseudo action: all_stopped - * Pseudo action: redis-bundle-master_running_0 - * Pseudo action: redis-bundle-master_post_notify_running_0 -- * Resource action: redis notify on redis-bundle-0 -- * Resource action: redis notify on redis-bundle-1 -- * Resource action: redis notify on redis-bundle-2 - * Pseudo action: redis-bundle-master_confirmed-post_notify_running_0 - * Pseudo action: redis-bundle_running_0 - * Pseudo action: redis-bundle-master_pre_notify_promote_0 -diff --git a/pengine/test10/bundle-order-partial-start-2.exp b/pengine/test10/bundle-order-partial-start-2.exp -index afba801..bf9a0b0 100644 ---- a/pengine/test10/bundle-order-partial-start-2.exp -+++ b/pengine/test10/bundle-order-partial-start-2.exp -@@ -315,7 +315,7 @@ - - - -- -+ - - - -@@ -328,7 +328,7 @@ - - - -- -+ - - - -@@ -379,7 +379,7 @@ - - - -- -+ - - - -@@ -409,7 +409,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-partial-start.exp b/pengine/test10/bundle-order-partial-start.exp -index cb10bad..8e28f19 100644 ---- a/pengine/test10/bundle-order-partial-start.exp -+++ b/pengine/test10/bundle-order-partial-start.exp -@@ -296,7 +296,7 @@ - - - -- -+ - - - -@@ -309,7 +309,7 @@ - - - -- -+ - - - -@@ -360,7 +360,7 @@ - - - -- -+ - - - -@@ -390,7 +390,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-partial-stop.dot b/pengine/test10/bundle-order-partial-stop.dot -index 5d0c039..6bad4ab 100644 ---- a/pengine/test10/bundle-order-partial-stop.dot -+++ b/pengine/test10/bundle-order-partial-stop.dot -@@ -112,7 +112,6 @@ digraph "g" { - "rabbitmq-bundle-0_stop_0 undercloud" -> "do_shutdown undercloud" [ style = bold] - "rabbitmq-bundle-0_stop_0 undercloud" -> "rabbitmq-bundle-docker-0_stop_0 undercloud" [ style = bold] - "rabbitmq-bundle-0_stop_0 undercloud" [ style=bold color="green" fontcolor="black"] --"rabbitmq-bundle-clone_confirmed-post_notify_running_0" -> "rabbitmq_monitor_10000 rabbitmq-bundle-0" [ style = dashed] - "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "rabbitmq-bundle-clone_pre_notify_start_0" [ style = dashed] -@@ -178,8 +177,6 @@ digraph "g" { - "redis-bundle-master_confirmed-post_notify_demoted_0" -> "redis_monitor_45000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_demoted_0" -> "redis_monitor_60000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_demoted_0" [ style=bold color="green" fontcolor="orange"] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_45000 redis-bundle-0" [ style = dashed] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_60000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "redis-bundle-master_pre_notify_start_0" [ style = dashed] -diff --git a/pengine/test10/bundle-order-partial-stop.exp b/pengine/test10/bundle-order-partial-stop.exp -index 6119950..89d87aa 100644 ---- a/pengine/test10/bundle-order-partial-stop.exp -+++ b/pengine/test10/bundle-order-partial-stop.exp -@@ -3,7 +3,7 @@ - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -@@ -280,7 +280,7 @@ - - - -- -+ - - - -@@ -293,7 +293,7 @@ - - - -- -+ - - - -@@ -306,7 +306,7 @@ - - - -- -+ - - - -@@ -319,7 +319,7 @@ - - - -- -+ - - - -@@ -338,7 +338,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-startup-clone.dot b/pengine/test10/bundle-order-startup-clone.dot -index 8426bd2..a23a2fe 100644 ---- a/pengine/test10/bundle-order-startup-clone.dot -+++ b/pengine/test10/bundle-order-startup-clone.dot -@@ -118,9 +118,6 @@ digraph "g" { - "redis:0_start_0 redis-bundle-0" -> "redis:0_monitor_60000 redis-bundle-0" [ style = bold] - "redis:0_start_0 redis-bundle-0" [ style=bold color="green" fontcolor="black"] - "storage-clone_confirmed-post_notify_running_0" -> "galera-bundle_start_0" [ style = dashed] --"storage-clone_confirmed-post_notify_running_0" -> "storage:0_monitor_30000 metal-1" [ style = dashed] --"storage-clone_confirmed-post_notify_running_0" -> "storage:1_monitor_30000 metal-2" [ style = dashed] --"storage-clone_confirmed-post_notify_running_0" -> "storage:2_monitor_30000 metal-3" [ style = dashed] - "storage-clone_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "storage-clone_confirmed-pre_notify_start_0" -> "storage-clone_post_notify_running_0" [ style = dashed] - "storage-clone_confirmed-pre_notify_start_0" -> "storage-clone_start_0" [ style = dashed] -diff --git a/pengine/test10/bundle-order-stop-clone.exp b/pengine/test10/bundle-order-stop-clone.exp -index 3e3fe77..3e66f54 100644 ---- a/pengine/test10/bundle-order-stop-clone.exp -+++ b/pengine/test10/bundle-order-stop-clone.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -88,10 +88,10 @@ - - - -- -+ - - -- -+ - - - -@@ -121,13 +121,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-stop-on-remote.exp b/pengine/test10/bundle-order-stop-on-remote.exp -index db5386b..96588dc 100644 ---- a/pengine/test10/bundle-order-stop-on-remote.exp -+++ b/pengine/test10/bundle-order-stop-on-remote.exp -@@ -588,7 +588,7 @@ - - - -- -+ - - - -@@ -601,7 +601,7 @@ - - - -- -+ - - - -@@ -614,7 +614,7 @@ - - - -- -+ - - - -@@ -627,7 +627,7 @@ - - - -- -+ - - - -@@ -675,7 +675,7 @@ - - - -- -+ - - - -@@ -688,7 +688,7 @@ - - - -- -+ - - - -@@ -701,7 +701,7 @@ - - - -- -+ - - - -@@ -780,7 +780,7 @@ - - - -- -+ - - - -@@ -793,7 +793,7 @@ - - - -- -+ - - - -@@ -806,7 +806,7 @@ - - - -- -+ - - - -@@ -819,7 +819,7 @@ - - - -- -+ - - - -@@ -841,13 +841,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -877,13 +877,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -940,13 +940,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -976,10 +976,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/bundle-order-stop.dot b/pengine/test10/bundle-order-stop.dot -index 5d0c039..6bad4ab 100644 ---- a/pengine/test10/bundle-order-stop.dot -+++ b/pengine/test10/bundle-order-stop.dot -@@ -112,7 +112,6 @@ digraph "g" { - "rabbitmq-bundle-0_stop_0 undercloud" -> "do_shutdown undercloud" [ style = bold] - "rabbitmq-bundle-0_stop_0 undercloud" -> "rabbitmq-bundle-docker-0_stop_0 undercloud" [ style = bold] - "rabbitmq-bundle-0_stop_0 undercloud" [ style=bold color="green" fontcolor="black"] --"rabbitmq-bundle-clone_confirmed-post_notify_running_0" -> "rabbitmq_monitor_10000 rabbitmq-bundle-0" [ style = dashed] - "rabbitmq-bundle-clone_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "rabbitmq-bundle-clone_confirmed-post_notify_stopped_0" -> "rabbitmq-bundle-clone_pre_notify_start_0" [ style = dashed] -@@ -178,8 +177,6 @@ digraph "g" { - "redis-bundle-master_confirmed-post_notify_demoted_0" -> "redis_monitor_45000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_demoted_0" -> "redis_monitor_60000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_demoted_0" [ style=bold color="green" fontcolor="orange"] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_45000 redis-bundle-0" [ style = dashed] --"redis-bundle-master_confirmed-post_notify_running_0" -> "redis_monitor_60000 redis-bundle-0" [ style = dashed] - "redis-bundle-master_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "all_stopped" [ style = bold] - "redis-bundle-master_confirmed-post_notify_stopped_0" -> "redis-bundle-master_pre_notify_start_0" [ style = dashed] -diff --git a/pengine/test10/bundle-order-stop.exp b/pengine/test10/bundle-order-stop.exp -index 6119950..89d87aa 100644 ---- a/pengine/test10/bundle-order-stop.exp -+++ b/pengine/test10/bundle-order-stop.exp -@@ -3,7 +3,7 @@ - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -@@ -280,7 +280,7 @@ - - - -- -+ - - - -@@ -293,7 +293,7 @@ - - - -- -+ - - - -@@ -306,7 +306,7 @@ - - - -- -+ - - - -@@ -319,7 +319,7 @@ - - - -- -+ - - - -@@ -338,7 +338,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/colo_master_w_native.exp b/pengine/test10/colo_master_w_native.exp -index 2803879..ffa773f 100644 ---- a/pengine/test10/colo_master_w_native.exp -+++ b/pengine/test10/colo_master_w_native.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -85,7 +85,7 @@ - - - -- -+ - - - -@@ -98,7 +98,7 @@ - - - -- -+ - - - -@@ -111,7 +111,7 @@ - - - -- -+ - - - -@@ -124,7 +124,7 @@ - - - -- -+ - - - -@@ -171,10 +171,10 @@ - - - -- -+ - - -- -+ - - - -@@ -204,10 +204,10 @@ - - - -- -+ - - -- -+ - - - -@@ -257,10 +257,10 @@ - - - -- -+ - - -- -+ - - - -@@ -290,10 +290,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/colo_slave_w_native.exp b/pengine/test10/colo_slave_w_native.exp -index e5ec984..a548923 100644 ---- a/pengine/test10/colo_slave_w_native.exp -+++ b/pengine/test10/colo_slave_w_native.exp -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -49,7 +49,7 @@ - - - -- -+ - - - -@@ -62,7 +62,7 @@ - - - -- -+ - - - -@@ -75,7 +75,7 @@ - - - -- -+ - - - -@@ -120,7 +120,7 @@ - - - -- -+ - - - -@@ -133,7 +133,7 @@ - - - -- -+ - - - -@@ -146,7 +146,7 @@ - - - -- -+ - - - -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -206,10 +206,10 @@ - - - -- -+ - - -- -+ - - - -@@ -239,10 +239,10 @@ - - - -- -+ - - -- -+ - - - -@@ -292,10 +292,10 @@ - - - -- -+ - - -- -+ - - - -@@ -325,10 +325,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/group-dependents.exp b/pengine/test10/group-dependents.exp -index 607e9d7..0df62f0 100644 ---- a/pengine/test10/group-dependents.exp -+++ b/pengine/test10/group-dependents.exp -@@ -1262,7 +1262,7 @@ - - - -- -+ - - - -@@ -1275,7 +1275,7 @@ - - - -- -+ - - - -@@ -1288,7 +1288,7 @@ - - - -- -+ - - - -@@ -1301,7 +1301,7 @@ - - - -- -+ - - - -@@ -1346,7 +1346,7 @@ - - - -- -+ - - - -@@ -1359,7 +1359,7 @@ - - - -- -+ - - - -@@ -1372,7 +1372,7 @@ - - - -- -+ - - - -@@ -1385,7 +1385,7 @@ - - - -- -+ - - - -@@ -1432,10 +1432,10 @@ - - - -- -+ - - -- -+ - - - -@@ -1465,10 +1465,10 @@ - - - -- -+ - - -- -+ - - - -@@ -1521,10 +1521,10 @@ - - - -- -+ - - -- -+ - - - -@@ -1554,10 +1554,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/inc10.exp b/pengine/test10/inc10.exp -index 3779287..742d124 100644 ---- a/pengine/test10/inc10.exp -+++ b/pengine/test10/inc10.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -89,7 +89,7 @@ - - - -- -+ - - - -@@ -102,7 +102,7 @@ - - - -- -+ - - - -@@ -115,7 +115,7 @@ - - - -- -+ - - - -@@ -128,7 +128,7 @@ - - - -- -+ - - - -@@ -150,13 +150,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -186,16 +186,16 @@ - - - -- -+ - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/interleave-pseudo-stop.exp b/pengine/test10/interleave-pseudo-stop.exp -index 63217e8..97faf46 100644 ---- a/pengine/test10/interleave-pseudo-stop.exp -+++ b/pengine/test10/interleave-pseudo-stop.exp -@@ -43,7 +43,7 @@ - - - -- -+ - - - -@@ -159,7 +159,7 @@ - - - -- -+ - - - -@@ -209,7 +209,7 @@ - - - -- -+ - - - -@@ -319,7 +319,7 @@ - - - -- -+ - - - -@@ -363,7 +363,7 @@ - - - -- -+ - - - -@@ -473,7 +473,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/interleave-stop.exp b/pengine/test10/interleave-stop.exp -index a4c524f..35a8428 100644 ---- a/pengine/test10/interleave-stop.exp -+++ b/pengine/test10/interleave-stop.exp -@@ -37,7 +37,7 @@ - - - -- -+ - - - -@@ -50,7 +50,7 @@ - - - -- -+ - - - -@@ -63,7 +63,7 @@ - - - -- -+ - - - -@@ -104,7 +104,7 @@ - - - -- -+ - - - -@@ -134,10 +134,10 @@ - - - -- -+ - - -- -+ - - - -@@ -184,7 +184,7 @@ - - - -- -+ - - - -@@ -197,7 +197,7 @@ - - - -- -+ - - - -@@ -210,7 +210,7 @@ - - - -- -+ - - - -@@ -245,7 +245,7 @@ - - - -- -+ - - - -@@ -275,10 +275,10 @@ - - - -- -+ - - -- -+ - - - -@@ -319,7 +319,7 @@ - - - -- -+ - - - -@@ -332,7 +332,7 @@ - - - -- -+ - - - -@@ -345,7 +345,7 @@ - - - -- -+ - - - -@@ -380,7 +380,7 @@ - - - -- -+ - - - -@@ -410,10 +410,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-13.exp b/pengine/test10/master-13.exp -index 1e09ee1..94b8d59 100644 ---- a/pengine/test10/master-13.exp -+++ b/pengine/test10/master-13.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -110,7 +110,7 @@ - - - -- -+ - - - -@@ -123,7 +123,7 @@ - - - -- -+ - - - -@@ -136,7 +136,7 @@ - - - -- -+ - - - -@@ -202,10 +202,10 @@ - - - -- -+ - - -- -+ - - - -@@ -235,10 +235,10 @@ - - - -- -+ - - -- -+ - - - -@@ -288,10 +288,10 @@ - - - -- -+ - - -- -+ - - - -@@ -321,10 +321,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-demote.exp b/pengine/test10/master-demote.exp -index 8909056..91cd0bc 100644 ---- a/pengine/test10/master-demote.exp -+++ b/pengine/test10/master-demote.exp -@@ -23,7 +23,7 @@ - - - -- -+ - - - -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -49,7 +49,7 @@ - - - -- -+ - - - -@@ -62,7 +62,7 @@ - - - -- -+ - - - -@@ -113,10 +113,10 @@ - - - -- -+ - - -- -+ - - - -@@ -146,10 +146,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-dependent-ban.exp b/pengine/test10/master-dependent-ban.exp -index 99a6e94..caea6e3 100644 ---- a/pengine/test10/master-dependent-ban.exp -+++ b/pengine/test10/master-dependent-ban.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -56,7 +56,7 @@ - - - -- -+ - - - -@@ -69,7 +69,7 @@ - - - -- -+ - - - -@@ -104,10 +104,10 @@ - - - -- -+ - - -- -+ - - - -@@ -137,10 +137,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-failed-demote.exp b/pengine/test10/master-failed-demote.exp -index 1d27dc5..7cbfdfa 100644 ---- a/pengine/test10/master-failed-demote.exp -+++ b/pengine/test10/master-failed-demote.exp -@@ -28,7 +28,7 @@ - - - -- -+ - - - -@@ -81,7 +81,7 @@ - - - -- -+ - - - -@@ -94,7 +94,7 @@ - - - -- -+ - - - -@@ -107,7 +107,7 @@ - - - -- -+ - - - -@@ -120,7 +120,7 @@ - - - -- -+ - - - -@@ -177,7 +177,7 @@ - - - -- -+ - - - -@@ -190,7 +190,7 @@ - - - -- -+ - - - -@@ -203,7 +203,7 @@ - - - -- -+ - - - -@@ -216,7 +216,7 @@ - - - -- -+ - - - -@@ -285,10 +285,10 @@ - - - -- -+ - - -- -+ - - - -@@ -318,10 +318,10 @@ - - - -- -+ - - -- -+ - - - -@@ -375,10 +375,10 @@ - - - -- -+ - - -- -+ - - - -@@ -408,13 +408,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-move.exp b/pengine/test10/master-move.exp -index e77005f..536e583 100644 ---- a/pengine/test10/master-move.exp -+++ b/pengine/test10/master-move.exp -@@ -182,7 +182,7 @@ - - - -- -+ - - - -@@ -195,7 +195,7 @@ - - - -- -+ - - - -@@ -208,7 +208,7 @@ - - - -- -+ - - - -@@ -221,7 +221,7 @@ - - - -- -+ - - - -@@ -278,7 +278,7 @@ - - - -- -+ - - - -@@ -291,7 +291,7 @@ - - - -- -+ - - - -@@ -304,7 +304,7 @@ - - - -- -+ - - - -@@ -317,7 +317,7 @@ - - - -- -+ - - - -@@ -383,10 +383,10 @@ - - - -- -+ - - -- -+ - - - -@@ -416,10 +416,10 @@ - - - -- -+ - - -- -+ - - - -@@ -472,10 +472,10 @@ - - - -- -+ - - -- -+ - - - -@@ -505,10 +505,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-notify.exp b/pengine/test10/master-notify.exp -index 0f6295c..7a73136 100644 ---- a/pengine/test10/master-notify.exp -+++ b/pengine/test10/master-notify.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -79,7 +79,7 @@ - - - -- -+ - - - -@@ -101,13 +101,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -@@ -137,13 +137,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/master-partially-demoted-group.exp b/pengine/test10/master-partially-demoted-group.exp -index fecf3c5..32a30fe 100644 ---- a/pengine/test10/master-partially-demoted-group.exp -+++ b/pengine/test10/master-partially-demoted-group.exp -@@ -493,7 +493,7 @@ - - - -- -+ - - - -@@ -506,7 +506,7 @@ - - - -- -+ - - - -@@ -519,7 +519,7 @@ - - - -- -+ - - - -@@ -532,7 +532,7 @@ - - - -- -+ - - - -@@ -577,7 +577,7 @@ - - - -- -+ - - - -@@ -590,7 +590,7 @@ - - - -- -+ - - - -@@ -603,7 +603,7 @@ - - - -- -+ - - - -@@ -616,7 +616,7 @@ - - - -- -+ - - - -@@ -670,10 +670,10 @@ - - - -- -+ - - -- -+ - - - -@@ -703,10 +703,10 @@ - - - -- -+ - - -- -+ - - - -@@ -759,10 +759,10 @@ - - - -- -+ - - -- -+ - - - -@@ -792,10 +792,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/novell-239082.exp b/pengine/test10/novell-239082.exp -index 9453656..c6d0221 100644 ---- a/pengine/test10/novell-239082.exp -+++ b/pengine/test10/novell-239082.exp -@@ -26,7 +26,7 @@ - - - -- -+ - - - -@@ -39,7 +39,7 @@ - - - -- -+ - - - -@@ -52,7 +52,7 @@ - - - -- -+ - - - -@@ -65,7 +65,7 @@ - - - -- -+ - - - -@@ -78,7 +78,7 @@ - - - -- -+ - - - -@@ -91,7 +91,7 @@ - - - -- -+ - - - -@@ -117,7 +117,7 @@ - - - -- -+ - - - -@@ -130,7 +130,7 @@ - - - -- -+ - - - -@@ -143,7 +143,7 @@ - - - -- -+ - - - -@@ -194,10 +194,10 @@ - - - -- -+ - - -- -+ - - - -@@ -227,10 +227,10 @@ - - - -- -+ - - -- -+ - - - -@@ -283,7 +283,7 @@ - - - -- -+ - - - -@@ -313,7 +313,7 @@ - - - -- -+ - - - -@@ -373,7 +373,7 @@ - - - -- -+ - - - -@@ -403,10 +403,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/novell-252693.exp b/pengine/test10/novell-252693.exp -index 43da979..82486d2 100644 ---- a/pengine/test10/novell-252693.exp -+++ b/pengine/test10/novell-252693.exp -@@ -77,7 +77,7 @@ - - - -- -+ - - - -@@ -90,7 +90,7 @@ - - - -- -+ - - - -@@ -103,7 +103,7 @@ - - - -- -+ - - - -@@ -138,7 +138,7 @@ - - - -- -+ - - - -@@ -168,10 +168,10 @@ - - - -- -+ - - -- -+ - - - -@@ -218,7 +218,7 @@ - - - -- -+ - - - -@@ -231,7 +231,7 @@ - - - -- -+ - - - -@@ -244,7 +244,7 @@ - - - -- -+ - - - -@@ -279,7 +279,7 @@ - - - -- -+ - - - -@@ -309,10 +309,10 @@ - - - -- -+ - - -- -+ - - - -@@ -353,7 +353,7 @@ - - - -- -+ - - - -@@ -366,7 +366,7 @@ - - - -- -+ - - - -@@ -379,7 +379,7 @@ - - - -- -+ - - - -@@ -414,7 +414,7 @@ - - - -- -+ - - - -@@ -444,10 +444,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/one-or-more-unrunnable-instances.exp b/pengine/test10/one-or-more-unrunnable-instances.exp -index 45ae3b6..ff156a4 100644 ---- a/pengine/test10/one-or-more-unrunnable-instances.exp -+++ b/pengine/test10/one-or-more-unrunnable-instances.exp -@@ -4300,7 +4300,7 @@ - - - -- -+ - - - -@@ -4345,7 +4345,7 @@ - - - -- -+ - - - -@@ -4390,7 +4390,7 @@ - - - -- -+ - - - -@@ -4444,13 +4444,13 @@ - - - -- -+ - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/order_constraint_stops_master.dot b/pengine/test10/order_constraint_stops_master.dot -index b2ebc9f..359d3fe 100644 ---- a/pengine/test10/order_constraint_stops_master.dot -+++ b/pengine/test10/order_constraint_stops_master.dot -@@ -3,7 +3,6 @@ - "MASTER_RSC_A_confirmed-post_notify_demoted_0" -> "MASTER_RSC_A_pre_notify_stop_0" [ style = bold] - "MASTER_RSC_A_confirmed-post_notify_demoted_0" -> "NATIVE_RSC_A:0_monitor_20000 fc16-builder" [ style = dashed] - "MASTER_RSC_A_confirmed-post_notify_demoted_0" [ style=bold color="green" fontcolor="orange"] --"MASTER_RSC_A_confirmed-post_notify_running_0" -> "NATIVE_RSC_A:0_monitor_20000 fc16-builder" [ style = dashed] - "MASTER_RSC_A_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "MASTER_RSC_A_confirmed-post_notify_stopped_0" -> "MASTER_RSC_A_pre_notify_start_0" [ style = dashed] - "MASTER_RSC_A_confirmed-post_notify_stopped_0" -> "NATIVE_RSC_B_stop_0 fc16-builder2" [ style = bold] -diff --git a/pengine/test10/order_constraint_stops_master.exp b/pengine/test10/order_constraint_stops_master.exp -index 551e186..22355bc 100644 ---- a/pengine/test10/order_constraint_stops_master.exp -+++ b/pengine/test10/order_constraint_stops_master.exp -@@ -3,7 +3,7 @@ - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -@@ -29,7 +29,7 @@ - - - -- -+ - - - -@@ -42,7 +42,7 @@ - - - -- -+ - - - -@@ -58,7 +58,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/order_constraint_stops_slave.dot b/pengine/test10/order_constraint_stops_slave.dot -index 90e1311..b7a48eb 100644 ---- a/pengine/test10/order_constraint_stops_slave.dot -+++ b/pengine/test10/order_constraint_stops_slave.dot -@@ -1,5 +1,4 @@ - digraph "g" { --"MASTER_RSC_A_confirmed-post_notify_running_0" -> "NATIVE_RSC_A:0_monitor_30000 fc16-builder" [ style = dashed] - "MASTER_RSC_A_confirmed-post_notify_running_0" [ style=dashed color="red" fontcolor="orange"] - "MASTER_RSC_A_confirmed-post_notify_stopped_0" -> "MASTER_RSC_A_pre_notify_start_0" [ style = dashed] - "MASTER_RSC_A_confirmed-post_notify_stopped_0" -> "NATIVE_RSC_B_stop_0 fc16-builder" [ style = bold] -diff --git a/pengine/test10/order_constraint_stops_slave.exp b/pengine/test10/order_constraint_stops_slave.exp -index 1a7d5da..96c7a72 100644 ---- a/pengine/test10/order_constraint_stops_slave.exp -+++ b/pengine/test10/order_constraint_stops_slave.exp -@@ -3,7 +3,7 @@ - - - -- -+ - - - -@@ -16,7 +16,7 @@ - - - -- -+ - - - -diff --git a/pengine/test10/probe-0.exp b/pengine/test10/probe-0.exp -index fe866a4..d65acb6 100644 ---- a/pengine/test10/probe-0.exp -+++ b/pengine/test10/probe-0.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -36,7 +36,7 @@ - - - -- -+ - - - -@@ -80,10 +80,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/probe-2.exp b/pengine/test10/probe-2.exp -index e8fbcff..72cc32a 100644 ---- a/pengine/test10/probe-2.exp -+++ b/pengine/test10/probe-2.exp -@@ -1,7 +1,7 @@ - - - -- -+ - - - -@@ -14,7 +14,7 @@ - - - -- -+ - - - -@@ -27,7 +27,7 @@ - - - -- -+ - - - -@@ -40,7 +40,7 @@ - - - -- -+ - - - -@@ -53,7 +53,7 @@ - - - -- -+ - - - -@@ -66,7 +66,7 @@ - - - -- -+ - - - -@@ -126,7 +126,7 @@ - - - -- -+ - - - -@@ -139,7 +139,7 @@ - - - -- -+ - - - -@@ -152,7 +152,7 @@ - - - -- -+ - - - -@@ -203,10 +203,10 @@ - - - -- -+ - - -- -+ - - - -@@ -236,10 +236,10 @@ - - - -- -+ - - -- -+ - - - -@@ -292,7 +292,7 @@ - - - -- -+ - - - -@@ -322,7 +322,7 @@ - - - -- -+ - - - -@@ -382,7 +382,7 @@ - - - -- -+ - - - -@@ -412,10 +412,10 @@ - - - -- -+ - - -- -+ - - - -@@ -666,7 +666,7 @@ - - - -- -+ - - - -@@ -679,7 +679,7 @@ - - - -- -+ - - - -@@ -692,7 +692,7 @@ - - - -- -+ - - - -@@ -727,7 +727,7 @@ - - - -- -+ - - - -@@ -757,10 +757,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-recover-all.exp b/pengine/test10/remote-recover-all.exp -index 556ccfd..fd2cf82 100644 ---- a/pengine/test10/remote-recover-all.exp -+++ b/pengine/test10/remote-recover-all.exp -@@ -310,7 +310,7 @@ - - - -- -+ - - - -@@ -339,7 +339,7 @@ - - - -- -+ - - - -@@ -410,10 +410,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-recover-connection.exp b/pengine/test10/remote-recover-connection.exp -index 40338b4..a9dd475 100644 ---- a/pengine/test10/remote-recover-connection.exp -+++ b/pengine/test10/remote-recover-connection.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -216,7 +216,7 @@ - - - -- -+ - - - -@@ -287,10 +287,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-recover-no-resources.exp b/pengine/test10/remote-recover-no-resources.exp -index 0a57e27..09b012b 100644 ---- a/pengine/test10/remote-recover-no-resources.exp -+++ b/pengine/test10/remote-recover-no-resources.exp -@@ -221,7 +221,7 @@ - - - -- -+ - - - -@@ -250,7 +250,7 @@ - - - -- -+ - - - -@@ -321,10 +321,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-recover-unknown.exp b/pengine/test10/remote-recover-unknown.exp -index 0d7b318..0a1d170 100644 ---- a/pengine/test10/remote-recover-unknown.exp -+++ b/pengine/test10/remote-recover-unknown.exp -@@ -221,7 +221,7 @@ - - - -- -+ - - - -@@ -250,7 +250,7 @@ - - - -- -+ - - - -@@ -321,10 +321,10 @@ - - - -- -+ - - -- -+ - - - -diff --git a/pengine/test10/remote-recovery.exp b/pengine/test10/remote-recovery.exp -index 40338b4..a9dd475 100644 ---- a/pengine/test10/remote-recovery.exp -+++ b/pengine/test10/remote-recovery.exp -@@ -187,7 +187,7 @@ - - - -- -+ - - - -@@ -216,7 +216,7 @@ - - - -- -+ - - - -@@ -287,10 +287,10 @@ - - - -- -+ - - -- -+ - - - --- -1.8.3.1 - diff --git a/SOURCES/014-segfault.patch b/SOURCES/014-segfault.patch deleted file mode 100644 index 2718f82..0000000 --- a/SOURCES/014-segfault.patch +++ /dev/null @@ -1,27 +0,0 @@ -From b2ab0f457e4fc594d98379abf2bd92ddc0bc018c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= -Date: Tue, 3 Apr 2018 23:53:44 +0200 -Subject: [PATCH] High: pengine: fix swapped warning message arguments leading - to segfault - -...when triggered. Present since 9cf01f5f9 (or since 1.1.17). ---- - lib/pengine/failcounts.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/pengine/failcounts.c b/lib/pengine/failcounts.c -index 53c0f14..e217176 100644 ---- a/lib/pengine/failcounts.c -+++ b/lib/pengine/failcounts.c -@@ -268,7 +268,7 @@ pe_get_failcount(node_t *node, resource_t *rsc, time_t *last_failure, - && block_failure(node, rsc, xml_op, data_set)) { - - pe_warn("Ignoring failure timeout %d for %s because it conflicts with on-fail=block", -- rsc->id, rsc->failure_timeout); -+ rsc->failure_timeout, rsc->id); - rsc->failure_timeout = 0; - } - --- -1.8.3.1 - diff --git a/SOURCES/015-fail-timeout.patch b/SOURCES/015-fail-timeout.patch deleted file mode 100644 index 02148fd..0000000 --- a/SOURCES/015-fail-timeout.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 74171d10462e11e46c67c3aabbbc4e1185a334d4 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Wed, 11 Apr 2018 11:48:13 +1000 -Subject: [PATCH] Fix: rhbz#1565187 - Ensure failures that cause fencing are - not removed until after fencing completes - ---- - lib/pengine/unpack.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 355cdcf..3a4a7cc 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2949,6 +2949,7 @@ static bool check_operation_expiry(resource_t *rsc, node_t *node, int rc, xmlNod - } - - if (clear_reason != NULL) { -+ node_t *remote_node = pe_find_node(data_set->nodes, rsc->id); - char *key = generate_op_key(rsc->id, CRM_OP_CLEAR_FAILCOUNT, 0); - action_t *clear_op = custom_action(rsc, key, CRM_OP_CLEAR_FAILCOUNT, - node, FALSE, TRUE, data_set); -@@ -2957,6 +2958,17 @@ static bool check_operation_expiry(resource_t *rsc, node_t *node, int rc, xmlNod - - crm_notice("Clearing failure of %s on %s because %s " CRM_XS " %s", - rsc->id, node->details->uname, clear_reason, clear_op->uuid); -+ -+ if (is_set(data_set->flags, pe_flag_stonith_enabled) -+ && rsc->remote_reconnect_interval -+ && remote_node -+ && remote_node->details->unclean) { -+ -+ action_t *fence = pe_fence_op(remote_node, NULL, TRUE, NULL, data_set); -+ crm_notice("Waiting for %s to complete before clearing %s failure for remote node %s", fence?fence->uuid:"nil", task, rsc->id); -+ -+ order_actions(fence, clear_op, pe_order_implies_then); -+ } - } - - crm_element_value_int(xml_op, XML_LRM_ATTR_INTERVAL, &interval); --- -1.8.3.1 - diff --git a/SOURCES/016-crm_diff.patch b/SOURCES/016-crm_diff.patch deleted file mode 100644 index dce31a2..0000000 --- a/SOURCES/016-crm_diff.patch +++ /dev/null @@ -1,105 +0,0 @@ -From a5c0782c0012b812ad0939a4aec5842f05dc1129 Mon Sep 17 00:00:00 2001 -From: Andrew Beekhof -Date: Sun, 15 Apr 2018 20:41:01 +1000 -Subject: [PATCH] Fix: crm_diff: rhbz#1561617 - Ignore attribute placement when - comparing in 'cib' mode - ---- - include/crm/common/xml.h | 1 + - lib/common/xml.c | 28 ++++++++++++++++++++++++---- - tools/crm_diff.c | 6 +++++- - 3 files changed, 30 insertions(+), 5 deletions(-) - -diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h -index 8297bb2..69ad4bd 100644 ---- a/include/crm/common/xml.h -+++ b/include/crm/common/xml.h -@@ -380,6 +380,7 @@ bool xml_tracking_changes(xmlNode * xml); - bool xml_document_dirty(xmlNode *xml); - void xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enforce_acls); - void xml_calculate_changes(xmlNode * old, xmlNode * new); /* For comparing two documents after the fact */ -+void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml); - void xml_accept_changes(xmlNode * xml); - void xml_log_changes(uint8_t level, const char *function, xmlNode *xml); - void xml_log_patchset(uint8_t level, const char *function, xmlNode *xml); -diff --git a/lib/common/xml.c b/lib/common/xml.c -index 947ddfe..8fd4778 100644 ---- a/lib/common/xml.c -+++ b/lib/common/xml.c -@@ -72,6 +72,7 @@ enum xml_private_flags { - - xpf_acl_create = 0x1000, - xpf_acl_denied = 0x2000, -+ xpf_lazy = 0x4000, - }; - - typedef struct xml_private_s -@@ -115,10 +116,22 @@ static inline bool TRACKING_CHANGES(xmlNode *xml) - { - if(xml == NULL || xml->doc == NULL || xml->doc->_private == NULL) { - return FALSE; -- } else if(is_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) { -- return TRUE; -+ } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) { -+ return FALSE; - } -- return FALSE; -+ return TRUE; -+} -+ -+static inline bool TRACKING_CHANGES_LAZY(xmlNode *xml) -+{ -+ if(xml == NULL || xml->doc == NULL || xml->doc->_private == NULL) { -+ return FALSE; -+ } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) { -+ return FALSE; -+ } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_lazy)) { -+ return FALSE; -+ } -+ return TRUE; - } - - #define buffer_print(buffer, max, offset, fmt, args...) do { \ -@@ -4084,7 +4097,7 @@ __xml_diff_object(xmlNode * old, xmlNode * new) - crm_xml_add(new, name, vcopy); - free(vcopy); - -- } else if(p_old != p_new) { -+ } else if(p_old != p_new && TRACKING_CHANGES_LAZY(new) == FALSE) { - crm_info("Moved %s@%s (%d -> %d)", old->name, name, p_old, p_new); - __xml_node_dirty(new); - p->flags |= xpf_dirty|xpf_moved; -@@ -4184,6 +4197,13 @@ __xml_diff_object(xmlNode * old, xmlNode * new) - } - - void -+xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml) -+{ -+ set_doc_flag(new_xml, xpf_lazy); -+ xml_calculate_changes(old_xml, new_xml); -+} -+ -+void - xml_calculate_changes(xmlNode * old, xmlNode * new) - { - CRM_CHECK(safe_str_eq(crm_element_name(old), crm_element_name(new)), return); -diff --git a/tools/crm_diff.c b/tools/crm_diff.c -index 20e7a27..0ec8e44 100644 ---- a/tools/crm_diff.c -+++ b/tools/crm_diff.c -@@ -190,7 +190,11 @@ generate_patch(xmlNode *object_1, xmlNode *object_2, const char *xml_file_2, - } - - xml_track_changes(object_2, NULL, object_2, FALSE); -- xml_calculate_changes(object_1, object_2); -+ if(as_cib) { -+ xml_calculate_significant_changes(object_1, object_2); -+ } else { -+ xml_calculate_changes(object_1, object_2); -+ } - crm_log_xml_debug(object_2, (xml_file_2? xml_file_2: "target")); - - output = xml_create_patchset(0, object_1, object_2, NULL, FALSE); --- -1.8.3.1 - diff --git a/SOURCES/017-pending-notify.patch b/SOURCES/017-pending-notify.patch deleted file mode 100644 index e667ca9..0000000 --- a/SOURCES/017-pending-notify.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 8e9a9d1aa3cceb8f310ed3db9b31b2eab9490330 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Thu, 19 Apr 2018 17:17:51 -0500 -Subject: [PATCH] Fix: libcrmcommon: don't record pending notify actions as - completed - -... especially relevant now that record-pending defaults to true. ---- - lib/common/operations.c | 14 ++++++++++---- - 1 file changed, 10 insertions(+), 4 deletions(-) - -diff --git a/lib/common/operations.c b/lib/common/operations.c -index 4afef80..3ca5939 100644 ---- a/lib/common/operations.c -+++ b/lib/common/operations.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2004-2017 Andrew Beekhof -+ * Copyright 2004-2018 Andrew Beekhof - * - * This source code is licensed under the GNU Lesser General Public License - * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. -@@ -513,9 +513,15 @@ create_operation_update(xmlNode * parent, lrmd_event_data_t * op, const char * c - CRM_LOG_ASSERT(n_task != NULL); - op_id = generate_notify_key(op->rsc_id, n_type, n_task); - -- /* these are not yet allowed to fail */ -- op->op_status = PCMK_LRM_OP_DONE; -- op->rc = 0; -+ if (op->op_status != PCMK_LRM_OP_PENDING) { -+ /* Ignore notify errors. -+ * -+ * @TODO We really should keep the actual result here, and ignore it -+ * when processing the CIB diff. -+ */ -+ op->op_status = PCMK_LRM_OP_DONE; -+ op->rc = 0; -+ } - - } else if (did_rsc_op_fail(op, target_rc)) { - op_id = generate_op_key(op->rsc_id, "last_failure", 0); --- -1.8.3.1 - diff --git a/SOURCES/018-node-names.patch b/SOURCES/018-node-names.patch deleted file mode 100644 index f8b8dfb..0000000 --- a/SOURCES/018-node-names.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 7618c29761368262fd8d633992816b52755ec028 Mon Sep 17 00:00:00 2001 -From: Hideo Yamauchi -Date: Thu, 26 Apr 2018 12:51:06 +0900 -Subject: [PATCH] Mid: lib: Changed to lowercase comparison. - ---- - lib/cib/cib_attrs.c | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/lib/cib/cib_attrs.c b/lib/cib/cib_attrs.c -index 8287a44..060d830 100644 ---- a/lib/cib/cib_attrs.c -+++ b/lib/cib/cib_attrs.c -@@ -471,17 +471,19 @@ get_uuid_from_result(xmlNode *result, char **uuid, int *is_remote) - * - guest node in resources section - * - orphaned remote node or bundle guest node in status section - */ -+#define XPATH_UPPER_TRANS "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -+#define XPATH_LOWER_TRANS "abcdefghijklmnopqrstuvwxyz" - #define XPATH_NODE \ - "/" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_NODES \ -- "/" XML_CIB_TAG_NODE "[@" XML_ATTR_UNAME "='%s']" \ -+ "/" XML_CIB_TAG_NODE "[translate(@" XML_ATTR_UNAME ",'" XPATH_UPPER_TRANS "','" XPATH_LOWER_TRANS "') ='%s']" \ - "|/" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_RESOURCES \ - "/" XML_CIB_TAG_RESOURCE \ -- "[@class='ocf'][@provider='pacemaker'][@type='remote'][@id='%s']" \ -+ "[@class='ocf'][@provider='pacemaker'][@type='remote'][translate(@id,'" XPATH_UPPER_TRANS "','" XPATH_LOWER_TRANS "') ='%s']" \ - "|/" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_RESOURCES \ - "/" XML_CIB_TAG_RESOURCE "/" XML_TAG_META_SETS "/" XML_CIB_TAG_NVPAIR \ -- "[@name='" XML_RSC_ATTR_REMOTE_NODE "'][@value='%s']" \ -+ "[@name='" XML_RSC_ATTR_REMOTE_NODE "'][translate(@value,'" XPATH_UPPER_TRANS "','" XPATH_LOWER_TRANS "') ='%s']" \ - "|/" XML_TAG_CIB "/" XML_CIB_TAG_STATUS "/" XML_CIB_TAG_STATE \ -- "[@" XML_NODE_IS_REMOTE "='true'][@" XML_ATTR_UUID "='%s']" -+ "[@" XML_NODE_IS_REMOTE "='true'][translate(@" XML_ATTR_UUID ",'" XPATH_UPPER_TRANS "','" XPATH_LOWER_TRANS "') ='%s']" - - int - query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_node) -@@ -489,6 +491,7 @@ query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_ - int rc = pcmk_ok; - char *xpath_string; - xmlNode *xml_search = NULL; -+ char *host_lowercase = g_ascii_strdown(uname, -1); - - CRM_ASSERT(uname != NULL); - -@@ -499,7 +502,7 @@ query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_ - *is_remote_node = FALSE; - } - -- xpath_string = crm_strdup_printf(XPATH_NODE, uname, uname, uname, uname); -+ xpath_string = crm_strdup_printf(XPATH_NODE, host_lowercase, host_lowercase, host_lowercase, host_lowercase); - if (cib_internal_op(the_cib, CIB_OP_QUERY, NULL, xpath_string, NULL, - &xml_search, cib_sync_call|cib_scope_local|cib_xpath, - NULL) == pcmk_ok) { -@@ -509,6 +512,7 @@ query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_ - } - free(xpath_string); - free_xml(xml_search); -+ free(host_lowercase); - - if (rc != pcmk_ok) { - crm_debug("Could not map node name '%s' to a UUID: %s", --- -1.8.3.1 - diff --git a/SOURCES/019-requires-quorum.patch b/SOURCES/019-requires-quorum.patch deleted file mode 100644 index c190b4e..0000000 --- a/SOURCES/019-requires-quorum.patch +++ /dev/null @@ -1,660 +0,0 @@ -From 85a3a174e1fc4cd4b055eb22827c1c3d0b288a85 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Tue, 22 May 2018 11:00:22 -0500 -Subject: [PATCH 1/3] Low: libpe_status: handle pending migrations correctly - -This is mainly a refactor of unpack_rsc_migration() for readability. - -The one significant change is that previously, a migrate_from operation that -was *recorded* as pending (record-pending=true) was treated differently from an -unrecorded pending migrate_from (record-pending=false). ---- - include/crm/pengine/status.h | 3 + - lib/pengine/unpack.c | 162 ++++++++++++++++++++++++------------------- - 2 files changed, 94 insertions(+), 71 deletions(-) - -diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h -index fca7f12..a8c90e2 100644 ---- a/include/crm/pengine/status.h -+++ b/include/crm/pengine/status.h -@@ -30,6 +30,9 @@ typedef struct pe_action_s pe_action_t; - typedef struct resource_s resource_t; - typedef struct ticket_s ticket_t; - -+// forward-compatible with Pacemaker 2.0.0 -+typedef struct resource_s pe_resource_t; -+ - typedef enum no_quorum_policy_e { - no_quorum_freeze, - no_quorum_stop, -diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c -index 1b8ca22..73bbe27 100644 ---- a/lib/pengine/unpack.c -+++ b/lib/pengine/unpack.c -@@ -2414,94 +2414,114 @@ find_lrm_op(const char *resource, const char *op, const char *node, const char * - return get_xpath_object(xpath, data_set->input, LOG_DEBUG); - } - -+static bool -+stop_happened_after(pe_resource_t *rsc, pe_node_t *node, xmlNode *xml_op, -+ pe_working_set_t *data_set) -+{ -+ xmlNode *stop_op = find_lrm_op(rsc->id, CRMD_ACTION_STOP, node->details->id, -+ NULL, data_set); -+ -+ if (stop_op) { -+ int stop_id = 0; -+ int task_id = 0; -+ -+ crm_element_value_int(stop_op, XML_LRM_ATTR_CALLID, &stop_id); -+ crm_element_value_int(xml_op, XML_LRM_ATTR_CALLID, &task_id); -+ if (stop_id > task_id) { -+ return TRUE; -+ } -+ } -+ return FALSE; -+} -+ - static void - unpack_rsc_migration(resource_t *rsc, node_t *node, xmlNode *xml_op, pe_working_set_t * data_set) - { -- -- /* -- * The normal sequence is (now): migrate_to(Src) -> migrate_from(Tgt) -> stop(Src) -- * -- * So if a migrate_to is followed by a stop, then we don't need to care what -- * happened on the target node -+ /* A successful migration sequence is: -+ * migrate_to on source node -+ * migrate_from on target node -+ * stop on source node - * -- * Without the stop, we need to look for a successful migrate_from. -- * This would also imply we're no longer running on the source -+ * If a migrate_to is followed by a stop, the entire migration (successful -+ * or failed) is complete, and we don't care what happened on the target. - * -- * Without the stop, and without a migrate_from op we make sure the resource -- * gets stopped on both source and target (assuming the target is up) -+ * If no migrate_from has happened, the migration is considered to be -+ * "partial". If the migrate_from failed, make sure the resource gets -+ * stopped on both source and target (if up). - * -+ * If the migrate_to and migrate_from both succeeded (which also implies the -+ * resource is no longer running on the source), but there is no stop, the -+ * migration is considered to be "dangling". - */ -- int stop_id = 0; -- int task_id = 0; -- xmlNode *stop_op = -- find_lrm_op(rsc->id, CRMD_ACTION_STOP, node->details->id, NULL, data_set); -- -- if (stop_op) { -- crm_element_value_int(stop_op, XML_LRM_ATTR_CALLID, &stop_id); -+ int from_rc = 0; -+ int from_status = 0; -+ const char *migrate_source = NULL; -+ const char *migrate_target = NULL; -+ pe_node_t *target = NULL; -+ pe_node_t *source = NULL; -+ xmlNode *migrate_from = NULL; -+ -+ if (stop_happened_after(rsc, node, xml_op, data_set)) { -+ return; - } - -- crm_element_value_int(xml_op, XML_LRM_ATTR_CALLID, &task_id); -+ // Clones are not allowed to migrate, so role can't be master -+ rsc->role = RSC_ROLE_STARTED; - -- if (stop_op == NULL || stop_id < task_id) { -- int from_rc = 0, from_status = 0; -- const char *migrate_source = -- crm_element_value(xml_op, XML_LRM_ATTR_MIGRATE_SOURCE); -- const char *migrate_target = -- crm_element_value(xml_op, XML_LRM_ATTR_MIGRATE_TARGET); -+ migrate_source = crm_element_value(xml_op, XML_LRM_ATTR_MIGRATE_SOURCE); -+ migrate_target = crm_element_value(xml_op, XML_LRM_ATTR_MIGRATE_TARGET); - -- node_t *target = pe_find_node(data_set->nodes, migrate_target); -- node_t *source = pe_find_node(data_set->nodes, migrate_source); -- xmlNode *migrate_from = -- find_lrm_op(rsc->id, CRMD_ACTION_MIGRATED, migrate_target, migrate_source, -- data_set); -+ target = pe_find_node(data_set->nodes, migrate_target); -+ source = pe_find_node(data_set->nodes, migrate_source); - -- rsc->role = RSC_ROLE_STARTED; /* can be master? */ -- if (migrate_from) { -- crm_element_value_int(migrate_from, XML_LRM_ATTR_RC, &from_rc); -- crm_element_value_int(migrate_from, XML_LRM_ATTR_OPSTATUS, &from_status); -- pe_rsc_trace(rsc, "%s op on %s exited with status=%d, rc=%d", -- ID(migrate_from), migrate_target, from_status, from_rc); -- } -- -- 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); -+ // Check whether there was a migrate_from action -+ migrate_from = find_lrm_op(rsc->id, CRMD_ACTION_MIGRATED, migrate_target, -+ migrate_source, data_set); -+ if (migrate_from) { -+ crm_element_value_int(migrate_from, XML_LRM_ATTR_RC, &from_rc); -+ crm_element_value_int(migrate_from, XML_LRM_ATTR_OPSTATUS, &from_status); -+ pe_rsc_trace(rsc, "%s op on %s exited with status=%d, rc=%d", -+ ID(migrate_from), migrate_target, from_status, from_rc); -+ } - -- /* all good -- * just need to arrange for the stop action to get sent -- * but _without_ affecting the target somehow -- */ -- rsc->role = RSC_ROLE_STOPPED; -- rsc->dangling_migrations = g_list_prepend(rsc->dangling_migrations, node); -+ if (migrate_from && from_rc == PCMK_OCF_OK -+ && from_status == PCMK_LRM_OP_DONE) { -+ /* The migrate_to and migrate_from both succeeded, so mark the migration -+ * as "dangling". This will be used to schedule a stop action on the -+ * source without affecting the target. -+ */ -+ pe_rsc_trace(rsc, "Detected dangling migration op: %s on %s", ID(xml_op), -+ migrate_source); -+ rsc->role = RSC_ROLE_STOPPED; -+ rsc->dangling_migrations = g_list_prepend(rsc->dangling_migrations, node); - -- } else if (migrate_from) { /* Failed */ -- if (target && target->details->online) { -- pe_rsc_trace(rsc, "Marking active on %s %p %d", migrate_target, target, -- target->details->online); -- native_add_running(rsc, target, data_set); -- } -+ } else if (migrate_from && (from_status != PCMK_LRM_OP_PENDING)) { // Failed -+ if (target && target->details->online) { -+ pe_rsc_trace(rsc, "Marking active on %s %p %d", migrate_target, target, -+ target->details->online); -+ native_add_running(rsc, target, data_set); -+ } - -- } else { /* Pending or complete but erased */ -- if (target && target->details->online) { -- pe_rsc_trace(rsc, "Marking active on %s %p %d", migrate_target, target, -- target->details->online); -+ } else { // Pending, or complete but erased -+ if (target && target->details->online) { -+ pe_rsc_trace(rsc, "Marking active on %s %p %d", migrate_target, target, -+ target->details->online); - -- native_add_running(rsc, target, data_set); -- if (source && source->details->online) { -- /* If we make it here we have a partial migration. The migrate_to -- * has completed but the migrate_from on the target has not. Hold on -- * to the target and source on the resource. Later on if we detect that -- * the resource is still going to run on that target, we may continue -- * the migration */ -- rsc->partial_migration_target = target; -- rsc->partial_migration_source = source; -- } -- } else { -- /* Consider it failed here - forces a restart, prevents migration */ -- set_bit(rsc->flags, pe_rsc_failed); -- clear_bit(rsc->flags, pe_rsc_allow_migrate); -+ native_add_running(rsc, target, data_set); -+ if (source && source->details->online) { -+ /* This is a partial migration: the migrate_to completed -+ * successfully on the source, but the migrate_from has not -+ * completed. Remember the source and target; if the newly -+ * chosen target remains the same when we schedule actions -+ * later, we may continue with the migration. -+ */ -+ rsc->partial_migration_target = target; -+ rsc->partial_migration_source = source; - } -+ } else { -+ /* Consider it failed here - forces a restart, prevents migration */ -+ set_bit(rsc->flags, pe_rsc_failed); -+ clear_bit(rsc->flags, pe_rsc_allow_migrate); - } - } - } --- -1.8.3.1 - - -From 37913a1dec2bda66476bddb5559817d23058be59 Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Mon, 21 May 2018 12:43:09 -0500 -Subject: [PATCH 2/3] Refactor: libpe_status: new functions for finding - resource's active nodes - -Existing code often grabs rsc->running_on->data (i.e. the first node in the -list) as the resource's current node, and often uses -g_list_length(rsc->running_on). - -However, if the resource is in the middle of a partial migration, the migration -source should be preferred as the current node. Also, if a resource has -"requires" set to "nothing" or "quorum", a clean, online node should be -preferred as the current node, and a caller should ignore unclean and offline -nodes when counting in certain cases. - -These functions will allow those issues to be addressed in later commits. ---- - include/crm/pengine/internal.h | 34 +++++++----- - lib/pengine/complex.c | 121 ++++++++++++++++++++++++++++++++++++----- - 2 files changed, 127 insertions(+), 28 deletions(-) - -diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h -index e9d7582..fe8f6a1 100644 ---- a/include/crm/pengine/internal.h -+++ b/include/crm/pengine/internal.h -@@ -1,20 +1,10 @@ - /* -- * Copyright (C) 2004 Andrew Beekhof -+ * Copyright 2004-2018 Andrew Beekhof - * -- * This program is free software; you can redistribute it and/or -- * modify it under the terms of the GNU Lesser General Public -- * License as published by the Free Software Foundation; either -- * version 2 of the License, or (at your option) any later version. -- * -- * This software is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- * General Public License for more details. -- * -- * You should have received a copy of the GNU Lesser General Public -- * License along with this library; if not, write to the Free Software -- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * This source code is licensed under the GNU Lesser General Public License -+ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. - */ -+ - #ifndef PE_INTERNAL__H - # define PE_INTERNAL__H - # include -@@ -125,6 +115,22 @@ int pe_get_failcount(node_t *node, resource_t *rsc, time_t *last_failure, - uint32_t flags, xmlNode *xml_op, - pe_working_set_t *data_set); - -+ -+/* Functions for finding/counting a resource's active nodes */ -+ -+pe_node_t *pe__find_active_on(const resource_t *rsc, -+ unsigned int *count_all, -+ unsigned int *count_clean); -+pe_node_t *pe__find_active_requires(const resource_t *rsc, -+ unsigned int *count); -+ -+static inline pe_node_t * -+pe__current_node(const resource_t *rsc) -+{ -+ return pe__find_active_on(rsc, NULL, NULL); -+} -+ -+ - /* Binary like operators for lists of nodes */ - extern void node_list_exclude(GHashTable * list, GListPtr list2, gboolean merge_scores); - extern GListPtr node_list_dup(GListPtr list, gboolean reset, gboolean filter); -diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c -index 86f290c..cdd409a 100644 ---- a/lib/pengine/complex.c -+++ b/lib/pengine/complex.c -@@ -1,19 +1,8 @@ - /* -- * Copyright (C) 2004 Andrew Beekhof -+ * Copyright 2004-2018 Andrew Beekhof - * -- * This library is free software; you can redistribute it and/or -- * modify it under the terms of the GNU Lesser General Public -- * License as published by the Free Software Foundation; either -- * version 2.1 of the License, or (at your option) any later version. -- * -- * This library is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- * Lesser General Public License for more details. -- * -- * You should have received a copy of the GNU Lesser General Public -- * License along with this library; if not, write to the Free Software -- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * This source code is licensed under the GNU Lesser General Public License -+ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. - */ - - #include -@@ -981,3 +970,107 @@ common_free(resource_t * rsc) - free(rsc->pending_task); - free(rsc); - } -+ -+/*! -+ * \brief -+ * \internal Find a node (and optionally count all) where resource is active -+ * -+ * \param[in] rsc Resource to check -+ * \param[out] count_all If not NULL, will be set to count of active nodes -+ * \param[out] count_clean If not NULL, will be set to count of clean nodes -+ * -+ * \return An active node (or NULL if resource is not active anywhere) -+ * -+ * \note The order of preference is: an active node that is the resource's -+ * partial migration source; if the resource's "requires" is "quorum" or -+ * "nothing", the first active node in the list that is clean and online; -+ * the first active node in the list. -+ */ -+pe_node_t * -+pe__find_active_on(const resource_t *rsc, unsigned int *count_all, -+ unsigned int *count_clean) -+{ -+ pe_node_t *active = NULL; -+ pe_node_t *node = NULL; -+ bool keep_looking = FALSE; -+ bool is_happy = FALSE; -+ -+ if (count_all) { -+ *count_all = 0; -+ } -+ if (count_clean) { -+ *count_clean = 0; -+ } -+ if (rsc == NULL) { -+ return NULL; -+ } -+ -+ for (GList *node_iter = rsc->running_on; node_iter != NULL; -+ node_iter = node_iter->next) { -+ -+ node = node_iter->data; -+ keep_looking = FALSE; -+ -+ is_happy = node->details->online && !node->details->unclean; -+ -+ if (count_all) { -+ ++*count_all; -+ } -+ if (count_clean && is_happy) { -+ ++*count_clean; -+ } -+ if (count_all || count_clean) { -+ // If we're counting, we need to go through entire list -+ keep_looking = TRUE; -+ } -+ -+ if (rsc->partial_migration_source != NULL) { -+ if (node->details == rsc->partial_migration_source->details) { -+ // This is the migration source -+ active = node; -+ } else { -+ keep_looking = TRUE; -+ } -+ } else if (is_not_set(rsc->flags, pe_rsc_needs_fencing)) { -+ if (is_happy && (!active || !active->details->online -+ || active->details->unclean)) { -+ // This is the first clean node -+ active = node; -+ } else { -+ keep_looking = TRUE; -+ } -+ } -+ if (active == NULL) { -+ // This is first node in list -+ active = node; -+ } -+ -+ if (keep_looking == FALSE) { -+ // Don't waste time iterating if we don't have to -+ break; -+ } -+ } -+ return active; -+} -+ -+/*! -+ * \brief -+ * \internal Find and count active nodes according to "requires" -+ * -+ * \param[in] rsc Resource to check -+ * \param[out] count If not NULL, will be set to count of active nodes -+ * -+ * \return An active node (or NULL if resource is not active anywhere) -+ * -+ * \note This is a convenience wrapper for pe__find_active_on() where the count -+ * of all active nodes or only clean active nodes is desired according to -+ * the "requires" meta-attribute. -+ */ -+pe_node_t * -+pe__find_active_requires(const resource_t *rsc, unsigned int *count) -+{ -+ if (rsc && is_not_set(rsc->flags, pe_rsc_needs_fencing)) { -+ return pe__find_active_on(rsc, NULL, count); -+ } -+ return pe__find_active_on(rsc, count, NULL); -+} --- -1.8.3.1 - - -From e752fcfa10ee68f8a8de48122ae0f73190ae30af Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Mon, 21 May 2018 09:36:00 -0500 -Subject: [PATCH 3/3] Fix: libpe_status: find active instances properly - according to requires - -If a resource has "requires" set to "nothing" or "quorum", that means we can -properly start it elsewhere, even if the node believed to be initially running -the resource is unclean and waiting to be fenced. - -Previously, if we did start the resource elsewhere before fencing completed, -the cluster would then consider the resource multiply active, and recover it. -Now, we don't consider such a resource multiply active if it's active on -only one clean node. - -Status displays still show the resource as started on the unclean node, to give -the administrator a better idea of the actual situation. However, the clean -node will be considered the "current" node. ---- - lib/pengine/native.c | 21 ++++++++-- - pengine/native.c | 107 +++++++++++++++++++++++++-------------------------- - 2 files changed, 70 insertions(+), 58 deletions(-) - -diff --git a/lib/pengine/native.c b/lib/pengine/native.c -index f6d1653..e01ef17 100644 ---- a/lib/pengine/native.c -+++ b/lib/pengine/native.c -@@ -17,6 +17,21 @@ - #define VARIANT_NATIVE 1 - #include "./variant.h" - -+/*! -+ * \internal -+ * \brief Check whether a resource is active on multiple nodes -+ */ -+static bool -+is_multiply_active(pe_resource_t *rsc) -+{ -+ unsigned int count = 0; -+ -+ if (rsc->variant == pe_native) { -+ pe__find_active_requires(rsc, &count); -+ } -+ return count > 1; -+} -+ - void - native_add_running(resource_t * rsc, node_t * node, pe_working_set_t * data_set) - { -@@ -58,7 +73,7 @@ native_add_running(resource_t * rsc, node_t * node, pe_working_set_t * data_set) - return; - } - -- if (rsc->variant == pe_native && g_list_length(rsc->running_on) > 1) { -+ if (is_multiply_active(rsc)) { - switch (rsc->recovery_type) { - case recovery_stop_only: - { -@@ -99,8 +114,8 @@ native_add_running(resource_t * rsc, node_t * node, pe_working_set_t * data_set) - } - break; - } -- crm_debug("%s is active on %d nodes including %s: %s", -- rsc->id, g_list_length(rsc->running_on), node->details->uname, -+ crm_debug("%s is active on multiple nodes including %s: %s", -+ rsc->id, node->details->uname, - recovery2text(rsc->recovery_type)); - - } else { -diff --git a/pengine/native.c b/pengine/native.c -index e3e0c59..37ac2e4 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -1163,7 +1163,9 @@ native_create_actions(resource_t * rsc, pe_working_set_t * data_set) - gboolean allow_migrate = is_set(rsc->flags, pe_rsc_allow_migrate) ? TRUE : FALSE; - - GListPtr gIter = NULL; -- int num_active_nodes = 0; -+ unsigned int num_all_active = 0; -+ unsigned int num_clean_active = 0; -+ bool multiply_active = FALSE; - enum rsc_role_e role = RSC_ROLE_UNKNOWN; - enum rsc_role_e next_role = RSC_ROLE_UNKNOWN; - -@@ -1181,18 +1183,7 @@ native_create_actions(resource_t * rsc, pe_working_set_t * data_set) - pe_rsc_trace(rsc, "Processing state transition for %s %p: %s->%s", rsc->id, rsc, - role2text(rsc->role), role2text(rsc->next_role)); - -- if (rsc->running_on) { -- current = rsc->running_on->data; -- } -- -- for (gIter = rsc->running_on; gIter != NULL; gIter = gIter->next) { -- node_t *n = (node_t *) gIter->data; -- if (rsc->partial_migration_source && -- (n->details == rsc->partial_migration_source->details)) { -- current = rsc->partial_migration_source; -- } -- num_active_nodes++; -- } -+ current = pe__find_active_on(rsc, &num_all_active, &num_clean_active); - - for (gIter = rsc->dangling_migrations; gIter != NULL; gIter = gIter->next) { - node_t *current = (node_t *) gIter->data; -@@ -1207,47 +1198,57 @@ native_create_actions(resource_t * rsc, pe_working_set_t * data_set) - } - } - -- if (num_active_nodes > 1) { -+ if ((num_all_active == 2) && (num_clean_active == 2) && chosen -+ && rsc->partial_migration_source && rsc->partial_migration_target -+ && (current->details == rsc->partial_migration_source->details) -+ && (chosen->details == rsc->partial_migration_target->details)) { - -- if (num_active_nodes == 2 -- && chosen -- && rsc->partial_migration_target -- && rsc->partial_migration_source -- && (current->details == rsc->partial_migration_source->details) -- && (chosen->details == rsc->partial_migration_target->details)) { -- /* Here the chosen node is still the migration target from a partial -- * migration. Attempt to continue the migration instead of recovering -- * by stopping the resource everywhere and starting it on a single node. */ -- pe_rsc_trace(rsc, -- "Will attempt to continue with a partial migration to target %s from %s", -- rsc->partial_migration_target->details->id, -- rsc->partial_migration_source->details->id); -- } else { -- const char *type = crm_element_value(rsc->xml, XML_ATTR_TYPE); -- const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); -+ /* The chosen node is still the migration target from a partial -+ * migration. Attempt to continue the migration instead of recovering -+ * by stopping the resource everywhere and starting it on a single node. -+ */ -+ pe_rsc_trace(rsc, -+ "Will attempt to continue with a partial migration to target %s from %s", -+ rsc->partial_migration_target->details->id, -+ rsc->partial_migration_source->details->id); -+ -+ } else if (is_not_set(rsc->flags, pe_rsc_needs_fencing)) { -+ /* If a resource has "requires" set to nothing or quorum, don't consider -+ * it active on unclean nodes (similar to how all resources behave when -+ * stonith-enabled is false). We can start such resources elsewhere -+ * before fencing completes, and if we considered the resource active on -+ * the failed node, we would attempt recovery for being active on -+ * multiple nodes. -+ */ -+ multiply_active = (num_clean_active > 1); -+ } else { -+ multiply_active = (num_all_active > 1); -+ } - -- if(rsc->partial_migration_target && rsc->partial_migration_source) { -- crm_notice("Resource %s can no longer migrate to %s. Stopping on %s too", rsc->id, -- rsc->partial_migration_target->details->uname, -- rsc->partial_migration_source->details->uname); -+ if (multiply_active) { -+ if (rsc->partial_migration_target && rsc->partial_migration_source) { -+ // Migration was in progress, but we've chosen a different target -+ crm_notice("Resource %s can no longer migrate to %s. Stopping on %s too", -+ rsc->id, rsc->partial_migration_target->details->uname, -+ rsc->partial_migration_source->details->uname); - -- } else { -- pe_proc_err("Resource %s (%s::%s) is active on %d nodes %s", -- rsc->id, class, type, num_active_nodes, recovery2text(rsc->recovery_type)); -- crm_warn("See %s for more information.", -- "http://clusterlabs.org/wiki/FAQ#Resource_is_Too_Active"); -- } -- -- if (rsc->recovery_type == recovery_stop_start) { -- need_stop = TRUE; -- } -+ } else { -+ // Resource was incorrectly multiply active -+ pe_proc_err("Resource %s is active on %u nodes (%s)", -+ rsc->id, num_all_active, -+ recovery2text(rsc->recovery_type)); -+ crm_notice("See https://wiki.clusterlabs.org/wiki/FAQ#Resource_is_Too_Active for more information"); -+ } - -- /* If by chance a partial migration is in process, -- * but the migration target is not chosen still, clear all -- * partial migration data. */ -- rsc->partial_migration_source = rsc->partial_migration_target = NULL; -- allow_migrate = FALSE; -+ if (rsc->recovery_type == recovery_stop_start) { -+ need_stop = TRUE; - } -+ -+ /* If by chance a partial migration is in process, but the migration -+ * target is not chosen still, clear all partial migration data. -+ */ -+ rsc->partial_migration_source = rsc->partial_migration_target = NULL; -+ allow_migrate = FALSE; - } - - if (is_set(rsc->flags, pe_rsc_start_pending)) { -@@ -1339,7 +1341,7 @@ native_create_actions(resource_t * rsc, pe_working_set_t * data_set) - is_not_set(rsc->flags, pe_rsc_managed) || - is_set(rsc->flags, pe_rsc_failed) || - is_set(rsc->flags, pe_rsc_start_pending) || -- (current->details->unclean == TRUE) || -+ (current && current->details->unclean) || - rsc->next_role < RSC_ROLE_STARTED) { - - allow_migrate = FALSE; -@@ -2329,12 +2331,7 @@ LogActions(resource_t * rsc, pe_working_set_t * data_set, gboolean terminal) - - next = rsc->allocated_to; - if (rsc->running_on) { -- if (g_list_length(rsc->running_on) > 1 && rsc->partial_migration_source) { -- current = rsc->partial_migration_source; -- } else { -- current = rsc->running_on->data; -- } -- -+ current = pe__current_node(rsc); - if (rsc->role == RSC_ROLE_STOPPED) { - /* - * This can occur when resources are being recovered --- -1.8.3.1 - diff --git a/SOURCES/020-multiple-active.patch b/SOURCES/020-multiple-active.patch deleted file mode 100644 index 27eec76..0000000 --- a/SOURCES/020-multiple-active.patch +++ /dev/null @@ -1,672 +0,0 @@ -From 355461723733acc0f6f9d9cc1318c91ba2a0ae6c Mon Sep 17 00:00:00 2001 -From: Ken Gaillot -Date: Tue, 22 May 2018 15:55:14 -0500 -Subject: [PATCH] Fix: all: prefer appropriate node when multiply active - ---- - lib/pengine/container.c | 8 +++---- - lib/pengine/native.c | 8 +++---- - pengine/allocate.c | 20 ++++++++--------- - pengine/clone.c | 51 +++++++++++++++++++----------------------- - pengine/graph.c | 26 +++++++++++++--------- - pengine/native.c | 17 +++++++------- - pengine/notif.c | 2 +- - tools/crm_mon.c | 14 ++++-------- - tools/crm_resource.c | 21 +++++++++++------- - tools/crm_resource_print.c | 16 ++++++------- - tools/crm_resource_runtime.c | 53 ++++++++++++++++++++++---------------------- - 11 files changed, 112 insertions(+), 124 deletions(-) - -diff --git a/lib/pengine/container.c b/lib/pengine/container.c -index b5340bf..d82948a 100644 ---- a/lib/pengine/container.c -+++ b/lib/pengine/container.c -@@ -807,11 +807,11 @@ container_fix_remote_addr_in(resource_t *rsc, xmlNode *xml, const char *field) - } - - node = tuple->docker->allocated_to; -- if(node == NULL && tuple->docker->running_on) { -+ if (node == NULL) { - /* If it won't be running anywhere after the - * transition, go with where it's running now. - */ -- node = tuple->docker->running_on->data; -+ node = pe__current_node(tuple->docker); - } - - if(node == NULL) { -@@ -1289,9 +1289,7 @@ tuple_print(container_grouping_t * tuple, const char *pre_text, long options, vo - offset += snprintf(buffer + offset, LINE_MAX - offset, " (%s)", tuple->ipaddr); - } - -- if (tuple->docker->running_on) { -- node = tuple->docker->running_on->data; -- } -+ node = pe__current_node(tuple->docker); - common_print(rsc, pre_text, buffer, node, options, print_data); - } - -diff --git a/lib/pengine/native.c b/lib/pengine/native.c -index e01ef17..eda0355 100644 ---- a/lib/pengine/native.c -+++ b/lib/pengine/native.c -@@ -457,7 +457,7 @@ native_print_xml(resource_t * rsc, const char *pre_text, long options, void *pri - if (options & pe_print_rsconly) { - status_print("/>\n"); - /* do nothing */ -- } else if (g_list_length(rsc->running_on) > 0) { -+ } else if (rsc->running_on != NULL) { - GListPtr gIter = rsc->running_on; - - status_print(">\n"); -@@ -529,7 +529,7 @@ common_print(resource_t * rsc, const char *pre_text, const char *name, node_t *n - } else if (is_set(rsc->flags, pe_rsc_failed)) { - status_print(""); - -- } else if (rsc->variant == pe_native && g_list_length(rsc->running_on) == 0) { -+ } else if (rsc->variant == pe_native && (rsc->running_on == NULL)) { - status_print(""); - - } else if (g_list_length(rsc->running_on) > 1) { -@@ -742,9 +742,7 @@ native_print(resource_t * rsc, const char *pre_text, long options, void *print_d - return; - } - -- if (rsc->running_on != NULL) { -- node = rsc->running_on->data; -- } -+ node = pe__current_node(rsc); - common_print(rsc, pre_text, rsc_printable_id(rsc), node, options, print_data); - } - -diff --git a/pengine/allocate.c b/pengine/allocate.c -index 724736c..427575b 100644 ---- a/pengine/allocate.c -+++ b/pengine/allocate.c -@@ -1101,14 +1101,14 @@ sort_rsc_process_order(gconstpointer a, gconstpointer b, gpointer data) - r2_weight = -INFINITY; - - if (resource1->running_on) { -- r1_node = g_list_nth_data(resource1->running_on, 0); -+ r1_node = pe__current_node(resource1); - r1_node = g_hash_table_lookup(r1_nodes, r1_node->details->id); - if (r1_node != NULL) { - r1_weight = r1_node->weight; - } - } - if (resource2->running_on) { -- r2_node = g_list_nth_data(resource2->running_on, 0); -+ r2_node = pe__current_node(resource2); - r2_node = g_hash_table_lookup(r2_nodes, r2_node->details->id); - if (r2_node != NULL) { - r2_weight = r2_node->weight; -@@ -1925,10 +1925,7 @@ get_remote_node_state(pe_node_t *node) - remote_rsc = node->details->remote_rsc; - CRM_ASSERT(remote_rsc); - -- if(remote_rsc->running_on) { -- cluster_node = remote_rsc->running_on->data; -- } -- -+ cluster_node = pe__current_node(remote_rsc); - - /* If the cluster node the remote connection resource resides on - * is unclean or went offline, we can't process any operations -@@ -1989,11 +1986,14 @@ get_remote_node_state(pe_node_t *node) - return remote_state_alive; - } - -+/*! -+ * \internal -+ * \brief Order actions on remote node relative to actions for the connection -+ */ - static void - apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - { - resource_t *remote_rsc = NULL; -- node_t *cluster_node = NULL; - enum action_tasks task = text2task(action->task); - enum remote_connection_state state = get_remote_node_state(action->node); - -@@ -2009,10 +2009,6 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - remote_rsc = action->node->details->remote_rsc; - CRM_ASSERT(remote_rsc); - -- if(remote_rsc->running_on) { -- cluster_node = remote_rsc->running_on->data; -- } -- - crm_trace("Order %s action %s relative to %s%s (state: %s)", - action->task, action->uuid, - is_set(remote_rsc->flags, pe_rsc_failed)? "failed " : "", -@@ -2093,6 +2089,8 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set) - pe_order_implies_then, data_set); - - } else { -+ node_t *cluster_node = pe__current_node(remote_rsc); -+ - if(task == monitor_rsc && state == remote_state_failed) { - /* We would only be here if we do not know the - * state of the resource on the remote node. -diff --git a/pengine/clone.c b/pengine/clone.c -index 3192412..1de2661 100644 ---- a/pengine/clone.c -+++ b/pengine/clone.c -@@ -69,6 +69,10 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) - int rc = 0; - node_t *node1 = NULL; - node_t *node2 = NULL; -+ node_t *current_node1 = NULL; -+ node_t *current_node2 = NULL; -+ unsigned int nnodes1 = 0; -+ unsigned int nnodes2 = 0; - - gboolean can1 = TRUE; - gboolean can2 = TRUE; -@@ -87,24 +91,22 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) - * - inactive instances - */ - -- if (resource1->running_on && resource2->running_on) { -- if (g_list_length(resource1->running_on) < g_list_length(resource2->running_on)) { -+ current_node1 = pe__find_active_on(resource1, &nnodes1, NULL); -+ current_node2 = pe__find_active_on(resource2, &nnodes2, NULL); -+ -+ if (nnodes1 && nnodes2) { -+ if (nnodes1 < nnodes2) { - crm_trace("%s < %s: running_on", resource1->id, resource2->id); - return -1; - -- } else if (g_list_length(resource1->running_on) > g_list_length(resource2->running_on)) { -+ } else if (nnodes1 > nnodes2) { - crm_trace("%s > %s: running_on", resource1->id, resource2->id); - return 1; - } - } - -- if (resource1->running_on) { -- node1 = resource1->running_on->data; -- } -- if (resource2->running_on) { -- node2 = resource2->running_on->data; -- } -- -+ node1 = current_node1; -+ node2 = current_node2; - if (node1) { - node_t *match = pe_hash_table_lookup(resource1->allowed_nodes, node1->details->id); - -@@ -216,10 +218,10 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) - GHashTable *hash2 = - g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, g_hash_destroy_str); - -- n = node_copy(resource1->running_on->data); -+ n = node_copy(current_node1); - g_hash_table_insert(hash1, (gpointer) n->details->id, n); - -- n = node_copy(resource2->running_on->data); -+ n = node_copy(current_node2); - g_hash_table_insert(hash2, (gpointer) n->details->id, n); - - if(resource1->parent) { -@@ -267,11 +269,8 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) - } - - /* Current location score */ -- node1 = g_list_nth_data(resource1->running_on, 0); -- node1 = g_hash_table_lookup(hash1, node1->details->id); -- -- node2 = g_list_nth_data(resource2->running_on, 0); -- node2 = g_hash_table_lookup(hash2, node2->details->id); -+ node1 = g_hash_table_lookup(hash1, current_node1->details->id); -+ node2 = g_hash_table_lookup(hash2, current_node2->details->id); - - if (node1->weight < node2->weight) { - if (node1->weight < 0) { -@@ -295,12 +294,8 @@ sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) - list1 = g_hash_table_get_values(hash1); - list2 = g_hash_table_get_values(hash2); - -- list1 = -- g_list_sort_with_data(list1, sort_node_weight, -- g_list_nth_data(resource1->running_on, 0)); -- list2 = -- g_list_sort_with_data(list2, sort_node_weight, -- g_list_nth_data(resource2->running_on, 0)); -+ list1 = g_list_sort_with_data(list1, sort_node_weight, current_node1); -+ list2 = g_list_sort_with_data(list2, sort_node_weight, current_node2); - max = g_list_length(list1); - if (max < g_list_length(list2)) { - max = g_list_length(list2); -@@ -528,8 +523,8 @@ distribute_children(resource_t *rsc, GListPtr children, GListPtr nodes, - - if (child->running_on && is_set(child->flags, pe_rsc_provisional) - && is_not_set(child->flags, pe_rsc_failed)) { -- node_t *child_node = child->running_on->data; -- node_t *local_node = parent_node_instance(child, child->running_on->data); -+ node_t *child_node = pe__current_node(child); -+ node_t *local_node = parent_node_instance(child, child_node); - - pe_rsc_trace(rsc, "Checking pre-allocation of %s to %s (%d remaining of %d)", - child->id, child_node->details->uname, max - allocated, max); -@@ -556,9 +551,9 @@ distribute_children(resource_t *rsc, GListPtr children, GListPtr nodes, - for (GListPtr gIter = children; gIter != NULL; gIter = gIter->next) { - resource_t *child = (resource_t *) gIter->data; - -- if (g_list_length(child->running_on) > 0) { -- node_t *child_node = child->running_on->data; -- node_t *local_node = parent_node_instance(child, child->running_on->data); -+ if (child->running_on != NULL) { -+ node_t *child_node = pe__current_node(child); -+ node_t *local_node = parent_node_instance(child, child_node); - - if (local_node == NULL) { - crm_err("%s is running on %s which isn't allowed", -diff --git a/pengine/graph.c b/pengine/graph.c -index 6d4e4c7..236b278 100644 ---- a/pengine/graph.c -+++ b/pengine/graph.c -@@ -783,6 +783,7 @@ get_router_node(action_t *action) - node_t *began_on = NULL; - node_t *ended_on = NULL; - node_t *router_node = NULL; -+ bool partial_migration = FALSE; - - if (safe_str_eq(action->task, CRM_OP_FENCE) || is_remote_node(action->node) == FALSE) { - return NULL; -@@ -790,10 +791,13 @@ get_router_node(action_t *action) - - CRM_ASSERT(action->node->details->remote_rsc != NULL); - -- if (action->node->details->remote_rsc->running_on) { -- began_on = action->node->details->remote_rsc->running_on->data; -- } -+ began_on = pe__current_node(action->node->details->remote_rsc); - ended_on = action->node->details->remote_rsc->allocated_to; -+ if (action->node->details->remote_rsc -+ && (action->node->details->remote_rsc->container == NULL) -+ && action->node->details->remote_rsc->partial_migration_target) { -+ partial_migration = TRUE; -+ } - - /* if there is only one location to choose from, - * this is easy. Check for those conditions first */ -@@ -817,6 +821,10 @@ get_router_node(action_t *action) - * are all required before the remote rsc stop action can occur.) In - * this case, we know these actions have to be routed through the initial - * cluster node the connection resource lived on before the move takes place. -+ * The exception is a partial migration of a (non-guest) remote -+ * connection resource; in that case, all actions (even these) will be -+ * ordered after the connection's pseudo-start on the migration target, -+ * so the target is the router node. - * - * 2. Everything else (start, promote, monitor, probe, refresh, clear failcount - * delete ....) must occur after the resource starts on the node it is -@@ -824,10 +832,10 @@ get_router_node(action_t *action) - */ - - /* 1. before connection rsc moves. */ -- if (safe_str_eq(action->task, "stop") || -+ if ((safe_str_eq(action->task, "stop") || - safe_str_eq(action->task, "demote") || - safe_str_eq(action->task, "migrate_from") || -- safe_str_eq(action->task, "migrate_to")) { -+ safe_str_eq(action->task, "migrate_to")) && !partial_migration) { - - router_node = began_on; - -@@ -1234,18 +1242,14 @@ action2xml(action_t * action, gboolean as_input, pe_working_set_t *data_set) - case stopped_rsc: - case action_demote: - case action_demoted: -- if(action->node->details->remote_rsc->container->running_on) { -- host = action->node->details->remote_rsc->container->running_on->data; -- } -+ host = pe__current_node(action->node->details->remote_rsc->container); - break; - case start_rsc: - case started_rsc: - case monitor_rsc: - case action_promote: - case action_promoted: -- if(action->node->details->remote_rsc->container->allocated_to) { -- host = action->node->details->remote_rsc->container->allocated_to; -- } -+ host = action->node->details->remote_rsc->container->allocated_to; - break; - default: - break; -diff --git a/pengine/native.c b/pengine/native.c -index 37ac2e4..1c26642 100644 ---- a/pengine/native.c -+++ b/pengine/native.c -@@ -102,7 +102,7 @@ native_choose_node(resource_t * rsc, node_t * prefer, pe_working_set_t * data_se - if (length > 0) { - nodes = g_hash_table_get_values(rsc->allowed_nodes); - nodes = g_list_sort_with_data(nodes, sort_node_weight, -- g_list_nth_data(rsc->running_on, 0)); -+ pe__current_node(rsc)); - - // First node in sorted list has the best score - best = g_list_nth_data(nodes, 0); -@@ -158,7 +158,7 @@ native_choose_node(resource_t * rsc, node_t * prefer, pe_working_set_t * data_se - * remaining unallocated instances to prefer a node that's already - * running another instance. - */ -- node_t *running = g_list_nth_data(rsc->running_on, 0); -+ node_t *running = pe__current_node(rsc); - - if (running && (can_run_resources(running) == FALSE)) { - pe_rsc_trace(rsc, "Current node for %s (%s) can't run resources", -@@ -534,16 +534,14 @@ native_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) - node_t *assign_to = NULL; - - rsc->next_role = rsc->role; -- if (rsc->running_on == NULL) { -+ assign_to = pe__current_node(rsc); -+ if (assign_to == NULL) { - reason = "inactive"; - } else if (rsc->role == RSC_ROLE_MASTER) { -- assign_to = rsc->running_on->data; - reason = "master"; - } else if (is_set(rsc->flags, pe_rsc_failed)) { -- assign_to = rsc->running_on->data; - reason = "failed"; - } else { -- assign_to = rsc->running_on->data; - reason = "active"; - } - pe_rsc_info(rsc, "Unmanaged resource %s allocated to %s: %s", rsc->id, -@@ -1834,7 +1832,9 @@ rsc_ticket_constraint(resource_t * rsc_lh, rsc_ticket_t * rsc_ticket, pe_working - rsc_lh->id, rsc_ticket->ticket->id, rsc_ticket->id, - role2text(rsc_ticket->role_lh)); - -- if (rsc_ticket->ticket->granted == FALSE && g_list_length(rsc_lh->running_on) > 0) { -+ if ((rsc_ticket->ticket->granted == FALSE) -+ && (rsc_lh->running_on != NULL)) { -+ - GListPtr gIter = NULL; - - switch (rsc_ticket->loss_policy) { -@@ -1867,7 +1867,7 @@ rsc_ticket_constraint(resource_t * rsc_lh, rsc_ticket_t * rsc_ticket, pe_working - if (filter_rsc_ticket(rsc_lh, rsc_ticket) == FALSE) { - return; - } -- if (g_list_length(rsc_lh->running_on) > 0) { -+ if (rsc_lh->running_on != NULL) { - clear_bit(rsc_lh->flags, pe_rsc_managed); - set_bit(rsc_lh->flags, pe_rsc_block); - } -@@ -1919,7 +1919,6 @@ native_update_actions(action_t * first, action_t * then, node_t * node, enum pe_ - } else if ((then_rsc_role >= RSC_ROLE_STARTED) - && safe_str_eq(then->task, RSC_START) - && then->node -- && then_rsc->running_on - && g_list_length(then_rsc->running_on) == 1 - && then->node->details == ((node_t *) then_rsc->running_on->data)->details) { - /* ignore... if 'then' is supposed to be started after 'first', but -diff --git a/pengine/notif.c b/pengine/notif.c -index 3013ee0..4913249 100644 ---- a/pengine/notif.c -+++ b/pengine/notif.c -@@ -113,7 +113,7 @@ expand_node_list(GListPtr list, char **uname, char **metal) - if(node->details->remote_rsc - && node->details->remote_rsc->container - && node->details->remote_rsc->container->running_on) { -- node = node->details->remote_rsc->container->running_on->data; -+ node = pe__current_node(node->details->remote_rsc->container); - } - - if (node->details->uname == NULL) { -diff --git a/tools/crm_mon.c b/tools/crm_mon.c -index 824b12f..7c63803 100644 ---- a/tools/crm_mon.c -+++ b/tools/crm_mon.c -@@ -1953,16 +1953,10 @@ get_node_display_name(node_t *node) - - /* Host is displayed only if this is a guest node */ - if (is_container_remote_node(node)) { -- if (node->details->remote_rsc->running_on) { -- /* running_on is a list, but guest nodes will have exactly one entry -- * unless they are in the process of migrating, in which case they -- * will have two; either way, we can use the first item in the list -- */ -- node_t *host_node = (node_t *) node->details->remote_rsc->running_on->data; -- -- if (host_node && host_node->details) { -- node_host = host_node->details->uname; -- } -+ node_t *host_node = pe__current_node(node->details->remote_rsc); -+ -+ if (host_node && host_node->details) { -+ node_host = host_node->details->uname; - } - if (node_host == NULL) { - node_host = ""; /* so we at least get "uname@" to indicate guest */ -diff --git a/tools/crm_resource.c b/tools/crm_resource.c -index c64432e..0557892 100644 ---- a/tools/crm_resource.c -+++ b/tools/crm_resource.c -@@ -1015,23 +1015,27 @@ main(int argc, char **argv) - rc = cli_resource_ban(rsc_id, dest->details->uname, NULL, cib_conn); - - } else if (rsc_cmd == 'B' || rsc_cmd == 'M') { -+ pe_node_t *current = NULL; -+ unsigned int nactive = 0; -+ - rc = -EINVAL; -- if (g_list_length(rsc->running_on) == 1) { -- node_t *current = rsc->running_on->data; -+ current = pe__find_active_requires(rsc, &nactive); -+ -+ if (nactive == 1) { - rc = cli_resource_ban(rsc_id, current->details->uname, NULL, cib_conn); - - } else if(rsc->variant == pe_master) { - int count = 0; - GListPtr iter = NULL; -- node_t *current = NULL; - -+ current = NULL; - for(iter = rsc->children; iter; iter = iter->next) { - resource_t *child = (resource_t *)iter->data; - enum rsc_role_e child_role = child->fns->state(child, TRUE); - - if(child_role == RSC_ROLE_MASTER) { - count++; -- current = child->running_on->data; -+ current = pe__current_node(child); - } - } - -@@ -1039,14 +1043,15 @@ main(int argc, char **argv) - rc = cli_resource_ban(rsc_id, current->details->uname, NULL, cib_conn); - - } else { -- CMD_ERR("Resource '%s' not moved: active in %d locations (promoted in %d).", rsc_id, g_list_length(rsc->running_on), count); -+ CMD_ERR("Resource '%s' not moved: active in %d locations (promoted in %d).", -+ rsc_id, nactive, count); - CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --node ", rsc_id); - CMD_ERR("You can prevent '%s' from being promoted at a specific location with:" - " --ban --master --node ", rsc_id); - } - - } else { -- CMD_ERR("Resource '%s' not moved: active in %d locations.", rsc_id, g_list_length(rsc->running_on)); -+ CMD_ERR("Resource '%s' not moved: active in %d locations.", rsc_id, nactive); - CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --node ", rsc_id); - } - -@@ -1164,12 +1169,12 @@ main(int argc, char **argv) - node_t *node = pe_find_node(data_set.nodes, host_uname); - - if (node && is_remote_node(node)) { -- if (node->details->remote_rsc == NULL || node->details->remote_rsc->running_on == NULL) { -+ node = pe__current_node(node->details->remote_rsc); -+ if (node == NULL) { - CMD_ERR("No lrmd connection detected to remote node %s", host_uname); - rc = -ENXIO; - goto bail; - } -- node = node->details->remote_rsc->running_on->data; - router_node = node->details->uname; - attr_options |= attrd_opt_remote; - } -diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c -index d066c42..2463fb5 100644 ---- a/tools/crm_resource_print.c -+++ b/tools/crm_resource_print.c -@@ -68,6 +68,7 @@ cli_resource_print_cts(resource_t * rsc) - const char *rtype = crm_element_value(rsc->xml, XML_ATTR_TYPE); - const char *rprov = crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER); - const char *rclass = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); -+ pe_node_t *node = pe__current_node(rsc); - - if (safe_str_eq(rclass, PCMK_RESOURCE_CLASS_STONITH)) { - xmlNode *op = NULL; -@@ -90,10 +91,8 @@ cli_resource_print_cts(resource_t * rsc) - } - } - -- if (rsc->running_on != NULL && g_list_length(rsc->running_on) == 1) { -- node_t *tmp = rsc->running_on->data; -- -- host = tmp->details->uname; -+ if (node != NULL) { -+ host = node->details->uname; - } - - printf("Resource: %s %s %s %s %s %s %s %s %d %lld 0x%.16llx\n", -@@ -315,16 +314,15 @@ int - cli_resource_print_attribute(resource_t *rsc, const char *attr, pe_working_set_t * data_set) - { - int rc = -ENXIO; -- node_t *current = NULL; -+ unsigned int count = 0; - GHashTable *params = NULL; - const char *value = NULL; -+ node_t *current = pe__find_active_on(rsc, &count, NULL); - -- if (g_list_length(rsc->running_on) == 1) { -- current = rsc->running_on->data; -- -- } else if (g_list_length(rsc->running_on) > 1) { -+ if (count > 1) { - CMD_ERR("%s is active on more than one node," - " returning the default value for %s", rsc->id, crm_str(attr)); -+ current = NULL; - } - - params = crm_str_table_new(); -diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c -index 5e54f9e..5004935 100644 ---- a/tools/crm_resource_runtime.c -+++ b/tools/crm_resource_runtime.c -@@ -473,11 +473,11 @@ send_lrm_rsc_op(crm_ipc_t * crmd_channel, const char *op, - node_t *node = pe_find_node(data_set->nodes, host_uname); - - if (node && is_remote_node(node)) { -- if (node->details->remote_rsc == NULL || node->details->remote_rsc->running_on == NULL) { -+ node = pe__current_node(node->details->remote_rsc); -+ if (node == NULL) { - CMD_ERR("No lrmd connection detected to remote node %s", host_uname); - return -ENXIO; - } -- node = node->details->remote_rsc->running_on->data; - router_node = node->details->uname; - } - } -@@ -1648,11 +1648,16 @@ cli_resource_move(resource_t *rsc, const char *rsc_id, const char *host_name, - cib_t *cib, pe_working_set_t *data_set) - { - int rc = -EINVAL; -- int count = 0; -+ unsigned int count = 0; - node_t *current = NULL; - node_t *dest = pe_find_node(data_set->nodes, host_name); - bool cur_is_dest = FALSE; - -+ if (dest == NULL) { -+ CMD_ERR("Error performing operation: node '%s' is unknown", host_name); -+ return -ENXIO; -+ } -+ - if (scope_master && rsc->variant != pe_master) { - resource_t *p = uber_parent(rsc); - if(p->variant == pe_master) { -@@ -1667,8 +1672,12 @@ cli_resource_move(resource_t *rsc, const char *rsc_id, const char *host_name, - } - } - -+ current = pe__find_active_requires(rsc, &count); -+ - if(rsc->variant == pe_master) { - GListPtr iter = NULL; -+ unsigned int master_count = 0; -+ pe_node_t *master_node = NULL; - - for(iter = rsc->children; iter; iter = iter->next) { - resource_t *child = (resource_t *)iter->data; -@@ -1676,37 +1685,27 @@ cli_resource_move(resource_t *rsc, const char *rsc_id, const char *host_name, - - if(child_role == RSC_ROLE_MASTER) { - rsc = child; -- count++; -+ master_node = pe__current_node(child); -+ master_count++; - } - } -- -- if(scope_master == FALSE && count == 0) { -- count = g_list_length(rsc->running_on); -+ if (scope_master || master_count) { -+ count = master_count; -+ current = master_node; - } - -- } else if (pe_rsc_is_clone(rsc)) { -- 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", rsc_id); -- return rc; -- } -- -- if(dest == NULL) { -- CMD_ERR("Error performing operation: node '%s' is unknown", host_name); -- return -ENXIO; - } - -- if(g_list_length(rsc->running_on) == 1) { -- current = rsc->running_on->data; -+ if (count > 1) { -+ if (pe_rsc_is_clone(rsc)) { -+ current = NULL; -+ } else { -+ CMD_ERR("Resource '%s' not moved: active on multiple nodes", rsc_id); -+ return rc; -+ } - } - -- if(current == NULL) { -- /* Nothing to check */ -- -- } else if(scope_master && rsc->fns->state(rsc, TRUE) != RSC_ROLE_MASTER) { -- crm_trace("%s is already active on %s but not in correct state", rsc_id, dest->details->uname); -- } else if (safe_str_eq(current->details->uname, dest->details->uname)) { -+ if (current && (current->details == dest->details)) { - cur_is_dest = TRUE; - if (do_force) { - crm_info("%s is already %s on %s, reinforcing placement with location constraint.", -@@ -1736,7 +1735,7 @@ cli_resource_move(resource_t *rsc, const char *rsc_id, const char *host_name, - (void)cli_resource_ban(rsc_id, current->details->uname, NULL, cib); - - } else if(count > 1) { -- CMD_ERR("Resource '%s' is currently %s in %d locations. One may now move one to %s", -+ CMD_ERR("Resource '%s' is currently %s in %d locations. One may now move to %s", - 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 ", rsc_id, scope_master?"promoted":"active", scope_master?"--master ":""); --- -1.8.3.1 - diff --git a/SOURCES/2.0-cleanup-behavior.patch b/SOURCES/2.0-cleanup-behavior.patch new file mode 100644 index 0000000..bd547d7 --- /dev/null +++ b/SOURCES/2.0-cleanup-behavior.patch @@ -0,0 +1,76 @@ +From 612fcbb399cfaa558504eeaa6ab16064e9013238 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Tue, 7 Aug 2018 11:56:06 -0500 +Subject: [PATCH] Feature: tools: enable 2.0 behavior of crm_resource clean-up + +--- + tools/crm_resource.c | 15 +++++---------- + 1 file changed, 5 insertions(+), 10 deletions(-) + +diff --git a/tools/crm_resource.c b/tools/crm_resource.c +index 5b20873..479c69d 100644 +--- a/tools/crm_resource.c ++++ b/tools/crm_resource.c +@@ -212,8 +212,6 @@ static struct crm_option long_options[] = { + }, + { + "cleanup", no_argument, NULL, 'C', +-#if 0 +- // new behavior disabled until 2.0.0 + "\t\tIf resource has any past failures, clear its history and fail count.\n" + "\t\t\t\tOptionally filtered by --resource, --node, --operation, and --interval (otherwise all).\n" + "\t\t\t\t--operation and --interval apply to fail counts, but entire history is always cleared,\n" +@@ -221,7 +219,6 @@ static struct crm_option long_options[] = { + }, + { + "refresh", no_argument, NULL, 'R', +-#endif + "\t\tDelete resource's history (including failures) so its current state is rechecked.\n" + "\t\t\t\tOptionally filtered by --resource and --node (otherwise all).\n" + "\t\t\t\tUnless --force is specified, resource's group or clone (if any) will also be refreshed." +@@ -352,13 +349,11 @@ static struct crm_option long_options[] = { + }, + { + "operation", required_argument, NULL, 'n', +- "\tOperation to clear instead of all (with -C -r)", +- pcmk_option_hidden // only used with 2.0 -C behavior ++ "\tOperation to clear instead of all (with -C -r)" + }, + { + "interval", required_argument, NULL, 'I', +- "\tInterval of operation to clear (default 0) (with -C -r -n)", +- pcmk_option_hidden // only used with 2.0 -C behavior ++ "\tInterval of operation to clear (default 0) (with -C -r -n)" + }, + { + "set-name", required_argument, NULL, 's', +@@ -388,7 +383,6 @@ static struct crm_option long_options[] = { + {"un-migrate", no_argument, NULL, 'U', NULL, pcmk_option_hidden}, + {"un-move", no_argument, NULL, 'U', NULL, pcmk_option_hidden}, + +- {"refresh", 0, 0, 'R', NULL, pcmk_option_hidden}, // remove this line for 2.0.0 + {"reprobe", no_argument, NULL, 'P', NULL, pcmk_option_hidden}, + + {"-spacer-", 1, NULL, '-', "\nExamples:", pcmk_option_paragraph}, +@@ -630,15 +624,16 @@ main(int argc, char **argv) + timeout_ms = crm_get_msec(optarg); + break; + ++ case 'P': ++ flag = 'R'; + case 'C': + case 'R': +- case 'P': + crm_log_args(argc, argv); + require_resource = FALSE; + if (cib_file == NULL) { + require_crmd = TRUE; + } +- rsc_cmd = 'R'; // disable new behavior until 2.0 ++ rsc_cmd = flag; + find_flags = pe_find_renamed|pe_find_anon; + break; + +-- +1.8.3.1 + diff --git a/SOURCES/2.0-record-pending-behavior.patch b/SOURCES/2.0-record-pending-behavior.patch new file mode 100644 index 0000000..22f49f7 --- /dev/null +++ b/SOURCES/2.0-record-pending-behavior.patch @@ -0,0 +1,48 @@ +From b48ceeb041cee65a9b93b9b76235e475fa1a128f Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Mon, 16 Oct 2017 09:45:18 -0500 +Subject: [PATCH 2/2] Feature: crmd: default record-pending to TRUE + +--- + crmd/lrm.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/crmd/lrm.c b/crmd/lrm.c +index eb4e16e..36dc076 100644 +--- a/crmd/lrm.c ++++ b/crmd/lrm.c +@@ -2061,25 +2061,22 @@ stop_recurring_actions(gpointer key, gpointer value, gpointer user_data) + static void + record_pending_op(const char *node_name, lrmd_rsc_info_t *rsc, lrmd_event_data_t *op) + { ++ const char *record_pending = NULL; ++ + CRM_CHECK(node_name != NULL, return); + CRM_CHECK(rsc != NULL, return); + CRM_CHECK(op != NULL, return); + + // Never record certain operation types as pending +- if (op->op_type == NULL ++ if ((op->op_type == NULL) || (op->params == NULL) + || !controld_action_is_recordable(op->op_type)) { + return; + } + +- if (op->params == NULL) { ++ // defaults to true ++ record_pending = crm_meta_value(op->params, XML_OP_ATTR_PENDING); ++ if (record_pending && !crm_is_true(record_pending)) { + return; +- +- } else { +- const char *record_pending = crm_meta_value(op->params, XML_OP_ATTR_PENDING); +- +- if (record_pending == NULL || crm_is_true(record_pending) == FALSE) { +- return; +- } + } + + op->call_id = -1; +-- +1.8.3.1 + diff --git a/SPECS/pacemaker.spec b/SPECS/pacemaker.spec index 18acc4e..6a47ba2 100644 --- a/SPECS/pacemaker.spec +++ b/SPECS/pacemaker.spec @@ -13,12 +13,12 @@ ## Upstream pacemaker version, and its package version (specversion ## can be incremented to build packages reliably considered "newer" ## than previously built packages with the same pcmkversion) -%global pcmkversion 1.1.18 -%global specversion 11 +%global pcmkversion 1.1.19 +%global specversion 8 ## Upstream commit (or git tag, such as "Pacemaker-" plus the ## {pcmkversion} macro for an official release) to use for this package -%global commit 2b07d5c5a908998891c3317faa30328c108d3a91 +%global commit c3c624ea3d98a74a8a287671a156db126c99a7bb ## Since git v2.11, the extent of abbreviation is autoscaled by default ## (used to be constant of 7), so we need to convey it for non-tags, too. %global commit_abbrev 7 @@ -43,9 +43,6 @@ case "%{shortcommit}" in *-rc[[:digit:]]*%{rparen} false;; esac; }; echo $?) -## Whether this is a development branch -%define post_release %([ %{commit} = Pacemaker-%{shortcommit} ]; echo $?) - ## Turn off auto-compilation of python files outside site-packages directory, ## so that the -libs-devel package is multilib-compliant (no *.py[co] files) %global __os_install_post %(echo '%{__os_install_post}' | { @@ -163,7 +160,7 @@ Name: pacemaker Summary: Scalable High-Availability cluster resource manager Version: %{pcmkversion} -Release: %{pcmk_release}%{?dist}.3 +Release: %{pcmk_release}%{?dist} %if %{defined _unitdir} License: GPLv2+ and LGPLv2+ %else @@ -179,30 +176,19 @@ Source0: https://github.com/%{github_owner}/%{name}/archive/%{commit}/%{na Source1: nagios-agents-metadata-%{nagios_hash}.tar.gz # upstream commits -Patch1: 001-new-behavior.patch -Patch2: 002-fixes.patch -Patch3: 003-cleanup.patch +Patch1: 001-rollup.patch +Patch2: 002-ppc64le.patch +Patch3: 003-static-analysis.patch Patch4: 004-cleanup.patch -Patch5: 005-cleanup.patch -Patch6: 006-leaks.patch -Patch7: 007-bundles.patch -Patch8: 008-quorum.patch -Patch9: 009-crm_resource.patch -Patch10: 010-crm_master.patch -Patch11: 011-regression-tests.patch -Patch12: 012-notifs.patch -Patch13: 013-notifs-tests.patch -Patch14: 014-segfault.patch -Patch15: 015-fail-timeout.patch -Patch16: 016-crm_diff.patch -Patch17: 017-pending-notify.patch -Patch18: 018-node-names.patch -Patch19: 019-requires-quorum.patch -Patch20: 020-multiple-active.patch +Patch5: 005-corosync.patch +Patch6: 006-fail-count.patch +Patch7: 007-stderr.patch # patches that aren't from upstream Patch100: lrmd-protocol-version.patch Patch101: rhbz-url.patch +Patch102: 2.0-record-pending-behavior.patch +Patch103: 2.0-cleanup-behavior.patch BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) AutoReqProv: on @@ -216,7 +202,7 @@ Provides: pcmk-cluster-manager %{?systemd_requires} -ExclusiveArch: i686 x86_64 ppc64le s390x +ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 # Pacemaker targets compatibility with python 2.6+ and 3.2+ Requires: python >= 2.6 @@ -267,7 +253,7 @@ BuildRequires: cluster-glue-libs-devel ## (note no avoiding effect when building through non-customized mock) %if !%{bleeding} %if %{with doc} -BuildRequires: publican inkscape asciidoc +BuildRequires: inkscape asciidoc publican %endif %endif @@ -339,6 +325,7 @@ Requires: %{name}-libs = %{version}-%{release} Requires: %{name}-cli = %{version}-%{release} Requires: resource-agents Provides: pcmk-cluster-manager + # -remote can be fully independent of systemd %{?systemd_ordering}%{!?systemd_ordering:%{?systemd_requires}} @@ -485,8 +472,11 @@ sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool make %{_smp_mflags} V=1 all %check -# Prevent false positives in rpmlint -./BasicSanity.sh -V pengine cli 2>&1 | sed s/[fF]ail/faiil/g +{ pengine/regression.sh --run one-or-more-unrunnable-instances \ + && tools/regression.sh \ + && touch .CHECKED +} 2>&1 | sed 's/[fF]ail/faiil/g' # prevent false positives in rpmlint +[ -f .CHECKED ] && rm -f -- .CHECKED || false %install rm -rf %{buildroot} @@ -522,6 +512,12 @@ find %{buildroot} -name '*.xml' -type f -print0 | xargs -0 chmod a-x find %{buildroot} -name '*.a' -type f -print0 | xargs -0 rm -f find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f +# For now, don't package the servicelog-related binaries built only for +# ppc64le when certain dependencies are installed. If they get more exercise by +# advanced users, we can reconsider. +rm -f %{buildroot}/%{_sbindir}/notifyServicelogEvent +rm -f %{buildroot}/%{_sbindir}/ipmiservicelogd + # Do not package these either rm -f %{buildroot}/%{_libdir}/service_crm.so rm -f %{buildroot}/%{_sbindir}/fence_legacy @@ -871,23 +867,75 @@ exit 0 %attr(0644,root,root) %{_datadir}/pacemaker/nagios/plugins-metadata/* %changelog -* Tue Jun 5 2018 Ken Gaillot - 1.1.18-11.3 -- Fix regression in handling of mixed-case node names -- Avoid multiple recovery of stonith devices -- Resolves: rhbz#1583747 -- Resolves: rhbz#1585741 - -* Fri Apr 20 2018 Ken Gaillot - 1.1.18-11.2 -- Do not record pending notify actions as completed -- Resolves: rhbz#1570618 - -* Wed Apr 18 2018 Ken Gaillot - 1.1.18-11.1 -- Do not schedule notifications for unrunnable actions -- Do not expire remote failures if fencing is pending -- Do not consider attribute order difference as CIB change in crm_diff -- Resolves: rhbz#1563345 -- Resolves: rhbz#1566533 -- Resolves: rhbz#1568720 +* Mon Sep 24 2018 Ken Gaillot - 1.1.19-8 +- Ensure crm_resource --force-* commands get stderr messages +- Resolves: rhbz#1628947 + +* Tue Aug 14 2018 Ken Gaillot - 1.1.19-7 +- Shutdown corosync locally if fenced +- Count start failure once +- Resolves: rhbz#1448221 +- Resolves: rhbz#1549576 + +* Tue Aug 7 2018 Ken Gaillot - 1.1.19-6 +- Fix pre-release regressions in resource clean-up behavior +- Resolves: rhbz#1612869 + +* Mon Jul 30 2018 Ken Gaillot - 1.1.19-5 +- Another fix for srpm build on ppc64le systems with OpenIPMI-devel +- Resolves: rhbz#1478451 + +* Wed Jul 25 2018 Ken Gaillot - 1.1.19-4 +- Fix srpm build on ppc64le systems with libservicelog-devel, OpenIPMI-devel +- Resolves: rhbz#1478451 + +* Wed Jul 11 2018 Ken Gaillot - 1.1.19-3 +- Rebase to upstream c3c624ea3d98a74a8a287671a156db126c99a7bb (1.1.19) +- Resolves: rhbz#1562255 + +* Thu Jul 5 2018 Ken Gaillot - 1.1.19-2 +- Ensure resource agent meta-data actions can get local node name +- Do not record pending clone notifications in CIB +- Resolves: rhbz#1374175 +- Resolves: rhbz#1570130 + +* Wed Jun 20 2018 Ken Gaillot - 1.1.19-1 +- Rebase to upstream 29ac12ad21f73524f69c0580798e07cdf1fe3fa0 (1.1.19-rc1) +- Allow crm_node to work on Pacemaker Remote nodes +- Implement new --validate option to stonith_admin +- Support .path, .mount, and .timer systemd unit files as resources +- Handle INFINITY fail count correctly in crm_failcount +- Resolves: rhbz#1374175 +- Resolves: rhbz#1434936 +- Resolves: rhbz#1562255 +- Resolves: rhbz#1590483 +- Resolves: rhbz#1591045 + +* Fri Jun 1 2018 Ken Gaillot - 1.1.18-13 +- Pull latest upstream 1.1 branch fixes +- Resolves: rhbz#1478451 +- Resolves: rhbz#1501505 +- Resolves: rhbz#1514492 +- Resolves: rhbz#1550829 +- Resolves: rhbz#1564536 +- Resolves: rhbz#1576148 +- Resolves: rhbz#1577300 + +* Tue Apr 17 2018 Ken Gaillot - 1.1.18-12 +- Pull in latest fixes from upstream 1.1 branch +- Build for aarch64 +- Resolves: rhbz#1422602 +- Resolves: rhbz#1463015 +- Resolves: rhbz#1469255 +- Resolves: rhbz#1519379 +- Resolves: rhbz#1543278 +- Resolves: rhbz#1545449 +- Resolves: rhbz#1550829 +- Resolves: rhbz#1561617 +- Resolves: rhbz#1562255 +- Resolves: rhbz#1565187 +- Resolves: rhbz#1568593 +- Resolves: rhbz#1570130 * Fri Jan 26 2018 Ken Gaillot - 1.1.18-11 - Fix regression in crm_master