From 587943fd1000e41353d601ace4181365a0c690a3 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Feb 05 2021 06:11:21 +0000 Subject: import pacemaker-2.0.5-6.el8 --- diff --git a/SOURCES/027-crm_mon.patch b/SOURCES/027-crm_mon.patch new file mode 100644 index 0000000..ae3501b --- /dev/null +++ b/SOURCES/027-crm_mon.patch @@ -0,0 +1,962 @@ +From a32b6e14ba51fefbda2d4a699cf1c48dd3a1bb5a Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 11:37:51 -0500 +Subject: [PATCH 01/10] Fix: tools: Don't pass stonith history to + print_simple_status. + +It's not being used. +--- + tools/crm_mon.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 4555516..729f6a1 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -1451,14 +1451,13 @@ main(int argc, char **argv) + * \brief Print one-line status suitable for use with monitoring software + * + * \param[in] data_set Working set of CIB state +- * \param[in] history List of stonith actions + * + * \note This function's output (and the return code when the program exits) + * should conform to https://www.monitoring-plugins.org/doc/guidelines.html + */ + static void + print_simple_status(pcmk__output_t *out, pe_working_set_t * data_set, +- stonith_history_t *history, unsigned int mon_ops) ++ unsigned int mon_ops) + { + GListPtr gIter = NULL; + int nodes_online = 0; +@@ -2012,7 +2011,7 @@ mon_refresh_display(gpointer user_data) + break; + + case mon_output_monitor: +- print_simple_status(out, mon_data_set, stonith_history, options.mon_ops); ++ print_simple_status(out, mon_data_set, options.mon_ops); + if (pcmk_is_set(options.mon_ops, mon_op_has_warnings)) { + clean_up(MON_STATUS_WARN); + return FALSE; +-- +1.8.3.1 + + +From 8b9c47089c70295bc0529671ba5991c6d831e14b Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 13:17:04 -0500 +Subject: [PATCH 02/10] Refactor: tools: Don't pass output_format to + mon_refresh_display. + +output_format is a global variable. +--- + tools/crm_mon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 729f6a1..b801560 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -827,7 +827,7 @@ cib_connect(gboolean full) + + rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); + if (rc == pcmk_ok) { +- mon_refresh_display(&output_format); ++ mon_refresh_display(NULL); + } + + if (rc == pcmk_ok && full) { +-- +1.8.3.1 + + +From a1b14ad96f12746167da8588dc086b20e6f6d1d6 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 13:20:14 -0500 +Subject: [PATCH 03/10] Refactor: tools: Remove unnecessary checks for cib != + NULL. + +cib is guaranteed to not be NULL at these points, so there's no need to +do an additional check. This code was leftover from a previous +reorganization that changed when the cib variable gets initialized. +--- + tools/crm_mon.c | 41 +++++++++++++++++++---------------------- + 1 file changed, 19 insertions(+), 22 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index b801560..1eedd38 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1346,7 +1346,7 @@ main(int argc, char **argv) + + /* Extra sanity checks when in CGI mode */ + if (output_format == mon_output_cgi) { +- if (cib && cib->variant == cib_file) { ++ if (cib->variant == cib_file) { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_USAGE, "CGI mode used with CIB file"); + return clean_up(CRM_EX_USAGE); + } else if (options.external_agent != NULL) { +@@ -1370,33 +1370,30 @@ main(int argc, char **argv) + + crm_info("Starting %s", crm_system_name); + +- if (cib) { +- +- do { +- if (!pcmk_is_set(options.mon_ops, mon_op_one_shot)) { +- print_as(output_format ,"Waiting until cluster is available on this node ...\n"); +- } +- rc = cib_connect(!pcmk_is_set(options.mon_ops, mon_op_one_shot)); ++ do { ++ if (!pcmk_is_set(options.mon_ops, mon_op_one_shot)) { ++ print_as(output_format ,"Waiting until cluster is available on this node ...\n"); ++ } ++ rc = cib_connect(!pcmk_is_set(options.mon_ops, mon_op_one_shot)); + +- if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { +- break; ++ if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { ++ break; + +- } else if (rc != pcmk_ok) { +- sleep(options.reconnect_msec / 1000); ++ } else if (rc != pcmk_ok) { ++ sleep(options.reconnect_msec / 1000); + #if CURSES_ENABLED +- if (output_format == mon_output_console) { +- clear(); +- refresh(); +- } ++ if (output_format == mon_output_console) { ++ clear(); ++ refresh(); ++ } + #endif +- } else { +- if (output_format == mon_output_html && out->dest != stdout) { +- printf("Writing html to %s ...\n", args->output_dest); +- } ++ } else { ++ if (output_format == mon_output_html && out->dest != stdout) { ++ printf("Writing html to %s ...\n", args->output_dest); + } ++ } + +- } while (rc == -ENOTCONN); +- } ++ } while (rc == -ENOTCONN); + + if (rc != pcmk_ok) { + if (output_format == mon_output_monitor) { +-- +1.8.3.1 + + +From fe5284a12765e775905bdfe58711c5733a063132 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 14:15:40 -0500 +Subject: [PATCH 04/10] Fix: tools: mon_refresh_display should return an int. + +While GSourceFunc is defined as returning a boolean, our public API +mainloop function expect the dispatch function to return an int. So +change mon_refresh_display to do so. +--- + tools/crm_mon.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 1eedd38..8657a89 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -125,7 +125,7 @@ struct { + static void clean_up_connections(void); + static crm_exit_t clean_up(crm_exit_t exit_code); + static void crm_diff_update(const char *event, xmlNode * msg); +-static gboolean mon_refresh_display(gpointer user_data); ++static int mon_refresh_display(gpointer user_data); + static int cib_connect(gboolean full); + static void mon_st_callback_event(stonith_t * st, stonith_event_t * e); + static void mon_st_callback_display(stonith_t * st, stonith_event_t * e); +@@ -1925,7 +1925,7 @@ crm_diff_update(const char *event, xmlNode * msg) + kick_refresh(cib_updated); + } + +-static gboolean ++static int + mon_refresh_display(gpointer user_data) + { + xmlNode *cib_copy = copy_xml(current_cib); +@@ -1940,7 +1940,7 @@ mon_refresh_display(gpointer user_data) + } + out->err(out, "Upgrade failed: %s", pcmk_strerror(-pcmk_err_schema_validation)); + clean_up(CRM_EX_CONFIG); +- return FALSE; ++ return 0; + } + + /* get the stonith-history if there is evidence we need it +@@ -1966,7 +1966,7 @@ mon_refresh_display(gpointer user_data) + } + free_xml(cib_copy); + out->err(out, "Reading stonith-history failed"); +- return FALSE; ++ return 0; + } + + if (mon_data_set == NULL) { +@@ -1995,7 +1995,7 @@ mon_refresh_display(gpointer user_data) + options.only_node, options.only_rsc) != 0) { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_CANTCREAT, "Critical: Unable to output html file"); + clean_up(CRM_EX_CANTCREAT); +- return FALSE; ++ return 0; + } + break; + +@@ -2044,7 +2044,7 @@ mon_refresh_display(gpointer user_data) + stonith_history_free(stonith_history); + stonith_history = NULL; + pe_reset_working_set(mon_data_set); +- return TRUE; ++ return 1; + } + + static void +-- +1.8.3.1 + + +From 7f88a5a428ed73fb5161096ece2517abe1119f06 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 16:59:02 -0500 +Subject: [PATCH 05/10] Refactor: tools: Change a conditional in cib_connect. + +This allows unindenting everything that occurs inside that conditional, +which I think makes it a little bit easier to understand what is going +on. +--- + tools/crm_mon.c | 86 +++++++++++++++++++++++++++++---------------------------- + 1 file changed, 44 insertions(+), 42 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 8657a89..b8ba56b 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -804,55 +804,57 @@ cib_connect(gboolean full) + } + } + +- if (cib->state != cib_connected_query && cib->state != cib_connected_command) { +- crm_trace("Connecting to the CIB"); +- +- /* Hack: the CIB signon will print the prompt for a password if needed, +- * but to stderr. If we're in curses, show it on the screen instead. +- * +- * @TODO Add a password prompt (maybe including input) function to +- * pcmk__output_t and use it in libcib. +- */ +- if ((output_format == mon_output_console) && need_pass && (cib->variant == cib_remote)) { +- need_pass = FALSE; +- print_as(output_format, "Password:"); +- } ++ if (cib->state == cib_connected_query || cib->state == cib_connected_command) { ++ return rc; ++ } + +- rc = cib->cmds->signon(cib, crm_system_name, cib_query); +- if (rc != pcmk_ok) { +- out->err(out, "Could not connect to the CIB: %s", +- pcmk_strerror(rc)); +- return rc; +- } ++ crm_trace("Connecting to the CIB"); + +- rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); +- if (rc == pcmk_ok) { +- mon_refresh_display(NULL); +- } ++ /* Hack: the CIB signon will print the prompt for a password if needed, ++ * but to stderr. If we're in curses, show it on the screen instead. ++ * ++ * @TODO Add a password prompt (maybe including input) function to ++ * pcmk__output_t and use it in libcib. ++ */ ++ if ((output_format == mon_output_console) && need_pass && (cib->variant == cib_remote)) { ++ need_pass = FALSE; ++ print_as(output_format, "Password:"); ++ } + +- if (rc == pcmk_ok && full) { +- if (rc == pcmk_ok) { +- rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); +- if (rc == -EPROTONOSUPPORT) { +- print_as +- (output_format, "Notification setup not supported, won't be able to reconnect after failure"); +- if (output_format == mon_output_console) { +- sleep(2); +- } +- rc = pcmk_ok; +- } ++ rc = cib->cmds->signon(cib, crm_system_name, cib_query); ++ if (rc != pcmk_ok) { ++ out->err(out, "Could not connect to the CIB: %s", ++ pcmk_strerror(rc)); ++ return rc; ++ } + +- } ++ rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); ++ if (rc == pcmk_ok) { ++ mon_refresh_display(NULL); ++ } + +- if (rc == pcmk_ok) { +- cib->cmds->del_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); +- rc = cib->cmds->add_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); ++ if (rc == pcmk_ok && full) { ++ if (rc == pcmk_ok) { ++ rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); ++ if (rc == -EPROTONOSUPPORT) { ++ print_as ++ (output_format, "Notification setup not supported, won't be able to reconnect after failure"); ++ if (output_format == mon_output_console) { ++ sleep(2); ++ } ++ rc = pcmk_ok; + } + +- if (rc != pcmk_ok) { +- out->err(out, "Notification setup failed, could not monitor CIB actions"); +- clean_up_connections(); +- } ++ } ++ ++ if (rc == pcmk_ok) { ++ cib->cmds->del_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); ++ rc = cib->cmds->add_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); ++ } ++ ++ if (rc != pcmk_ok) { ++ out->err(out, "Notification setup failed, could not monitor CIB actions"); ++ clean_up_connections(); + } + } + return rc; +-- +1.8.3.1 + + +From 178ba17e4ee62bef28f8e71cad2c002f823661b5 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 17:37:36 -0500 +Subject: [PATCH 06/10] Refactor: tools: Remove an unnecessary conditional in + cib_connect. + +--- + tools/crm_mon.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index b8ba56b..36249e8 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -834,17 +834,14 @@ cib_connect(gboolean full) + } + + if (rc == pcmk_ok && full) { +- if (rc == pcmk_ok) { +- rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); +- if (rc == -EPROTONOSUPPORT) { +- print_as +- (output_format, "Notification setup not supported, won't be able to reconnect after failure"); +- if (output_format == mon_output_console) { +- sleep(2); +- } +- rc = pcmk_ok; ++ rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); ++ if (rc == -EPROTONOSUPPORT) { ++ print_as ++ (output_format, "Notification setup not supported, won't be able to reconnect after failure"); ++ if (output_format == mon_output_console) { ++ sleep(2); + } +- ++ rc = pcmk_ok; + } + + if (rc == pcmk_ok) { +-- +1.8.3.1 + + +From 33bac5886417afc5c7bbf56f4d31e0e36f8ae947 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Fri, 8 Jan 2021 10:00:50 -0500 +Subject: [PATCH 07/10] Refactor: tools: Simplify another conditional in + crm_mon. + +--- + tools/crm_mon.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 36249e8..8b47bbc 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1386,10 +1386,8 @@ main(int argc, char **argv) + refresh(); + } + #endif +- } else { +- if (output_format == mon_output_html && out->dest != stdout) { +- printf("Writing html to %s ...\n", args->output_dest); +- } ++ } else if (output_format == mon_output_html && out->dest != stdout) { ++ printf("Writing html to %s ...\n", args->output_dest); + } + + } while (rc == -ENOTCONN); +-- +1.8.3.1 + + +From 40bc8b3147e7ebef4318211fa69973a8b5d32e79 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Fri, 8 Jan 2021 12:12:37 -0500 +Subject: [PATCH 08/10] Refactor: libcrmcommon,tools,daemons: Put common xpath + code in one place. + +--- + configure.ac | 1 + + daemons/controld/controld_te_callbacks.c | 26 +++----------- + include/crm/common/xml_internal.h | 14 +++++++- + lib/common/tests/Makefile.am | 2 +- + lib/common/tests/xpath/Makefile.am | 29 +++++++++++++++ + lib/common/tests/xpath/pcmk__xpath_node_id_test.c | 43 +++++++++++++++++++++++ + lib/common/xpath.c | 34 +++++++++++++++++- + tools/crm_mon.c | 25 ++----------- + 8 files changed, 127 insertions(+), 47 deletions(-) + create mode 100644 lib/common/tests/xpath/Makefile.am + create mode 100644 lib/common/tests/xpath/pcmk__xpath_node_id_test.c + +diff --git a/configure.ac b/configure.ac +index 5959116..ce0f1fe 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1920,6 +1920,7 @@ AC_CONFIG_FILES(Makefile \ + lib/common/tests/operations/Makefile \ + lib/common/tests/strings/Makefile \ + lib/common/tests/utils/Makefile \ ++ lib/common/tests/xpath/Makefile \ + lib/cluster/Makefile \ + lib/cib/Makefile \ + lib/gnu/Makefile \ +diff --git a/daemons/controld/controld_te_callbacks.c b/daemons/controld/controld_te_callbacks.c +index 66fc645..4e3e4e6 100644 +--- a/daemons/controld/controld_te_callbacks.c ++++ b/daemons/controld/controld_te_callbacks.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -276,24 +276,6 @@ process_resource_updates(const char *node, xmlNode *xml, xmlNode *change, + } + } + +-#define NODE_PATT "/lrm[@id=" +-static char *get_node_from_xpath(const char *xpath) +-{ +- char *nodeid = NULL; +- char *tmp = strstr(xpath, NODE_PATT); +- +- if(tmp) { +- tmp += strlen(NODE_PATT); +- tmp += 1; +- +- nodeid = strdup(tmp); +- tmp = strstr(nodeid, "\'"); +- CRM_ASSERT(tmp); +- tmp[0] = 0; +- } +- return nodeid; +-} +- + static char *extract_node_uuid(const char *xpath) + { + char *mutable_path = strdup(xpath); +@@ -522,19 +504,19 @@ te_update_diff_v2(xmlNode *diff) + process_resource_updates(ID(match), match, change, op, xpath); + + } else if (strcmp(name, XML_LRM_TAG_RESOURCES) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + process_resource_updates(local_node, match, change, op, xpath); + free(local_node); + + } else if (strcmp(name, XML_LRM_TAG_RESOURCE) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + process_lrm_resource_diff(match, local_node); + free(local_node); + + } else if (strcmp(name, XML_LRM_TAG_RSC_OP) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + process_graph_event(match, local_node); + free(local_node); +diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h +index 1e80bc6..d8694ee 100644 +--- a/include/crm/common/xml_internal.h ++++ b/include/crm/common/xml_internal.h +@@ -1,5 +1,5 @@ + /* +- * Copyright 2017-2020 the Pacemaker project contributors ++ * Copyright 2017-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -273,4 +273,16 @@ pcmk__xe_first_attr(const xmlNode *xe) + return (xe == NULL)? NULL : xe->properties; + } + ++/*! ++ * \internal ++ * \brief Extract the ID attribute from an XML element ++ * ++ * \param[in] xpath String to search ++ * \param[in] node Node to get the ID for ++ * ++ * \return ID attribute of \p node in xpath string \p xpath ++ */ ++char * ++pcmk__xpath_node_id(const char *xpath, const char *node); ++ + #endif // PCMK__XML_INTERNAL__H +diff --git a/lib/common/tests/Makefile.am b/lib/common/tests/Makefile.am +index 2c33cc5..4c6e8b4 100644 +--- a/lib/common/tests/Makefile.am ++++ b/lib/common/tests/Makefile.am +@@ -1 +1 @@ +-SUBDIRS = agents cmdline flags operations strings utils ++SUBDIRS = agents cmdline flags operations strings utils xpath +diff --git a/lib/common/tests/xpath/Makefile.am b/lib/common/tests/xpath/Makefile.am +new file mode 100644 +index 0000000..7a53683 +--- /dev/null ++++ b/lib/common/tests/xpath/Makefile.am +@@ -0,0 +1,29 @@ ++# ++# Copyright 2021 the Pacemaker project contributors ++# ++# The version control history for this file may have further details. ++# ++# This source code is licensed under the GNU General Public License version 2 ++# or later (GPLv2+) WITHOUT ANY WARRANTY. ++# ++AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include ++LDADD = $(top_builddir)/lib/common/libcrmcommon.la ++ ++include $(top_srcdir)/mk/glib-tap.mk ++ ++# Add each test program here. Each test should be written as a little standalone ++# program using the glib unit testing functions. See the documentation for more ++# information. ++# ++# https://developer.gnome.org/glib/unstable/glib-Testing.html ++# ++# Add "_test" to the end of all test program names to simplify .gitignore. ++test_programs = pcmk__xpath_node_id_test ++ ++# If any extra data needs to be added to the source distribution, add it to the ++# following list. ++dist_test_data = ++ ++# If any extra data needs to be used by tests but should not be added to the ++# source distribution, add it to the following list. ++test_data = +diff --git a/lib/common/tests/xpath/pcmk__xpath_node_id_test.c b/lib/common/tests/xpath/pcmk__xpath_node_id_test.c +new file mode 100644 +index 0000000..f6b5c10 +--- /dev/null ++++ b/lib/common/tests/xpath/pcmk__xpath_node_id_test.c +@@ -0,0 +1,43 @@ ++/* ++ * Copyright 2021 the Pacemaker project contributors ++ * ++ * The version control history for this file may have further details. ++ * ++ * This source code is licensed under the GNU Lesser General Public License ++ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. ++ */ ++ ++#include ++#include ++ ++static void ++empty_input(void) { ++ g_assert_null(pcmk__xpath_node_id(NULL, "lrm")); ++ g_assert_null(pcmk__xpath_node_id("", "lrm")); ++ g_assert_null(pcmk__xpath_node_id("/blah/blah", NULL)); ++ g_assert_null(pcmk__xpath_node_id("/blah/blah", "")); ++ g_assert_null(pcmk__xpath_node_id(NULL, NULL)); ++} ++ ++static void ++not_present(void) { ++ g_assert_null(pcmk__xpath_node_id("/some/xpath/string[@id='xyz']", "lrm")); ++ g_assert_null(pcmk__xpath_node_id("/some/xpath/containing[@id='lrm']", "lrm")); ++} ++ ++static void ++present(void) { ++ g_assert_cmpint(strcmp(pcmk__xpath_node_id("/some/xpath/containing/lrm[@id='xyz']", "lrm"), "xyz"), ==, 0); ++ g_assert_cmpint(strcmp(pcmk__xpath_node_id("/some/other/lrm[@id='xyz']/xpath", "lrm"), "xyz"), ==, 0); ++} ++ ++int ++main(int argc, char **argv) ++{ ++ g_test_init(&argc, &argv, NULL); ++ ++ g_test_add_func("/common/xpath/node_id/empty_input", empty_input); ++ g_test_add_func("/common/xpath/node_id/not_present", not_present); ++ g_test_add_func("/common/xpath/node_id/present", present); ++ return g_test_run(); ++} +diff --git a/lib/common/xpath.c b/lib/common/xpath.c +index 6fa4941..7851a7c 100644 +--- a/lib/common/xpath.c ++++ b/lib/common/xpath.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include "crmcommon_private.h" + + /* +@@ -297,3 +298,34 @@ xml_get_path(xmlNode *xml) + } + return NULL; + } ++ ++char * ++pcmk__xpath_node_id(const char *xpath, const char *node) ++{ ++ char *retval = NULL; ++ char *patt = NULL; ++ char *start = NULL; ++ char *end = NULL; ++ ++ if (node == NULL || xpath == NULL) { ++ return retval; ++ } ++ ++ patt = crm_strdup_printf("/%s[@id=", node); ++ start = strstr(xpath, patt); ++ ++ if (!start) { ++ free(patt); ++ return retval; ++ } ++ ++ start += strlen(patt); ++ start++; ++ ++ end = strstr(start, "\'"); ++ CRM_ASSERT(end); ++ retval = strndup(start, end-start); ++ ++ free(patt); ++ return retval; ++} +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 8b47bbc..ff1b86b 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1719,25 +1719,6 @@ mon_trigger_refresh(gpointer user_data) + return FALSE; + } + +-#define NODE_PATT "/lrm[@id=" +-static char * +-get_node_from_xpath(const char *xpath) +-{ +- char *nodeid = NULL; +- char *tmp = strstr(xpath, NODE_PATT); +- +- if(tmp) { +- tmp += strlen(NODE_PATT); +- tmp += 1; +- +- nodeid = strdup(tmp); +- tmp = strstr(nodeid, "\'"); +- CRM_ASSERT(tmp); +- tmp[0] = 0; +- } +- return nodeid; +-} +- + static void + crm_diff_update_v2(const char *event, xmlNode * msg) + { +@@ -1822,19 +1803,19 @@ crm_diff_update_v2(const char *event, xmlNode * msg) + handle_rsc_op(match, node); + + } else if(strcmp(name, XML_LRM_TAG_RESOURCES) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + handle_rsc_op(match, local_node); + free(local_node); + + } else if(strcmp(name, XML_LRM_TAG_RESOURCE) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + handle_rsc_op(match, local_node); + free(local_node); + + } else if(strcmp(name, XML_LRM_TAG_RSC_OP) == 0) { +- char *local_node = get_node_from_xpath(xpath); ++ char *local_node = pcmk__xpath_node_id(xpath, "lrm"); + + handle_rsc_op(match, local_node); + free(local_node); +-- +1.8.3.1 + + +From b0126373d8b2a739ec5b985a7e1f530e850618d3 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Mon, 11 Jan 2021 10:20:11 -0500 +Subject: [PATCH 09/10] Refactor: libpacemaker: Move reduce_stonith_history + into the library. + +And also rename it to pcmk__reduce_fence_history. I don't see anywhere +else that could use this function at the moment, but it seems too +generic to keep in crm_mon. +--- + include/pcmki/pcmki_fence.h | 16 +++++++++++++- + lib/pacemaker/pcmk_fence.c | 45 ++++++++++++++++++++++++++++++++++++++- + tools/crm_mon.c | 52 +-------------------------------------------- + 3 files changed, 60 insertions(+), 53 deletions(-) + +diff --git a/include/pcmki/pcmki_fence.h b/include/pcmki/pcmki_fence.h +index 241d030..d4cef68 100644 +--- a/include/pcmki/pcmki_fence.h ++++ b/include/pcmki/pcmki_fence.h +@@ -1,5 +1,5 @@ + /* +- * Copyright 2019-2020 the Pacemaker project contributors ++ * Copyright 2019-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -219,4 +219,18 @@ int pcmk__fence_validate(pcmk__output_t *out, stonith_t *st, const char *agent, + const char *id, stonith_key_value_t *params, + unsigned int timeout); + ++/** ++ * \brief Reduce the STONITH history ++ * ++ * STONITH history is reduced as follows: ++ * - The last successful action of every action-type and target is kept ++ * - For failed actions, who failed is kept ++ * - All actions in progress are kept ++ * ++ * \param[in] history List of STONITH actions ++ * ++ * \return The reduced history ++ */ ++stonith_history_t * ++pcmk__reduce_fence_history(stonith_history_t *history); + #endif +diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c +index d591379..34540cc 100644 +--- a/lib/pacemaker/pcmk_fence.c ++++ b/lib/pacemaker/pcmk_fence.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2009-2020 the Pacemaker project contributors ++ * Copyright 2009-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -520,3 +520,46 @@ pcmk_fence_validate(xmlNodePtr *xml, stonith_t *st, const char *agent, + return rc; + } + #endif ++ ++stonith_history_t * ++pcmk__reduce_fence_history(stonith_history_t *history) ++{ ++ stonith_history_t *new, *hp, *np; ++ ++ if (!history) { ++ return history; ++ } ++ ++ new = history; ++ hp = new->next; ++ new->next = NULL; ++ ++ while (hp) { ++ stonith_history_t *hp_next = hp->next; ++ ++ hp->next = NULL; ++ ++ for (np = new; ; np = np->next) { ++ if ((hp->state == st_done) || (hp->state == st_failed)) { ++ /* action not in progress */ ++ if (pcmk__str_eq(hp->target, np->target, pcmk__str_casei) && ++ pcmk__str_eq(hp->action, np->action, pcmk__str_casei) && ++ (hp->state == np->state) && ++ ((hp->state == st_done) || ++ pcmk__str_eq(hp->delegate, np->delegate, pcmk__str_casei))) { ++ /* purge older hp */ ++ stonith_history_free(hp); ++ break; ++ } ++ } ++ ++ if (!np->next) { ++ np->next = hp; ++ break; ++ } ++ } ++ hp = hp_next; ++ } ++ ++ return new; ++} +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index ff1b86b..2179f53 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1520,56 +1520,6 @@ print_simple_status(pcmk__output_t *out, pe_working_set_t * data_set, + /* coverity[leaked_storage] False positive */ + } + +-/*! +- * \internal +- * \brief Reduce the stonith-history +- * for successful actions we keep the last of every action-type & target +- * for failed actions we record as well who had failed +- * for actions in progress we keep full track +- * +- * \param[in] history List of stonith actions +- * +- */ +-static stonith_history_t * +-reduce_stonith_history(stonith_history_t *history) +-{ +- stonith_history_t *new = history, *hp, *np; +- +- if (new) { +- hp = new->next; +- new->next = NULL; +- +- while (hp) { +- stonith_history_t *hp_next = hp->next; +- +- hp->next = NULL; +- +- for (np = new; ; np = np->next) { +- if ((hp->state == st_done) || (hp->state == st_failed)) { +- /* action not in progress */ +- if (pcmk__str_eq(hp->target, np->target, pcmk__str_casei) && +- pcmk__str_eq(hp->action, np->action, pcmk__str_casei) && +- (hp->state == np->state) && +- ((hp->state == st_done) || +- pcmk__str_eq(hp->delegate, np->delegate, pcmk__str_casei))) { +- /* purge older hp */ +- stonith_history_free(hp); +- break; +- } +- } +- +- if (!np->next) { +- np->next = hp; +- break; +- } +- } +- hp = hp_next; +- } +- } +- +- return new; +-} +- + static int + send_custom_trap(const char *node, const char *rsc, const char *task, int target_rc, int rc, + int status, const char *desc) +@@ -1935,7 +1885,7 @@ mon_refresh_display(gpointer user_data) + if (!pcmk_is_set(options.mon_ops, mon_op_fence_full_history) + && (output_format != mon_output_xml)) { + +- stonith_history = reduce_stonith_history(stonith_history); ++ stonith_history = pcmk__reduce_fence_history(stonith_history); + } + break; /* all other cases are errors */ + } +-- +1.8.3.1 + + +From af3f1368bc76eb498c2c96b3eda9324b579c9380 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Tue, 12 Jan 2021 15:46:55 -0500 +Subject: [PATCH 10/10] Low: tools: Adjust fencing shown indicator in crm_mon. + +If any of the various fencing flags are set, but not all of them, no '*' +will be shown next to the fencing line in the interactive change screen. +This makes it seem like fencing should not be shown, and hitting 'm' +should toggle the fencing display on. However, that's not the case and +hitting 'm' will actually toggle fencing off. Hitting it again will +toggle it on and the '*' will appear. + +This is confusing, so just display the '*' if any fencing flag is set. +--- + tools/crm_mon.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 2179f53..8ec97bb 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -984,7 +984,10 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + print_option_help(out, 'R', pcmk_is_set(options.mon_ops, mon_op_print_clone_detail)); + print_option_help(out, 'b', pcmk_is_set(options.mon_ops, mon_op_print_brief)); + print_option_help(out, 'j', pcmk_is_set(options.mon_ops, mon_op_print_pending)); +- print_option_help(out, 'm', pcmk_is_set(show, mon_show_fencing_all)); ++ print_option_help(out, 'm', pcmk_any_flags_set(show, ++ mon_show_fence_failed ++ |mon_show_fence_pending ++ |mon_show_fence_worked)); + out->info(out, "%s", "\nToggle fields via field letter, type any other key to return"); + } + +-- +1.8.3.1 + diff --git a/SOURCES/028-crm_mon.patch b/SOURCES/028-crm_mon.patch new file mode 100644 index 0000000..7d295f4 --- /dev/null +++ b/SOURCES/028-crm_mon.patch @@ -0,0 +1,1305 @@ +From bc91cc5d8b4257627d09103cf676cd83656bda8c Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Tue, 12 Jan 2021 10:45:53 -0500 +Subject: [PATCH 01/11] Refactor: tools: Split up connection teardown in + crm_mon. + +We don't necessarily want to tear down the fencing and CIB connections +at the same time always. This can then immediately be used in +mon_refresh_display and do_mon_cib_connection_destroy. +--- + tools/crm_mon.c | 57 +++++++++++++++++++++++++++++++-------------------------- + 1 file changed, 31 insertions(+), 26 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 8ec97bb..fc20e4c 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -122,7 +122,8 @@ struct { + .mon_ops = mon_op_default + }; + +-static void clean_up_connections(void); ++static void clean_up_cib_connection(void); ++static void clean_up_fencing_connection(void); + static crm_exit_t clean_up(crm_exit_t exit_code); + static void crm_diff_update(const char *event, xmlNode * msg); + static int mon_refresh_display(gpointer user_data); +@@ -712,12 +713,7 @@ do_mon_cib_connection_destroy(gpointer user_data, bool is_error) + /* the client API won't properly reconnect notifications + * if they are still in the table - so remove them + */ +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_DISCONNECT); +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_FENCE); +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_HISTORY); +- if (st->state != stonith_disconnected) { +- st->cmds->disconnect(st); +- } ++ clean_up_fencing_connection(); + } + if (cib) { + cib->cmds->signoff(cib); +@@ -851,7 +847,8 @@ cib_connect(gboolean full) + + if (rc != pcmk_ok) { + out->err(out, "Notification setup failed, could not monitor CIB actions"); +- clean_up_connections(); ++ clean_up_cib_connection(); ++ clean_up_fencing_connection(); + } + } + return rc; +@@ -1866,9 +1863,7 @@ mon_refresh_display(gpointer user_data) + last_refresh = time(NULL); + + if (cli_config_update(&cib_copy, NULL, FALSE) == FALSE) { +- if (cib) { +- cib->cmds->signoff(cib); +- } ++ clean_up_cib_connection(); + out->err(out, "Upgrade failed: %s", pcmk_strerror(-pcmk_err_schema_validation)); + clean_up(CRM_EX_CONFIG); + return 0; +@@ -2040,24 +2035,33 @@ mon_st_callback_display(stonith_t * st, stonith_event_t * e) + } + + static void +-clean_up_connections(void) ++clean_up_cib_connection(void) + { +- if (cib != NULL) { +- cib->cmds->signoff(cib); +- cib_delete(cib); +- cib = NULL; ++ if (cib == NULL) { ++ return; + } + +- if (st != NULL) { +- if (st->state != stonith_disconnected) { +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_DISCONNECT); +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_FENCE); +- st->cmds->remove_notification(st, T_STONITH_NOTIFY_HISTORY); +- st->cmds->disconnect(st); +- } +- stonith_api_delete(st); +- st = NULL; ++ cib->cmds->signoff(cib); ++ cib_delete(cib); ++ cib = NULL; ++} ++ ++static void ++clean_up_fencing_connection(void) ++{ ++ if (st == NULL) { ++ return; + } ++ ++ if (st->state != stonith_disconnected) { ++ st->cmds->remove_notification(st, T_STONITH_NOTIFY_DISCONNECT); ++ st->cmds->remove_notification(st, T_STONITH_NOTIFY_FENCE); ++ st->cmds->remove_notification(st, T_STONITH_NOTIFY_HISTORY); ++ st->cmds->disconnect(st); ++ } ++ ++ stonith_api_delete(st); ++ st = NULL; + } + + /* +@@ -2074,7 +2078,8 @@ clean_up(crm_exit_t exit_code) + /* Quitting crm_mon is much more complicated than it ought to be. */ + + /* (1) Close connections, free things, etc. */ +- clean_up_connections(); ++ clean_up_cib_connection(); ++ clean_up_fencing_connection(); + free(options.pid_file); + free(options.neg_location_prefix); + g_slist_free_full(options.includes_excludes, free); +-- +1.8.3.1 + + +From 28d646ce67c6a933eaa76aca51f9973a65d0ee3c Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 7 Jan 2021 17:18:13 -0500 +Subject: [PATCH 02/11] Refactor: tools: Split up connection establishment in + crm_mon. + +We don't necessarily always want to connect to the CIB and fencing in +the same action. Note that bringing up the fencing connection needs to +happen first, because mon_refresh_display is called from cib_connect and +it will want a fencing connection. +--- + tools/crm_mon.c | 66 +++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 38 insertions(+), 28 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index fc20e4c..301a222 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -128,6 +128,7 @@ static crm_exit_t clean_up(crm_exit_t exit_code); + static void crm_diff_update(const char *event, xmlNode * msg); + static int mon_refresh_display(gpointer user_data); + static int cib_connect(gboolean full); ++static int fencing_connect(void); + static void mon_st_callback_event(stonith_t * st, stonith_event_t * e); + static void mon_st_callback_display(stonith_t * st, stonith_event_t * e); + static void kick_refresh(gboolean data_updated); +@@ -668,8 +669,6 @@ static GOptionEntry deprecated_entries[] = { + static gboolean + mon_timer_popped(gpointer data) + { +- int rc = pcmk_ok; +- + #if CURSES_ENABLED + if (output_format == mon_output_console) { + clear(); +@@ -683,9 +682,7 @@ mon_timer_popped(gpointer data) + } + + print_as(output_format, "Reconnecting...\n"); +- rc = cib_connect(TRUE); +- +- if (rc != pcmk_ok) { ++ if (fencing_connect() == pcmk_ok && cib_connect(TRUE) == pcmk_ok) { + timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); + } + return FALSE; +@@ -767,39 +764,48 @@ mon_winresize(int nsig) + #endif + + static int +-cib_connect(gboolean full) ++fencing_connect(void) + { + int rc = pcmk_ok; +- static gboolean need_pass = TRUE; +- +- CRM_CHECK(cib != NULL, return -EINVAL); +- +- if (getenv("CIB_passwd") != NULL) { +- need_pass = FALSE; +- } + + if (pcmk_is_set(options.mon_ops, mon_op_fence_connect) && (st == NULL)) { + st = stonith_api_new(); + } + +- if (pcmk_is_set(options.mon_ops, mon_op_fence_connect) +- && (st != NULL) && (st->state == stonith_disconnected)) { ++ if (!pcmk_is_set(options.mon_ops, mon_op_fence_connect) || ++ st == NULL || st->state != stonith_disconnected) { ++ return rc; ++ } + +- rc = st->cmds->connect(st, crm_system_name, NULL); +- if (rc == pcmk_ok) { +- crm_trace("Setting up stonith callbacks"); +- if (pcmk_is_set(options.mon_ops, mon_op_watch_fencing)) { +- st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, +- mon_st_callback_event); +- st->cmds->register_notification(st, T_STONITH_NOTIFY_FENCE, mon_st_callback_event); +- } else { +- st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, +- mon_st_callback_display); +- st->cmds->register_notification(st, T_STONITH_NOTIFY_HISTORY, mon_st_callback_display); +- } ++ rc = st->cmds->connect(st, crm_system_name, NULL); ++ if (rc == pcmk_ok) { ++ crm_trace("Setting up stonith callbacks"); ++ if (pcmk_is_set(options.mon_ops, mon_op_watch_fencing)) { ++ st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, ++ mon_st_callback_event); ++ st->cmds->register_notification(st, T_STONITH_NOTIFY_FENCE, mon_st_callback_event); ++ } else { ++ st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, ++ mon_st_callback_display); ++ st->cmds->register_notification(st, T_STONITH_NOTIFY_HISTORY, mon_st_callback_display); + } + } + ++ return rc; ++} ++ ++static int ++cib_connect(gboolean full) ++{ ++ int rc = pcmk_ok; ++ static gboolean need_pass = TRUE; ++ ++ CRM_CHECK(cib != NULL, return -EINVAL); ++ ++ if (getenv("CIB_passwd") != NULL) { ++ need_pass = FALSE; ++ } ++ + if (cib->state == cib_connected_query || cib->state == cib_connected_command) { + return rc; + } +@@ -1373,7 +1379,11 @@ main(int argc, char **argv) + if (!pcmk_is_set(options.mon_ops, mon_op_one_shot)) { + print_as(output_format ,"Waiting until cluster is available on this node ...\n"); + } +- rc = cib_connect(!pcmk_is_set(options.mon_ops, mon_op_one_shot)); ++ ++ rc = fencing_connect(); ++ if (rc == pcmk_ok) { ++ rc = cib_connect(!pcmk_is_set(options.mon_ops, mon_op_one_shot)); ++ } + + if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { + break; +-- +1.8.3.1 + + +From e12508ffba06b1c5652e7f49a449aae6d89ec420 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Tue, 12 Jan 2021 17:01:53 -0500 +Subject: [PATCH 03/11] Refactor: tools: Split one shot mode out into its own + function. + +Also, the connection error handling function can get split out on its +own as well to allow it to be reused in both the one shot and loop +cases. +--- + tools/crm_mon.c | 69 +++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 43 insertions(+), 26 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 301a222..b33598b 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1162,6 +1162,41 @@ reconcile_output_format(pcmk__common_args_t *args) { + } + } + ++static void ++handle_connection_failures(int rc) ++{ ++ if (rc == pcmk_ok) { ++ return; ++ } ++ ++ if (output_format == mon_output_monitor) { ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "CLUSTER CRIT: Connection to cluster failed: %s", ++ pcmk_strerror(rc)); ++ rc = MON_STATUS_CRIT; ++ } else if (rc == -ENOTCONN) { ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: cluster is not available on this node"); ++ rc = crm_errno2exit(rc); ++ } else { ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Connection to cluster failed: %s", pcmk_strerror(rc)); ++ rc = crm_errno2exit(rc); ++ } ++ ++ clean_up(rc); ++} ++ ++static void ++one_shot() ++{ ++ int rc = fencing_connect(); ++ ++ if (rc == pcmk_rc_ok) { ++ rc = cib_connect(FALSE); ++ handle_connection_failures(rc); ++ } ++ ++ clean_up(CRM_EX_OK); ++} ++ + int + main(int argc, char **argv) + { +@@ -1375,20 +1410,19 @@ main(int argc, char **argv) + + crm_info("Starting %s", crm_system_name); + ++ if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { ++ one_shot(); ++ } ++ + do { +- if (!pcmk_is_set(options.mon_ops, mon_op_one_shot)) { +- print_as(output_format ,"Waiting until cluster is available on this node ...\n"); +- } ++ print_as(output_format ,"Waiting until cluster is available on this node ...\n"); + + rc = fencing_connect(); + if (rc == pcmk_ok) { +- rc = cib_connect(!pcmk_is_set(options.mon_ops, mon_op_one_shot)); ++ rc = cib_connect(TRUE); + } + +- if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { +- break; +- +- } else if (rc != pcmk_ok) { ++ if (rc != pcmk_ok) { + sleep(options.reconnect_msec / 1000); + #if CURSES_ENABLED + if (output_format == mon_output_console) { +@@ -1402,24 +1436,7 @@ main(int argc, char **argv) + + } while (rc == -ENOTCONN); + +- if (rc != pcmk_ok) { +- if (output_format == mon_output_monitor) { +- g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "CLUSTER CRIT: Connection to cluster failed: %s", +- pcmk_strerror(rc)); +- return clean_up(MON_STATUS_CRIT); +- } else { +- if (rc == -ENOTCONN) { +- g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: cluster is not available on this node"); +- } else { +- g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Connection to cluster failed: %s", pcmk_strerror(rc)); +- } +- } +- return clean_up(crm_errno2exit(rc)); +- } +- +- if (pcmk_is_set(options.mon_ops, mon_op_one_shot)) { +- return clean_up(CRM_EX_OK); +- } ++ handle_connection_failures(rc); + + mainloop = g_main_loop_new(NULL, FALSE); + +-- +1.8.3.1 + + +From 0eb307a19d57d4a59a4b51a64a3b62dcd0b7cc9a Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Wed, 13 Jan 2021 12:47:41 -0500 +Subject: [PATCH 04/11] Refactor: tools: Don't call mon_refresh_display from + cib_connect. + +--- + tools/crm_mon.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index b33598b..b0daf76 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -683,6 +683,7 @@ mon_timer_popped(gpointer data) + + print_as(output_format, "Reconnecting...\n"); + if (fencing_connect() == pcmk_ok && cib_connect(TRUE) == pcmk_ok) { ++ mon_refresh_display(NULL); + timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); + } + return FALSE; +@@ -831,9 +832,6 @@ cib_connect(gboolean full) + } + + rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); +- if (rc == pcmk_ok) { +- mon_refresh_display(NULL); +- } + + if (rc == pcmk_ok && full) { + rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); +@@ -1192,6 +1190,7 @@ one_shot() + if (rc == pcmk_rc_ok) { + rc = cib_connect(FALSE); + handle_connection_failures(rc); ++ mon_refresh_display(NULL); + } + + clean_up(CRM_EX_OK); +@@ -1437,6 +1436,7 @@ main(int argc, char **argv) + } while (rc == -ENOTCONN); + + handle_connection_failures(rc); ++ mon_refresh_display(NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + +-- +1.8.3.1 + + +From 46696d3135e699c58918e41c93c357d951146d5c Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Wed, 13 Jan 2021 13:52:49 -0500 +Subject: [PATCH 05/11] Fix: tools: Report if getting fencing history failed in + crm_mon. + +This just takes history_rc into account in the text and html formatters. +It was already used by the XML formatter. If we can't get fencing +history, add a message to the output indicating that happened. +--- + tools/crm_mon.c | 13 +++++---- + tools/crm_mon.h | 12 ++++----- + tools/crm_mon_print.c | 74 ++++++++++++++++++++++++++++++++++++++------------- + 3 files changed, 70 insertions(+), 29 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index b0daf76..1a68555 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1943,7 +1943,8 @@ mon_refresh_display(gpointer user_data) + switch (output_format) { + case mon_output_html: + case mon_output_cgi: +- if (print_html_status(out, mon_data_set, stonith_history, options.mon_ops, ++ if (print_html_status(out, mon_data_set, crm_errno2exit(history_rc), ++ stonith_history, options.mon_ops, + show, options.neg_location_prefix, + options.only_node, options.only_rsc) != 0) { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_CANTCREAT, "Critical: Unable to output html file"); +@@ -1974,15 +1975,17 @@ mon_refresh_display(gpointer user_data) + */ + #if CURSES_ENABLED + blank_screen(); +- print_status(out, mon_data_set, stonith_history, options.mon_ops, show, +- options.neg_location_prefix, options.only_node, options.only_rsc); ++ print_status(out, mon_data_set, crm_errno2exit(history_rc), stonith_history, ++ options.mon_ops, show, options.neg_location_prefix, ++ options.only_node, options.only_rsc); + refresh(); + break; + #endif + + case mon_output_plain: +- print_status(out, mon_data_set, stonith_history, options.mon_ops, show, +- options.neg_location_prefix, options.only_node, options.only_rsc); ++ print_status(out, mon_data_set, crm_errno2exit(history_rc), stonith_history, ++ options.mon_ops, show, options.neg_location_prefix, ++ options.only_node, options.only_rsc); + break; + + case mon_output_unset: +diff --git a/tools/crm_mon.h b/tools/crm_mon.h +index f746507..73c926d 100644 +--- a/tools/crm_mon.h ++++ b/tools/crm_mon.h +@@ -95,17 +95,17 @@ typedef enum mon_output_format_e { + #define mon_op_default (mon_op_print_pending | mon_op_fence_history | mon_op_fence_connect) + + void print_status(pcmk__output_t *out, pe_working_set_t *data_set, +- stonith_history_t *stonith_history, unsigned int mon_ops, +- unsigned int show, char *prefix, char *only_node, +- char *only_rsc); ++ crm_exit_t history_rc, stonith_history_t *stonith_history, ++ unsigned int mon_ops, unsigned int show, char *prefix, ++ char *only_node, char *only_rsc); + void print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, + crm_exit_t history_rc, stonith_history_t *stonith_history, + unsigned int mon_ops, unsigned int show, char *prefix, + char *only_node, char *only_rsc); + int print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, +- stonith_history_t *stonith_history, unsigned int mon_ops, +- unsigned int show, char *prefix, char *only_node, +- char *only_rsc); ++ crm_exit_t history_rc, stonith_history_t *stonith_history, ++ unsigned int mon_ops, unsigned int show, char *prefix, ++ char *only_node, char *only_rsc); + + GList *append_attr_list(GList *attr_list, char *name); + void blank_screen(void); +diff --git a/tools/crm_mon_print.c b/tools/crm_mon_print.c +index 8ae11bf..73406bd 100644 +--- a/tools/crm_mon_print.c ++++ b/tools/crm_mon_print.c +@@ -656,6 +656,7 @@ print_failed_actions(pcmk__output_t *out, pe_working_set_t *data_set, + * + * \param[in] out The output functions structure. + * \param[in] data_set Cluster state to display. ++ * \param[in] history_rc Result of getting stonith history + * \param[in] stonith_history List of stonith actions. + * \param[in] mon_ops Bitmask of mon_op_*. + * \param[in] show Bitmask of mon_show_*. +@@ -663,14 +664,16 @@ print_failed_actions(pcmk__output_t *out, pe_working_set_t *data_set, + */ + void + print_status(pcmk__output_t *out, pe_working_set_t *data_set, +- stonith_history_t *stonith_history, unsigned int mon_ops, +- unsigned int show, char *prefix, char *only_node, char *only_rsc) ++ crm_exit_t history_rc, stonith_history_t *stonith_history, ++ unsigned int mon_ops, unsigned int show, char *prefix, ++ char *only_node, char *only_rsc) + { + GListPtr unames = NULL; + GListPtr resources = NULL; + + unsigned int print_opts = get_resource_display_options(mon_ops); + int rc = pcmk_rc_no_output; ++ bool already_printed_failure = false; + + CHECK_RC(rc, out->message(out, "cluster-summary", data_set, + pcmk_is_set(mon_ops, mon_op_print_clone_detail), +@@ -731,13 +734,23 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, + if (pcmk_is_set(show, mon_show_fence_failed) + && pcmk_is_set(mon_ops, mon_op_fence_history)) { + +- stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, +- GINT_TO_POINTER(st_failed)); ++ if (history_rc == 0) { ++ stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, ++ GINT_TO_POINTER(st_failed)); ++ ++ if (hp) { ++ CHECK_RC(rc, out->message(out, "failed-fencing-list", stonith_history, unames, ++ pcmk_is_set(mon_ops, mon_op_fence_full_history), ++ rc == pcmk_rc_ok)); ++ } ++ } else { ++ PCMK__OUTPUT_SPACER_IF(out, rc == pcmk_rc_ok); ++ out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); ++ out->list_item(out, NULL, "Failed to get fencing history: %s", ++ crm_exit_str(history_rc)); ++ out->end_list(out); + +- if (hp) { +- CHECK_RC(rc, out->message(out, "failed-fencing-list", stonith_history, unames, +- pcmk_is_set(mon_ops, mon_op_fence_full_history), +- rc == pcmk_rc_ok)); ++ already_printed_failure = true; + } + } + +@@ -754,7 +767,15 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, + + /* Print stonith history */ + if (pcmk_is_set(mon_ops, mon_op_fence_history)) { +- if (pcmk_is_set(show, mon_show_fence_worked)) { ++ if (history_rc != 0) { ++ if (!already_printed_failure) { ++ PCMK__OUTPUT_SPACER_IF(out, rc == pcmk_rc_ok); ++ out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); ++ out->list_item(out, NULL, "Failed to get fencing history: %s", ++ crm_exit_str(history_rc)); ++ out->end_list(out); ++ } ++ } else if (pcmk_is_set(show, mon_show_fence_worked)) { + stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_neq, + GINT_TO_POINTER(st_failed)); + +@@ -783,6 +804,7 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, + * + * \param[in] out The output functions structure. + * \param[in] data_set Cluster state to display. ++ * \param[in] history_rc Result of getting stonith history + * \param[in] stonith_history List of stonith actions. + * \param[in] mon_ops Bitmask of mon_op_*. + * \param[in] show Bitmask of mon_show_*. +@@ -878,6 +900,7 @@ print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, + * + * \param[in] out The output functions structure. + * \param[in] data_set Cluster state to display. ++ * \param[in] history_rc Result of getting stonith history + * \param[in] stonith_history List of stonith actions. + * \param[in] mon_ops Bitmask of mon_op_*. + * \param[in] show Bitmask of mon_show_*. +@@ -885,14 +908,15 @@ print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, + */ + int + print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, +- stonith_history_t *stonith_history, unsigned int mon_ops, +- unsigned int show, char *prefix, char *only_node, +- char *only_rsc) ++ crm_exit_t history_rc, stonith_history_t *stonith_history, ++ unsigned int mon_ops, unsigned int show, char *prefix, ++ char *only_node, char *only_rsc) + { + GListPtr unames = NULL; + GListPtr resources = NULL; + + unsigned int print_opts = get_resource_display_options(mon_ops); ++ bool already_printed_failure = false; + + out->message(out, "cluster-summary", data_set, + pcmk_is_set(mon_ops, mon_op_print_clone_detail), +@@ -950,18 +974,32 @@ print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, + if (pcmk_is_set(show, mon_show_fence_failed) + && pcmk_is_set(mon_ops, mon_op_fence_history)) { + +- stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, +- GINT_TO_POINTER(st_failed)); ++ if (history_rc == 0) { ++ stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, ++ GINT_TO_POINTER(st_failed)); + +- if (hp) { +- out->message(out, "failed-fencing-list", stonith_history, unames, +- pcmk_is_set(mon_ops, mon_op_fence_full_history), FALSE); ++ if (hp) { ++ out->message(out, "failed-fencing-list", stonith_history, unames, ++ pcmk_is_set(mon_ops, mon_op_fence_full_history), FALSE); ++ } ++ } else { ++ out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); ++ out->list_item(out, NULL, "Failed to get fencing history: %s", ++ crm_exit_str(history_rc)); ++ out->end_list(out); + } + } + + /* Print stonith history */ + if (pcmk_is_set(mon_ops, mon_op_fence_history)) { +- if (pcmk_is_set(show, mon_show_fence_worked)) { ++ if (history_rc != 0) { ++ if (!already_printed_failure) { ++ out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); ++ out->list_item(out, NULL, "Failed to get fencing history: %s", ++ crm_exit_str(history_rc)); ++ out->end_list(out); ++ } ++ } else if (pcmk_is_set(show, mon_show_fence_worked)) { + stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_neq, + GINT_TO_POINTER(st_failed)); + +-- +1.8.3.1 + + +From 2e391be6fdbbbccd6aef49b3f109e5c342eb5dcc Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Mon, 11 Jan 2021 12:54:40 -0500 +Subject: [PATCH 06/11] Fix: tools: A lack of stonith history is not fatal in + crm_mon. + +Instead, print out all the rest of the typical output. This should also +include an error message in the fencing section, if that section was +requested. + +See: rhbz#1880426 +--- + tools/crm_mon.c | 40 ++++++++++++++++------------------------ + 1 file changed, 16 insertions(+), 24 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 1a68555..17b8ee9 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -682,7 +682,8 @@ mon_timer_popped(gpointer data) + } + + print_as(output_format, "Reconnecting...\n"); +- if (fencing_connect() == pcmk_ok && cib_connect(TRUE) == pcmk_ok) { ++ fencing_connect(); ++ if (cib_connect(TRUE) == pcmk_ok) { + mon_refresh_display(NULL); + timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); + } +@@ -726,12 +727,6 @@ mon_cib_connection_destroy_regular(gpointer user_data) + do_mon_cib_connection_destroy(user_data, false); + } + +-static void +-mon_cib_connection_destroy_error(gpointer user_data) +-{ +- do_mon_cib_connection_destroy(user_data, true); +-} +- + /* + * Mainloop signal handler. + */ +@@ -790,6 +785,8 @@ fencing_connect(void) + mon_st_callback_display); + st->cmds->register_notification(st, T_STONITH_NOTIFY_HISTORY, mon_st_callback_display); + } ++ } else { ++ st = NULL; + } + + return rc; +@@ -1185,12 +1182,15 @@ handle_connection_failures(int rc) + static void + one_shot() + { +- int rc = fencing_connect(); ++ int rc; ++ ++ fencing_connect(); + ++ rc = cib_connect(FALSE); + if (rc == pcmk_rc_ok) { +- rc = cib_connect(FALSE); +- handle_connection_failures(rc); + mon_refresh_display(NULL); ++ } else { ++ handle_connection_failures(rc); + } + + clean_up(CRM_EX_OK); +@@ -1416,10 +1416,8 @@ main(int argc, char **argv) + do { + print_as(output_format ,"Waiting until cluster is available on this node ...\n"); + +- rc = fencing_connect(); +- if (rc == pcmk_ok) { +- rc = cib_connect(TRUE); +- } ++ fencing_connect(); ++ rc = cib_connect(TRUE); + + if (rc != pcmk_ok) { + sleep(options.reconnect_msec / 1000); +@@ -1896,16 +1894,12 @@ mon_refresh_display(gpointer user_data) + return 0; + } + +- /* get the stonith-history if there is evidence we need it +- */ ++ /* get the stonith-history if there is evidence we need it */ + while (pcmk_is_set(options.mon_ops, mon_op_fence_history)) { + if (st != NULL) { + history_rc = st->cmds->history(st, st_opt_sync_call, NULL, &stonith_history, 120); + +- if (history_rc != 0) { +- out->err(out, "Critical: Unable to get stonith-history"); +- mon_cib_connection_destroy_error(NULL); +- } else { ++ if (history_rc == 0) { + stonith_history = stonith__sort_history(stonith_history); + if (!pcmk_is_set(options.mon_ops, mon_op_fence_full_history) + && (output_format != mon_output_xml)) { +@@ -1915,11 +1909,9 @@ mon_refresh_display(gpointer user_data) + break; /* all other cases are errors */ + } + } else { +- out->err(out, "Critical: No stonith-API"); ++ history_rc = ENOTCONN; ++ break; + } +- free_xml(cib_copy); +- out->err(out, "Reading stonith-history failed"); +- return 0; + } + + if (mon_data_set == NULL) { +-- +1.8.3.1 + + +From 8abcb2bf0c5c90004a687e27aa86fd6ad1b62eb3 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 14 Jan 2021 14:31:25 -0500 +Subject: [PATCH 07/11] Refactor: Split the fencing history code into its own + function. + +--- + tools/crm_mon.c | 46 ++++++++++++++++++++++++++++------------------ + 1 file changed, 28 insertions(+), 18 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 17b8ee9..1baba5f 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1879,6 +1879,33 @@ crm_diff_update(const char *event, xmlNode * msg) + } + + static int ++get_fencing_history(stonith_history_t **stonith_history) ++{ ++ int rc = 0; ++ ++ while (pcmk_is_set(options.mon_ops, mon_op_fence_history)) { ++ if (st != NULL) { ++ rc = st->cmds->history(st, st_opt_sync_call, NULL, stonith_history, 120); ++ ++ if (rc == 0) { ++ *stonith_history = stonith__sort_history(*stonith_history); ++ if (!pcmk_is_set(options.mon_ops, mon_op_fence_full_history) ++ && (output_format != mon_output_xml)) { ++ ++ *stonith_history = pcmk__reduce_fence_history(*stonith_history); ++ } ++ break; /* all other cases are errors */ ++ } ++ } else { ++ rc = ENOTCONN; ++ break; ++ } ++ } ++ ++ return rc; ++} ++ ++static int + mon_refresh_display(gpointer user_data) + { + xmlNode *cib_copy = copy_xml(current_cib); +@@ -1895,24 +1922,7 @@ mon_refresh_display(gpointer user_data) + } + + /* get the stonith-history if there is evidence we need it */ +- while (pcmk_is_set(options.mon_ops, mon_op_fence_history)) { +- if (st != NULL) { +- history_rc = st->cmds->history(st, st_opt_sync_call, NULL, &stonith_history, 120); +- +- if (history_rc == 0) { +- stonith_history = stonith__sort_history(stonith_history); +- if (!pcmk_is_set(options.mon_ops, mon_op_fence_full_history) +- && (output_format != mon_output_xml)) { +- +- stonith_history = pcmk__reduce_fence_history(stonith_history); +- } +- break; /* all other cases are errors */ +- } +- } else { +- history_rc = ENOTCONN; +- break; +- } +- } ++ history_rc = get_fencing_history(&stonith_history); + + if (mon_data_set == NULL) { + mon_data_set = pe_new_working_set(); +-- +1.8.3.1 + + +From fa75e884e3c3822e1010ad1d67958e4f1cc5400b Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 14 Jan 2021 14:49:09 -0500 +Subject: [PATCH 08/11] Refactor: tools: Get rid of + mon_cib_connection_destroy_regular. + +With the _error version removed in a previous commit, there's no need +for this wrapper to exist anymore. We can just call +mon_cib_connection_destroy directly. +--- + tools/crm_mon.c | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 1baba5f..a0764a5 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -691,13 +691,9 @@ mon_timer_popped(gpointer data) + } + + static void +-do_mon_cib_connection_destroy(gpointer user_data, bool is_error) ++mon_cib_connection_destroy(gpointer user_data) + { +- if (is_error) { +- out->err(out, "Connection to the cluster-daemons terminated"); +- } else { +- out->info(out, "Connection to the cluster-daemons terminated"); +- } ++ out->info(out, "Connection to the cluster-daemons terminated"); + + if (refresh_timer != NULL) { + /* we'll trigger a refresh after reconnect */ +@@ -721,12 +717,6 @@ do_mon_cib_connection_destroy(gpointer user_data, bool is_error) + return; + } + +-static void +-mon_cib_connection_destroy_regular(gpointer user_data) +-{ +- do_mon_cib_connection_destroy(user_data, false); +-} +- + /* + * Mainloop signal handler. + */ +@@ -831,7 +821,7 @@ cib_connect(gboolean full) + rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); + + if (rc == pcmk_ok && full) { +- rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy_regular); ++ rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy); + if (rc == -EPROTONOSUPPORT) { + print_as + (output_format, "Notification setup not supported, won't be able to reconnect after failure"); +@@ -890,7 +880,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + options.mon_ops |= mon_op_fence_history; + options.mon_ops |= mon_op_fence_connect; + if (st == NULL) { +- mon_cib_connection_destroy_regular(NULL); ++ mon_cib_connection_destroy(NULL); + } + } + +@@ -2010,7 +2000,7 @@ mon_st_callback_event(stonith_t * st, stonith_event_t * e) + { + if (st->state == stonith_disconnected) { + /* disconnect cib as well and have everything reconnect */ +- mon_cib_connection_destroy_regular(NULL); ++ mon_cib_connection_destroy(NULL); + } else if (options.external_agent) { + char *desc = crm_strdup_printf("Operation %s requested by %s for peer %s: %s (ref=%s)", + e->operation, e->origin, e->target, pcmk_strerror(e->result), +@@ -2059,7 +2049,7 @@ mon_st_callback_display(stonith_t * st, stonith_event_t * e) + { + if (st->state == stonith_disconnected) { + /* disconnect cib as well and have everything reconnect */ +- mon_cib_connection_destroy_regular(NULL); ++ mon_cib_connection_destroy(NULL); + } else { + print_dot(output_format); + kick_refresh(TRUE); +-- +1.8.3.1 + + +From 009f3aa0caa6d138d4da418297f12c4a1210cf6b Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 14 Jan 2021 16:25:37 -0500 +Subject: [PATCH 09/11] Refactor: Add comments to connection functions in + crm_mon.c. + +There are an awful lot of these functions, and trying to make sense of +them can be confusing when there's no comments explaining when they +happen. Hopefully this helps a little. +--- + tools/crm_mon.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 48 insertions(+), 8 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index a0764a5..54a7958 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -666,6 +666,10 @@ static GOptionEntry deprecated_entries[] = { + }; + /* *INDENT-ON* */ + ++/* Reconnect to the CIB and fencing agent after reconnect_msec has passed. This sounds ++ * like it would be more broadly useful, but only ever happens after a disconnect via ++ * mon_cib_connection_destroy. ++ */ + static gboolean + mon_timer_popped(gpointer data) + { +@@ -684,12 +688,17 @@ mon_timer_popped(gpointer data) + print_as(output_format, "Reconnecting...\n"); + fencing_connect(); + if (cib_connect(TRUE) == pcmk_ok) { ++ /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ + mon_refresh_display(NULL); + timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); + } + return FALSE; + } + ++/* Called from various places when we are disconnected from the CIB or from the ++ * fencing agent. If the CIB connection is still valid, this function will also ++ * attempt to sign off and reconnect. ++ */ + static void + mon_cib_connection_destroy(gpointer user_data) + { +@@ -717,9 +726,7 @@ mon_cib_connection_destroy(gpointer user_data) + return; + } + +-/* +- * Mainloop signal handler. +- */ ++/* Signal handler installed into the mainloop for normal program shutdown */ + static void + mon_shutdown(int nsig) + { +@@ -729,6 +736,10 @@ mon_shutdown(int nsig) + #if CURSES_ENABLED + static sighandler_t ncurses_winch_handler; + ++/* Signal handler installed the regular way (not into the main loop) for when ++ * the screen is resized. Commonly, this happens when running in an xterm and ++ * the user changes its size. ++ */ + static void + mon_winresize(int nsig) + { +@@ -743,6 +754,9 @@ mon_winresize(int nsig) + (*ncurses_winch_handler) (SIGWINCH); + getmaxyx(stdscr, lines, cols); + resizeterm(lines, cols); ++ /* Alert the mainloop code we'd like the refresh_trigger to run next ++ * time the mainloop gets around to checking. ++ */ + mainloop_set_trigger(refresh_trigger); + } + not_done--; +@@ -863,6 +877,12 @@ get_option_desc(char c) + #define print_option_help(output_format, option, condition) \ + out->info(out, "%c %c: \t%s", ((condition)? '*': ' '), option, get_option_desc(option)); + ++/* This function is called from the main loop when there is something to be read ++ * on stdin, like an interactive user's keystroke. All it does is read the keystroke, ++ * set flags (or show the page showing which keystrokes are valid), and redraw the ++ * screen. It does not do anything with connections to the CIB or fencing agent ++ * agent what would happen in mon_refresh_display. ++ */ + static gboolean + detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_data) + { +@@ -951,6 +971,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + config_mode = TRUE; + break; + default: ++ /* All other keys just redraw the screen. */ + goto refresh; + } + +@@ -1441,6 +1462,10 @@ main(int argc, char **argv) + g_io_add_watch(io_channel, G_IO_IN, detect_user_input, NULL); + } + #endif ++ ++ /* When refresh_trigger->trigger is set to TRUE, call mon_refresh_display. In ++ * this file, that is anywhere mainloop_set_trigger is called. ++ */ + refresh_trigger = mainloop_add_trigger(G_PRIORITY_LOW, mon_refresh_display, NULL); + + g_main_loop_run(mainloop); +@@ -1677,6 +1702,10 @@ handle_rsc_op(xmlNode * xml, const char *node_id) + free(task); + } + ++/* This function is just a wrapper around mainloop_set_trigger so that it can be ++ * called from a mainloop directly. It's simply another way of ensuring the screen ++ * gets redrawn. ++ */ + static gboolean + mon_trigger_refresh(gpointer user_data) + { +@@ -1995,6 +2024,9 @@ mon_refresh_display(gpointer user_data) + return 1; + } + ++/* This function is called for fencing events (see fencing_connect for which ones) when ++ * --watch-fencing is used on the command line. ++ */ + static void + mon_st_callback_event(stonith_t * st, stonith_event_t * e) + { +@@ -2010,6 +2042,16 @@ mon_st_callback_event(stonith_t * st, stonith_event_t * e) + } + } + ++/* Cause the screen to be redrawn (via mainloop_set_trigger) when various conditions are met: ++ * ++ * - If the last update occurred more than reconnect_msec ago (defaults to 5s, but can be ++ * changed via the -i command line option), or ++ * - After every 10 CIB updates, or ++ * - If it's been 2s since the last update ++ * ++ * This function sounds like it would be more broadly useful, but it is only called when a ++ * fencing event is received or a CIB diff occurrs. ++ */ + static void + kick_refresh(gboolean data_updated) + { +@@ -2024,11 +2066,6 @@ kick_refresh(gboolean data_updated) + refresh_timer = mainloop_timer_add("refresh", 2000, FALSE, mon_trigger_refresh, NULL); + } + +- /* Refresh +- * - immediately if the last update was more than 5s ago +- * - every 10 cib-updates +- * - at most 2s after the last update +- */ + if ((now - last_refresh) > (options.reconnect_msec / 1000)) { + mainloop_set_trigger(refresh_trigger); + mainloop_timer_stop(refresh_timer); +@@ -2044,6 +2081,9 @@ kick_refresh(gboolean data_updated) + } + } + ++/* This function is called for fencing events (see fencing_connect for which ones) when ++ * --watch-fencing is NOT used on the command line. ++ */ + static void + mon_st_callback_display(stonith_t * st, stonith_event_t * e) + { +-- +1.8.3.1 + + +From aa328f0788ef0057874aeeeae7261dfb450b9b9e Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Thu, 14 Jan 2021 16:44:45 -0500 +Subject: [PATCH 10/11] Refactor: tools: Rename some connection-related symbols + in crm_mon. + +--- + tools/crm_mon.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 54a7958..89d7ae2 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -66,7 +66,7 @@ static mon_output_format_t output_format = mon_output_unset; + /* other globals */ + static GIOChannel *io_channel = NULL; + static GMainLoop *mainloop = NULL; +-static guint timer_id = 0; ++static guint reconnect_timer = 0; + static mainloop_timer_t *refresh_timer = NULL; + static pe_working_set_t *mon_data_set = NULL; + +@@ -131,7 +131,7 @@ static int cib_connect(gboolean full); + static int fencing_connect(void); + static void mon_st_callback_event(stonith_t * st, stonith_event_t * e); + static void mon_st_callback_display(stonith_t * st, stonith_event_t * e); +-static void kick_refresh(gboolean data_updated); ++static void refresh_after_event(gboolean data_updated); + + static unsigned int + all_includes(mon_output_format_t fmt) { +@@ -671,7 +671,7 @@ static GOptionEntry deprecated_entries[] = { + * mon_cib_connection_destroy. + */ + static gboolean +-mon_timer_popped(gpointer data) ++reconnect_after_timeout(gpointer data) + { + #if CURSES_ENABLED + if (output_format == mon_output_console) { +@@ -680,9 +680,9 @@ mon_timer_popped(gpointer data) + } + #endif + +- if (timer_id > 0) { +- g_source_remove(timer_id); +- timer_id = 0; ++ if (reconnect_timer > 0) { ++ g_source_remove(reconnect_timer); ++ reconnect_timer = 0; + } + + print_as(output_format, "Reconnecting...\n"); +@@ -690,7 +690,7 @@ mon_timer_popped(gpointer data) + if (cib_connect(TRUE) == pcmk_ok) { + /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ + mon_refresh_display(NULL); +- timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); ++ reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); + } + return FALSE; + } +@@ -708,10 +708,10 @@ mon_cib_connection_destroy(gpointer user_data) + /* we'll trigger a refresh after reconnect */ + mainloop_timer_stop(refresh_timer); + } +- if (timer_id) { ++ if (reconnect_timer) { + /* we'll trigger a new reconnect-timeout at the end */ +- g_source_remove(timer_id); +- timer_id = 0; ++ g_source_remove(reconnect_timer); ++ reconnect_timer = 0; + } + if (st) { + /* the client API won't properly reconnect notifications +@@ -721,7 +721,7 @@ mon_cib_connection_destroy(gpointer user_data) + } + if (cib) { + cib->cmds->signoff(cib); +- timer_id = g_timeout_add(options.reconnect_msec, mon_timer_popped, NULL); ++ reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); + } + return; + } +@@ -1894,7 +1894,7 @@ crm_diff_update(const char *event, xmlNode * msg) + } + + stale = FALSE; +- kick_refresh(cib_updated); ++ refresh_after_event(cib_updated); + } + + static int +@@ -2053,7 +2053,7 @@ mon_st_callback_event(stonith_t * st, stonith_event_t * e) + * fencing event is received or a CIB diff occurrs. + */ + static void +-kick_refresh(gboolean data_updated) ++refresh_after_event(gboolean data_updated) + { + static int updates = 0; + time_t now = time(NULL); +@@ -2092,7 +2092,7 @@ mon_st_callback_display(stonith_t * st, stonith_event_t * e) + mon_cib_connection_destroy(NULL); + } else { + print_dot(output_format); +- kick_refresh(TRUE); ++ refresh_after_event(TRUE); + } + } + +-- +1.8.3.1 + + +From 8c51b4980f349e8773681f7ed2882ca639e0e63a Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Mon, 18 Jan 2021 14:03:39 -0500 +Subject: [PATCH 11/11] Fix: tools: Attempt to reestablish connections in + crm_mon. + +If the fencing or CIB connections go away between screen refreshes, +attempt to re-establish those connections. The functions that do this +should be safe to be called repeatedly. + +See: rhbz#1880426, rhbz#1466875 +--- + tools/crm_mon.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 89d7ae2..083b7ae 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -126,6 +126,7 @@ static void clean_up_cib_connection(void); + static void clean_up_fencing_connection(void); + static crm_exit_t clean_up(crm_exit_t exit_code); + static void crm_diff_update(const char *event, xmlNode * msg); ++static void handle_connection_failures(int rc); + static int mon_refresh_display(gpointer user_data); + static int cib_connect(gboolean full); + static int fencing_connect(void); +@@ -690,9 +691,11 @@ reconnect_after_timeout(gpointer data) + if (cib_connect(TRUE) == pcmk_ok) { + /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ + mon_refresh_display(NULL); +- reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); ++ return FALSE; + } +- return FALSE; ++ ++ reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); ++ return TRUE; + } + + /* Called from various places when we are disconnected from the CIB or from the +@@ -887,6 +890,7 @@ static gboolean + detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_data) + { + int c; ++ int rc; + gboolean config_mode = FALSE; + + while (1) { +@@ -1001,7 +1005,14 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + } + + refresh: +- mon_refresh_display(NULL); ++ fencing_connect(); ++ rc = cib_connect(FALSE); ++ if (rc == pcmk_rc_ok) { ++ mon_refresh_display(NULL); ++ } else { ++ handle_connection_failures(rc); ++ } ++ + return TRUE; + } + #endif +-- +1.8.3.1 + diff --git a/SOURCES/029-crm_mon.patch b/SOURCES/029-crm_mon.patch new file mode 100644 index 0000000..135898a --- /dev/null +++ b/SOURCES/029-crm_mon.patch @@ -0,0 +1,202 @@ +From bc60f9c84bd6f0fa4d73db8d140030dfcdbf4f5e Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Tue, 19 Jan 2021 15:58:36 -0500 +Subject: [PATCH 1/2] Fix: tools: Describe interactive crm_mon use in help and + man page. + +--- + tools/crm_mon.8.inc | 3 +++ + tools/crm_mon.c | 4 ++++ + tools/fix-manpages | 2 +- + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/tools/crm_mon.8.inc b/tools/crm_mon.8.inc +index e4cd7e3..6b46d7b 100644 +--- a/tools/crm_mon.8.inc ++++ b/tools/crm_mon.8.inc +@@ -12,3 +12,6 @@ crm_mon mode [options] + + /command line arguments./ + .SH TIME SPECIFICATION ++ ++/or --exclude=list./ ++.SH INTERACTIVE USE +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 083b7ae..aafc80f 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1062,6 +1062,10 @@ build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) { + "times on the command line, and each can give a comma-separated list of sections.\n" + "The options are applied to the default set, from left to right as seen on the\n" + "command line. For a list of valid sections, pass --include=list or --exclude=list.\n\n" ++ "Interactive Use:\n\n" ++ "When run interactively, crm_mon can be told to hide and display various sections\n" ++ "of output. To see a help screen explaining the options, hit '?'. Any key stroke\n" ++ "aside from those listed will cause the screen to refresh.\n\n" + "Examples:\n\n" + "Display the cluster status on the console with updates as they occur:\n\n" + "\tcrm_mon\n\n" +diff --git a/tools/fix-manpages b/tools/fix-manpages +index 714ecce..f1f6f0d 100644 +--- a/tools/fix-manpages ++++ b/tools/fix-manpages +@@ -26,7 +26,7 @@ + # This leaves the --help-all output looking good and removes redundant + # stuff from the man page. Feel free to add additional headers here. + # Not all tools will have all headers. +-/.SH NOTES\|.SH OPERATION SPECIFICATION\|.SH OUTPUT CONTROL\|.SH TIME SPECIFICATION/{ n ++/.SH NOTES\|.SH INTERACTIVE USE\|.SH OPERATION SPECIFICATION\|.SH OUTPUT CONTROL\|.SH TIME SPECIFICATION/{ n + N + N + d +-- +1.8.3.1 + + +From ed4e4370dc97bc220878db89d69c71426b9458a3 Mon Sep 17 00:00:00 2001 +From: Chris Lumens +Date: Tue, 19 Jan 2021 17:02:45 -0500 +Subject: [PATCH 2/2] Fix: tools: The 'm' key in crm_mon is a cycle, not a + toggle. + +Each time it's pressed, a different amount of fencing information should +be shown, cycling back to nothing after level 3. +--- + tools/crm_mon.c | 76 +++++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 55 insertions(+), 21 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index aafc80f..0981634 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -83,6 +83,8 @@ static gchar **processed_args = NULL; + static time_t last_refresh = 0; + crm_trigger_t *refresh_trigger = NULL; + ++int interactive_fence_level = 0; ++ + static pcmk__supported_format_t formats[] = { + #if CURSES_ENABLED + CRM_MON_SUPPORTED_FORMAT_CURSES, +@@ -382,9 +384,9 @@ as_xml_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError * + + static gboolean + fence_history_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) { +- int rc = crm_atoi(optarg, "2"); ++ interactive_fence_level = crm_atoi(optarg, "2"); + +- switch (rc) { ++ switch (interactive_fence_level) { + case 3: + options.mon_ops |= mon_op_fence_full_history | mon_op_fence_history | mon_op_fence_connect; + return include_exclude_cb("--include", "fencing", data, err); +@@ -862,6 +864,38 @@ cib_connect(gboolean full) + return rc; + } + ++/* This is used to set up the fencing options after the interactive UI has been stared. ++ * fence_history_cb can't be used because it builds up a list of includes/excludes that ++ * then have to be processed with apply_include_exclude and that could affect other ++ * things. ++ */ ++static void ++set_fencing_options(int level) ++{ ++ switch (level) { ++ case 3: ++ options.mon_ops |= mon_op_fence_full_history | mon_op_fence_history | mon_op_fence_connect; ++ show |= mon_show_fencing_all; ++ break; ++ ++ case 2: ++ options.mon_ops |= mon_op_fence_history | mon_op_fence_connect; ++ show |= mon_show_fencing_all; ++ break; ++ ++ case 1: ++ options.mon_ops |= mon_op_fence_history | mon_op_fence_connect; ++ show |= mon_show_fence_failed | mon_show_fence_pending; ++ break; ++ ++ default: ++ level = 0; ++ options.mon_ops &= ~(mon_op_fence_history | mon_op_fence_connect); ++ show &= ~mon_show_fencing_all; ++ break; ++ } ++} ++ + #if CURSES_ENABLED + static const char * + get_option_desc(char c) +@@ -900,23 +934,12 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + + switch (c) { + case 'm': +- if (!pcmk_is_set(show, mon_show_fencing_all)) { +- options.mon_ops |= mon_op_fence_history; +- options.mon_ops |= mon_op_fence_connect; +- if (st == NULL) { +- mon_cib_connection_destroy(NULL); +- } +- } +- +- if (pcmk_any_flags_set(show, +- mon_show_fence_failed +- |mon_show_fence_pending +- |mon_show_fence_worked)) { +- show &= ~mon_show_fencing_all; +- } else { +- show |= mon_show_fencing_all; ++ interactive_fence_level++; ++ if (interactive_fence_level > 3) { ++ interactive_fence_level = 0; + } + ++ set_fencing_options(interactive_fence_level); + break; + case 'c': + show ^= mon_show_tickets; +@@ -997,10 +1020,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + print_option_help(out, 'R', pcmk_is_set(options.mon_ops, mon_op_print_clone_detail)); + print_option_help(out, 'b', pcmk_is_set(options.mon_ops, mon_op_print_brief)); + print_option_help(out, 'j', pcmk_is_set(options.mon_ops, mon_op_print_pending)); +- print_option_help(out, 'm', pcmk_any_flags_set(show, +- mon_show_fence_failed +- |mon_show_fence_pending +- |mon_show_fence_worked)); ++ out->info(out, "%d m: \t%s", interactive_fence_level, get_option_desc('m')); + out->info(out, "%s", "\nToggle fields via field letter, type any other key to return"); + } + +@@ -1400,6 +1420,19 @@ main(int argc, char **argv) + return clean_up(CRM_EX_USAGE); + } + ++ /* Sync up the initial value of interactive_fence_level with whatever was set with ++ * --include/--exclude= options. ++ */ ++ if (pcmk_is_set(show, mon_show_fencing_all)) { ++ interactive_fence_level = 3; ++ } else if (pcmk_is_set(show, mon_show_fence_worked)) { ++ interactive_fence_level = 2; ++ } else if (pcmk_any_flags_set(show, mon_show_fence_failed | mon_show_fence_pending)) { ++ interactive_fence_level = 1; ++ } else { ++ interactive_fence_level = 0; ++ } ++ + crm_mon_register_messages(out); + pe__register_messages(out); + stonith__register_messages(out); +@@ -1460,6 +1493,7 @@ main(int argc, char **argv) + } while (rc == -ENOTCONN); + + handle_connection_failures(rc); ++ set_fencing_options(interactive_fence_level); + mon_refresh_display(NULL); + + mainloop = g_main_loop_new(NULL, FALSE); +-- +1.8.3.1 + diff --git a/SOURCES/030-crmadmin.patch b/SOURCES/030-crmadmin.patch new file mode 100644 index 0000000..8c39e44 --- /dev/null +++ b/SOURCES/030-crmadmin.patch @@ -0,0 +1,1505 @@ +From 4fc4140d0c3daa3a8de32adaebf33462c9b3d581 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 26 Nov 2020 13:34:21 +0100 +Subject: [PATCH 1/7] Refactor: move crm_admin_list() to pcmk__list_nodes() and + only print node name for -N -q + +--- + lib/pacemaker/pcmk_cluster_queries.c | 32 ++++++++++++++++++++++++---- + lib/pacemaker/pcmk_output.c | 41 +++--------------------------------- + 2 files changed, 31 insertions(+), 42 deletions(-) + +diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c +index c705b7f..1d1e775 100644 +--- a/lib/pacemaker/pcmk_cluster_queries.c ++++ b/lib/pacemaker/pcmk_cluster_queries.c +@@ -395,7 +395,7 @@ int + pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT) + { + cib_t *the_cib = cib_new(); +- xmlNode *output = NULL; ++ xmlNode *xml_node = NULL; + int rc; + + if (the_cib == NULL) { +@@ -406,11 +406,35 @@ pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT) + return pcmk_legacy2rc(rc); + } + +- rc = the_cib->cmds->query(the_cib, NULL, &output, ++ rc = the_cib->cmds->query(the_cib, NULL, &xml_node, + cib_scope_local | cib_sync_call); + if (rc == pcmk_ok) { +- out->message(out, "crmadmin-node-list", output, BASH_EXPORT); +- free_xml(output); ++ int found = 0; ++ xmlNode *node = NULL; ++ xmlNode *nodes = get_object_root(XML_CIB_TAG_NODES, xml_node); ++ ++ out->begin_list(out, NULL, NULL, "nodes"); ++ ++ for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; ++ node = crm_next_same_xml(node)) { ++ const char *node_type = BASH_EXPORT ? NULL : ++ crm_element_value(node, XML_ATTR_TYPE); ++ out->message(out, "crmadmin-node", node_type, ++ crm_str(crm_element_value(node, XML_ATTR_UNAME)), ++ crm_str(crm_element_value(node, XML_ATTR_ID)), ++ BASH_EXPORT); ++ ++ found++; ++ } ++ // @TODO List Pacemaker Remote nodes that don't have a entry ++ ++ out->end_list(out); ++ ++ if (found == 0) { ++ out->info(out, "No nodes configured"); ++ } ++ ++ free_xml(xml_node); + } + the_cib->cmds->signoff(the_cib); + return pcmk_legacy2rc(rc); +diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c +index bc4b91a..8f5e301 100644 +--- a/lib/pacemaker/pcmk_output.c ++++ b/lib/pacemaker/pcmk_output.c +@@ -469,42 +469,6 @@ dc_xml(pcmk__output_t *out, va_list args) + return pcmk_rc_ok; + } + +- +-PCMK__OUTPUT_ARGS("crmadmin-node-list", "xmlNodePtr", "gboolean") +-static int +-crmadmin_node_list(pcmk__output_t *out, va_list args) +-{ +- xmlNodePtr xml_node = va_arg(args, xmlNodePtr); +- gboolean BASH_EXPORT = va_arg(args, gboolean); +- +- int found = 0; +- xmlNode *node = NULL; +- xmlNode *nodes = get_object_root(XML_CIB_TAG_NODES, xml_node); +- +- out->begin_list(out, NULL, NULL, "nodes"); +- +- for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; +- node = crm_next_same_xml(node)) { +- const char *node_type = BASH_EXPORT ? NULL : +- crm_element_value(node, XML_ATTR_TYPE); +- out->message(out, "crmadmin-node", node_type, +- crm_str(crm_element_value(node, XML_ATTR_UNAME)), +- crm_str(crm_element_value(node, XML_ATTR_ID)), +- BASH_EXPORT); +- +- found++; +- } +- // @TODO List Pacemaker Remote nodes that don't have a entry +- +- out->end_list(out); +- +- if (found == 0) { +- out->info(out, "No nodes configured"); +- } +- +- return pcmk_rc_ok; +-} +- + PCMK__OUTPUT_ARGS("crmadmin-node", "const char *", "const char *", "const char *", "gboolean") + static int + crmadmin_node_text(pcmk__output_t *out, va_list args) +@@ -514,7 +478,9 @@ crmadmin_node_text(pcmk__output_t *out, va_list args) + const char *id = va_arg(args, const char *); + gboolean BASH_EXPORT = va_arg(args, gboolean); + +- if (BASH_EXPORT) { ++ if (out->is_quiet(out)) { ++ out->info(out, "%s", crm_str(name)); ++ } else if (BASH_EXPORT) { + out->info(out, "export %s=%s", crm_str(name), crm_str(id)); + } else { + out->info(out, "%s node: %s (%s)", type ? type : "member", +@@ -657,7 +623,6 @@ static pcmk__message_entry_t fmt_functions[] = { + { "pacemakerd-health", "xml", pacemakerd_health_xml }, + { "dc", "default", dc_text }, + { "dc", "xml", dc_xml }, +- { "crmadmin-node-list", "default", crmadmin_node_list }, + { "crmadmin-node", "default", crmadmin_node_text }, + { "crmadmin-node", "xml", crmadmin_node_xml }, + { "digests", "default", digests_text }, +-- +1.8.3.1 + + +From ecc6d582fd18f774ab6c081c4d72a7913a0f419e Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Fri, 4 Dec 2020 09:30:04 +0100 +Subject: [PATCH 2/7] Feature/API: crmadmin/pcmk_list_nodes(): list + remote/guest nodes and add parameter/variable to choose which node type(s) to + list + +--- + include/crm/common/xml_internal.h | 18 +++++++ + include/pacemaker.h | 6 +-- + include/pcmki/pcmki_cluster_queries.h | 2 +- + lib/cluster/membership.c | 17 +------ + lib/pacemaker/pcmk_cluster_queries.c | 89 ++++++++++++++++++++++++++++------- + tools/crmadmin.c | 9 +++- + 6 files changed, 103 insertions(+), 38 deletions(-) + +diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h +index d8694ee..969a57d 100644 +--- a/include/crm/common/xml_internal.h ++++ b/include/crm/common/xml_internal.h +@@ -123,6 +123,24 @@ do { + } \ + } while (0) + ++/* XML search strings for guest, remote and pacemaker_remote nodes */ ++ ++/* search string to find CIB resources entries for guest nodes */ ++#define XPATH_GUEST_NODE_CONFIG \ ++ "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ ++ "//" XML_TAG_META_SETS "//" XML_CIB_TAG_NVPAIR \ ++ "[@name='" XML_RSC_ATTR_REMOTE_NODE "']" ++ ++/* search string to find CIB resources entries for remote nodes */ ++#define XPATH_REMOTE_NODE_CONFIG \ ++ "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ ++ "[@type='remote'][@provider='pacemaker']" ++ ++/* search string to find CIB node status entries for pacemaker_remote nodes */ ++#define XPATH_REMOTE_NODE_STATUS \ ++ "//" XML_TAG_CIB "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE \ ++ "[@" XML_NODE_IS_REMOTE "='true']" ++ + enum pcmk__xml_artefact_ns { + pcmk__xml_artefact_ns_legacy_rng = 1, + pcmk__xml_artefact_ns_legacy_xslt, +diff --git a/include/pacemaker.h b/include/pacemaker.h +index 51bf585..42d096f 100644 +--- a/include/pacemaker.h ++++ b/include/pacemaker.h +@@ -73,8 +73,6 @@ int pcmk_resource_digests(xmlNodePtr *xml, pe_resource_t *rsc, + pe_node_t *node, GHashTable *overrides, + pe_working_set_t *data_set); + +-#ifdef BUILD_PUBLIC_LIBPACEMAKER +- + /*! + * \brief Get nodes list + * +@@ -82,7 +80,9 @@ int pcmk_resource_digests(xmlNodePtr *xml, pe_resource_t *rsc, + * + * \return Standard Pacemaker return code + */ +-int pcmk_list_nodes(xmlNodePtr *xml); ++int pcmk_list_nodes(xmlNodePtr *xml, char *node_types); ++ ++#ifdef BUILD_PUBLIC_LIBPACEMAKER + + /*! + * \brief Perform a STONITH action. +diff --git a/include/pcmki/pcmki_cluster_queries.h b/include/pcmki/pcmki_cluster_queries.h +index eb3b51c..955eea3 100644 +--- a/include/pcmki/pcmki_cluster_queries.h ++++ b/include/pcmki/pcmki_cluster_queries.h +@@ -8,7 +8,7 @@ + int pcmk__controller_status(pcmk__output_t *out, char *dest_node, guint message_timeout_ms); + int pcmk__designated_controller(pcmk__output_t *out, guint message_timeout_ms); + int pcmk__pacemakerd_status(pcmk__output_t *out, char *ipc_name, guint message_timeout_ms); +-int pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT); ++int pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT); + + // remove when parameters removed from tools/crmadmin.c + int pcmk__shutdown_controller(pcmk__output_t *out, char *dest_node); +diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c +index 8bf5764..5841f16 100644 +--- a/lib/cluster/membership.c ++++ b/lib/cluster/membership.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -235,22 +236,6 @@ is_dirty(gpointer key, gpointer value, gpointer user_data) + return pcmk_is_set(((crm_node_t*)value)->flags, crm_node_dirty); + } + +-/* search string to find CIB resources entries for guest nodes */ +-#define XPATH_GUEST_NODE_CONFIG \ +- "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ +- "//" XML_TAG_META_SETS "//" XML_CIB_TAG_NVPAIR \ +- "[@name='" XML_RSC_ATTR_REMOTE_NODE "']" +- +-/* search string to find CIB resources entries for remote nodes */ +-#define XPATH_REMOTE_NODE_CONFIG \ +- "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ +- "[@type='remote'][@provider='pacemaker']" +- +-/* search string to find CIB node status entries for pacemaker_remote nodes */ +-#define XPATH_REMOTE_NODE_STATUS \ +- "//" XML_TAG_CIB "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE \ +- "[@" XML_NODE_IS_REMOTE "='true']" +- + /*! + * \brief Repopulate the remote peer cache based on CIB XML + * +diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c +index 1d1e775..fc5cfc4 100644 +--- a/lib/pacemaker/pcmk_cluster_queries.c ++++ b/lib/pacemaker/pcmk_cluster_queries.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -390,9 +391,33 @@ pcmk_pacemakerd_status(xmlNodePtr *xml, char *ipc_name, unsigned int message_tim + return rc; + } + ++/* user data for looping through remote node xpath searches */ ++struct node_data { ++ pcmk__output_t *out; ++ int found; ++ const char *field; /* XML attribute to check for node name */ ++ const char *type; ++ gboolean BASH_EXPORT; ++}; ++ ++static void ++remote_node_print_helper(xmlNode *result, void *user_data) ++{ ++ struct node_data *data = user_data; ++ pcmk__output_t *out = data->out; ++ const char *remote = crm_element_value(result, data->field); ++ ++ // node name and node id are the same for remote/guest nodes ++ out->message(out, "crmadmin-node", data->type, ++ remote, ++ remote, ++ data->BASH_EXPORT); ++ data->found++; ++} ++ + // \return Standard Pacemaker return code + int +-pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT) ++pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + { + cib_t *the_cib = cib_new(); + xmlNode *xml_node = NULL; +@@ -409,28 +434,60 @@ pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT) + rc = the_cib->cmds->query(the_cib, NULL, &xml_node, + cib_scope_local | cib_sync_call); + if (rc == pcmk_ok) { +- int found = 0; + xmlNode *node = NULL; + xmlNode *nodes = get_object_root(XML_CIB_TAG_NODES, xml_node); ++ struct node_data data = { ++ .out = out, ++ .found = 0, ++ .BASH_EXPORT = BASH_EXPORT ++ }; + + out->begin_list(out, NULL, NULL, "nodes"); + +- for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; +- node = crm_next_same_xml(node)) { +- const char *node_type = BASH_EXPORT ? NULL : +- crm_element_value(node, XML_ATTR_TYPE); +- out->message(out, "crmadmin-node", node_type, +- crm_str(crm_element_value(node, XML_ATTR_UNAME)), +- crm_str(crm_element_value(node, XML_ATTR_ID)), +- BASH_EXPORT); ++ if (!pcmk__str_empty(node_types) && strstr(node_types, "all")) { ++ node_types = NULL; ++ } ++ ++ if (pcmk__str_empty(node_types) || strstr(node_types, "member")) { ++ for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; ++ node = crm_next_same_xml(node)) { ++ const char *node_type = crm_element_value(node, XML_ATTR_TYPE); ++ //if (node_type == NULL || !strcmp(node_type, "member")) { ++ if (node_type == NULL) { ++ out->message(out, "crmadmin-node", node_type, ++ crm_str(crm_element_value(node, XML_ATTR_UNAME)), ++ crm_str(crm_element_value(node, XML_ATTR_ID)), ++ BASH_EXPORT); ++ data.found++; ++ } ++ ++ } ++ } ++ ++ if (pcmk__str_empty(node_types) || strstr(node_types, "pacemaker_remote")) { ++ data.field = "id"; ++ data.type = "pacemaker_remote"; ++ crm_foreach_xpath_result(xml_node, XPATH_REMOTE_NODE_STATUS, ++ remote_node_print_helper, &data); ++ } ++ ++ if (pcmk__str_empty(node_types) || strstr(node_types, "guest")) { ++ data.field = "value"; ++ data.type = "guest"; ++ crm_foreach_xpath_result(xml_node, XPATH_GUEST_NODE_CONFIG, ++ remote_node_print_helper, &data); ++ } + +- found++; ++ if (pcmk__str_empty(node_types) || !pcmk__strcmp(node_types, ",|^remote", pcmk__str_regex)) { ++ data.field = "id"; ++ data.type = "remote"; ++ crm_foreach_xpath_result(xml_node, XPATH_REMOTE_NODE_CONFIG, ++ remote_node_print_helper, &data); + } +- // @TODO List Pacemaker Remote nodes that don't have a entry + + out->end_list(out); + +- if (found == 0) { ++ if (data.found == 0) { + out->info(out, "No nodes configured"); + } + +@@ -440,9 +497,8 @@ pcmk__list_nodes(pcmk__output_t *out, gboolean BASH_EXPORT) + return pcmk_legacy2rc(rc); + } + +-#ifdef BUILD_PUBLIC_LIBPACEMAKER + int +-pcmk_list_nodes(xmlNodePtr *xml) ++pcmk_list_nodes(xmlNodePtr *xml, char *node_types) + { + pcmk__output_t *out = NULL; + int rc = pcmk_rc_ok; +@@ -454,11 +510,10 @@ pcmk_list_nodes(xmlNodePtr *xml) + + pcmk__register_lib_messages(out); + +- rc = pcmk__list_nodes(out, FALSE); ++ rc = pcmk__list_nodes(out, node_types, FALSE); + pcmk__out_epilogue(out, xml, rc); + return rc; + } +-#endif + + // remove when parameters removed from tools/crmadmin.c + int +diff --git a/tools/crmadmin.c b/tools/crmadmin.c +index 2d9d663..3f31c69 100644 +--- a/tools/crmadmin.c ++++ b/tools/crmadmin.c +@@ -38,10 +38,12 @@ struct { + gint timeout; + char *dest_node; + char *ipc_name; ++ char *node_types; + gboolean BASH_EXPORT; + } options = { + .dest_node = NULL, + .ipc_name = NULL, ++ .node_types = NULL, + .BASH_EXPORT = FALSE + }; + +@@ -93,6 +95,11 @@ static GOptionEntry additional_options[] = { + "\n operation failed", + NULL + }, ++ { "node-types", 'T', 0, G_OPTION_ARG_STRING, &options.node_types, ++ "Node types to list (available options: all, member, pacemaker_remote," ++ "\n guest, remote) (valid with -N/--nodes)", ++ NULL ++ }, + { "bash-export", 'B', 0, G_OPTION_ARG_NONE, &options.BASH_EXPORT, + "Display nodes as shell commands of the form 'export uname=uuid'" + "\n (valid with -N/--nodes)", +@@ -264,7 +271,7 @@ main(int argc, char **argv) + rc = pcmk__pacemakerd_status(out, options.ipc_name, options.timeout); + break; + case cmd_list_nodes: +- rc = pcmk__list_nodes(out, options.BASH_EXPORT); ++ rc = pcmk__list_nodes(out, options.node_types, options.BASH_EXPORT); + break; + case cmd_whois_dc: + rc = pcmk__designated_controller(out, options.timeout); +-- +1.8.3.1 + + +From f25d4e7aa9de55bb296087e6cbaf1654d01d6b0d Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Thu, 10 Dec 2020 13:58:31 +0100 +Subject: [PATCH 3/7] Refactor: use PCMK__XP_ prefix instead of XPATH_ for XML + constants + +--- + include/crm/common/xml_internal.h | 6 +++--- + lib/cluster/membership.c | 12 ++++++------ + lib/pacemaker/pcmk_cluster_queries.c | 6 +++--- + 3 files changed, 12 insertions(+), 12 deletions(-) + +diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h +index 969a57d..4501bee 100644 +--- a/include/crm/common/xml_internal.h ++++ b/include/crm/common/xml_internal.h +@@ -126,18 +126,18 @@ do { + /* XML search strings for guest, remote and pacemaker_remote nodes */ + + /* search string to find CIB resources entries for guest nodes */ +-#define XPATH_GUEST_NODE_CONFIG \ ++#define PCMK__XP_GUEST_NODE_CONFIG \ + "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ + "//" XML_TAG_META_SETS "//" XML_CIB_TAG_NVPAIR \ + "[@name='" XML_RSC_ATTR_REMOTE_NODE "']" + + /* search string to find CIB resources entries for remote nodes */ +-#define XPATH_REMOTE_NODE_CONFIG \ ++#define PCMK__XP_REMOTE_NODE_CONFIG \ + "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ + "[@type='remote'][@provider='pacemaker']" + + /* search string to find CIB node status entries for pacemaker_remote nodes */ +-#define XPATH_REMOTE_NODE_STATUS \ ++#define PCMK__XP_REMOTE_NODE_STATUS \ + "//" XML_TAG_CIB "//" XML_CIB_TAG_STATUS "//" XML_CIB_TAG_STATE \ + "[@" XML_NODE_IS_REMOTE "='true']" + +diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c +index 5841f16..d70091e 100644 +--- a/lib/cluster/membership.c ++++ b/lib/cluster/membership.c +@@ -257,7 +257,7 @@ crm_remote_peer_cache_refresh(xmlNode *cib) + /* Look for guest nodes and remote nodes in the status section */ + data.field = "id"; + data.has_state = TRUE; +- crm_foreach_xpath_result(cib, XPATH_REMOTE_NODE_STATUS, ++ crm_foreach_xpath_result(cib, PCMK__XP_REMOTE_NODE_STATUS, + remote_cache_refresh_helper, &data); + + /* Look for guest nodes and remote nodes in the configuration section, +@@ -268,11 +268,11 @@ crm_remote_peer_cache_refresh(xmlNode *cib) + */ + data.field = "value"; + data.has_state = FALSE; +- crm_foreach_xpath_result(cib, XPATH_GUEST_NODE_CONFIG, ++ crm_foreach_xpath_result(cib, PCMK__XP_GUEST_NODE_CONFIG, + remote_cache_refresh_helper, &data); + data.field = "id"; + data.has_state = FALSE; +- crm_foreach_xpath_result(cib, XPATH_REMOTE_NODE_CONFIG, ++ crm_foreach_xpath_result(cib, PCMK__XP_REMOTE_NODE_CONFIG, + remote_cache_refresh_helper, &data); + + /* Remove all old cache entries that weren't seen in the CIB */ +@@ -1232,7 +1232,7 @@ known_node_cache_refresh_helper(xmlNode *xml_node, void *user_data) + + } + +-#define XPATH_MEMBER_NODE_CONFIG \ ++#define PCMK__XP_MEMBER_NODE_CONFIG \ + "//" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_NODES \ + "/" XML_CIB_TAG_NODE "[not(@type) or @type='member']" + +@@ -1243,7 +1243,7 @@ crm_known_peer_cache_refresh(xmlNode *cib) + + g_hash_table_foreach(crm_known_peer_cache, mark_dirty, NULL); + +- crm_foreach_xpath_result(cib, XPATH_MEMBER_NODE_CONFIG, ++ crm_foreach_xpath_result(cib, PCMK__XP_MEMBER_NODE_CONFIG, + known_peer_cache_refresh_helper, NULL); + + /* Remove all old cache entries that weren't seen in the CIB */ +diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c +index fc5cfc4..e512f32 100644 +--- a/lib/pacemaker/pcmk_cluster_queries.c ++++ b/lib/pacemaker/pcmk_cluster_queries.c +@@ -467,21 +467,21 @@ pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + if (pcmk__str_empty(node_types) || strstr(node_types, "pacemaker_remote")) { + data.field = "id"; + data.type = "pacemaker_remote"; +- crm_foreach_xpath_result(xml_node, XPATH_REMOTE_NODE_STATUS, ++ crm_foreach_xpath_result(xml_node, PCMK__XP_REMOTE_NODE_STATUS, + remote_node_print_helper, &data); + } + + if (pcmk__str_empty(node_types) || strstr(node_types, "guest")) { + data.field = "value"; + data.type = "guest"; +- crm_foreach_xpath_result(xml_node, XPATH_GUEST_NODE_CONFIG, ++ crm_foreach_xpath_result(xml_node, PCMK__XP_GUEST_NODE_CONFIG, + remote_node_print_helper, &data); + } + + if (pcmk__str_empty(node_types) || !pcmk__strcmp(node_types, ",|^remote", pcmk__str_regex)) { + data.field = "id"; + data.type = "remote"; +- crm_foreach_xpath_result(xml_node, XPATH_REMOTE_NODE_CONFIG, ++ crm_foreach_xpath_result(xml_node, PCMK__XP_REMOTE_NODE_CONFIG, + remote_node_print_helper, &data); + } + +-- +1.8.3.1 + + +From 225d5fabedb1319245a2a3e661df2252e60aca1a Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Fri, 22 Jan 2021 16:34:39 +0100 +Subject: [PATCH 4/7] Fix: crmadmin: use cluster instead of member term and + remove pacemaker_remote node type + +--- + include/pacemaker.h | 1 + + lib/cluster/membership.c | 2 +- + lib/pacemaker/pcmk_cluster_queries.c | 10 +--------- + lib/pacemaker/pcmk_output.c | 4 ++-- + tools/crmadmin.c | 4 ++-- + 5 files changed, 7 insertions(+), 14 deletions(-) + +diff --git a/include/pacemaker.h b/include/pacemaker.h +index 42d096f..a6a9d13 100644 +--- a/include/pacemaker.h ++++ b/include/pacemaker.h +@@ -77,6 +77,7 @@ int pcmk_resource_digests(xmlNodePtr *xml, pe_resource_t *rsc, + * \brief Get nodes list + * + * \param[in,out] xml The destination for the result, as an XML tree. ++ * \param[in] node_types Node type(s) to return (default: all) + * + * \return Standard Pacemaker return code + */ +diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c +index e512f32..9f19915 100644 +--- a/lib/pacemaker/pcmk_cluster_queries.c ++++ b/lib/pacemaker/pcmk_cluster_queries.c +@@ -448,11 +448,10 @@ pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + node_types = NULL; + } + +- if (pcmk__str_empty(node_types) || strstr(node_types, "member")) { ++ if (pcmk__str_empty(node_types) || strstr(node_types, "cluster")) { + for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; + node = crm_next_same_xml(node)) { + const char *node_type = crm_element_value(node, XML_ATTR_TYPE); +- //if (node_type == NULL || !strcmp(node_type, "member")) { + if (node_type == NULL) { + out->message(out, "crmadmin-node", node_type, + crm_str(crm_element_value(node, XML_ATTR_UNAME)), +@@ -464,13 +463,6 @@ pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + } + } + +- if (pcmk__str_empty(node_types) || strstr(node_types, "pacemaker_remote")) { +- data.field = "id"; +- data.type = "pacemaker_remote"; +- crm_foreach_xpath_result(xml_node, PCMK__XP_REMOTE_NODE_STATUS, +- remote_node_print_helper, &data); +- } +- + if (pcmk__str_empty(node_types) || strstr(node_types, "guest")) { + data.field = "value"; + data.type = "guest"; +diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c +index 8f5e301..655b723 100644 +--- a/lib/pacemaker/pcmk_output.c ++++ b/lib/pacemaker/pcmk_output.c +@@ -483,7 +483,7 @@ crmadmin_node_text(pcmk__output_t *out, va_list args) + } else if (BASH_EXPORT) { + out->info(out, "export %s=%s", crm_str(name), crm_str(id)); + } else { +- out->info(out, "%s node: %s (%s)", type ? type : "member", ++ out->info(out, "%s node: %s (%s)", type ? type : "cluster", + crm_str(name), crm_str(id)); + } + +@@ -499,7 +499,7 @@ crmadmin_node_xml(pcmk__output_t *out, va_list args) + const char *id = va_arg(args, const char *); + + pcmk__output_create_xml_node(out, "node", +- "type", type ? type : "member", ++ "type", type ? type : "cluster", + "name", crm_str(name), + "id", crm_str(id), + NULL); +diff --git a/tools/crmadmin.c b/tools/crmadmin.c +index 3f31c69..d699786 100644 +--- a/tools/crmadmin.c ++++ b/tools/crmadmin.c +@@ -96,8 +96,8 @@ static GOptionEntry additional_options[] = { + NULL + }, + { "node-types", 'T', 0, G_OPTION_ARG_STRING, &options.node_types, +- "Node types to list (available options: all, member, pacemaker_remote," +- "\n guest, remote) (valid with -N/--nodes)", ++ "Node types to list (available options: all, cluster, guest, remote)" ++ "\n (valid with -N/--nodes)", + NULL + }, + { "bash-export", 'B', 0, G_OPTION_ARG_NONE, &options.BASH_EXPORT, +-- +1.8.3.1 + + +From ceacef32c70d1760a4dd89c00134373d42457ea2 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Mon, 25 Jan 2021 16:52:00 +0100 +Subject: [PATCH 5/7] Refactor: crmadmin/pcmk__list_nodes(): use + crm_foreach_xpath_result() for all types of nodes + +--- + include/crm/common/xml_internal.h | 5 +++++ + lib/cluster/membership.c | 4 ---- + lib/pacemaker/pcmk_cluster_queries.c | 25 ++++++++----------------- + 3 files changed, 13 insertions(+), 21 deletions(-) + +diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h +index 4501bee..2193b50 100644 +--- a/include/crm/common/xml_internal.h ++++ b/include/crm/common/xml_internal.h +@@ -125,6 +125,11 @@ do { + + /* XML search strings for guest, remote and pacemaker_remote nodes */ + ++/* search string to find CIB resources entries for cluster nodes */ ++#define PCMK__XP_MEMBER_NODE_CONFIG \ ++ "//" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_NODES \ ++ "/" XML_CIB_TAG_NODE "[not(@type) or @type='member']" ++ + /* search string to find CIB resources entries for guest nodes */ + #define PCMK__XP_GUEST_NODE_CONFIG \ + "//" XML_TAG_CIB "//" XML_CIB_TAG_CONFIGURATION "//" XML_CIB_TAG_RESOURCE \ +diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c +index 3417836..5d042e2 100644 +--- a/lib/cluster/membership.c ++++ b/lib/cluster/membership.c +@@ -1232,10 +1232,6 @@ known_node_cache_refresh_helper(xmlNode *xml_node, void *user_data) + + } + +-#define PCMK__XP_MEMBER_NODE_CONFIG \ +- "//" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION "/" XML_CIB_TAG_NODES \ +- "/" XML_CIB_TAG_NODE "[not(@type) or @type='member']" +- + static void + crm_known_peer_cache_refresh(xmlNode *cib) + { +diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c +index 9f19915..6e6acda 100644 +--- a/lib/pacemaker/pcmk_cluster_queries.c ++++ b/lib/pacemaker/pcmk_cluster_queries.c +@@ -405,12 +405,13 @@ remote_node_print_helper(xmlNode *result, void *user_data) + { + struct node_data *data = user_data; + pcmk__output_t *out = data->out; +- const char *remote = crm_element_value(result, data->field); ++ const char *name = crm_element_value(result, XML_ATTR_UNAME); ++ const char *id = crm_element_value(result, data->field); + + // node name and node id are the same for remote/guest nodes + out->message(out, "crmadmin-node", data->type, +- remote, +- remote, ++ name ? name : id, ++ id, + data->BASH_EXPORT); + data->found++; + } +@@ -434,8 +435,6 @@ pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + rc = the_cib->cmds->query(the_cib, NULL, &xml_node, + cib_scope_local | cib_sync_call); + if (rc == pcmk_ok) { +- xmlNode *node = NULL; +- xmlNode *nodes = get_object_root(XML_CIB_TAG_NODES, xml_node); + struct node_data data = { + .out = out, + .found = 0, +@@ -449,18 +448,10 @@ pcmk__list_nodes(pcmk__output_t *out, char *node_types, gboolean BASH_EXPORT) + } + + if (pcmk__str_empty(node_types) || strstr(node_types, "cluster")) { +- for (node = first_named_child(nodes, XML_CIB_TAG_NODE); node != NULL; +- node = crm_next_same_xml(node)) { +- const char *node_type = crm_element_value(node, XML_ATTR_TYPE); +- if (node_type == NULL) { +- out->message(out, "crmadmin-node", node_type, +- crm_str(crm_element_value(node, XML_ATTR_UNAME)), +- crm_str(crm_element_value(node, XML_ATTR_ID)), +- BASH_EXPORT); +- data.found++; +- } +- +- } ++ data.field = "id"; ++ data.type = "cluster"; ++ crm_foreach_xpath_result(xml_node, PCMK__XP_MEMBER_NODE_CONFIG, ++ remote_node_print_helper, &data); + } + + if (pcmk__str_empty(node_types) || strstr(node_types, "guest")) { +-- +1.8.3.1 + + +From a56ce0cf463798ac8d7ff945dda3be019cb9297d Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 26 Jan 2021 11:03:10 +0100 +Subject: [PATCH 6/7] Refactor: crmadmin: move new -T functionality to -N + parameter + +--- + include/crm/crm.h | 2 +- + tools/crmadmin.c | 30 ++++++++++++------------------ + 2 files changed, 13 insertions(+), 19 deletions(-) + +diff --git a/include/crm/crm.h b/include/crm/crm.h +index 3f22c4b..09643c2 100644 +--- a/include/crm/crm.h ++++ b/include/crm/crm.h +@@ -51,7 +51,7 @@ extern "C" { + * >=3.0.13: Fail counts include operation name and interval + * >=3.2.0: DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED + */ +-# define CRM_FEATURE_SET "3.7.0" ++# define CRM_FEATURE_SET "3.7.1" + + # define EOS '\0' + # define DIMOF(a) ((int) (sizeof(a)/sizeof(a[0])) ) +diff --git a/tools/crmadmin.c b/tools/crmadmin.c +index d699786..9c280aa 100644 +--- a/tools/crmadmin.c ++++ b/tools/crmadmin.c +@@ -36,14 +36,12 @@ static enum { + struct { + gboolean health; + gint timeout; +- char *dest_node; ++ char *optarg; + char *ipc_name; +- char *node_types; + gboolean BASH_EXPORT; + } options = { +- .dest_node = NULL, ++ .optarg = NULL, + .ipc_name = NULL, +- .node_types = NULL, + .BASH_EXPORT = FALSE + }; + +@@ -69,9 +67,10 @@ static GOptionEntry command_options[] = { + "\n node to examine the logs.", + NULL + }, +- { "nodes", 'N', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, command_cb, +- "Display the uname of all member nodes", +- NULL ++ { "nodes", 'N', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, command_cb, ++ "Display the uname of all member nodes [optionally filtered by type (comma-separated)]" ++ "\n Types: all (default), cluster, guest, remote", ++ "TYPE" + }, + { "election", 'E', G_OPTION_FLAG_HIDDEN|G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, command_cb, + "(Advanced) Start an election for the cluster co-ordinator", +@@ -95,11 +94,6 @@ static GOptionEntry additional_options[] = { + "\n operation failed", + NULL + }, +- { "node-types", 'T', 0, G_OPTION_ARG_STRING, &options.node_types, +- "Node types to list (available options: all, cluster, guest, remote)" +- "\n (valid with -N/--nodes)", +- NULL +- }, + { "bash-export", 'B', 0, G_OPTION_ARG_NONE, &options.BASH_EXPORT, + "Display nodes as shell commands of the form 'export uname=uuid'" + "\n (valid with -N/--nodes)", +@@ -142,10 +136,10 @@ command_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError + } + + if (optarg) { +- if (options.dest_node != NULL) { +- free(options.dest_node); ++ if (options.optarg != NULL) { ++ free(options.optarg); + } +- options.dest_node = strdup(optarg); ++ options.optarg = strdup(optarg); + } + + return TRUE; +@@ -265,19 +259,19 @@ main(int argc, char **argv) + + switch (command) { + case cmd_health: +- rc = pcmk__controller_status(out, options.dest_node, options.timeout); ++ rc = pcmk__controller_status(out, options.optarg, options.timeout); + break; + case cmd_pacemakerd_health: + rc = pcmk__pacemakerd_status(out, options.ipc_name, options.timeout); + break; + case cmd_list_nodes: +- rc = pcmk__list_nodes(out, options.node_types, options.BASH_EXPORT); ++ rc = pcmk__list_nodes(out, options.optarg, options.BASH_EXPORT); + break; + case cmd_whois_dc: + rc = pcmk__designated_controller(out, options.timeout); + break; + case cmd_shutdown: +- rc = pcmk__shutdown_controller(out, options.dest_node); ++ rc = pcmk__shutdown_controller(out, options.optarg); + break; + case cmd_elect_dc: + rc = pcmk__start_election(out); +-- +1.8.3.1 + + +From dae5688edaf1b3008b70296421004ebdfbdf4b7b Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Tue, 26 Jan 2021 15:02:39 +0100 +Subject: [PATCH 7/7] Test: cts-cli: add crmadmin -N/--nodes tests + +--- + cts/Makefile.am | 1 + + cts/cli/crmadmin-cluster-remote-guest-nodes.xml | 483 ++++++++++++++++++++++++ + cts/cli/regression.tools.exp | 24 ++ + cts/cts-cli.in | 42 ++- + 4 files changed, 543 insertions(+), 7 deletions(-) + create mode 100644 cts/cli/crmadmin-cluster-remote-guest-nodes.xml + +diff --git a/cts/Makefile.am b/cts/Makefile.am +index de02aed..2a73774 100644 +--- a/cts/Makefile.am ++++ b/cts/Makefile.am +@@ -61,6 +61,7 @@ cts_SCRIPTS = CTSlab.py \ + + clidir = $(testdir)/cli + dist_cli_DATA = cli/constraints.xml \ ++ cli/crmadmin-cluster-remote-guest-nodes.xml \ + cli/crm_diff_new.xml \ + cli/crm_diff_old.xml \ + cli/crm_mon.xml \ +diff --git a/cts/cli/crmadmin-cluster-remote-guest-nodes.xml b/cts/cli/crmadmin-cluster-remote-guest-nodes.xml +new file mode 100644 +index 0000000..8db656f +--- /dev/null ++++ b/cts/cli/crmadmin-cluster-remote-guest-nodes.xml +@@ -0,0 +1,483 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/cts/cli/regression.tools.exp b/cts/cli/regression.tools.exp +index 510cc0a..7324053 100644 +--- a/cts/cli/regression.tools.exp ++++ b/cts/cli/regression.tools.exp +@@ -4053,3 +4053,27 @@ Resources colocated with clone: + + =#=#=#= End test: Show resource digests with overrides - OK (0) =#=#=#= + * Passed: crm_resource - Show resource digests with overrides ++=#=#=#= Begin test: List all nodes =#=#=#= ++11 ++=#=#=#= End test: List all nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List all nodes ++=#=#=#= Begin test: List cluster nodes =#=#=#= ++6 ++=#=#=#= End test: List cluster nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List cluster nodes ++=#=#=#= Begin test: List guest nodes =#=#=#= ++2 ++=#=#=#= End test: List guest nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List guest nodes ++=#=#=#= Begin test: List remote nodes =#=#=#= ++3 ++=#=#=#= End test: List remote nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List remote nodes ++=#=#=#= Begin test: List cluster,remote nodes =#=#=#= ++9 ++=#=#=#= End test: List cluster,remote nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List cluster,remote nodes ++=#=#=#= Begin test: List guest,remote nodes =#=#=#= ++5 ++=#=#=#= End test: List guest,remote nodes - OK (0) =#=#=#= ++* Passed: crmadmin - List guest,remote nodes +diff --git a/cts/cts-cli.in b/cts/cts-cli.in +index 96f5386..8e2dbe5 100755 +--- a/cts/cts-cli.in ++++ b/cts/cts-cli.in +@@ -501,15 +501,15 @@ function test_tools() { + desc="Default standby value" + cmd="crm_standby -N node1 -G" + test_assert $CRM_EX_OK +- ++ + desc="Set standby status" + cmd="crm_standby -N node1 -v true" + test_assert $CRM_EX_OK +- ++ + desc="Query standby value" + cmd="crm_standby -N node1 -G" + test_assert $CRM_EX_OK +- ++ + desc="Delete standby value" + cmd="crm_standby -N node1 -D" + test_assert $CRM_EX_OK +@@ -657,7 +657,7 @@ function test_tools() { + desc="Drop the status section" + cmd="cibadmin -R -o status --xml-text ''" + test_assert $CRM_EX_OK 0 +- ++ + desc="Create a clone" + cmd="cibadmin -C -o resources --xml-text ''" + test_assert $CRM_EX_OK 0 +@@ -697,7 +697,7 @@ function test_tools() { + desc="Update existing resource meta attribute" + cmd="crm_resource -r test-clone --meta -p is-managed -v true" + test_assert $CRM_EX_OK +- ++ + desc="Create a resource meta attribute in the parent" + cmd="crm_resource -r test-clone --meta -p is-managed -v true --force" + test_assert $CRM_EX_OK +@@ -803,6 +803,34 @@ function test_tools() { + test_assert $CRM_EX_OK 0 + + unset CIB_file ++ ++ export CIB_file="$test_home/cli/crmadmin-cluster-remote-guest-nodes.xml" ++ ++ desc="List all nodes" ++ cmd="crmadmin -N | wc -l | grep 11" ++ test_assert $CRM_EX_OK 0 ++ ++ desc="List cluster nodes" ++ cmd="crmadmin -N cluster | wc -l | grep 6" ++ test_assert $CRM_EX_OK 0 ++ ++ desc="List guest nodes" ++ cmd="crmadmin -N guest | wc -l | grep 2" ++ test_assert $CRM_EX_OK 0 ++ ++ desc="List remote nodes" ++ cmd="crmadmin -N remote | wc -l | grep 3" ++ test_assert $CRM_EX_OK 0 ++ ++ desc="List cluster,remote nodes" ++ cmd="crmadmin -N cluster,remote | wc -l | grep 9" ++ test_assert $CRM_EX_OK 0 ++ ++ desc="List guest,remote nodes" ++ cmd="crmadmin -N guest,remote | wc -l | grep 5" ++ test_assert $CRM_EX_OK 0 ++ ++ unset CIB_file + } + + INVALID_PERIODS=( +@@ -822,7 +850,7 @@ INVALID_PERIODS=( + "P1Z/2019-02-20 00:00:00Z" # Invalid duration unit + "P1YM/2019-02-20 00:00:00Z" # No number for duration unit + ) +- ++ + function test_dates() { + # Ensure invalid period specifications are rejected + for spec in '' "${INVALID_PERIODS[@]}"; do +@@ -1665,7 +1693,7 @@ for t in $tests; do + done + + rm -rf "${shadow_dir}" +- ++ + failed=0 + + if [ $verbose -eq 1 ]; then +-- +1.8.3.1 + diff --git a/SOURCES/031-cibsecret.patch b/SOURCES/031-cibsecret.patch new file mode 100644 index 0000000..4985bb4 --- /dev/null +++ b/SOURCES/031-cibsecret.patch @@ -0,0 +1,29 @@ +From 240b9ec01e6a6e6554f0ae13d759c01339835a40 Mon Sep 17 00:00:00 2001 +From: Oyvind Albrigtsen +Date: Wed, 27 Jan 2021 10:10:03 +0100 +Subject: [PATCH] Feature: cibsecret: use crmadmin -N (which also lists guest + and remote nodes) to get nodes to sync to + +--- + tools/cibsecret.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/cibsecret.in b/tools/cibsecret.in +index 8923a70..6326bf0 100644 +--- a/tools/cibsecret.in ++++ b/tools/cibsecret.in +@@ -182,9 +182,9 @@ get_live_peers() { + [ $? -eq 0 ] || fatal $CRM_EX_UNAVAILABLE "couldn't get local node name" + + # Get a list of all other cluster nodes +- GLP_ALL_PEERS="$(crm_node -l)" ++ GLP_ALL_PEERS="$(crmadmin -N -q)" + [ $? -eq 0 ] || fatal $CRM_EX_UNAVAILABLE "couldn't determine cluster nodes" +- GLP_ALL_PEERS="$(echo "$GLP_ALL_PEERS" | awk '{print $2}' | grep -v "^${GLP_LOCAL_NODE}$")" ++ GLP_ALL_PEERS="$(echo "$GLP_ALL_PEERS" | grep -v "^${GLP_LOCAL_NODE}$")" + + # Make a list of those that respond to pings + if [ "$(id -u)" = "0" ] && which fping >/dev/null 2>&1; then +-- +1.8.3.1 + diff --git a/SOURCES/032-rhbz1898457.patch b/SOURCES/032-rhbz1898457.patch new file mode 100644 index 0000000..d36e9b5 --- /dev/null +++ b/SOURCES/032-rhbz1898457.patch @@ -0,0 +1,6801 @@ +From 04a259fbd6fe24f909b82a2b0790c39841618c3c Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:08:43 -0600 +Subject: [PATCH 01/16] Refactor: scheduler: use convenience functions when + unpacking node history + +... to simplify a bit and improve readability +--- + lib/pengine/unpack.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 281bc88..f0f3425 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -1019,19 +1019,15 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + bool changed = false; + xmlNode *lrm_rsc = NULL; + +- for (xmlNode *state = pcmk__xe_first_child(status); state != NULL; +- state = pcmk__xe_next(state)) { ++ // Loop through all node_state entries in CIB status ++ for (xmlNode *state = first_named_child(status, XML_CIB_TAG_STATE); ++ state != NULL; state = crm_next_same_xml(state)) { + +- const char *id = NULL; ++ const char *id = ID(state); + const char *uname = NULL; + pe_node_t *this_node = NULL; + bool process = FALSE; + +- if (!pcmk__str_eq((const char *)state->name, XML_CIB_TAG_STATE, pcmk__str_none)) { +- continue; +- } +- +- id = crm_element_value(state, XML_ATTR_ID); + uname = crm_element_value(state, XML_ATTR_UNAME); + this_node = pe_find_node_any(data_set->nodes, id, uname); + +-- +1.8.3.1 + + +From 4e1a0fa5ffbdad7fe0ed2e40550fc2773073a2dd Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:12:19 -0600 +Subject: [PATCH 02/16] Refactor: scheduler: return standard code when + unpacking node history + +... for consistency and readability. Also, document the function. +--- + lib/pengine/unpack.c | 31 ++++++++++++++++++++++++------- + 1 file changed, 24 insertions(+), 7 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index f0f3425..2471bf0 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1013,10 +1013,27 @@ unpack_handle_remote_attrs(pe_node_t *this_node, xmlNode *state, pe_working_set_ + } + } + +-static bool ++/*! ++ * \internal ++ * \brief Unpack nodes' resource history as much as possible ++ * ++ * Unpack as many nodes' resource history as possible in one pass through the ++ * status. We need to process Pacemaker Remote nodes' connections/containers ++ * before unpacking their history; the connection/container history will be ++ * in another node's history, so it might take multiple passes to unpack ++ * everything. ++ * ++ * \param[in] status CIB XML status section ++ * \param[in] fence If true, treat any not-yet-unpacked nodes as unseen ++ * \param[in] data_set Cluster working set ++ * ++ * \return Standard Pacemaker return code (specifically pcmk_rc_ok if done, ++ * or EAGAIN if more unpacking remains to be done) ++ */ ++static int + unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + { +- bool changed = false; ++ int rc = pcmk_rc_ok; + xmlNode *lrm_rsc = NULL; + + // Loop through all node_state entries in CIB status +@@ -1091,15 +1108,16 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + fence?"un":"", + (pe__is_guest_or_remote_node(this_node)? " remote" : ""), + this_node->details->uname); +- changed = TRUE; + this_node->details->unpacked = TRUE; + + lrm_rsc = find_xml_node(state, XML_CIB_TAG_LRM, FALSE); + lrm_rsc = find_xml_node(lrm_rsc, XML_LRM_TAG_RESOURCES, FALSE); + unpack_lrm_resources(this_node, lrm_rsc, data_set); ++ ++ rc = EAGAIN; // Other node histories might depend on this one + } + } +- return changed; ++ return rc; + } + + /* remove nodes that are down, stopping */ +@@ -1195,9 +1213,8 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set) + } + } + +- +- while(unpack_node_loop(status, FALSE, data_set)) { +- crm_trace("Start another loop"); ++ while (unpack_node_loop(status, FALSE, data_set) == EAGAIN) { ++ crm_trace("Another pass through node resource histories is needed"); + } + + // Now catch any nodes we didn't see +-- +1.8.3.1 + + +From 14a94866978e4a36bb329deb6b7a004c97eab912 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:15:20 -0600 +Subject: [PATCH 03/16] Low: scheduler: warn if node state has no ID or uname + +This should be possible only if someone manually mis-edits the CIB, but that +case does merit a warning, and we should bail early if it happens (previously, +the right thing would eventually be done anyway, but log messages using a NULL +could theoretically cause a crash). +--- + lib/pengine/unpack.c | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 2471bf0..0b4e0cd 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1041,11 +1041,15 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + state != NULL; state = crm_next_same_xml(state)) { + + const char *id = ID(state); +- const char *uname = NULL; ++ const char *uname = crm_element_value(state, XML_ATTR_UNAME); + pe_node_t *this_node = NULL; + bool process = FALSE; + +- uname = crm_element_value(state, XML_ATTR_UNAME); ++ if ((id == NULL) || (uname == NULL)) { ++ // Warning already logged in first pass through status section ++ continue; ++ } ++ + this_node = pe_find_node_any(data_set->nodes, id, uname); + + if (this_node == NULL) { +@@ -1150,19 +1154,27 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set) + const char *resource_discovery_enabled = NULL; + + id = crm_element_value(state, XML_ATTR_ID); +- uname = crm_element_value(state, XML_ATTR_UNAME); +- this_node = pe_find_node_any(data_set->nodes, id, uname); ++ if (id == NULL) { ++ crm_warn("Ignoring malformed " XML_CIB_TAG_STATE ++ " entry without " XML_ATTR_ID); ++ continue; ++ } + ++ uname = crm_element_value(state, XML_ATTR_UNAME); + if (uname == NULL) { +- /* error */ ++ crm_warn("Ignoring malformed " XML_CIB_TAG_STATE ++ " entry without " XML_ATTR_UNAME); + continue; ++ } + +- } else if (this_node == NULL) { ++ this_node = pe_find_node_any(data_set->nodes, id, uname); ++ if (this_node == NULL) { + pcmk__config_warn("Ignoring recorded node status for '%s' " + "because no longer in configuration", uname); + continue; ++ } + +- } else if (pe__is_guest_or_remote_node(this_node)) { ++ if (pe__is_guest_or_remote_node(this_node)) { + /* online state for remote nodes is determined by the + * rsc state after all the unpacking is done. we do however + * need to mark whether or not the node has been fenced as this plays +-- +1.8.3.1 + + +From 2b77c873ad3f3f04e164695eafe945cec7d16f75 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:22:48 -0600 +Subject: [PATCH 04/16] Log: scheduler: improve messages when unpacking node + histories + +--- + lib/pengine/unpack.c | 26 ++++++++++++++------------ + 1 file changed, 14 insertions(+), 12 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 0b4e0cd..641b601 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1047,21 +1047,27 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + + if ((id == NULL) || (uname == NULL)) { + // Warning already logged in first pass through status section ++ crm_trace("Not unpacking resource history from malformed " ++ XML_CIB_TAG_STATE " without id and/or uname"); + continue; + } + + this_node = pe_find_node_any(data_set->nodes, id, uname); +- + if (this_node == NULL) { +- crm_info("Node %s is unknown", id); ++ // Warning already logged in first pass through status section ++ crm_trace("Not unpacking resource history for node %s because " ++ "no longer in configuration", id); + continue; ++ } + +- } else if (this_node->details->unpacked) { +- crm_trace("Node %s was already processed", id); ++ if (this_node->details->unpacked) { ++ crm_trace("Not unpacking resource history for node %s because " ++ "already unpacked", id); + continue; ++ } + +- } else if (!pe__is_guest_or_remote_node(this_node) +- && pcmk_is_set(data_set->flags, pe_flag_stonith_enabled)) { ++ if (!pe__is_guest_or_remote_node(this_node) ++ && pcmk_is_set(data_set->flags, pe_flag_stonith_enabled)) { + // A redundant test, but preserves the order for regression tests + process = TRUE; + +@@ -1082,13 +1088,11 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + * known to be up before we process resources running in it. + */ + check = TRUE; +- crm_trace("Checking node %s/%s/%s status %d/%d/%d", id, rsc->id, rsc->container->id, fence, rsc->role, RSC_ROLE_STARTED); + + } else if (!pe__is_guest_node(this_node) + && ((rsc->role == RSC_ROLE_STARTED) + || pcmk_is_set(data_set->flags, pe_flag_shutdown_lock))) { + check = TRUE; +- crm_trace("Checking node %s/%s status %d/%d/%d", id, rsc->id, fence, rsc->role, RSC_ROLE_STARTED); + } + + if (check) { +@@ -1108,10 +1112,8 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + } + + if(process) { +- crm_trace("Processing lrm resource entries on %shealthy%s node: %s", +- fence?"un":"", +- (pe__is_guest_or_remote_node(this_node)? " remote" : ""), +- this_node->details->uname); ++ crm_trace("Unpacking resource history for %snode %s", ++ (fence? "unseen " : ""), id); + this_node->details->unpacked = TRUE; + + lrm_rsc = find_xml_node(state, XML_CIB_TAG_LRM, FALSE); +-- +1.8.3.1 + + +From 9e1747453bf3d0315f189814fc025eaeab35b937 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:26:05 -0600 +Subject: [PATCH 05/16] Refactor: scheduler: avoid a level of indentation when + unpacking node histories + +--- + lib/pengine/unpack.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 641b601..7e68d64 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1111,17 +1111,19 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + process = TRUE; + } + +- if(process) { +- crm_trace("Unpacking resource history for %snode %s", +- (fence? "unseen " : ""), id); +- this_node->details->unpacked = TRUE; ++ if (!process) { ++ continue; ++ } + +- lrm_rsc = find_xml_node(state, XML_CIB_TAG_LRM, FALSE); +- lrm_rsc = find_xml_node(lrm_rsc, XML_LRM_TAG_RESOURCES, FALSE); +- unpack_lrm_resources(this_node, lrm_rsc, data_set); ++ crm_trace("Unpacking resource history for %snode %s", ++ (fence? "unseen " : ""), id); + +- rc = EAGAIN; // Other node histories might depend on this one +- } ++ this_node->details->unpacked = TRUE; ++ lrm_rsc = find_xml_node(state, XML_CIB_TAG_LRM, FALSE); ++ lrm_rsc = find_xml_node(lrm_rsc, XML_LRM_TAG_RESOURCES, FALSE); ++ unpack_lrm_resources(this_node, lrm_rsc, data_set); ++ ++ rc = EAGAIN; // Other node histories might depend on this one + } + return rc; + } +-- +1.8.3.1 + + +From 7d5dadb32dbd52d287bbc94c2d55d75e018a3146 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 20 Jan 2021 17:26:41 -0600 +Subject: [PATCH 06/16] Refactor: scheduler: simplify unpacking node histories + +By separating the processing of remote and guest nodes, we can eliminate some +variables, improve trace messages, and make the code a little easier to follow. +--- + lib/pengine/unpack.c | 82 +++++++++++++++++++++++++++------------------------- + 1 file changed, 42 insertions(+), 40 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 7e68d64..9b968a9 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1031,7 +1031,7 @@ unpack_handle_remote_attrs(pe_node_t *this_node, xmlNode *state, pe_working_set_ + * or EAGAIN if more unpacking remains to be done) + */ + static int +-unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) ++unpack_node_loop(xmlNode *status, bool fence, pe_working_set_t *data_set) + { + int rc = pcmk_rc_ok; + xmlNode *lrm_rsc = NULL; +@@ -1043,7 +1043,6 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + const char *id = ID(state); + const char *uname = crm_element_value(state, XML_ATTR_UNAME); + pe_node_t *this_node = NULL; +- bool process = FALSE; + + if ((id == NULL) || (uname == NULL)) { + // Warning already logged in first pass through status section +@@ -1066,53 +1065,56 @@ unpack_node_loop(xmlNode * status, bool fence, pe_working_set_t * data_set) + continue; + } + +- if (!pe__is_guest_or_remote_node(this_node) +- && pcmk_is_set(data_set->flags, pe_flag_stonith_enabled)) { +- // A redundant test, but preserves the order for regression tests +- process = TRUE; ++ if (fence) { ++ // We're processing all remaining nodes + +- } else if (pe__is_guest_or_remote_node(this_node)) { +- bool check = FALSE; ++ } else if (pe__is_guest_node(this_node)) { ++ /* We can unpack a guest node's history only after we've unpacked ++ * other resource history to the point that we know that the node's ++ * connection and containing resource are both up. ++ */ + pe_resource_t *rsc = this_node->details->remote_rsc; + +- if(fence) { +- check = TRUE; +- +- } else if(rsc == NULL) { +- /* Not ready yet */ +- +- } else if (pe__is_guest_node(this_node) +- && rsc->role == RSC_ROLE_STARTED +- && rsc->container->role == RSC_ROLE_STARTED) { +- /* Both the connection and its containing resource need to be +- * known to be up before we process resources running in it. +- */ +- check = TRUE; +- +- } else if (!pe__is_guest_node(this_node) +- && ((rsc->role == RSC_ROLE_STARTED) +- || pcmk_is_set(data_set->flags, pe_flag_shutdown_lock))) { +- check = TRUE; +- } +- +- if (check) { +- determine_remote_online_status(data_set, this_node); +- unpack_handle_remote_attrs(this_node, state, data_set); +- process = TRUE; ++ if ((rsc == NULL) || (rsc->role != RSC_ROLE_STARTED) ++ || (rsc->container->role != RSC_ROLE_STARTED)) { ++ crm_trace("Not unpacking resource history for guest node %s " ++ "because container and connection are not known to " ++ "be up", id); ++ continue; + } + +- } else if (this_node->details->online) { +- process = TRUE; ++ } else if (pe__is_remote_node(this_node)) { ++ /* We can unpack a remote node's history only after we've unpacked ++ * other resource history to the point that we know that the node's ++ * connection is up, with the exception of when shutdown locks are ++ * in use. ++ */ ++ pe_resource_t *rsc = this_node->details->remote_rsc; + +- } else if (fence) { +- process = TRUE; ++ if ((rsc == NULL) ++ || (!pcmk_is_set(data_set->flags, pe_flag_shutdown_lock) ++ && (rsc->role != RSC_ROLE_STARTED))) { ++ crm_trace("Not unpacking resource history for remote node %s " ++ "because connection is not known to be up", id); ++ continue; ++ } + +- } else if (pcmk_is_set(data_set->flags, pe_flag_shutdown_lock)) { +- process = TRUE; ++ /* If fencing and shutdown locks are disabled and we're not processing ++ * unseen nodes, then we don't want to unpack offline nodes until online ++ * nodes have been unpacked. This allows us to number active clone ++ * instances first. ++ */ ++ } else if (!pcmk_any_flags_set(data_set->flags, pe_flag_stonith_enabled ++ |pe_flag_shutdown_lock) ++ && !this_node->details->online) { ++ crm_trace("Not unpacking resource history for offline " ++ "cluster node %s", id); ++ continue; + } + +- if (!process) { +- continue; ++ if (pe__is_guest_or_remote_node(this_node)) { ++ determine_remote_online_status(data_set, this_node); ++ unpack_handle_remote_attrs(this_node, state, data_set); + } + + crm_trace("Unpacking resource history for %snode %s", +-- +1.8.3.1 + + +From 0772d5e22df71557ca217e148bac5c9df00ddb3e Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 12:17:50 -0600 +Subject: [PATCH 07/16] Refactor: scheduler: functionize unpacking node state + better + +unpack_status() was large and a bit difficult to follow, so separate unpacking +the node state and unpacking a cluster node's transient attributes into their +own functions. + +Aside from formatting and log message tweaks, the code remains the same. +--- + lib/pengine/unpack.c | 188 ++++++++++++++++++++++++++++++--------------------- + 1 file changed, 112 insertions(+), 76 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 9b968a9..2e565e3 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1015,6 +1015,117 @@ unpack_handle_remote_attrs(pe_node_t *this_node, xmlNode *state, pe_working_set_ + + /*! + * \internal ++ * \brief Unpack a cluster node's transient attributes ++ * ++ * \param[in] state CIB node state XML ++ * \param[in] node Cluster node whose attributes are being unpacked ++ * \param[in] data_set Cluster working set ++ */ ++static void ++unpack_transient_attributes(xmlNode *state, pe_node_t *node, ++ pe_working_set_t *data_set) ++{ ++ const char *discovery = NULL; ++ xmlNode *attrs = find_xml_node(state, XML_TAG_TRANSIENT_NODEATTRS, FALSE); ++ ++ add_node_attrs(attrs, node, TRUE, data_set); ++ ++ if (crm_is_true(pe_node_attribute_raw(node, "standby"))) { ++ crm_info("Node %s is in standby-mode", node->details->uname); ++ node->details->standby = TRUE; ++ } ++ ++ if (crm_is_true(pe_node_attribute_raw(node, "maintenance"))) { ++ crm_info("Node %s is in maintenance-mode", node->details->uname); ++ node->details->maintenance = TRUE; ++ } ++ ++ discovery = pe_node_attribute_raw(node, XML_NODE_ATTR_RSC_DISCOVERY); ++ if ((discovery != NULL) && !crm_is_true(discovery)) { ++ crm_warn("Ignoring %s attribute for node %s because disabling " ++ "resource discovery is not allowed for cluster nodes", ++ XML_NODE_ATTR_RSC_DISCOVERY, node->details->uname); ++ } ++} ++ ++/*! ++ * \internal ++ * \brief Unpack a node state entry (first pass) ++ * ++ * Unpack one node state entry from status. This unpacks information from the ++ * node_state element itself and node attributes inside it, but not the ++ * resource history inside it. Multiple passes through the status are needed to ++ * fully unpack everything. ++ * ++ * \param[in] state CIB node state XML ++ * \param[in] data_set Cluster working set ++ */ ++static void ++unpack_node_state(xmlNode *state, pe_working_set_t *data_set) ++{ ++ const char *id = NULL; ++ const char *uname = NULL; ++ pe_node_t *this_node = NULL; ++ ++ id = crm_element_value(state, XML_ATTR_ID); ++ if (id == NULL) { ++ crm_warn("Ignoring malformed " XML_CIB_TAG_STATE " entry without " ++ XML_ATTR_ID); ++ return; ++ } ++ ++ uname = crm_element_value(state, XML_ATTR_UNAME); ++ if (uname == NULL) { ++ crm_warn("Ignoring malformed " XML_CIB_TAG_STATE " entry without " ++ XML_ATTR_UNAME); ++ return; ++ } ++ ++ this_node = pe_find_node_any(data_set->nodes, id, uname); ++ if (this_node == NULL) { ++ pcmk__config_warn("Ignoring recorded node state for '%s' because " ++ "it is no longer in the configuration", uname); ++ return; ++ } ++ ++ if (pe__is_guest_or_remote_node(this_node)) { ++ /* We can't determine the online status of Pacemaker Remote nodes until ++ * after all resource history has been unpacked. In this first pass, we ++ * do need to mark whether the node has been fenced, as this plays a ++ * role during unpacking cluster node resource state. ++ */ ++ const char *is_fenced = crm_element_value(state, XML_NODE_IS_FENCED); ++ ++ this_node->details->remote_was_fenced = crm_atoi(is_fenced, "0"); ++ return; ++ } ++ ++ unpack_transient_attributes(state, this_node, data_set); ++ ++ /* Provisionally mark this cluster node as clean. We have at least seen it ++ * in the current cluster's lifetime. ++ */ ++ this_node->details->unclean = FALSE; ++ this_node->details->unseen = FALSE; ++ ++ crm_trace("Determining online status of cluster node %s (id %s)", ++ this_node->details->uname, id); ++ determine_online_status(state, this_node, data_set); ++ ++ if (!pcmk_is_set(data_set->flags, pe_flag_have_quorum) ++ && this_node->details->online ++ && (data_set->no_quorum_policy == no_quorum_suicide)) { ++ /* Everything else should flow from this automatically ++ * (at least until the scheduler becomes able to migrate off ++ * healthy resources) ++ */ ++ pe_fence_node(data_set, this_node, "cluster does not have quorum", ++ FALSE); ++ } ++} ++ ++/*! ++ * \internal + * \brief Unpack nodes' resource history as much as possible + * + * Unpack as many nodes' resource history as possible in one pass through the +@@ -1136,11 +1247,7 @@ unpack_node_loop(xmlNode *status, bool fence, pe_working_set_t *data_set) + gboolean + unpack_status(xmlNode * status, pe_working_set_t * data_set) + { +- const char *id = NULL; +- const char *uname = NULL; +- + xmlNode *state = NULL; +- pe_node_t *this_node = NULL; + + crm_trace("Beginning unpack"); + +@@ -1156,78 +1263,7 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set) + unpack_tickets_state((xmlNode *) state, data_set); + + } else if (pcmk__str_eq((const char *)state->name, XML_CIB_TAG_STATE, pcmk__str_none)) { +- xmlNode *attrs = NULL; +- const char *resource_discovery_enabled = NULL; +- +- id = crm_element_value(state, XML_ATTR_ID); +- if (id == NULL) { +- crm_warn("Ignoring malformed " XML_CIB_TAG_STATE +- " entry without " XML_ATTR_ID); +- continue; +- } +- +- uname = crm_element_value(state, XML_ATTR_UNAME); +- if (uname == NULL) { +- crm_warn("Ignoring malformed " XML_CIB_TAG_STATE +- " entry without " XML_ATTR_UNAME); +- continue; +- } +- +- this_node = pe_find_node_any(data_set->nodes, id, uname); +- if (this_node == NULL) { +- pcmk__config_warn("Ignoring recorded node status for '%s' " +- "because no longer in configuration", uname); +- continue; +- } +- +- if (pe__is_guest_or_remote_node(this_node)) { +- /* online state for remote nodes is determined by the +- * rsc state after all the unpacking is done. we do however +- * need to mark whether or not the node has been fenced as this plays +- * a role during unpacking cluster node resource state */ +- this_node->details->remote_was_fenced = +- crm_atoi(crm_element_value(state, XML_NODE_IS_FENCED), "0"); +- continue; +- } +- +- crm_trace("Processing node id=%s, uname=%s", id, uname); +- +- /* Mark the node as provisionally clean +- * - at least we have seen it in the current cluster's lifetime +- */ +- this_node->details->unclean = FALSE; +- this_node->details->unseen = FALSE; +- attrs = find_xml_node(state, XML_TAG_TRANSIENT_NODEATTRS, FALSE); +- add_node_attrs(attrs, this_node, TRUE, data_set); +- +- if (crm_is_true(pe_node_attribute_raw(this_node, "standby"))) { +- crm_info("Node %s is in standby-mode", this_node->details->uname); +- this_node->details->standby = TRUE; +- } +- +- if (crm_is_true(pe_node_attribute_raw(this_node, "maintenance"))) { +- crm_info("Node %s is in maintenance-mode", this_node->details->uname); +- this_node->details->maintenance = TRUE; +- } +- +- resource_discovery_enabled = pe_node_attribute_raw(this_node, XML_NODE_ATTR_RSC_DISCOVERY); +- if (resource_discovery_enabled && !crm_is_true(resource_discovery_enabled)) { +- crm_warn("ignoring %s attribute on node %s, disabling resource discovery is not allowed on cluster nodes", +- XML_NODE_ATTR_RSC_DISCOVERY, this_node->details->uname); +- } +- +- crm_trace("determining node state"); +- determine_online_status(state, this_node, data_set); +- +- if (!pcmk_is_set(data_set->flags, pe_flag_have_quorum) +- && this_node->details->online +- && (data_set->no_quorum_policy == no_quorum_suicide)) { +- /* Everything else should flow from this automatically +- * (at least until the scheduler becomes able to migrate off +- * healthy resources) +- */ +- pe_fence_node(data_set, this_node, "cluster does not have quorum", FALSE); +- } ++ unpack_node_state(state, data_set); + } + } + +-- +1.8.3.1 + + +From f36ac7e59b430ed21c2ceca6f58117c3566b35a6 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 12:20:38 -0600 +Subject: [PATCH 08/16] Refactor: scheduler: rename node history unpacking + function + +unpack_node_loop() was a confusing name since it doesn't unpack a node or +even most of its node state, just its resource history. +--- + lib/pengine/unpack.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 2e565e3..28951bd 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -1142,7 +1142,7 @@ unpack_node_state(xmlNode *state, pe_working_set_t *data_set) + * or EAGAIN if more unpacking remains to be done) + */ + static int +-unpack_node_loop(xmlNode *status, bool fence, pe_working_set_t *data_set) ++unpack_node_history(xmlNode *status, bool fence, pe_working_set_t *data_set) + { + int rc = pcmk_rc_ok; + xmlNode *lrm_rsc = NULL; +@@ -1267,14 +1267,14 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set) + } + } + +- while (unpack_node_loop(status, FALSE, data_set) == EAGAIN) { ++ while (unpack_node_history(status, FALSE, data_set) == EAGAIN) { + crm_trace("Another pass through node resource histories is needed"); + } + + // Now catch any nodes we didn't see +- unpack_node_loop(status, +- pcmk_is_set(data_set->flags, pe_flag_stonith_enabled), +- data_set); ++ unpack_node_history(status, ++ pcmk_is_set(data_set->flags, pe_flag_stonith_enabled), ++ data_set); + + /* Now that we know where resources are, we can schedule stops of containers + * with failed bundle connections +@@ -3448,7 +3448,7 @@ check_operation_expiry(pe_resource_t *rsc, pe_node_t *node, int rc, + * + * We could limit this to remote_node->details->unclean, but at + * this point, that's always true (it won't be reliable until +- * after unpack_node_loop() is done). ++ * after unpack_node_history() is done). + */ + crm_info("Clearing %s failure will wait until any scheduled " + "fencing of %s completes", task, rsc->id); +-- +1.8.3.1 + + +From 50cda757beb809de555b6f0efbb19c711b99e72a Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 12:52:22 -0600 +Subject: [PATCH 09/16] Refactor: scheduler: reorganize lrm_resources unpacker + +Drill down from node_state to lrm_resources within the function rather than +before it, so it's more self-contained, and unpack_node_history() is cleaner. +Rename it accordingly. + +Also comment it better, and use convenience functions to simplify a bit. +--- + lib/pengine/unpack.c | 59 +++++++++++++++++++++++++++++++--------------------- + 1 file changed, 35 insertions(+), 24 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 28951bd..637be8d 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -60,8 +60,8 @@ static void add_node_attrs(xmlNode *attrs, pe_node_t *node, bool overwrite, + static void determine_online_status(xmlNode *node_state, pe_node_t *this_node, + pe_working_set_t *data_set); + +-static void unpack_lrm_resources(pe_node_t *node, xmlNode *lrm_state, +- pe_working_set_t *data_set); ++static void unpack_node_lrm(pe_node_t *node, xmlNode *xml, ++ pe_working_set_t *data_set); + + + // Bitmask for warnings we only want to print once +@@ -1145,7 +1145,6 @@ static int + unpack_node_history(xmlNode *status, bool fence, pe_working_set_t *data_set) + { + int rc = pcmk_rc_ok; +- xmlNode *lrm_rsc = NULL; + + // Loop through all node_state entries in CIB status + for (xmlNode *state = first_named_child(status, XML_CIB_TAG_STATE); +@@ -1232,9 +1231,7 @@ unpack_node_history(xmlNode *status, bool fence, pe_working_set_t *data_set) + (fence? "unseen " : ""), id); + + this_node->details->unpacked = TRUE; +- lrm_rsc = find_xml_node(state, XML_CIB_TAG_LRM, FALSE); +- lrm_rsc = find_xml_node(lrm_rsc, XML_LRM_TAG_RESOURCES, FALSE); +- unpack_lrm_resources(this_node, lrm_rsc, data_set); ++ unpack_node_lrm(this_node, state, data_set); + + rc = EAGAIN; // Other node histories might depend on this one + } +@@ -2458,32 +2455,46 @@ handle_orphaned_container_fillers(xmlNode * lrm_rsc_list, pe_working_set_t * dat + } + } + ++/*! ++ * \internal ++ * \brief Unpack one node's lrm status section ++ * ++ * \param[in] node Node whose status is being unpacked ++ * \param[in] xml CIB node state XML ++ * \param[in] data_set Cluster working set ++ */ + static void +-unpack_lrm_resources(pe_node_t *node, xmlNode *lrm_rsc_list, +- pe_working_set_t *data_set) ++unpack_node_lrm(pe_node_t *node, xmlNode *xml, pe_working_set_t *data_set) + { +- xmlNode *rsc_entry = NULL; +- gboolean found_orphaned_container_filler = FALSE; ++ bool found_orphaned_container_filler = false; + +- for (rsc_entry = pcmk__xe_first_child(lrm_rsc_list); rsc_entry != NULL; +- rsc_entry = pcmk__xe_next(rsc_entry)) { ++ // Drill down to lrm_resources section ++ xml = find_xml_node(xml, XML_CIB_TAG_LRM, FALSE); ++ if (xml == NULL) { ++ return; ++ } ++ xml = find_xml_node(xml, XML_LRM_TAG_RESOURCES, FALSE); ++ if (xml == NULL) { ++ return; ++ } + +- if (pcmk__str_eq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE, pcmk__str_none)) { +- pe_resource_t *rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); +- if (!rsc) { +- continue; +- } +- if (pcmk_is_set(rsc->flags, pe_rsc_orphan_container_filler)) { +- found_orphaned_container_filler = TRUE; +- } ++ // Unpack each lrm_resource entry ++ for (xmlNode *rsc_entry = first_named_child(xml, XML_LRM_TAG_RESOURCE); ++ rsc_entry != NULL; rsc_entry = crm_next_same_xml(rsc_entry)) { ++ ++ pe_resource_t *rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); ++ ++ if ((rsc != NULL) ++ && pcmk_is_set(rsc->flags, pe_rsc_orphan_container_filler)) { ++ found_orphaned_container_filler = true; + } + } + +- /* now that all the resource state has been unpacked for this node +- * we have to go back and map any orphaned container fillers to their +- * container resource */ ++ /* Now that all resource state has been unpacked for this node, map any ++ * orphaned container fillers to their container resource. ++ */ + if (found_orphaned_container_filler) { +- handle_orphaned_container_fillers(lrm_rsc_list, data_set); ++ handle_orphaned_container_fillers(xml, data_set); + } + } + +-- +1.8.3.1 + + +From 32b07e573cafc6fa63f29a3619914afc7e40944f Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 13:00:01 -0600 +Subject: [PATCH 10/16] Refactor: scheduler: rename lrm_resource unpacking + function + +... to reflect the XML element directly, for readability. Similarly +rename one of its arguments. +--- + lib/pengine/unpack.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 637be8d..4c70cdc 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -2306,8 +2306,19 @@ unpack_shutdown_lock(xmlNode *rsc_entry, pe_resource_t *rsc, pe_node_t *node, + } + } + ++/*! ++ * \internal ++ * \brief Unpack one lrm_resource entry from a node's CIB status ++ * ++ * \param[in] node Node whose status is being unpacked ++ * \param[in] rsc_entry lrm_resource XML being unpacked ++ * \param[in] data_set Cluster working set ++ * ++ * \return Resource corresponding to the entry, or NULL if no operation history ++ */ + static pe_resource_t * +-unpack_lrm_rsc_state(pe_node_t * node, xmlNode * rsc_entry, pe_working_set_t * data_set) ++unpack_lrm_resource(pe_node_t *node, xmlNode *lrm_resource, ++ pe_working_set_t *data_set) + { + GListPtr gIter = NULL; + int stop_index = -1; +@@ -2315,7 +2326,7 @@ unpack_lrm_rsc_state(pe_node_t * node, xmlNode * rsc_entry, pe_working_set_t * d + enum rsc_role_e req_role = RSC_ROLE_UNKNOWN; + + const char *task = NULL; +- const char *rsc_id = crm_element_value(rsc_entry, XML_ATTR_ID); ++ const char *rsc_id = crm_element_value(lrm_resource, XML_ATTR_ID); + + pe_resource_t *rsc = NULL; + GListPtr op_list = NULL; +@@ -2329,13 +2340,13 @@ unpack_lrm_rsc_state(pe_node_t * node, xmlNode * rsc_entry, pe_working_set_t * d + enum rsc_role_e saved_role = RSC_ROLE_UNKNOWN; + + crm_trace("[%s] Processing %s on %s", +- crm_element_name(rsc_entry), rsc_id, node->details->uname); ++ crm_element_name(lrm_resource), rsc_id, node->details->uname); + + /* extract operations */ + op_list = NULL; + sorted_op_list = NULL; + +- for (rsc_op = pcmk__xe_first_child(rsc_entry); rsc_op != NULL; ++ for (rsc_op = pcmk__xe_first_child(lrm_resource); rsc_op != NULL; + rsc_op = pcmk__xe_next(rsc_op)) { + + if (pcmk__str_eq((const char *)rsc_op->name, XML_LRM_TAG_RSC_OP, +@@ -2352,20 +2363,20 @@ unpack_lrm_rsc_state(pe_node_t * node, xmlNode * rsc_entry, pe_working_set_t * d + } + + /* find the resource */ +- rsc = unpack_find_resource(data_set, node, rsc_id, rsc_entry); ++ rsc = unpack_find_resource(data_set, node, rsc_id, lrm_resource); + if (rsc == NULL) { + if (op_list == NULL) { + // If there are no operations, there is nothing to do + return NULL; + } else { +- rsc = process_orphan_resource(rsc_entry, node, data_set); ++ rsc = process_orphan_resource(lrm_resource, node, data_set); + } + } + CRM_ASSERT(rsc != NULL); + + // Check whether the resource is "shutdown-locked" to this node + if (pcmk_is_set(data_set->flags, pe_flag_shutdown_lock)) { +- unpack_shutdown_lock(rsc_entry, rsc, node, data_set); ++ unpack_shutdown_lock(lrm_resource, rsc, node, data_set); + } + + /* process operations */ +@@ -2482,7 +2493,7 @@ unpack_node_lrm(pe_node_t *node, xmlNode *xml, pe_working_set_t *data_set) + for (xmlNode *rsc_entry = first_named_child(xml, XML_LRM_TAG_RESOURCE); + rsc_entry != NULL; rsc_entry = crm_next_same_xml(rsc_entry)) { + +- pe_resource_t *rsc = unpack_lrm_rsc_state(node, rsc_entry, data_set); ++ pe_resource_t *rsc = unpack_lrm_resource(node, rsc_entry, data_set); + + if ((rsc != NULL) + && pcmk_is_set(rsc->flags, pe_rsc_orphan_container_filler)) { +-- +1.8.3.1 + + +From ed08885366fc3a43ac83d5c3fdab12fbf0b29ded Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 13:04:25 -0600 +Subject: [PATCH 11/16] Refactor: scheduler: use convenience functions when + unpacking lrm_resource + +... to simplify a bit and improve readability +--- + lib/pengine/unpack.c | 16 +++++----------- + 1 file changed, 5 insertions(+), 11 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 4c70cdc..82b7562 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -2326,7 +2326,7 @@ unpack_lrm_resource(pe_node_t *node, xmlNode *lrm_resource, + enum rsc_role_e req_role = RSC_ROLE_UNKNOWN; + + const char *task = NULL; +- const char *rsc_id = crm_element_value(lrm_resource, XML_ATTR_ID); ++ const char *rsc_id = ID(lrm_resource); + + pe_resource_t *rsc = NULL; + GListPtr op_list = NULL; +@@ -2342,17 +2342,11 @@ unpack_lrm_resource(pe_node_t *node, xmlNode *lrm_resource, + crm_trace("[%s] Processing %s on %s", + crm_element_name(lrm_resource), rsc_id, node->details->uname); + +- /* extract operations */ +- op_list = NULL; +- sorted_op_list = NULL; +- +- for (rsc_op = pcmk__xe_first_child(lrm_resource); rsc_op != NULL; +- rsc_op = pcmk__xe_next(rsc_op)) { ++ // Build a list of individual lrm_rsc_op entries, so we can sort them ++ for (rsc_op = first_named_child(lrm_resource, XML_LRM_TAG_RSC_OP); ++ rsc_op != NULL; rsc_op = crm_next_same_xml(rsc_op)) { + +- if (pcmk__str_eq((const char *)rsc_op->name, XML_LRM_TAG_RSC_OP, +- pcmk__str_none)) { +- op_list = g_list_prepend(op_list, rsc_op); +- } ++ op_list = g_list_prepend(op_list, rsc_op); + } + + if (!pcmk_is_set(data_set->flags, pe_flag_shutdown_lock)) { +-- +1.8.3.1 + + +From e727f29e1fe194938e8ecc698d8ef556031fb5a3 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Thu, 21 Jan 2021 13:09:58 -0600 +Subject: [PATCH 12/16] Low: scheduler: warn if lrm_resource has no ID + +This should be possible only if someone manually mis-edits the CIB, but that +case does merit a warning, and we should bail early if it happens (previously, +the right thing would eventually be done anyway, but log messages using a NULL +could theoretically cause a crash). +--- + lib/pengine/unpack.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 82b7562..19cde7a 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -2339,8 +2339,13 @@ unpack_lrm_resource(pe_node_t *node, xmlNode *lrm_resource, + enum action_fail_response on_fail = action_fail_ignore; + enum rsc_role_e saved_role = RSC_ROLE_UNKNOWN; + +- crm_trace("[%s] Processing %s on %s", +- crm_element_name(lrm_resource), rsc_id, node->details->uname); ++ if (rsc_id == NULL) { ++ crm_warn("Ignoring malformed " XML_LRM_TAG_RESOURCE ++ " entry without id"); ++ return NULL; ++ } ++ crm_trace("Unpacking " XML_LRM_TAG_RESOURCE " for %s on %s", ++ rsc_id, node->details->uname); + + // Build a list of individual lrm_rsc_op entries, so we can sort them + for (rsc_op = first_named_child(lrm_resource, XML_LRM_TAG_RSC_OP); +-- +1.8.3.1 + + +From 981dcf0f8442cf95ba6e6df3cac07d78e7510cae Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 22 Jan 2021 15:04:49 -0600 +Subject: [PATCH 13/16] Refactor: scheduler: new convenience function for + changing resource's next role + +... for logging consistency +--- + include/crm/pengine/complex.h | 5 ++++- + lib/pengine/complex.c | 19 +++++++++++++++++++ + 2 files changed, 23 insertions(+), 1 deletion(-) + +diff --git a/include/crm/pengine/complex.h b/include/crm/pengine/complex.h +index 1d010f4..d5e1a39 100644 +--- a/include/crm/pengine/complex.h ++++ b/include/crm/pengine/complex.h +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -35,6 +35,9 @@ void pe_get_versioned_attributes(xmlNode *meta_hash, pe_resource_t *rsc, + gboolean is_parent(pe_resource_t *child, pe_resource_t *rsc); + pe_resource_t *uber_parent(pe_resource_t *rsc); + ++void pe__set_next_role(pe_resource_t *rsc, enum rsc_role_e role, ++ const char *why); ++ + #ifdef __cplusplus + } + #endif +diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c +index 5d7d628..3b5f722 100644 +--- a/lib/pengine/complex.c ++++ b/lib/pengine/complex.c +@@ -1109,3 +1109,22 @@ pe__count_common(pe_resource_t *rsc) + } + } + } ++ ++/*! ++ * \internal ++ * \brief Update a resource's next role ++ * ++ * \param[in,out] rsc Resource to be updated ++ * \param[in] role Resource's new next role ++ * \param[in] why Human-friendly reason why role is changing (for logs) ++ */ ++void ++pe__set_next_role(pe_resource_t *rsc, enum rsc_role_e role, const char *why) ++{ ++ CRM_ASSERT((rsc != NULL) && (why != NULL)); ++ if (rsc->next_role != role) { ++ pe_rsc_trace(rsc, "Resetting next role for %s from %s to %s (%s)", ++ rsc->id, role2text(rsc->next_role), role2text(role), why); ++ rsc->next_role = role; ++ } ++} +-- +1.8.3.1 + + +From 2ae780b8746ffd8e7575fe4d30fea3971df87c66 Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 22 Jan 2021 15:25:59 -0600 +Subject: [PATCH 14/16] Log: scheduler: use new function to set a resource's + next role + +This does downgrade one log from debug to trace, but that seems reasonable. +Otherwise it adds a trace message whenever the next role is changed. +--- + lib/pacemaker/pcmk_sched_group.c | 3 ++- + lib/pacemaker/pcmk_sched_native.c | 8 +++++--- + lib/pacemaker/pcmk_sched_promotable.c | 11 +++-------- + lib/pacemaker/pcmk_sched_utils.c | 6 +++--- + lib/pengine/unpack.c | 23 +++++++++++------------ + lib/pengine/utils.c | 5 +++-- + 6 files changed, 27 insertions(+), 29 deletions(-) + +diff --git a/lib/pacemaker/pcmk_sched_group.c b/lib/pacemaker/pcmk_sched_group.c +index 439ed91..c9026e4 100644 +--- a/lib/pacemaker/pcmk_sched_group.c ++++ b/lib/pacemaker/pcmk_sched_group.c +@@ -68,7 +68,8 @@ pcmk__group_allocate(pe_resource_t *rsc, pe_node_t *prefer, + } + } + +- rsc->next_role = group_data->first_child->next_role; ++ pe__set_next_role(rsc, group_data->first_child->next_role, ++ "first group member"); + pe__clear_resource_flags(rsc, pe_rsc_allocating|pe_rsc_provisional); + + if (group_data->colocated) { +diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c +index 0e50eda..6548b20 100644 +--- a/lib/pacemaker/pcmk_sched_native.c ++++ b/lib/pacemaker/pcmk_sched_native.c +@@ -581,7 +581,7 @@ pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, + && data_set->no_quorum_policy == no_quorum_freeze) { + crm_notice("Resource %s cannot be elevated from %s to %s: no-quorum-policy=freeze", + rsc->id, role2text(rsc->role), role2text(rsc->next_role)); +- rsc->next_role = rsc->role; ++ pe__set_next_role(rsc, rsc->role, "no-quorum-policy=freeze"); + } + + pe__show_node_weights(!show_scores, rsc, __func__, rsc->allowed_nodes); +@@ -594,7 +594,7 @@ pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, + const char *reason = NULL; + pe_node_t *assign_to = NULL; + +- rsc->next_role = rsc->role; ++ pe__set_next_role(rsc, rsc->role, "unmanaged"); + assign_to = pe__current_node(rsc); + if (assign_to == NULL) { + reason = "inactive"; +@@ -1226,7 +1226,9 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set) + chosen = rsc->allocated_to; + next_role = rsc->next_role; + if (next_role == RSC_ROLE_UNKNOWN) { +- rsc->next_role = (chosen == NULL)? RSC_ROLE_STOPPED : RSC_ROLE_STARTED; ++ pe__set_next_role(rsc, ++ (chosen == NULL)? RSC_ROLE_STOPPED : RSC_ROLE_STARTED, ++ "allocation"); + } + pe_rsc_trace(rsc, "Creating all actions for %s transition from %s to %s (%s) on %s", + rsc->id, role2text(rsc->role), role2text(rsc->next_role), +diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c +index 40d07e9..f3bde0c 100644 +--- a/lib/pacemaker/pcmk_sched_promotable.c ++++ b/lib/pacemaker/pcmk_sched_promotable.c +@@ -622,13 +622,8 @@ set_role_slave(pe_resource_t * rsc, gboolean current) + GListPtr allocated = NULL; + + rsc->fns->location(rsc, &allocated, FALSE); +- +- if (allocated) { +- rsc->next_role = RSC_ROLE_SLAVE; +- +- } else { +- rsc->next_role = RSC_ROLE_STOPPED; +- } ++ pe__set_next_role(rsc, (allocated? RSC_ROLE_SLAVE : RSC_ROLE_STOPPED), ++ "unpromoted instance"); + g_list_free(allocated); + } + +@@ -645,7 +640,7 @@ set_role_master(pe_resource_t * rsc) + GListPtr gIter = rsc->children; + + if (rsc->next_role == RSC_ROLE_UNKNOWN) { +- rsc->next_role = RSC_ROLE_MASTER; ++ pe__set_next_role(rsc, RSC_ROLE_MASTER, "promoted instance"); + } + + for (; gIter != NULL; gIter = gIter->next) { +diff --git a/lib/pacemaker/pcmk_sched_utils.c b/lib/pacemaker/pcmk_sched_utils.c +index eaaf526..177f43e 100644 +--- a/lib/pacemaker/pcmk_sched_utils.c ++++ b/lib/pacemaker/pcmk_sched_utils.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -287,7 +287,7 @@ native_assign_node(pe_resource_t * rsc, GListPtr nodes, pe_node_t * chosen, gboo + crm_debug("All nodes for resource %s are unavailable" + ", unclean or shutting down (%s: %d, %d)", + rsc->id, chosen->details->uname, can_run_resources(chosen), chosen->weight); +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, "node availability"); + chosen = NULL; + } + } +@@ -304,7 +304,7 @@ native_assign_node(pe_resource_t * rsc, GListPtr nodes, pe_node_t * chosen, gboo + char *rc_inactive = crm_itoa(PCMK_OCF_NOT_RUNNING); + + crm_debug("Could not allocate a node for %s", rsc->id); +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, "unable to allocate"); + + for (gIter = rsc->actions; gIter != NULL; gIter = gIter->next) { + pe_action_t *op = (pe_action_t *) gIter->data; +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index 19cde7a..ce51429 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -980,7 +980,7 @@ unpack_handle_remote_attrs(pe_node_t *this_node, xmlNode *state, pe_working_set_ + crm_info("Node %s is shutting down", this_node->details->uname); + this_node->details->shutdown = TRUE; + if (rsc) { +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, "remote shutdown"); + } + } + +@@ -2060,7 +2060,7 @@ process_rsc_state(pe_resource_t * rsc, pe_node_t * node, + break; + + case action_fail_stop: +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, "on-fail=stop"); + break; + + case action_fail_recover: +@@ -2114,7 +2114,7 @@ process_rsc_state(pe_resource_t * rsc, pe_node_t * node, + /* if reconnect delay is in use, prevent the connection from exiting the + * "STOPPED" role until the failure is cleared by the delay timeout. */ + if (rsc->remote_reconnect_ms) { +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, "remote reset"); + } + break; + } +@@ -2405,10 +2405,7 @@ unpack_lrm_resource(pe_node_t *node, xmlNode *lrm_resource, + + if (get_target_role(rsc, &req_role)) { + if (rsc->next_role == RSC_ROLE_UNKNOWN || req_role < rsc->next_role) { +- pe_rsc_debug(rsc, "%s: Overwriting calculated next role %s" +- " with requested next role %s", +- rsc->id, role2text(rsc->next_role), role2text(req_role)); +- rsc->next_role = req_role; ++ pe__set_next_role(rsc, req_role, XML_RSC_ATTR_TARGET_ROLE); + + } else if (req_role > rsc->next_role) { + pe_rsc_info(rsc, "%s: Not overwriting calculated next role %s" +@@ -3052,7 +3049,8 @@ unpack_rsc_op_failure(pe_resource_t * rsc, pe_node_t * node, int rc, xmlNode * x + } else if (!strcmp(task, CRMD_ACTION_DEMOTE)) { + if (action->on_fail == action_fail_block) { + rsc->role = RSC_ROLE_MASTER; +- rsc->next_role = RSC_ROLE_STOPPED; ++ pe__set_next_role(rsc, RSC_ROLE_STOPPED, ++ "demote with on-fail=block"); + + } else if(rc == PCMK_OCF_NOT_RUNNING) { + rsc->role = RSC_ROLE_STOPPED; +@@ -3083,7 +3081,7 @@ unpack_rsc_op_failure(pe_resource_t * rsc, pe_node_t * node, int rc, xmlNode * x + fail2text(action->on_fail), role2text(action->fail_role)); + + if (action->fail_role != RSC_ROLE_STARTED && rsc->next_role < action->fail_role) { +- rsc->next_role = action->fail_role; ++ pe__set_next_role(rsc, action->fail_role, "failure"); + } + + if (action->fail_role == RSC_ROLE_STOPPED) { +@@ -3200,7 +3198,7 @@ determine_op_status( + + /* clear any previous failure actions */ + *on_fail = action_fail_ignore; +- rsc->next_role = RSC_ROLE_UNKNOWN; ++ pe__set_next_role(rsc, RSC_ROLE_UNKNOWN, "not running"); + } + break; + +@@ -3595,7 +3593,7 @@ update_resource_state(pe_resource_t * rsc, pe_node_t * node, xmlNode * xml_op, c + case action_fail_recover: + case action_fail_restart_container: + *on_fail = action_fail_ignore; +- rsc->next_role = RSC_ROLE_UNKNOWN; ++ pe__set_next_role(rsc, RSC_ROLE_UNKNOWN, "clear past failures"); + break; + case action_fail_reset_remote: + if (rsc->remote_reconnect_ms == 0) { +@@ -3606,7 +3604,8 @@ update_resource_state(pe_resource_t * rsc, pe_node_t * node, xmlNode * xml_op, c + * to reconnect.) + */ + *on_fail = action_fail_ignore; +- rsc->next_role = RSC_ROLE_UNKNOWN; ++ pe__set_next_role(rsc, RSC_ROLE_UNKNOWN, ++ "clear past failures and reset remote"); + } + break; + } +diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c +index 831f890..dbfe048 100644 +--- a/lib/pengine/utils.c ++++ b/lib/pengine/utils.c +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004-2020 the Pacemaker project contributors ++ * Copyright 2004-2021 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * +@@ -450,7 +450,8 @@ effective_quorum_policy(pe_resource_t *rsc, pe_working_set_t *data_set) + case RSC_ROLE_MASTER: + case RSC_ROLE_SLAVE: + if (rsc->next_role > RSC_ROLE_SLAVE) { +- rsc->next_role = RSC_ROLE_SLAVE; ++ pe__set_next_role(rsc, RSC_ROLE_SLAVE, ++ "no-quorum-policy=demote"); + } + policy = no_quorum_ignore; + break; +-- +1.8.3.1 + + +From 588a7c6bcdef8d051a43004a9744641e76d7d3cd Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 22 Jan 2021 16:45:18 -0600 +Subject: [PATCH 15/16] Fix: scheduler: process remote shutdowns correctly + +When unpacking node histories, the scheduler can make multiple passes through +the node_state entries, because the state of remote node connections (on other +nodes) must be known before the history of the remote node itself can be +unpacked. + +When unpacking a remote or guest node's history, the scheduler also unpacks its +transient attributes. If the shutdown attribute has been set, the scheduler +marks the node as shutting down. + +Previously, at that time, it would also set the remote connection's next role +to stopped. However, if it so happened that remote connection history on +another node was processed later in the node history unpacking, and a probe had +found the connection not running, this would reset the next role to unknown. +The connection stop would not be scheduled, and the shutdown would hang until +it timed out. + +Now, set the remote connection to stopped for shutdowns after all node +histories have been unpacked. +--- + lib/pengine/unpack.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c +index ce51429..2d91abc 100644 +--- a/lib/pengine/unpack.c ++++ b/lib/pengine/unpack.c +@@ -979,9 +979,6 @@ unpack_handle_remote_attrs(pe_node_t *this_node, xmlNode *state, pe_working_set_ + if (pe__shutdown_requested(this_node)) { + crm_info("Node %s is shutting down", this_node->details->uname); + this_node->details->shutdown = TRUE; +- if (rsc) { +- pe__set_next_role(rsc, RSC_ROLE_STOPPED, "remote shutdown"); +- } + } + + if (crm_is_true(pe_node_attribute_raw(this_node, "standby"))) { +@@ -1289,17 +1286,24 @@ unpack_status(xmlNode * status, pe_working_set_t * data_set) + data_set->stop_needed = NULL; + } + ++ /* Now that we know status of all Pacemaker Remote connections and nodes, ++ * we can stop connections for node shutdowns, and check the online status ++ * of remote/guest nodes that didn't have any node history to unpack. ++ */ + for (GListPtr gIter = data_set->nodes; gIter != NULL; gIter = gIter->next) { + pe_node_t *this_node = gIter->data; + +- if (this_node == NULL) { +- continue; +- } else if (!pe__is_guest_or_remote_node(this_node)) { +- continue; +- } else if(this_node->details->unpacked) { ++ if (!pe__is_guest_or_remote_node(this_node)) { + continue; + } +- determine_remote_online_status(data_set, this_node); ++ if (this_node->details->shutdown ++ && (this_node->details->remote_rsc != NULL)) { ++ pe__set_next_role(this_node->details->remote_rsc, RSC_ROLE_STOPPED, ++ "remote shutdown"); ++ } ++ if (!this_node->details->unpacked) { ++ determine_remote_online_status(data_set, this_node); ++ } + } + + return TRUE; +-- +1.8.3.1 + + +From 119d0aa3f8c9e0c9aeba8398de185a559aa40f5e Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Fri, 22 Jan 2021 16:59:37 -0600 +Subject: [PATCH 16/16] Test: scheduler: add regression test for remote + connection shutdown + +In particular, a remote node is shutting down, and its node history comes +before a cluster node's history in the status section, where that cluster node +has a probe that found the remote node's connection not running in its history. + +The test ensures that the connection is scheduled to be stopped, even though +that later history will set the next role to unknown. +--- + cts/scheduler/remote-connection-shutdown.dot | 57 + + cts/scheduler/remote-connection-shutdown.exp | 402 ++++ + cts/scheduler/remote-connection-shutdown.scores | 2560 ++++++++++++++++++++++ + cts/scheduler/remote-connection-shutdown.summary | 186 ++ + cts/scheduler/remote-connection-shutdown.xml | 2109 ++++++++++++++++++ + 5 files changed, 5314 insertions(+) + create mode 100644 cts/scheduler/remote-connection-shutdown.dot + create mode 100644 cts/scheduler/remote-connection-shutdown.exp + create mode 100644 cts/scheduler/remote-connection-shutdown.scores + create mode 100644 cts/scheduler/remote-connection-shutdown.summary + create mode 100644 cts/scheduler/remote-connection-shutdown.xml + +diff --git a/cts/scheduler/remote-connection-shutdown.dot b/cts/scheduler/remote-connection-shutdown.dot +new file mode 100644 +index 0000000..74eb9e3 +--- /dev/null ++++ b/cts/scheduler/remote-connection-shutdown.dot +@@ -0,0 +1,57 @@ ++ digraph "g" { ++"compute-0_stop_0 controller-0" [ style=bold color="green" fontcolor="black"] ++"compute-unfence-trigger-clone_stop_0" -> "compute-unfence-trigger-clone_stopped_0" [ style = bold] ++"compute-unfence-trigger-clone_stop_0" -> "compute-unfence-trigger_stop_0 compute-0" [ style = bold] ++"compute-unfence-trigger-clone_stop_0" [ style=bold color="green" fontcolor="orange"] ++"compute-unfence-trigger-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] ++"compute-unfence-trigger_stop_0 compute-0" -> "compute-0_stop_0 controller-0" [ style = bold] ++"compute-unfence-trigger_stop_0 compute-0" -> "compute-unfence-trigger-clone_stopped_0" [ style = bold] ++"compute-unfence-trigger_stop_0 compute-0" [ style=bold color="green" fontcolor="black"] ++"nova-evacuate_monitor_10000 database-1" [ style=bold color="green" fontcolor="black"] ++"nova-evacuate_start_0 database-1" -> "nova-evacuate_monitor_10000 database-1" [ style = bold] ++"nova-evacuate_start_0 database-1" [ style=bold color="green" fontcolor="black"] ++"nova-evacuate_stop_0 database-0" -> "nova-evacuate_start_0 database-1" [ style = bold] ++"nova-evacuate_stop_0 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 controller-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 controller-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 controller-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 database-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 database-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 messaging-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 messaging-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_clear_failcount_0 messaging-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_monitor_60000 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_compute-fence-nova_start_0 database-0" -> "stonith-fence_compute-fence-nova_monitor_60000 database-0" [ style = bold] ++"stonith-fence_compute-fence-nova_start_0 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254001f5f3c_monitor_60000 messaging-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254001f5f3c_start_0 messaging-0" -> "stonith-fence_ipmilan-5254001f5f3c_monitor_60000 messaging-0" [ style = bold] ++"stonith-fence_ipmilan-5254001f5f3c_start_0 messaging-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254001f5f3c_stop_0 database-2" -> "stonith-fence_ipmilan-5254001f5f3c_start_0 messaging-0" [ style = bold] ++"stonith-fence_ipmilan-5254001f5f3c_stop_0 database-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-52540033df9c_monitor_60000 database-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-52540033df9c_start_0 database-2" -> "stonith-fence_ipmilan-52540033df9c_monitor_60000 database-2" [ style = bold] ++"stonith-fence_ipmilan-52540033df9c_start_0 database-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-52540033df9c_stop_0 database-1" -> "stonith-fence_ipmilan-52540033df9c_start_0 database-2" [ style = bold] ++"stonith-fence_ipmilan-52540033df9c_stop_0 database-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254003f88b4_monitor_60000 messaging-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254003f88b4_start_0 messaging-1" -> "stonith-fence_ipmilan-5254003f88b4_monitor_60000 messaging-1" [ style = bold] ++"stonith-fence_ipmilan-5254003f88b4_start_0 messaging-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254003f88b4_stop_0 messaging-0" -> "stonith-fence_ipmilan-5254003f88b4_start_0 messaging-1" [ style = bold] ++"stonith-fence_ipmilan-5254003f88b4_stop_0 messaging-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254007b7920_monitor_60000 messaging-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254007b7920_start_0 messaging-2" -> "stonith-fence_ipmilan-5254007b7920_monitor_60000 messaging-2" [ style = bold] ++"stonith-fence_ipmilan-5254007b7920_start_0 messaging-2" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254007b7920_stop_0 messaging-1" -> "stonith-fence_ipmilan-5254007b7920_start_0 messaging-2" [ style = bold] ++"stonith-fence_ipmilan-5254007b7920_stop_0 messaging-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254009cb549_monitor_60000 database-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254009cb549_start_0 database-1" -> "stonith-fence_ipmilan-5254009cb549_monitor_60000 database-1" [ style = bold] ++"stonith-fence_ipmilan-5254009cb549_start_0 database-1" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-5254009cb549_stop_0 database-0" -> "stonith-fence_ipmilan-5254009cb549_start_0 database-1" [ style = bold] ++"stonith-fence_ipmilan-5254009cb549_stop_0 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-525400ffc780_monitor_60000 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-525400ffc780_start_0 database-0" -> "stonith-fence_ipmilan-525400ffc780_monitor_60000 database-0" [ style = bold] ++"stonith-fence_ipmilan-525400ffc780_start_0 database-0" [ style=bold color="green" fontcolor="black"] ++"stonith-fence_ipmilan-525400ffc780_stop_0 messaging-2" -> "stonith-fence_ipmilan-525400ffc780_start_0 database-0" [ style = bold] ++"stonith-fence_ipmilan-525400ffc780_stop_0 messaging-2" [ style=bold color="green" fontcolor="black"] ++} +diff --git a/cts/scheduler/remote-connection-shutdown.exp b/cts/scheduler/remote-connection-shutdown.exp +new file mode 100644 +index 0000000..f3c3424 +--- /dev/null ++++ b/cts/scheduler/remote-connection-shutdown.exp +@@ -0,0 +1,402 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/cts/scheduler/remote-connection-shutdown.scores b/cts/scheduler/remote-connection-shutdown.scores +new file mode 100644 +index 0000000..003b067 +--- /dev/null ++++ b/cts/scheduler/remote-connection-shutdown.scores +@@ -0,0 +1,2560 @@ ++Allocation scores: ++Only 'private' parameters to nova-evacuate_monitor_10000 on database-0 changed: 0:0;259:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to nova-evacuate_start_0 on database-0 changed: 0:0;258:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-0 changed ++Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-1 changed ++Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_monitor_60000 on database-2 changed: 0:0;265:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_start_0 on database-2 changed: 0:0;263:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_monitor_60000 on database-1 changed: 0:0;263:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_start_0 on database-1 changed: 0:0;261:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_monitor_60000 on messaging-0 changed: 0:0;269:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_start_0 on messaging-0 changed: 0:0;267:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400642894_monitor_60000 on messaging-2 changed: 0:0;274:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400642894_start_0 on messaging-2 changed: 0:0;272:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_monitor_60000 on messaging-1 changed: 0:0;273:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_start_0 on messaging-1 changed: 0:0;271:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_monitor_60000 on database-0 changed: 0:0;323:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_start_0 on database-0 changed: 0:0;322:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_monitor_60000 on messaging-0 changed: 0:0;325:70:0:40f880e4-b328-4380-9703-47856390a1e0 ++Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_start_0 on messaging-0 changed: 0:0;324:70:0:40f880e4-b328-4380-9703-47856390a1e0 ++Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_monitor_60000 on database-2 changed: 0:0;320:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_start_0 on database-2 changed: 0:0;319:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_monitor_60000 on database-1 changed: 0:0;331:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_start_0 on database-1 changed: 0:0;330:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400e10267_monitor_60000 on messaging-1 changed: 0:0;326:1318:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400e10267_start_0 on messaging-1 changed: 0:0;320:1317:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_monitor_60000 on messaging-2 changed: 0:0;323:50:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_start_0 on messaging-2 changed: 0:0;321:49:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Using the original execution date of: 2020-11-17 07:03:16Z ++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 ++ovndb_servers:0 promotion score on ovn-dbs-bundle-0: 10 ++ovndb_servers:1 promotion score on ovn-dbs-bundle-1: 5 ++ovndb_servers:2 promotion score on ovn-dbs-bundle-2: 5 ++pcmk__bundle_allocate: galera-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on compute-0: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on compute-1: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on controller-0: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on controller-1: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on controller-2: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-0: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-1: 0 ++pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-2: 0 ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: galera:0 allocation score on galera-bundle-0: 501 ++pcmk__bundle_allocate: galera:1 allocation score on galera-bundle-1: 501 ++pcmk__bundle_allocate: galera:2 allocation score on galera-bundle-2: 501 ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-0: 0 ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-1: 0 ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-2: 0 ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 10000 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 10000 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 10000 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: 10 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: 5 ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: 5 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: 501 ++pcmk__bundle_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY ++pcmk__bundle_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: 501 ++pcmk__bundle_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY ++pcmk__bundle_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: 501 ++pcmk__bundle_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on compute-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on compute-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: 501 ++pcmk__bundle_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: 501 ++pcmk__bundle_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: 501 ++pcmk__bundle_allocate: redis-bundle allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on database-0: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on database-1: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on database-2: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on database-0: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on database-1: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on database-2: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on database-0: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on database-1: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on database-2: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-0: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-1: 0 ++pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-2: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on compute-0: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on compute-1: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on database-0: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on database-1: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on database-2: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-0: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-1: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-2: 0 ++pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-0: 0 ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-2: 0 ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__bundle_allocate: redis:0 allocation score on redis-bundle-0: 501 ++pcmk__bundle_allocate: redis:1 allocation score on redis-bundle-1: 501 ++pcmk__bundle_allocate: redis:2 allocation score on redis-bundle-2: 501 ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on compute-0: 1 ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on compute-1: 1 ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on compute-0: 0 ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on compute-1: 0 ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-0: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-1: -INFINITY ++pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-2: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on compute-0: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on compute-1: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on database-0: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on database-1: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on database-2: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-0: 0 ++pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-1: 0 ++pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-2: 0 ++pcmk__clone_allocate: galera-bundle-master allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: galera-bundle-master allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: galera:0 allocation score on galera-bundle-0: INFINITY ++pcmk__clone_allocate: galera:1 allocation score on galera-bundle-1: INFINITY ++pcmk__clone_allocate: galera:2 allocation score on galera-bundle-2: INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on compute-0: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on compute-1: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-0: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-1: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-2: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: 0 ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: 0 ++pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: 0 ++pcmk__clone_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY ++pcmk__clone_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY ++pcmk__clone_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on compute-0: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on compute-1: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-0: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-1: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-2: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: 0 ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: 0 ++pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: 0 ++pcmk__clone_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY ++pcmk__clone_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY ++pcmk__clone_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on compute-0: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on compute-1: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on controller-0: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on controller-1: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on controller-2: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on database-0: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on database-1: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on database-2: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on messaging-0: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on messaging-1: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on messaging-2: -INFINITY ++pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-0: 0 ++pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-1: 0 ++pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-2: 0 ++pcmk__clone_allocate: redis:0 allocation score on redis-bundle-0: INFINITY ++pcmk__clone_allocate: redis:1 allocation score on redis-bundle-1: INFINITY ++pcmk__clone_allocate: redis:2 allocation score on redis-bundle-2: INFINITY ++pcmk__native_allocate: compute-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-0 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-1 allocation score on controller-0: 0 ++pcmk__native_allocate: compute-1 allocation score on controller-1: 0 ++pcmk__native_allocate: compute-1 allocation score on controller-2: 0 ++pcmk__native_allocate: compute-1 allocation score on database-0: 0 ++pcmk__native_allocate: compute-1 allocation score on database-1: 0 ++pcmk__native_allocate: compute-1 allocation score on database-2: 0 ++pcmk__native_allocate: compute-1 allocation score on messaging-0: 0 ++pcmk__native_allocate: compute-1 allocation score on messaging-1: 0 ++pcmk__native_allocate: compute-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on compute-1: 1 ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-2: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-0: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-1: -INFINITY ++pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-2: -INFINITY ++pcmk__native_allocate: galera-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-0 allocation score on controller-0: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on controller-1: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on controller-2: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on database-0: 10000 ++pcmk__native_allocate: galera-bundle-0 allocation score on database-1: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on database-2: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on messaging-0: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on messaging-1: 0 ++pcmk__native_allocate: galera-bundle-0 allocation score on messaging-2: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-1 allocation score on controller-0: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on controller-1: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on controller-2: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on database-0: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on database-1: 10000 ++pcmk__native_allocate: galera-bundle-1 allocation score on database-2: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on messaging-0: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on messaging-1: 0 ++pcmk__native_allocate: galera-bundle-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-2 allocation score on controller-0: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on controller-1: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on controller-2: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on database-0: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on database-1: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on database-2: 10000 ++pcmk__native_allocate: galera-bundle-2 allocation score on messaging-0: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on messaging-1: 0 ++pcmk__native_allocate: galera-bundle-2 allocation score on messaging-2: 0 ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-0: 0 ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-1: 0 ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-2: 0 ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-1: 0 ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-2: 0 ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-2: 0 ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: galera:0 allocation score on galera-bundle-0: INFINITY ++pcmk__native_allocate: galera:1 allocation score on galera-bundle-1: INFINITY ++pcmk__native_allocate: galera:2 allocation score on galera-bundle-2: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-0: INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-1: 0 ++pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-2: 0 ++pcmk__native_allocate: ip-10.0.0.150 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-0: 0 ++pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-1: 0 ++pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-2: INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-0: 0 ++pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-1: INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-2: 0 ++pcmk__native_allocate: ip-172.17.1.151 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-2: INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-0: INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-1: 0 ++pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-2: 0 ++pcmk__native_allocate: ip-172.17.3.150 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-0: 0 ++pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-1: INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-2: 0 ++pcmk__native_allocate: ip-172.17.4.150 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-0: 0 ++pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-1: 0 ++pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-2: INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: nova-evacuate allocation score on compute-0: -INFINITY ++pcmk__native_allocate: nova-evacuate allocation score on compute-1: -INFINITY ++pcmk__native_allocate: nova-evacuate allocation score on controller-0: 0 ++pcmk__native_allocate: nova-evacuate allocation score on controller-1: 0 ++pcmk__native_allocate: nova-evacuate allocation score on controller-2: 0 ++pcmk__native_allocate: nova-evacuate allocation score on database-0: 0 ++pcmk__native_allocate: nova-evacuate allocation score on database-1: 0 ++pcmk__native_allocate: nova-evacuate allocation score on database-2: 0 ++pcmk__native_allocate: nova-evacuate allocation score on messaging-0: 0 ++pcmk__native_allocate: nova-evacuate allocation score on messaging-1: 0 ++pcmk__native_allocate: nova-evacuate allocation score on messaging-2: 0 ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-0: 0 ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-1: 0 ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-2: 0 ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 10000 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 10000 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 10000 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY ++pcmk__native_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY ++pcmk__native_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-0: 10000 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-1: 10000 ++pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-2: 10000 ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-0: 0 ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-1: 0 ++pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-2: 0 ++pcmk__native_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY ++pcmk__native_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY ++pcmk__native_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY ++pcmk__native_allocate: redis-bundle-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-0 allocation score on controller-0: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on controller-1: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on controller-2: 10000 ++pcmk__native_allocate: redis-bundle-0 allocation score on database-0: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on database-1: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on database-2: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on messaging-0: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on messaging-1: 0 ++pcmk__native_allocate: redis-bundle-0 allocation score on messaging-2: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-1 allocation score on controller-0: 10000 ++pcmk__native_allocate: redis-bundle-1 allocation score on controller-1: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on controller-2: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on database-0: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on database-1: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on database-2: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on messaging-0: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on messaging-1: 0 ++pcmk__native_allocate: redis-bundle-1 allocation score on messaging-2: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-2 allocation score on controller-0: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on controller-1: 10000 ++pcmk__native_allocate: redis-bundle-2 allocation score on controller-2: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on database-0: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on database-1: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on database-2: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on messaging-0: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on messaging-1: 0 ++pcmk__native_allocate: redis-bundle-2 allocation score on messaging-2: 0 ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-0: 0 ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-1: 0 ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-2: 0 ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-0: 0 ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-1: 0 ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-1: 0 ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-2: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-0: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-1: -INFINITY ++pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-2: -INFINITY ++pcmk__native_allocate: redis:0 allocation score on redis-bundle-0: INFINITY ++pcmk__native_allocate: redis:1 allocation score on redis-bundle-1: INFINITY ++pcmk__native_allocate: redis:2 allocation score on redis-bundle-2: INFINITY ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-0: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-2: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-2: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-1: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-1: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-2: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-0: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-0: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on compute-0: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on compute-1: -INFINITY ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-1: -10000 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-2: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-0: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-1: 0 ++pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-2: 0 ++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/cts/scheduler/remote-connection-shutdown.summary b/cts/scheduler/remote-connection-shutdown.summary +new file mode 100644 +index 0000000..8756c33 +--- /dev/null ++++ b/cts/scheduler/remote-connection-shutdown.summary +@@ -0,0 +1,186 @@ ++Using the original execution date of: 2020-11-17 07:03:16Z ++ ++Current cluster status: ++Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] ++RemoteOnline: [ compute-0 compute-1 ] ++GuestOnline: [ galera-bundle-0:galera-bundle-podman-0 galera-bundle-1:galera-bundle-podman-1 galera-bundle-2:galera-bundle-podman-2 ovn-dbs-bundle-0:ovn-dbs-bundle-podman-0 ovn-dbs-bundle-1:ovn-dbs-bundle-podman-1 ovn-dbs-bundle-2:ovn-dbs-bundle-podman-2 rabbitmq-bundle-0:rabbitmq-bundle-podman-0 rabbitmq-bundle-1:rabbitmq-bundle-podman-1 rabbitmq-bundle-2:rabbitmq-bundle-podman-2 redis-bundle-0:redis-bundle-podman-0 redis-bundle-1:redis-bundle-podman-1 redis-bundle-2:redis-bundle-podman-2 ] ++ ++ compute-0 (ocf::pacemaker:remote): Started controller-0 ++ compute-1 (ocf::pacemaker:remote): Started controller-1 ++ Container bundle set: galera-bundle [cluster.common.tag/mariadb: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 ++ Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq: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 ++ Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest] ++ redis-bundle-0 (ocf::heartbeat:redis): Master controller-2 ++ redis-bundle-1 (ocf::heartbeat:redis): Slave controller-0 ++ redis-bundle-2 (ocf::heartbeat:redis): Slave controller-1 ++ ip-192.168.24.150 (ocf::heartbeat:IPaddr2): Started controller-2 ++ ip-10.0.0.150 (ocf::heartbeat:IPaddr2): Started controller-0 ++ ip-172.17.1.151 (ocf::heartbeat:IPaddr2): Started controller-1 ++ ip-172.17.1.150 (ocf::heartbeat:IPaddr2): Started controller-2 ++ ip-172.17.3.150 (ocf::heartbeat:IPaddr2): Started controller-0 ++ ip-172.17.4.150 (ocf::heartbeat:IPaddr2): Started controller-1 ++ Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest] ++ haproxy-bundle-podman-0 (ocf::heartbeat:podman): Started controller-2 ++ haproxy-bundle-podman-1 (ocf::heartbeat:podman): Started controller-0 ++ haproxy-bundle-podman-2 (ocf::heartbeat:podman): Started controller-1 ++ Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest] ++ ovn-dbs-bundle-0 (ocf::ovn:ovndb-servers): Master controller-2 ++ ovn-dbs-bundle-1 (ocf::ovn:ovndb-servers): Slave controller-0 ++ ovn-dbs-bundle-2 (ocf::ovn:ovndb-servers): Slave controller-1 ++ ip-172.17.1.57 (ocf::heartbeat:IPaddr2): Started controller-2 ++ stonith-fence_compute-fence-nova (stonith:fence_compute): Stopped ++ Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger] ++ Started: [ compute-0 compute-1 ] ++ Stopped: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] ++ nova-evacuate (ocf::openstack:NovaEvacuate): Started database-0 ++ stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-1 ++ stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started database-2 ++ stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-0 ++ stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-1 ++ stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 ++ stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 ++ stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 ++ stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started messaging-2 ++ stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-0 ++ stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 ++ stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 ++ Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest] ++ openstack-cinder-volume-podman-0 (ocf::heartbeat:podman): Started controller-0 ++ ++Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-0 changed ++Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-1 changed ++Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_start_0 on database-0 changed: 0:0;322:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_monitor_60000 on database-0 changed: 0:0;323:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to nova-evacuate_start_0 on database-0 changed: 0:0;258:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to nova-evacuate_monitor_10000 on database-0 changed: 0:0;259:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_start_0 on database-1 changed: 0:0;330:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_monitor_60000 on database-1 changed: 0:0;331:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_start_0 on database-1 changed: 0:0;261:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_monitor_60000 on database-1 changed: 0:0;263:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_start_0 on database-2 changed: 0:0;319:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_monitor_60000 on database-2 changed: 0:0;320:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_start_0 on database-2 changed: 0:0;263:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_monitor_60000 on database-2 changed: 0:0;265:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400e10267_start_0 on messaging-1 changed: 0:0;320:1317:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400e10267_monitor_60000 on messaging-1 changed: 0:0;326:1318:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_start_0 on messaging-1 changed: 0:0;271:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_monitor_60000 on messaging-1 changed: 0:0;273:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_start_0 on messaging-0 changed: 0:0;324:70:0:40f880e4-b328-4380-9703-47856390a1e0 ++Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_monitor_60000 on messaging-0 changed: 0:0;325:70:0:40f880e4-b328-4380-9703-47856390a1e0 ++Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_start_0 on messaging-0 changed: 0:0;267:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_monitor_60000 on messaging-0 changed: 0:0;269:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400642894_start_0 on messaging-2 changed: 0:0;272:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400642894_monitor_60000 on messaging-2 changed: 0:0;274:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_start_0 on messaging-2 changed: 0:0;321:49:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_monitor_60000 on messaging-2 changed: 0:0;323:50:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 ++Transition Summary: ++ * Stop compute-0 ( controller-0 ) due to node availability ++ * Start stonith-fence_compute-fence-nova ( database-0 ) ++ * Stop compute-unfence-trigger:0 ( compute-0 ) due to node availability ++ * Move nova-evacuate ( database-0 -> database-1 ) ++ * Move stonith-fence_ipmilan-52540033df9c ( database-1 -> database-2 ) ++ * Move stonith-fence_ipmilan-5254001f5f3c ( database-2 -> messaging-0 ) ++ * Move stonith-fence_ipmilan-5254003f88b4 ( messaging-0 -> messaging-1 ) ++ * Move stonith-fence_ipmilan-5254007b7920 ( messaging-1 -> messaging-2 ) ++ * Move stonith-fence_ipmilan-525400ffc780 ( messaging-2 -> database-0 ) ++ * Move stonith-fence_ipmilan-5254009cb549 ( database-0 -> database-1 ) ++ ++Executing cluster transition: ++ * Resource action: stonith-fence_compute-fence-nova start on database-0 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-2 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-0 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-1 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-2 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-1 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-0 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-2 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-1 ++ * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-0 ++ * Pseudo action: compute-unfence-trigger-clone_stop_0 ++ * Resource action: nova-evacuate stop on database-0 ++ * Resource action: stonith-fence_ipmilan-52540033df9c stop on database-1 ++ * Resource action: stonith-fence_ipmilan-5254001f5f3c stop on database-2 ++ * Resource action: stonith-fence_ipmilan-5254003f88b4 stop on messaging-0 ++ * Resource action: stonith-fence_ipmilan-5254007b7920 stop on messaging-1 ++ * Resource action: stonith-fence_ipmilan-525400ffc780 stop on messaging-2 ++ * Resource action: stonith-fence_ipmilan-5254009cb549 stop on database-0 ++ * Resource action: stonith-fence_compute-fence-nova monitor=60000 on database-0 ++ * Resource action: compute-unfence-trigger stop on compute-0 ++ * Pseudo action: compute-unfence-trigger-clone_stopped_0 ++ * Resource action: nova-evacuate start on database-1 ++ * Resource action: stonith-fence_ipmilan-52540033df9c start on database-2 ++ * Resource action: stonith-fence_ipmilan-5254001f5f3c start on messaging-0 ++ * Resource action: stonith-fence_ipmilan-5254003f88b4 start on messaging-1 ++ * Resource action: stonith-fence_ipmilan-5254007b7920 start on messaging-2 ++ * Resource action: stonith-fence_ipmilan-525400ffc780 start on database-0 ++ * Resource action: stonith-fence_ipmilan-5254009cb549 start on database-1 ++ * Resource action: compute-0 stop on controller-0 ++ * Resource action: nova-evacuate monitor=10000 on database-1 ++ * Resource action: stonith-fence_ipmilan-52540033df9c monitor=60000 on database-2 ++ * Resource action: stonith-fence_ipmilan-5254001f5f3c monitor=60000 on messaging-0 ++ * Resource action: stonith-fence_ipmilan-5254003f88b4 monitor=60000 on messaging-1 ++ * Resource action: stonith-fence_ipmilan-5254007b7920 monitor=60000 on messaging-2 ++ * Resource action: stonith-fence_ipmilan-525400ffc780 monitor=60000 on database-0 ++ * Resource action: stonith-fence_ipmilan-5254009cb549 monitor=60000 on database-1 ++Using the original execution date of: 2020-11-17 07:03:16Z ++ ++Revised cluster status: ++Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] ++RemoteOnline: [ compute-1 ] ++RemoteOFFLINE: [ compute-0 ] ++GuestOnline: [ galera-bundle-0:galera-bundle-podman-0 galera-bundle-1:galera-bundle-podman-1 galera-bundle-2:galera-bundle-podman-2 ovn-dbs-bundle-0:ovn-dbs-bundle-podman-0 ovn-dbs-bundle-1:ovn-dbs-bundle-podman-1 ovn-dbs-bundle-2:ovn-dbs-bundle-podman-2 rabbitmq-bundle-0:rabbitmq-bundle-podman-0 rabbitmq-bundle-1:rabbitmq-bundle-podman-1 rabbitmq-bundle-2:rabbitmq-bundle-podman-2 redis-bundle-0:redis-bundle-podman-0 redis-bundle-1:redis-bundle-podman-1 redis-bundle-2:redis-bundle-podman-2 ] ++ ++ compute-0 (ocf::pacemaker:remote): Stopped ++ compute-1 (ocf::pacemaker:remote): Started controller-1 ++ Container bundle set: galera-bundle [cluster.common.tag/mariadb: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 ++ Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq: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 ++ Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest] ++ redis-bundle-0 (ocf::heartbeat:redis): Master controller-2 ++ redis-bundle-1 (ocf::heartbeat:redis): Slave controller-0 ++ redis-bundle-2 (ocf::heartbeat:redis): Slave controller-1 ++ ip-192.168.24.150 (ocf::heartbeat:IPaddr2): Started controller-2 ++ ip-10.0.0.150 (ocf::heartbeat:IPaddr2): Started controller-0 ++ ip-172.17.1.151 (ocf::heartbeat:IPaddr2): Started controller-1 ++ ip-172.17.1.150 (ocf::heartbeat:IPaddr2): Started controller-2 ++ ip-172.17.3.150 (ocf::heartbeat:IPaddr2): Started controller-0 ++ ip-172.17.4.150 (ocf::heartbeat:IPaddr2): Started controller-1 ++ Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest] ++ haproxy-bundle-podman-0 (ocf::heartbeat:podman): Started controller-2 ++ haproxy-bundle-podman-1 (ocf::heartbeat:podman): Started controller-0 ++ haproxy-bundle-podman-2 (ocf::heartbeat:podman): Started controller-1 ++ Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest] ++ ovn-dbs-bundle-0 (ocf::ovn:ovndb-servers): Master controller-2 ++ ovn-dbs-bundle-1 (ocf::ovn:ovndb-servers): Slave controller-0 ++ ovn-dbs-bundle-2 (ocf::ovn:ovndb-servers): Slave controller-1 ++ ip-172.17.1.57 (ocf::heartbeat:IPaddr2): Started controller-2 ++ stonith-fence_compute-fence-nova (stonith:fence_compute): Started database-0 ++ Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger] ++ Started: [ compute-1 ] ++ Stopped: [ compute-0 controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] ++ nova-evacuate (ocf::openstack:NovaEvacuate): Started database-1 ++ stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-2 ++ stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started messaging-0 ++ stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-1 ++ stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-2 ++ stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 ++ stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 ++ stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 ++ stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started database-0 ++ stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-1 ++ stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 ++ stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 ++ Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest] ++ openstack-cinder-volume-podman-0 (ocf::heartbeat:podman): Started controller-0 ++ +diff --git a/cts/scheduler/remote-connection-shutdown.xml b/cts/scheduler/remote-connection-shutdown.xml +new file mode 100644 +index 0000000..0e4f995 +--- /dev/null ++++ b/cts/scheduler/remote-connection-shutdown.xml +@@ -0,0 +1,2109 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +1.8.3.1 + diff --git a/SOURCES/033-cibsecret.patch b/SOURCES/033-cibsecret.patch new file mode 100644 index 0000000..541f4f4 --- /dev/null +++ b/SOURCES/033-cibsecret.patch @@ -0,0 +1,26 @@ +From 494eebe33d56b24e1f3a13ebe6c0ec651c99a2af Mon Sep 17 00:00:00 2001 +From: Ken Gaillot +Date: Wed, 3 Feb 2021 09:47:39 -0600 +Subject: [PATCH] Fix: tools: get cibsecret stash working again + +Broke with dfe636c4 +--- + tools/cibsecret.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/cibsecret.in b/tools/cibsecret.in +index 6326bf0..ce57a18 100644 +--- a/tools/cibsecret.in ++++ b/tools/cibsecret.in +@@ -393,7 +393,7 @@ cibsecret_stash() { + fatal $CRM_EX_NOSUCH "nothing to stash for resource $rsc parameter $param" + is_secret "$CIBSTASH_CURRENT" && + fatal $CRM_EX_EXISTS "resource $rsc parameter $param already set as secret, nothing to stash" +- cibsecret_set "$CIBSTASH_CURRENT" ++ cibsecret_set "$CIBSTASH_CURRENT" 4 + } + + cibsecret_unstash() { +-- +1.8.3.1 + diff --git a/SOURCES/034-crm_mon.patch b/SOURCES/034-crm_mon.patch new file mode 100644 index 0000000..d38af90 --- /dev/null +++ b/SOURCES/034-crm_mon.patch @@ -0,0 +1,709 @@ +From 68139dc8ff5efbfd81d3b5e868462e7eaefa2c74 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Mon, 25 Jan 2021 15:35:33 +0100 +Subject: [PATCH 1/7] Fix: crm_mon: add explicit void to one_shot prototype for + compat + +--- + tools/crm_mon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 0981634..1eca1b7 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -1226,7 +1226,7 @@ handle_connection_failures(int rc) + } + + static void +-one_shot() ++one_shot(void) + { + int rc; + +-- +1.8.3.1 + + +From 8c7a01f8880efff8457e8421c381082b250d4512 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Mon, 25 Jan 2021 16:26:30 +0100 +Subject: [PATCH 2/7] Refactor: crm_mon: cib_connect & + handle_connection_failures -> new rc + +--- + tools/crm_mon.c | 62 ++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 35 insertions(+), 27 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 1eca1b7..3fbac5f 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -690,7 +690,7 @@ reconnect_after_timeout(gpointer data) + + print_as(output_format, "Reconnecting...\n"); + fencing_connect(); +- if (cib_connect(TRUE) == pcmk_ok) { ++ if (cib_connect(TRUE) == pcmk_rc_ok) { + /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ + mon_refresh_display(NULL); + return FALSE; +@@ -804,16 +804,17 @@ fencing_connect(void) + static int + cib_connect(gboolean full) + { +- int rc = pcmk_ok; ++ int rc = pcmk_rc_ok; + static gboolean need_pass = TRUE; + +- CRM_CHECK(cib != NULL, return -EINVAL); ++ CRM_CHECK(cib != NULL, return EINVAL); + + if (getenv("CIB_passwd") != NULL) { + need_pass = FALSE; + } + +- if (cib->state == cib_connected_query || cib->state == cib_connected_command) { ++ if (cib->state == cib_connected_query || ++ cib->state == cib_connected_command) { + return rc; + } + +@@ -825,37 +826,44 @@ cib_connect(gboolean full) + * @TODO Add a password prompt (maybe including input) function to + * pcmk__output_t and use it in libcib. + */ +- if ((output_format == mon_output_console) && need_pass && (cib->variant == cib_remote)) { ++ if ((output_format == mon_output_console) && ++ need_pass && ++ (cib->variant == cib_remote)) { + need_pass = FALSE; + print_as(output_format, "Password:"); + } + +- rc = cib->cmds->signon(cib, crm_system_name, cib_query); +- if (rc != pcmk_ok) { ++ rc = pcmk_legacy2rc(cib->cmds->signon(cib, crm_system_name, cib_query)); ++ if (rc != pcmk_rc_ok) { + out->err(out, "Could not connect to the CIB: %s", +- pcmk_strerror(rc)); ++ pcmk_rc_str(rc)); + return rc; + } + +- rc = cib->cmds->query(cib, NULL, ¤t_cib, cib_scope_local | cib_sync_call); ++ rc = pcmk_legacy2rc(cib->cmds->query(cib, NULL, ¤t_cib, ++ cib_scope_local | cib_sync_call)); + +- if (rc == pcmk_ok && full) { +- rc = cib->cmds->set_connection_dnotify(cib, mon_cib_connection_destroy); +- if (rc == -EPROTONOSUPPORT) { +- print_as +- (output_format, "Notification setup not supported, won't be able to reconnect after failure"); ++ if (rc == pcmk_rc_ok && full) { ++ rc = pcmk_legacy2rc(cib->cmds->set_connection_dnotify(cib, ++ mon_cib_connection_destroy)); ++ if (rc == EPROTONOSUPPORT) { ++ print_as(output_format, ++ "Notification setup not supported, won't be " ++ "able to reconnect after failure"); + if (output_format == mon_output_console) { + sleep(2); + } +- rc = pcmk_ok; ++ rc = pcmk_rc_ok; + } + +- if (rc == pcmk_ok) { +- cib->cmds->del_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); +- rc = cib->cmds->add_notify_callback(cib, T_CIB_DIFF_NOTIFY, crm_diff_update); ++ if (rc == pcmk_rc_ok) { ++ cib->cmds->del_notify_callback(cib, T_CIB_DIFF_NOTIFY, ++ crm_diff_update); ++ rc = pcmk_legacy2rc(cib->cmds->add_notify_callback(cib, ++ T_CIB_DIFF_NOTIFY, crm_diff_update)); + } + +- if (rc != pcmk_ok) { ++ if (rc != pcmk_rc_ok) { + out->err(out, "Notification setup failed, could not monitor CIB actions"); + clean_up_cib_connection(); + clean_up_fencing_connection(); +@@ -1206,20 +1214,20 @@ reconcile_output_format(pcmk__common_args_t *args) { + static void + handle_connection_failures(int rc) + { +- if (rc == pcmk_ok) { ++ if (rc == pcmk_rc_ok) { + return; + } + + if (output_format == mon_output_monitor) { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "CLUSTER CRIT: Connection to cluster failed: %s", +- pcmk_strerror(rc)); ++ pcmk_rc_str(rc)); + rc = MON_STATUS_CRIT; +- } else if (rc == -ENOTCONN) { ++ } else if (rc == ENOTCONN) { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: cluster is not available on this node"); +- rc = crm_errno2exit(rc); ++ rc = pcmk_rc2exitc(rc); + } else { +- g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Connection to cluster failed: %s", pcmk_strerror(rc)); +- rc = crm_errno2exit(rc); ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Connection to cluster failed: %s", pcmk_rc_str(rc)); ++ rc = pcmk_rc2exitc(rc); + } + + clean_up(rc); +@@ -1478,7 +1486,7 @@ main(int argc, char **argv) + fencing_connect(); + rc = cib_connect(TRUE); + +- if (rc != pcmk_ok) { ++ if (rc != pcmk_rc_ok) { + sleep(options.reconnect_msec / 1000); + #if CURSES_ENABLED + if (output_format == mon_output_console) { +@@ -1490,7 +1498,7 @@ main(int argc, char **argv) + printf("Writing html to %s ...\n", args->output_dest); + } + +- } while (rc == -ENOTCONN); ++ } while (rc == ENOTCONN); + + handle_connection_failures(rc); + set_fencing_options(interactive_fence_level); +-- +1.8.3.1 + + +From 9b8fb7b608280f65a3b76d66a99b575a4da70944 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Mon, 25 Jan 2021 18:26:04 +0100 +Subject: [PATCH 3/7] Fix: tools: Report pacemakerd in state waiting for sbd + +Waiting for pacemakerd to report that all subdaemons are started +before trying to connect to cib and fencer should remove the +potential race introduced by making fencer connection failure +non fatal when cib is faster to come up. +--- + tools/crm_mon.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- + tools/crm_mon.h | 1 + + 2 files changed, 148 insertions(+), 11 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 3fbac5f..61f070d 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -132,6 +132,7 @@ static void handle_connection_failures(int rc); + static int mon_refresh_display(gpointer user_data); + static int cib_connect(gboolean full); + static int fencing_connect(void); ++static int pacemakerd_status(void); + static void mon_st_callback_event(stonith_t * st, stonith_event_t * e); + static void mon_st_callback_display(stonith_t * st, stonith_event_t * e); + static void refresh_after_event(gboolean data_updated); +@@ -689,11 +690,13 @@ reconnect_after_timeout(gpointer data) + } + + print_as(output_format, "Reconnecting...\n"); +- fencing_connect(); +- if (cib_connect(TRUE) == pcmk_rc_ok) { +- /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ +- mon_refresh_display(NULL); +- return FALSE; ++ if (pacemakerd_status() == pcmk_rc_ok) { ++ fencing_connect(); ++ if (cib_connect(TRUE) == pcmk_rc_ok) { ++ /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ ++ mon_refresh_display(NULL); ++ return FALSE; ++ } + } + + reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); +@@ -840,6 +843,13 @@ cib_connect(gboolean full) + return rc; + } + ++#if CURSES_ENABLED ++ /* just show this if refresh is gonna remove all traces */ ++ if (output_format == mon_output_console) { ++ print_as(output_format ,"Waiting for CIB ...\n"); ++ } ++#endif ++ + rc = pcmk_legacy2rc(cib->cmds->query(cib, NULL, ¤t_cib, + cib_scope_local | cib_sync_call)); + +@@ -904,6 +914,121 @@ set_fencing_options(int level) + } + } + ++/* Before trying to connect to fencer or cib check for state of ++ pacemakerd - just no sense in trying till pacemakerd has ++ taken care of starting all the sub-processes ++ ++ Only noteworthy thing to show here is when pacemakerd is ++ waiting for startup-trigger from SBD. ++ */ ++static void ++pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api, ++ enum pcmk_ipc_event event_type, crm_exit_t status, ++ void *event_data, void *user_data) ++{ ++ pcmk_pacemakerd_api_reply_t *reply = event_data; ++ enum pcmk_pacemakerd_state *state = ++ (enum pcmk_pacemakerd_state *) user_data; ++ ++ /* we are just interested in the latest reply */ ++ *state = pcmk_pacemakerd_state_invalid; ++ ++ switch (event_type) { ++ case pcmk_ipc_event_reply: ++ break; ++ ++ default: ++ return; ++ } ++ ++ if (status != CRM_EX_OK) { ++ out->err(out, "Bad reply from pacemakerd: %s", ++ crm_exit_str(status)); ++ return; ++ } ++ ++ if (reply->reply_type != pcmk_pacemakerd_reply_ping) { ++ out->err(out, "Unknown reply type %d from pacemakerd", ++ reply->reply_type); ++ } else { ++ if ((reply->data.ping.last_good != (time_t) 0) && ++ (reply->data.ping.status == pcmk_rc_ok)) { ++ *state = reply->data.ping.state; ++ } ++ } ++} ++ ++static int ++pacemakerd_status(void) ++{ ++ int rc = pcmk_rc_ok; ++ pcmk_ipc_api_t *pacemakerd_api = NULL; ++ enum pcmk_pacemakerd_state state = pcmk_pacemakerd_state_invalid; ++ ++ if (!pcmk_is_set(options.mon_ops, mon_op_cib_native)) { ++ /* we don't need fully functional pacemakerd otherwise */ ++ return rc; ++ } ++ if (cib != NULL && ++ (cib->state == cib_connected_query || ++ cib->state == cib_connected_command)) { ++ /* As long as we have a cib-connection let's go with ++ * that to fetch further cluster-status and avoid ++ * unnecessary pings to pacemakerd. ++ * If cluster is going down and fencer is down already ++ * this will lead to a silently failing fencer reconnect. ++ * On cluster startup we shouldn't see this situation ++ * as first we do is wait for pacemakerd to report all ++ * daemons running. ++ */ ++ return rc; ++ } ++ rc = pcmk_new_ipc_api(&pacemakerd_api, pcmk_ipc_pacemakerd); ++ if (pacemakerd_api == NULL) { ++ out->err(out, "Could not connect to pacemakerd: %s", ++ pcmk_rc_str(rc)); ++ /* this is unrecoverable so return with rc we have */ ++ return rc; ++ } ++ pcmk_register_ipc_callback(pacemakerd_api, pacemakerd_event_cb, (void *) &state); ++ rc = pcmk_connect_ipc(pacemakerd_api, pcmk_ipc_dispatch_poll); ++ if (rc == pcmk_rc_ok) { ++ rc = pcmk_pacemakerd_api_ping(pacemakerd_api, crm_system_name); ++ if (rc == pcmk_rc_ok) { ++ rc = pcmk_poll_ipc(pacemakerd_api, options.reconnect_msec/2); ++ if (rc == pcmk_rc_ok) { ++ pcmk_dispatch_ipc(pacemakerd_api); ++ rc = ENOTCONN; ++ switch (state) { ++ case pcmk_pacemakerd_state_running: ++ rc = pcmk_rc_ok; ++ break; ++ case pcmk_pacemakerd_state_starting_daemons: ++ print_as(output_format ,"Pacemaker daemons starting ...\n"); ++ break; ++ case pcmk_pacemakerd_state_wait_for_ping: ++ print_as(output_format ,"Waiting for startup-trigger from SBD ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutting_down: ++ print_as(output_format ,"Pacemaker daemons shutting down ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutdown_complete: ++ /* assuming pacemakerd doesn't dispatch any pings after entering ++ * that state unless it is waiting for SBD ++ */ ++ print_as(output_format ,"Pacemaker daemons shut down - reporting to SBD ...\n"); ++ break; ++ default: ++ break; ++ } ++ } ++ } ++ } ++ pcmk_free_ipc_api(pacemakerd_api); ++ /* returning with ENOTCONN triggers a retry */ ++ return (rc == pcmk_rc_ok)?rc:ENOTCONN; ++} ++ + #if CURSES_ENABLED + static const char * + get_option_desc(char c) +@@ -1033,8 +1158,11 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + } + + refresh: +- fencing_connect(); +- rc = cib_connect(FALSE); ++ rc = pacemakerd_status(); ++ if (rc == pcmk_rc_ok) { ++ fencing_connect(); ++ rc = cib_connect(FALSE); ++ } + if (rc == pcmk_rc_ok) { + mon_refresh_display(NULL); + } else { +@@ -1238,9 +1366,13 @@ one_shot(void) + { + int rc; + +- fencing_connect(); ++ rc = pacemakerd_status(); ++ ++ if (rc == pcmk_rc_ok) { ++ fencing_connect(); ++ rc = cib_connect(FALSE); ++ } + +- rc = cib_connect(FALSE); + if (rc == pcmk_rc_ok) { + mon_refresh_display(NULL); + } else { +@@ -1316,6 +1448,7 @@ main(int argc, char **argv) + + case cib_native: + /* cib & fencing - everything available */ ++ options.mon_ops |= mon_op_cib_native; + break; + + case cib_file: +@@ -1483,8 +1616,11 @@ main(int argc, char **argv) + do { + print_as(output_format ,"Waiting until cluster is available on this node ...\n"); + +- fencing_connect(); +- rc = cib_connect(TRUE); ++ rc = pacemakerd_status(); ++ if (rc == pcmk_rc_ok) { ++ fencing_connect(); ++ rc = cib_connect(TRUE); ++ } + + if (rc != pcmk_rc_ok) { + sleep(options.reconnect_msec / 1000); +diff --git a/tools/crm_mon.h b/tools/crm_mon.h +index 73c926d..b556913 100644 +--- a/tools/crm_mon.h ++++ b/tools/crm_mon.h +@@ -91,6 +91,7 @@ typedef enum mon_output_format_e { + #define mon_op_print_brief (0x0200U) + #define mon_op_print_pending (0x0400U) + #define mon_op_print_clone_detail (0x0800U) ++#define mon_op_cib_native (0x1000U) + + #define mon_op_default (mon_op_print_pending | mon_op_fence_history | mon_op_fence_connect) + +-- +1.8.3.1 + + +From 046516dbe66fb2c52b90f36215cf60c5ad3c269b Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Thu, 28 Jan 2021 16:38:22 +0100 +Subject: [PATCH 4/7] Refactor: crm_mon: do refreshes rather via + refresh_after_event + +--- + tools/crm_mon.c | 35 ++++++++++++++--------------------- + 1 file changed, 14 insertions(+), 21 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 61f070d..195e7b5 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -135,7 +135,7 @@ static int fencing_connect(void); + static int pacemakerd_status(void); + static void mon_st_callback_event(stonith_t * st, stonith_event_t * e); + static void mon_st_callback_display(stonith_t * st, stonith_event_t * e); +-static void refresh_after_event(gboolean data_updated); ++static void refresh_after_event(gboolean data_updated, gboolean enforce); + + static unsigned int + all_includes(mon_output_format_t fmt) { +@@ -694,13 +694,13 @@ reconnect_after_timeout(gpointer data) + fencing_connect(); + if (cib_connect(TRUE) == pcmk_rc_ok) { + /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ +- mon_refresh_display(NULL); ++ refresh_after_event(FALSE, TRUE); + return FALSE; + } + } + + reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); +- return TRUE; ++ return FALSE; + } + + /* Called from various places when we are disconnected from the CIB or from the +@@ -1057,7 +1057,6 @@ static gboolean + detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_data) + { + int c; +- int rc; + gboolean config_mode = FALSE; + + while (1) { +@@ -1158,16 +1157,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat + } + + refresh: +- rc = pacemakerd_status(); +- if (rc == pcmk_rc_ok) { +- fencing_connect(); +- rc = cib_connect(FALSE); +- } +- if (rc == pcmk_rc_ok) { +- mon_refresh_display(NULL); +- } else { +- handle_connection_failures(rc); +- } ++ refresh_after_event(FALSE, TRUE); + + return TRUE; + } +@@ -2087,7 +2077,7 @@ crm_diff_update(const char *event, xmlNode * msg) + } + + stale = FALSE; +- refresh_after_event(cib_updated); ++ refresh_after_event(cib_updated, FALSE); + } + + static int +@@ -2246,7 +2236,7 @@ mon_st_callback_event(stonith_t * st, stonith_event_t * e) + * fencing event is received or a CIB diff occurrs. + */ + static void +-refresh_after_event(gboolean data_updated) ++refresh_after_event(gboolean data_updated, gboolean enforce) + { + static int updates = 0; + time_t now = time(NULL); +@@ -2259,12 +2249,15 @@ refresh_after_event(gboolean data_updated) + refresh_timer = mainloop_timer_add("refresh", 2000, FALSE, mon_trigger_refresh, NULL); + } + +- if ((now - last_refresh) > (options.reconnect_msec / 1000)) { +- mainloop_set_trigger(refresh_trigger); ++ if (reconnect_timer > 0) { ++ /* we will receive a refresh request after successful reconnect */ + mainloop_timer_stop(refresh_timer); +- updates = 0; ++ return; ++ } + +- } else if(updates >= 10) { ++ if (enforce || ++ now - last_refresh > options.reconnect_msec / 1000 || ++ updates >= 10) { + mainloop_set_trigger(refresh_trigger); + mainloop_timer_stop(refresh_timer); + updates = 0; +@@ -2285,7 +2278,7 @@ mon_st_callback_display(stonith_t * st, stonith_event_t * e) + mon_cib_connection_destroy(NULL); + } else { + print_dot(output_format); +- refresh_after_event(TRUE); ++ refresh_after_event(TRUE, FALSE); + } + } + +-- +1.8.3.1 + + +From a63af2713f96719fc1d5ef594eb033d0f251187f Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Thu, 28 Jan 2021 16:52:57 +0100 +Subject: [PATCH 5/7] Fix: crm_mon: retry fencer connection as not fatal + initially + +and cleanup fencer api to not leak memory on multiple reconnects +--- + tools/crm_mon.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 195e7b5..a768ca9 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -798,7 +798,7 @@ fencing_connect(void) + st->cmds->register_notification(st, T_STONITH_NOTIFY_HISTORY, mon_st_callback_display); + } + } else { +- st = NULL; ++ clean_up_fencing_connection(); + } + + return rc; +@@ -2255,6 +2255,12 @@ refresh_after_event(gboolean data_updated, gboolean enforce) + return; + } + ++ /* as we're not handling initial failure of fencer-connection as ++ * fatal give it a retry here ++ * not getting here if cib-reconnection is already on the way ++ */ ++ fencing_connect(); ++ + if (enforce || + now - last_refresh > options.reconnect_msec / 1000 || + updates >= 10) { +-- +1.8.3.1 + + +From b6f4b5dfc0b5fec8cdc029409fc61252de019415 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Thu, 28 Jan 2021 18:08:43 +0100 +Subject: [PATCH 6/7] Refactor: crm_mon: have reconnect-timer removed + implicitly + +--- + tools/crm_mon.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index a768ca9..4f73379 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -684,23 +684,19 @@ reconnect_after_timeout(gpointer data) + } + #endif + +- if (reconnect_timer > 0) { +- g_source_remove(reconnect_timer); +- reconnect_timer = 0; +- } +- + print_as(output_format, "Reconnecting...\n"); + if (pacemakerd_status() == pcmk_rc_ok) { + fencing_connect(); + if (cib_connect(TRUE) == pcmk_rc_ok) { +- /* Redraw the screen and reinstall ourselves to get called after another reconnect_msec. */ ++ /* trigger redrawing the screen (needs reconnect_timer == 0) */ ++ reconnect_timer = 0; + refresh_after_event(FALSE, TRUE); +- return FALSE; ++ return G_SOURCE_REMOVE; + } + } + + reconnect_timer = g_timeout_add(options.reconnect_msec, reconnect_after_timeout, NULL); +- return FALSE; ++ return G_SOURCE_REMOVE; + } + + /* Called from various places when we are disconnected from the CIB or from the +-- +1.8.3.1 + + +From 586e69ec38d5273b348c42a61b9bc7bbcc2b93b3 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Thu, 28 Jan 2021 21:08:16 +0100 +Subject: [PATCH 7/7] Fix: crm_mon: suppress pacemakerd-status for non-text + output + +--- + tools/crm_mon.c | 53 ++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 32 insertions(+), 21 deletions(-) + +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index 4f73379..d4d4ac3 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -995,27 +995,38 @@ pacemakerd_status(void) + if (rc == pcmk_rc_ok) { + pcmk_dispatch_ipc(pacemakerd_api); + rc = ENOTCONN; +- switch (state) { +- case pcmk_pacemakerd_state_running: +- rc = pcmk_rc_ok; +- break; +- case pcmk_pacemakerd_state_starting_daemons: +- print_as(output_format ,"Pacemaker daemons starting ...\n"); +- break; +- case pcmk_pacemakerd_state_wait_for_ping: +- print_as(output_format ,"Waiting for startup-trigger from SBD ...\n"); +- break; +- case pcmk_pacemakerd_state_shutting_down: +- print_as(output_format ,"Pacemaker daemons shutting down ...\n"); +- break; +- case pcmk_pacemakerd_state_shutdown_complete: +- /* assuming pacemakerd doesn't dispatch any pings after entering +- * that state unless it is waiting for SBD +- */ +- print_as(output_format ,"Pacemaker daemons shut down - reporting to SBD ...\n"); +- break; +- default: +- break; ++ if ((output_format == mon_output_console) || ++ (output_format == mon_output_plain)) { ++ switch (state) { ++ case pcmk_pacemakerd_state_running: ++ rc = pcmk_rc_ok; ++ break; ++ case pcmk_pacemakerd_state_starting_daemons: ++ print_as(output_format ,"Pacemaker daemons starting ...\n"); ++ break; ++ case pcmk_pacemakerd_state_wait_for_ping: ++ print_as(output_format ,"Waiting for startup-trigger from SBD ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutting_down: ++ print_as(output_format ,"Pacemaker daemons shutting down ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutdown_complete: ++ /* assuming pacemakerd doesn't dispatch any pings after entering ++ * that state unless it is waiting for SBD ++ */ ++ print_as(output_format ,"Pacemaker daemons shut down - reporting to SBD ...\n"); ++ break; ++ default: ++ break; ++ } ++ } else { ++ switch (state) { ++ case pcmk_pacemakerd_state_running: ++ rc = pcmk_rc_ok; ++ break; ++ default: ++ break; ++ } + } + } + } +-- +1.8.3.1 + diff --git a/SOURCES/035-crm_mon.patch b/SOURCES/035-crm_mon.patch new file mode 100644 index 0000000..9e6c828 --- /dev/null +++ b/SOURCES/035-crm_mon.patch @@ -0,0 +1,267 @@ +From f4e3d77c94906a062641c7bf34243049de521a87 Mon Sep 17 00:00:00 2001 +From: Klaus Wenninger +Date: Wed, 3 Feb 2021 13:25:22 +0100 +Subject: [PATCH] Fix: crm_mon: detect when run on remote-node + +--- + daemons/execd/remoted_proxy.c | 17 +++++++ + daemons/pacemakerd/pacemakerd.c | 6 +-- + include/crm/common/ipc_internal.h | 2 + + lib/common/ipc_server.c | 26 ++++++++++ + tools/crm_mon.c | 99 ++++++++++++++++++++++++--------------- + 5 files changed, 106 insertions(+), 44 deletions(-) + +diff --git a/daemons/execd/remoted_proxy.c b/daemons/execd/remoted_proxy.c +index 9329fa6..0fe39bf 100644 +--- a/daemons/execd/remoted_proxy.c ++++ b/daemons/execd/remoted_proxy.c +@@ -29,6 +29,7 @@ static qb_ipcs_service_t *cib_shm = NULL; + static qb_ipcs_service_t *attrd_ipcs = NULL; + static qb_ipcs_service_t *crmd_ipcs = NULL; + static qb_ipcs_service_t *stonith_ipcs = NULL; ++static qb_ipcs_service_t *pacemakerd_ipcs = NULL; + + // An IPC provider is a cluster node controller connecting as a client + static GList *ipc_providers = NULL; +@@ -126,6 +127,12 @@ stonith_proxy_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) + } + + static int32_t ++pacemakerd_proxy_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) ++{ ++ return -EREMOTEIO; ++} ++ ++static int32_t + cib_proxy_accept_rw(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) + { + return ipc_proxy_accept(c, uid, gid, PCMK__SERVER_BASED_RW); +@@ -356,6 +363,14 @@ static struct qb_ipcs_service_handlers stonith_proxy_callbacks = { + .connection_destroyed = ipc_proxy_destroy + }; + ++static struct qb_ipcs_service_handlers pacemakerd_proxy_callbacks = { ++ .connection_accept = pacemakerd_proxy_accept, ++ .connection_created = NULL, ++ .msg_process = NULL, ++ .connection_closed = NULL, ++ .connection_destroyed = NULL ++}; ++ + static struct qb_ipcs_service_handlers cib_proxy_callbacks_ro = { + .connection_accept = cib_proxy_accept_ro, + .connection_created = NULL, +@@ -422,6 +437,7 @@ ipc_proxy_init(void) + &cib_proxy_callbacks_rw); + pcmk__serve_attrd_ipc(&attrd_ipcs, &attrd_proxy_callbacks); + pcmk__serve_fenced_ipc(&stonith_ipcs, &stonith_proxy_callbacks); ++ pcmk__serve_pacemakerd_ipc(&pacemakerd_ipcs, &pacemakerd_proxy_callbacks); + crmd_ipcs = pcmk__serve_controld_ipc(&crmd_proxy_callbacks); + if (crmd_ipcs == NULL) { + crm_err("Failed to create controller: exiting and inhibiting respawn"); +@@ -444,6 +460,7 @@ ipc_proxy_cleanup(void) + pcmk__stop_based_ipc(cib_ro, cib_rw, cib_shm); + qb_ipcs_destroy(attrd_ipcs); + qb_ipcs_destroy(stonith_ipcs); ++ qb_ipcs_destroy(pacemakerd_ipcs); + qb_ipcs_destroy(crmd_ipcs); + cib_ro = NULL; + cib_rw = NULL; +diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c +index 509b0f8..4572b70 100644 +--- a/daemons/pacemakerd/pacemakerd.c ++++ b/daemons/pacemakerd/pacemakerd.c +@@ -1287,11 +1287,7 @@ main(int argc, char **argv) + + // Don't build CRM_RSCTMP_DIR, pacemaker-execd will do it + +- ipcs = mainloop_add_ipc_server(CRM_SYSTEM_MCP, QB_IPC_NATIVE, &mcp_ipc_callbacks); +- if (ipcs == NULL) { +- crm_err("Couldn't start IPC server"); +- crm_exit(CRM_EX_OSERR); +- } ++ pcmk__serve_pacemakerd_ipc(&ipcs, &mcp_ipc_callbacks); + + #ifdef SUPPORT_COROSYNC + /* Allows us to block shutdown */ +diff --git a/include/crm/common/ipc_internal.h b/include/crm/common/ipc_internal.h +index cf935f3..fb82ce1 100644 +--- a/include/crm/common/ipc_internal.h ++++ b/include/crm/common/ipc_internal.h +@@ -221,6 +221,8 @@ void pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs, + struct qb_ipcs_service_handlers *cb); + void pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs, + struct qb_ipcs_service_handlers *cb); ++void pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs, ++ struct qb_ipcs_service_handlers *cb); + qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb); + + void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro, +diff --git a/lib/common/ipc_server.c b/lib/common/ipc_server.c +index 4d3e954..b3aaf8e 100644 +--- a/lib/common/ipc_server.c ++++ b/lib/common/ipc_server.c +@@ -922,6 +922,32 @@ pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs, + } + + /*! ++ * \internal ++ * \brief Add an IPC server to the main loop for the pacemakerd API ++ * ++ * \param[in] cb IPC callbacks ++ * ++ * \note This function exits with CRM_EX_OSERR if unable to create the servers. ++ */ ++void ++pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs, ++ struct qb_ipcs_service_handlers *cb) ++{ ++ *ipcs = mainloop_add_ipc_server(CRM_SYSTEM_MCP, QB_IPC_NATIVE, cb); ++ ++ if (*ipcs == NULL) { ++ crm_err("Couldn't start pacemakerd IPC server"); ++ crm_warn("Verify pacemaker and pacemaker_remote are not both enabled."); ++ /* sub-daemons are observed by pacemakerd. Thus we exit CRM_EX_FATAL ++ * if we want to prevent pacemakerd from restarting them. ++ * With pacemakerd we leave the exit-code shown to e.g. systemd ++ * to what it was prior to moving the code here from pacemakerd.c ++ */ ++ crm_exit(CRM_EX_OSERR); ++ } ++} ++ ++/*! + * \brief Check whether string represents a client name used by cluster daemons + * + * \param[in] name String to check +diff --git a/tools/crm_mon.c b/tools/crm_mon.c +index d4d4ac3..e58fed2 100644 +--- a/tools/crm_mon.c ++++ b/tools/crm_mon.c +@@ -83,6 +83,8 @@ static gchar **processed_args = NULL; + static time_t last_refresh = 0; + crm_trigger_t *refresh_trigger = NULL; + ++static gboolean on_remote_node = FALSE; ++ + int interactive_fence_level = 0; + + static pcmk__supported_format_t formats[] = { +@@ -988,48 +990,63 @@ pacemakerd_status(void) + } + pcmk_register_ipc_callback(pacemakerd_api, pacemakerd_event_cb, (void *) &state); + rc = pcmk_connect_ipc(pacemakerd_api, pcmk_ipc_dispatch_poll); +- if (rc == pcmk_rc_ok) { +- rc = pcmk_pacemakerd_api_ping(pacemakerd_api, crm_system_name); +- if (rc == pcmk_rc_ok) { +- rc = pcmk_poll_ipc(pacemakerd_api, options.reconnect_msec/2); ++ switch (rc) { ++ case pcmk_rc_ok: ++ rc = pcmk_pacemakerd_api_ping(pacemakerd_api, crm_system_name); + if (rc == pcmk_rc_ok) { +- pcmk_dispatch_ipc(pacemakerd_api); +- rc = ENOTCONN; +- if ((output_format == mon_output_console) || +- (output_format == mon_output_plain)) { +- switch (state) { +- case pcmk_pacemakerd_state_running: +- rc = pcmk_rc_ok; +- break; +- case pcmk_pacemakerd_state_starting_daemons: +- print_as(output_format ,"Pacemaker daemons starting ...\n"); +- break; +- case pcmk_pacemakerd_state_wait_for_ping: +- print_as(output_format ,"Waiting for startup-trigger from SBD ...\n"); +- break; +- case pcmk_pacemakerd_state_shutting_down: +- print_as(output_format ,"Pacemaker daemons shutting down ...\n"); +- break; +- case pcmk_pacemakerd_state_shutdown_complete: +- /* assuming pacemakerd doesn't dispatch any pings after entering +- * that state unless it is waiting for SBD +- */ +- print_as(output_format ,"Pacemaker daemons shut down - reporting to SBD ...\n"); +- break; +- default: +- break; +- } +- } else { +- switch (state) { +- case pcmk_pacemakerd_state_running: +- rc = pcmk_rc_ok; +- break; +- default: +- break; ++ rc = pcmk_poll_ipc(pacemakerd_api, options.reconnect_msec/2); ++ if (rc == pcmk_rc_ok) { ++ pcmk_dispatch_ipc(pacemakerd_api); ++ rc = ENOTCONN; ++ if ((output_format == mon_output_console) || ++ (output_format == mon_output_plain)) { ++ switch (state) { ++ case pcmk_pacemakerd_state_running: ++ rc = pcmk_rc_ok; ++ break; ++ case pcmk_pacemakerd_state_starting_daemons: ++ print_as(output_format ,"Pacemaker daemons starting ...\n"); ++ break; ++ case pcmk_pacemakerd_state_wait_for_ping: ++ print_as(output_format ,"Waiting for startup-trigger from SBD ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutting_down: ++ print_as(output_format ,"Pacemaker daemons shutting down ...\n"); ++ break; ++ case pcmk_pacemakerd_state_shutdown_complete: ++ /* assuming pacemakerd doesn't dispatch any pings after entering ++ * that state unless it is waiting for SBD ++ */ ++ print_as(output_format ,"Pacemaker daemons shut down - reporting to SBD ...\n"); ++ break; ++ default: ++ break; ++ } ++ } else { ++ switch (state) { ++ case pcmk_pacemakerd_state_running: ++ rc = pcmk_rc_ok; ++ break; ++ default: ++ break; ++ } + } + } + } +- } ++ break; ++ case EREMOTEIO: ++ rc = pcmk_rc_ok; ++ on_remote_node = TRUE; ++#if CURSES_ENABLED ++ /* just show this if refresh is gonna remove all traces */ ++ if (output_format == mon_output_console) { ++ print_as(output_format , ++ "Running on remote-node waiting to be connected by cluster ...\n"); ++ } ++#endif ++ break; ++ default: ++ break; + } + pcmk_free_ipc_api(pacemakerd_api); + /* returning with ENOTCONN triggers a retry */ +@@ -1348,7 +1365,11 @@ handle_connection_failures(int rc) + pcmk_rc_str(rc)); + rc = MON_STATUS_CRIT; + } else if (rc == ENOTCONN) { +- g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: cluster is not available on this node"); ++ if (on_remote_node) { ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: remote-node not connected to cluster"); ++ } else { ++ g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Error: cluster is not available on this node"); ++ } + rc = pcmk_rc2exitc(rc); + } else { + g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_ERROR, "Connection to cluster failed: %s", pcmk_rc_str(rc)); +-- +1.8.3.1 + diff --git a/SPECS/pacemaker.spec b/SPECS/pacemaker.spec index 05344fc..c7180c6 100644 --- a/SPECS/pacemaker.spec +++ b/SPECS/pacemaker.spec @@ -23,7 +23,7 @@ ## can be incremented to build packages reliably considered "newer" ## than previously built packages with the same pcmkversion) %global pcmkversion 2.0.5 -%global specversion 5 +%global specversion 6 ## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build %global commit ba59be71228fed04f78ab374dfac748d314d0e89 @@ -274,6 +274,15 @@ Patch23: 023-rhbz1872376.patch Patch24: 024-rhbz1371576.patch Patch25: 025-feature-set.patch Patch26: 026-tests.patch +Patch27: 027-crm_mon.patch +Patch28: 028-crm_mon.patch +Patch29: 029-crm_mon.patch +Patch30: 030-crmadmin.patch +Patch31: 031-cibsecret.patch +Patch32: 032-rhbz1898457.patch +Patch33: 033-cibsecret.patch +Patch34: 034-crm_mon.patch +Patch35: 035-crm_mon.patch # downstream-only commits Patch100: 100-default-to-syncing-with-sbd.patch @@ -971,6 +980,18 @@ exit 0 %license %{nagios_name}-%{nagios_hash}/COPYING %changelog +* Wed Feb 3 2021 Ken Gaillot - 2.0.5-6 +- crm_mon --daemonize should reconnect if cluster restarts +- crm_mon should show more informative messages when cluster is starting +- crm_mon should show rest of status if fencing history is unavailable +- cibsecret now works on remote nodes (as long as name can be reached via ssh) +- Stop remote nodes correctly when connection history is later than node history +- Resolves: rhbz1466875 +- Resolves: rhbz1872490 +- Resolves: rhbz1880426 +- Resolves: rhbz1881537 +- Resolves: rhbz1898457 + * Thu Jan 14 2021 Ken Gaillot - 2.0.5-5 - Allow non-critical resources that stop rather than make another resource move - Support crm_resource --digests option for showing operation digests