diff --git a/extra/alerts/alert_file.sh.sample b/extra/alerts/alert_file.sh.sample index cccff7c9ea..e1e0bb9a5b 100644 --- a/extra/alerts/alert_file.sh.sample +++ b/extra/alerts/alert_file.sh.sample @@ -1,102 +1,113 @@ #!/bin/sh # # Copyright (C) 2015 Andrew Beekhof # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ############################################################################## # Sample configuration (cib fragment in xml notation) # ================================ # # # # # # # # # # # # # +# No one will probably ever see this echo, unless they run the script manually. +# An alternative would be to log to the system log, or similar. (We can't send +# this to the configured recipient, because that variable won't be defined in +# this case either.) if [ -z $CRM_alert_version ]; then - echo "Pacemaker version 1.1.15 or later is required" >> "${CRM_alert_recipient}" + echo "$0 must be run by Pacemaker version 1.1.15 or later" + exit 0 +fi + +# Alert agents must always handle the case where no recipients are defined, +# even if it's a no-op (a recipient might be added to the configuration later). +if [ -z "${CRM_alert_recipient}" ]; then + echo "$0 requires a recipient configured with a full filename path" exit 0 fi debug_exec_order_default="false" # Pacemaker passes instance attributes to alert agents as environment variables. # It is completely up to the agent what instance attributes to support. # Here, we define an instance attribute "debug_exec_order". : ${debug_exec_order=${debug_exec_order_default}} if [ "${debug_exec_order}" = "true" ]; then tstamp=`printf "%04d. " "$CRM_alert_node_sequence"` if [ ! -z "$CRM_alert_timestamp" ]; then tstamp="${tstamp} $CRM_alert_timestamp (`date "+%H:%M:%S.%06N"`): " fi else if [ ! -z "$CRM_alert_timestamp" ]; then tstamp="$CRM_alert_timestamp: " fi fi case $CRM_alert_kind in node) echo "${tstamp}Node '${CRM_alert_node}' is now '${CRM_alert_desc}'" >> "${CRM_alert_recipient}" ;; fencing) # Other keys: # # CRM_alert_node # CRM_alert_task # CRM_alert_rc # echo "${tstamp}Fencing ${CRM_alert_desc}" >> "${CRM_alert_recipient}" ;; resource) # Other keys: # # CRM_alert_target_rc # CRM_alert_status # CRM_alert_rc # if [ ${CRM_alert_interval} = "0" ]; then CRM_alert_interval="" else CRM_alert_interval=" (${CRM_alert_interval})" fi if [ ${CRM_alert_target_rc} = "0" ]; then CRM_alert_target_rc="" else CRM_alert_target_rc=" (target: ${CRM_alert_target_rc})" fi case ${CRM_alert_desc} in Cancelled) ;; *) echo "${tstamp}Resource operation '${CRM_alert_task}${CRM_alert_interval}' for '${CRM_alert_rsc}' on '${CRM_alert_node}': ${CRM_alert_desc}${CRM_alert_target_rc}" >> "${CRM_alert_recipient}" ;; esac ;; *) echo "${tstamp}Unhandled $CRM_alert_kind alert" >> "${CRM_alert_recipient}" env | grep CRM_alert >> "${CRM_alert_recipient}" ;; esac diff --git a/extra/alerts/alert_snmp.sh.sample b/extra/alerts/alert_snmp.sh.sample index 788e3c1297..3e7ee6c8f5 100644 --- a/extra/alerts/alert_snmp.sh.sample +++ b/extra/alerts/alert_snmp.sh.sample @@ -1,145 +1,150 @@ #!/bin/sh # # Description: Manages a SNMP trap, provided by NTT OSSC as an # script under Heartbeat/LinuxHA control # # Copyright (c) 2016 NIPPON TELEGRAPH AND TELEPHONE CORPORATION # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # ############################################################################## # This sample script assumes that only users who already have # hacluster-equivalent access to the cluster nodes can edit the CIB. Otherwise, # a malicious user could run commands as hacluster by inserting shell code into # the trap_options or timestamp-format parameters. # # Sample configuration (cib fragment in xml notation) # ================================ # # # # # # # # # # # # # # ================================ if [ -z "$CRM_alert_version" ]; then - echo "Pacemaker version 1.1.15 or later is required" + echo "$0 must be run by Pacemaker version 1.1.15 or later" + exit 0 +fi + +if [ -z "$CRM_alert_recipient" ]; then + echo "$0 requires a recipient configured with the SNMP server IP address" exit 0 fi # trap_binary_default="/usr/bin/snmptrap" trap_version_default="2c" trap_options_default="" trap_community_default="public" trap_node_states_default="all" trap_fencing_tasks_default="all" trap_resource_tasks_default="all" trap_monitor_success_default="false" trap_add_hires_timestamp_oid_default="true" : ${trap_binary=${trap_binary_default}} : ${trap_version=${trap_version_default}} : ${trap_options=${trap_options_default}} : ${trap_community=${trap_community_default}} : ${trap_node_states=${trap_node_states_default}} : ${trap_fencing_tasks=${trap_fencing_tasks_default}} : ${trap_resource_tasks=${trap_resource_tasks_default}} : ${trap_monitor_success=${trap_monitor_success_default}} : ${trap_add_hires_timestamp_oid=${trap_add_hires_timestamp_oid_default}} if [ "${trap_add_hires_timestamp_oid}" = "true" ]; then hires_timestamp="HOST-RESOURCES-MIB::hrSystemDate s ${CRM_alert_timestamp}" fi is_in_list() { item_list=`echo "$1" | tr ',' ' '` if [ "${item_list}" = "all" ]; then return 0 else for act in $item_list do act=`echo "$act" | tr A-Z a-z` [ "$act" != "$2" ] && continue return 0 done fi return 1 } case "$CRM_alert_kind" in node) is_in_list "${trap_node_states}" "${CRM_alert_desc}" [ $? -ne 0 ] && exit 0 "${trap_binary}" -v "${trap_version}" ${trap_options} \ -c "${trap_community}" "${CRM_alert_recipient}" "" \ PACEMAKER-MIB::pacemakerNotificationTrap \ PACEMAKER-MIB::pacemakerNotificationNode s "${CRM_alert_node}" \ PACEMAKER-MIB::pacemakerNotificationDescription s "${CRM_alert_desc}" \ ${hires_timestamp} ;; fencing) is_in_list "${trap_fencing_tasks}" "${CRM_alert_task}" [ $? -ne 0 ] && exit 0 "${trap_binary}" -v "${trap_version}" ${trap_options} \ -c "${trap_community}" "${CRM_alert_recipient}" "" \ PACEMAKER-MIB::pacemakerNotificationTrap \ PACEMAKER-MIB::pacemakerNotificationNode s "${CRM_alert_node}" \ PACEMAKER-MIB::pacemakerNotificationOperation s "${CRM_alert_task}" \ PACEMAKER-MIB::pacemakerNotificationDescription s "${CRM_alert_desc}" \ PACEMAKER-MIB::pacemakerNotificationReturnCode i ${CRM_alert_rc} \ ${hires_timestamp} ;; resource) is_in_list "${trap_resource_tasks}" "${CRM_alert_task}" [ $? -ne 0 ] && exit 0 case "${CRM_alert_desc}" in Cancelled) ;; *) if [ "${trap_monitor_success}" = "false" ] \ && [ "${CRM_alert_rc}" = "${CRM_alert_target_rc}" ] \ && [ "${CRM_alert_task}" = "monitor" ]; then exit fi "${trap_binary}" -v "${trap_version}" ${trap_options} \ -c "${trap_community}" "${CRM_alert_recipient}" "" \ PACEMAKER-MIB::pacemakerNotificationTrap \ PACEMAKER-MIB::pacemakerNotificationNode s "${CRM_alert_node}" \ PACEMAKER-MIB::pacemakerNotificationResource s "${CRM_alert_rsc}" \ PACEMAKER-MIB::pacemakerNotificationOperation s "${CRM_alert_task}" \ PACEMAKER-MIB::pacemakerNotificationDescription s "${CRM_alert_desc}" \ PACEMAKER-MIB::pacemakerNotificationStatus i ${CRM_alert_status} \ PACEMAKER-MIB::pacemakerNotificationReturnCode i ${CRM_alert_rc} \ PACEMAKER-MIB::pacemakerNotificationTargetReturnCode i ${CRM_alert_target_rc} \ ${hires_timestamp} ;; esac ;; *) ;; esac diff --git a/pengine/clone.c b/pengine/clone.c index fd47018298..74b4ea6fb7 100644 --- a/pengine/clone.c +++ b/pengine/clone.c @@ -1,1649 +1,1657 @@ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #define VARIANT_CLONE 1 #include gint sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set); static void append_parent_colocation(resource_t * rsc, resource_t * child, gboolean all); static gint sort_rsc_id(gconstpointer a, gconstpointer b) { const resource_t *resource1 = (const resource_t *)a; const resource_t *resource2 = (const resource_t *)b; CRM_ASSERT(resource1 != NULL); CRM_ASSERT(resource2 != NULL); return strcmp(resource1->id, resource2->id); } static node_t * parent_node_instance(const resource_t * rsc, node_t * node) { node_t *ret = NULL; if (node != NULL) { ret = pe_hash_table_lookup(rsc->parent->allowed_nodes, node->details->id); } return ret; } static gboolean did_fail(const resource_t * rsc) { GListPtr gIter = rsc->children; if (is_set(rsc->flags, pe_rsc_failed)) { return TRUE; } for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; if (did_fail(child_rsc)) { return TRUE; } } return FALSE; } gint sort_clone_instance(gconstpointer a, gconstpointer b, gpointer data_set) { int rc = 0; node_t *node1 = NULL; node_t *node2 = NULL; gboolean can1 = TRUE; gboolean can2 = TRUE; const resource_t *resource1 = (const resource_t *)a; const resource_t *resource2 = (const resource_t *)b; CRM_ASSERT(resource1 != NULL); CRM_ASSERT(resource2 != NULL); /* allocation order: * - active instances * - instances running on nodes with the least copies * - active instances on nodes that can't support them or are to be fenced * - failed instances * - inactive instances */ if (resource1->running_on && resource2->running_on) { if (g_list_length(resource1->running_on) < g_list_length(resource2->running_on)) { crm_trace("%s < %s: running_on", resource1->id, resource2->id); return -1; } else if (g_list_length(resource1->running_on) > g_list_length(resource2->running_on)) { crm_trace("%s > %s: running_on", resource1->id, resource2->id); return 1; } } if (resource1->running_on) { node1 = resource1->running_on->data; } if (resource2->running_on) { node2 = resource2->running_on->data; } if (node1) { node_t *match = pe_hash_table_lookup(resource1->allowed_nodes, node1->details->id); if (match == NULL || match->weight < 0) { crm_trace("%s: current location is unavailable", resource1->id); node1 = NULL; can1 = FALSE; } } if (node2) { node_t *match = pe_hash_table_lookup(resource2->allowed_nodes, node2->details->id); if (match == NULL || match->weight < 0) { crm_trace("%s: current location is unavailable", resource2->id); node2 = NULL; can2 = FALSE; } } if (can1 != can2) { if (can1) { crm_trace("%s < %s: availability of current location", resource1->id, resource2->id); return -1; } crm_trace("%s > %s: availability of current location", resource1->id, resource2->id); return 1; } if (resource1->priority < resource2->priority) { crm_trace("%s < %s: priority", resource1->id, resource2->id); return 1; } else if (resource1->priority > resource2->priority) { crm_trace("%s > %s: priority", resource1->id, resource2->id); return -1; } if (node1 == NULL && node2 == NULL) { crm_trace("%s == %s: not active", resource1->id, resource2->id); return 0; } if (node1 != node2) { if (node1 == NULL) { crm_trace("%s > %s: active", resource1->id, resource2->id); return 1; } else if (node2 == NULL) { crm_trace("%s < %s: active", resource1->id, resource2->id); return -1; } } can1 = can_run_resources(node1); can2 = can_run_resources(node2); if (can1 != can2) { if (can1) { crm_trace("%s < %s: can", resource1->id, resource2->id); return -1; } crm_trace("%s > %s: can", resource1->id, resource2->id); return 1; } node1 = parent_node_instance(resource1, node1); node2 = parent_node_instance(resource2, node2); if (node1 != NULL && node2 == NULL) { crm_trace("%s < %s: not allowed", resource1->id, resource2->id); return -1; } else if (node1 == NULL && node2 != NULL) { crm_trace("%s > %s: not allowed", resource1->id, resource2->id); return 1; } if (node1 == NULL || node2 == NULL) { crm_trace("%s == %s: not allowed", resource1->id, resource2->id); return 0; } if (node1->count < node2->count) { crm_trace("%s < %s: count", resource1->id, resource2->id); return -1; } else if (node1->count > node2->count) { crm_trace("%s > %s: count", resource1->id, resource2->id); return 1; } can1 = did_fail(resource1); can2 = did_fail(resource2); if (can1 != can2) { if (can1) { crm_trace("%s > %s: failed", resource1->id, resource2->id); return 1; } crm_trace("%s < %s: failed", resource1->id, resource2->id); return -1; } if (node1 && node2) { int lpc = 0; int max = 0; node_t *n = NULL; GListPtr gIter = NULL; GListPtr list1 = NULL; GListPtr list2 = NULL; GHashTable *hash1 = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, g_hash_destroy_str); GHashTable *hash2 = g_hash_table_new_full(crm_str_hash, g_str_equal, NULL, g_hash_destroy_str); n = node_copy(resource1->running_on->data); g_hash_table_insert(hash1, (gpointer) n->details->id, n); n = node_copy(resource2->running_on->data); g_hash_table_insert(hash2, (gpointer) n->details->id, n); for (gIter = resource1->parent->rsc_cons; gIter; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource1->id); hash1 = native_merge_weights(constraint->rsc_rh, resource1->id, hash1, constraint->node_attribute, (float)constraint->score / INFINITY, 0); } for (gIter = resource1->parent->rsc_cons_lhs; gIter; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource1->id); hash1 = native_merge_weights(constraint->rsc_lh, resource1->id, hash1, constraint->node_attribute, (float)constraint->score / INFINITY, pe_weights_positive); } for (gIter = resource2->parent->rsc_cons; gIter; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource2->id); hash2 = native_merge_weights(constraint->rsc_rh, resource2->id, hash2, constraint->node_attribute, (float)constraint->score / INFINITY, 0); } for (gIter = resource2->parent->rsc_cons_lhs; gIter; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; crm_trace("Applying %s to %s", constraint->id, resource2->id); hash2 = native_merge_weights(constraint->rsc_lh, resource2->id, hash2, constraint->node_attribute, (float)constraint->score / INFINITY, pe_weights_positive); } /* Current location score */ node1 = g_list_nth_data(resource1->running_on, 0); node1 = g_hash_table_lookup(hash1, node1->details->id); node2 = g_list_nth_data(resource2->running_on, 0); node2 = g_hash_table_lookup(hash2, node2->details->id); if (node1->weight < node2->weight) { if (node1->weight < 0) { crm_trace("%s > %s: current score", resource1->id, resource2->id); rc = -1; goto out; } else { crm_trace("%s < %s: current score", resource1->id, resource2->id); rc = 1; goto out; } } else if (node1->weight > node2->weight) { crm_trace("%s > %s: current score", resource1->id, resource2->id); rc = -1; goto out; } /* All location scores */ list1 = g_hash_table_get_values(hash1); list2 = g_hash_table_get_values(hash2); list1 = g_list_sort_with_data(list1, sort_node_weight, g_list_nth_data(resource1->running_on, 0)); list2 = g_list_sort_with_data(list2, sort_node_weight, g_list_nth_data(resource2->running_on, 0)); max = g_list_length(list1); if (max < g_list_length(list2)) { max = g_list_length(list2); } for (; lpc < max; lpc++) { node1 = g_list_nth_data(list1, lpc); node2 = g_list_nth_data(list2, lpc); if (node1 == NULL) { crm_trace("%s < %s: colocated score NULL", resource1->id, resource2->id); rc = 1; break; } else if (node2 == NULL) { crm_trace("%s > %s: colocated score NULL", resource1->id, resource2->id); rc = -1; break; } if (node1->weight < node2->weight) { crm_trace("%s < %s: colocated score", resource1->id, resource2->id); rc = 1; break; } else if (node1->weight > node2->weight) { crm_trace("%s > %s: colocated score", resource1->id, resource2->id); rc = -1; break; } } /* Order by reverse uname - same as sort_node_weight() does? */ out: g_hash_table_destroy(hash1); /* Free mem */ g_hash_table_destroy(hash2); /* Free mem */ g_list_free(list1); g_list_free(list2); if (rc != 0) { return rc; } } rc = strcmp(resource1->id, resource2->id); crm_trace("%s %c %s: default", resource1->id, rc < 0 ? '<' : '>', resource2->id); return rc; } static node_t * can_run_instance(resource_t * rsc, node_t * node) { node_t *local_node = NULL; clone_variant_data_t *clone_data = NULL; if (can_run_resources(node) == FALSE) { goto bail; } else if (is_set(rsc->flags, pe_rsc_orphan)) { goto bail; } local_node = parent_node_instance(rsc, node); get_clone_variant_data(clone_data, rsc->parent); if (local_node == NULL) { crm_warn("%s cannot run on %s: node not allowed", rsc->id, node->details->uname); goto bail; } else if (local_node->weight < 0) { common_update_score(rsc, node->details->id, local_node->weight); pe_rsc_trace(rsc, "%s cannot run on %s: Parent node weight doesn't allow it.", rsc->id, node->details->uname); } else if (local_node->count < clone_data->clone_node_max) { pe_rsc_trace(rsc, "%s can run on %s: %d", rsc->id, node->details->uname, local_node->count); return local_node; } else { pe_rsc_trace(rsc, "%s cannot run on %s: node full (%d >= %d)", rsc->id, node->details->uname, local_node->count, clone_data->clone_node_max); } bail: if (node) { common_update_score(rsc, node->details->id, -INFINITY); } return NULL; } static node_t * color_instance(resource_t * rsc, node_t * prefer, gboolean all_coloc, pe_working_set_t * data_set) { node_t *chosen = NULL; node_t *local_node = NULL; GHashTable *backup = NULL; CRM_ASSERT(rsc); pe_rsc_trace(rsc, "Processing %s %d", rsc->id, all_coloc); if (is_not_set(rsc->flags, pe_rsc_provisional)) { return rsc->fns->location(rsc, NULL, FALSE); } else if (is_set(rsc->flags, pe_rsc_allocating)) { pe_rsc_debug(rsc, "Dependency loop detected involving %s", rsc->id); return NULL; } /* Only include positive colocation preferences of dependent resources * if not every node will get a copy of the clone */ append_parent_colocation(rsc->parent, rsc, all_coloc); if (prefer) { node_t *local_prefer = g_hash_table_lookup(rsc->allowed_nodes, prefer->details->id); if (local_prefer == NULL || local_prefer->weight < 0) { pe_rsc_trace(rsc, "Not pre-allocating %s to %s - unavailable", rsc->id, prefer->details->uname); return NULL; } } if (rsc->allowed_nodes) { GHashTableIter iter; node_t *try_node = NULL; g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&try_node)) { can_run_instance(rsc, try_node); } } backup = node_hash_dup(rsc->allowed_nodes); chosen = rsc->cmds->allocate(rsc, prefer, data_set); if (chosen) { local_node = pe_hash_table_lookup(rsc->parent->allowed_nodes, chosen->details->id); if (prefer && chosen && chosen->details != prefer->details) { crm_notice("Pre-allocation failed: got %s instead of %s", chosen->details->uname, prefer->details->uname); g_hash_table_destroy(rsc->allowed_nodes); rsc->allowed_nodes = backup; native_deallocate(rsc); chosen = NULL; backup = NULL; } else if (local_node) { local_node->count++; } else if (is_set(rsc->flags, pe_rsc_managed)) { /* what to do? we can't enforce per-node limits in this case */ crm_config_err("%s not found in %s (list=%d)", chosen->details->id, rsc->parent->id, g_hash_table_size(rsc->parent->allowed_nodes)); } } if(backup) { g_hash_table_destroy(backup); } return chosen; } static void append_parent_colocation(resource_t * rsc, resource_t * child, gboolean all) { GListPtr gIter = NULL; gIter = rsc->rsc_cons; for (; gIter != NULL; gIter = gIter->next) { rsc_colocation_t *cons = (rsc_colocation_t *) gIter->data; if (all || cons->score < 0 || cons->score == INFINITY) { child->rsc_cons = g_list_prepend(child->rsc_cons, cons); } } gIter = rsc->rsc_cons_lhs; for (; gIter != NULL; gIter = gIter->next) { rsc_colocation_t *cons = (rsc_colocation_t *) gIter->data; if (all || cons->score < 0) { child->rsc_cons_lhs = g_list_prepend(child->rsc_cons_lhs, cons); } } } node_t * clone_color(resource_t * rsc, node_t * prefer, pe_working_set_t * data_set) { GHashTableIter iter; GListPtr nIter = NULL; GListPtr gIter = NULL; GListPtr nodes = NULL; node_t *node = NULL; int allocated = 0; int loop_max = 0; int clone_max = 0; int available_nodes = 0; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); if (is_not_set(rsc->flags, pe_rsc_provisional)) { return NULL; } else if (is_set(rsc->flags, pe_rsc_allocating)) { pe_rsc_debug(rsc, "Dependency loop detected involving %s", rsc->id); return NULL; } set_bit(rsc->flags, pe_rsc_allocating); pe_rsc_trace(rsc, "Processing %s", rsc->id); /* this information is used by sort_clone_instance() when deciding in which * order to allocate clone instances */ gIter = rsc->rsc_cons; for (; gIter != NULL; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; pe_rsc_trace(rsc, "%s: Coloring %s first", rsc->id, constraint->rsc_rh->id); constraint->rsc_rh->cmds->allocate(constraint->rsc_rh, prefer, data_set); } gIter = rsc->rsc_cons_lhs; for (; gIter != NULL; gIter = gIter->next) { rsc_colocation_t *constraint = (rsc_colocation_t *) gIter->data; rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights(constraint->rsc_lh, rsc->id, rsc->allowed_nodes, constraint->node_attribute, (float)constraint->score / INFINITY, (pe_weights_rollback | pe_weights_positive)); } dump_node_scores(show_scores ? 0 : scores_log_level, rsc, __FUNCTION__, rsc->allowed_nodes); /* count now tracks the number of clones currently allocated */ g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { node->count = 0; if (can_run_resources(node)) { available_nodes++; } } clone_max = clone_data->clone_max; if(available_nodes) { loop_max = clone_data->clone_max / available_nodes; } if (loop_max < 1) { loop_max = 1; } rsc->children = g_list_sort_with_data(rsc->children, sort_clone_instance, data_set); /* Pre-allocate as many instances as we can to their current location * First pre-sort the list of nodes by their placement score */ nodes = g_hash_table_get_values(rsc->allowed_nodes); nodes = g_list_sort_with_data(nodes, sort_node_weight, NULL); for(nIter = nodes; nIter; nIter = nIter->next) { int lpc; node = nIter->data; if(clone_max <= 0) { break; } if (can_run_resources(node) == FALSE || node->weight < 0) { pe_rsc_trace(rsc, "Not Pre-allocatiing %s", node->details->uname); continue; } clone_max--; pe_rsc_trace(rsc, "Pre-allocating %s (%d remaining)", node->details->uname, clone_max); for (lpc = 0; allocated < clone_data->clone_max && node->count < clone_data->clone_node_max && lpc < clone_data->clone_node_max && lpc < loop_max; lpc++) { for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; if (child->running_on && is_set(child->flags, pe_rsc_provisional) && is_not_set(child->flags, pe_rsc_failed)) { node_t *child_node = child->running_on->data; if (child_node->details == node->details && color_instance(child, node, clone_data->clone_max < available_nodes, data_set)) { pe_rsc_trace(rsc, "Pre-allocated %s to %s", child->id, node->details->uname); allocated++; break; } } } } } pe_rsc_trace(rsc, "Done pre-allocating (%d of %d)", allocated, clone_data->clone_max); g_list_free(nodes); for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; if (g_list_length(child->running_on) > 0) { node_t *child_node = child->running_on->data; node_t *local_node = parent_node_instance(child, child->running_on->data); if (local_node == NULL) { crm_err("%s is running on %s which isn't allowed", child->id, child_node->details->uname); } } if (is_not_set(child->flags, pe_rsc_provisional)) { } else if (allocated >= clone_data->clone_max) { pe_rsc_debug(rsc, "Child %s not allocated - limit reached", child->id); resource_location(child, NULL, -INFINITY, "clone_color:limit_reached", data_set); } else if (color_instance(child, NULL, clone_data->clone_max < available_nodes, data_set)) { allocated++; } } pe_rsc_debug(rsc, "Allocated %d %s instances of a possible %d", allocated, rsc->id, clone_data->clone_max); clear_bit(rsc->flags, pe_rsc_provisional); clear_bit(rsc->flags, pe_rsc_allocating); pe_rsc_trace(rsc, "Done allocating %s", rsc->id); return NULL; } static void clone_update_pseudo_status(resource_t * rsc, gboolean * stopping, gboolean * starting, gboolean * active) { GListPtr gIter = NULL; if (rsc->children) { gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; clone_update_pseudo_status(child, stopping, starting, active); } return; } CRM_ASSERT(active != NULL); CRM_ASSERT(starting != NULL); CRM_ASSERT(stopping != NULL); if (rsc->running_on) { *active = TRUE; } gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *action = (action_t *) gIter->data; if (*starting && *stopping) { return; } else if (is_set(action->flags, pe_action_optional)) { pe_rsc_trace(rsc, "Skipping optional: %s", action->uuid); continue; } else if (is_set(action->flags, pe_action_pseudo) == FALSE && is_set(action->flags, pe_action_runnable) == FALSE) { pe_rsc_trace(rsc, "Skipping unrunnable: %s", action->uuid); continue; } else if (safe_str_eq(RSC_STOP, action->task)) { pe_rsc_trace(rsc, "Stopping due to: %s", action->uuid); *stopping = TRUE; } else if (safe_str_eq(RSC_START, action->task)) { if (is_set(action->flags, pe_action_runnable) == FALSE) { pe_rsc_trace(rsc, "Skipping pseudo-op: %s run=%d, pseudo=%d", action->uuid, is_set(action->flags, pe_action_runnable), is_set(action->flags, pe_action_pseudo)); } else { pe_rsc_trace(rsc, "Starting due to: %s", action->uuid); pe_rsc_trace(rsc, "%s run=%d, pseudo=%d", action->uuid, is_set(action->flags, pe_action_runnable), is_set(action->flags, pe_action_pseudo)); *starting = TRUE; } } } } static action_t * find_rsc_action(resource_t * rsc, const char *key, gboolean active_only, GListPtr * list) { action_t *match = NULL; GListPtr possible = NULL; GListPtr active = NULL; possible = find_actions(rsc->actions, key, NULL); if (active_only) { GListPtr gIter = possible; for (; gIter != NULL; gIter = gIter->next) { action_t *op = (action_t *) gIter->data; if (is_set(op->flags, pe_action_optional) == FALSE) { active = g_list_prepend(active, op); } } if (active && g_list_length(active) == 1) { match = g_list_nth_data(active, 0); } if (list) { *list = active; active = NULL; } } else if (possible && g_list_length(possible) == 1) { match = g_list_nth_data(possible, 0); } if (list) { *list = possible; possible = NULL; } if (possible) { g_list_free(possible); } if (active) { g_list_free(active); } return match; } static void child_ordering_constraints(resource_t * rsc, pe_working_set_t * data_set) { char *key = NULL; action_t *stop = NULL; action_t *start = NULL; action_t *last_stop = NULL; action_t *last_start = NULL; GListPtr gIter = NULL; gboolean active_only = TRUE; /* change to false to get the old behavior */ clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); if (clone_data->ordered == FALSE) { return; } /* we have to maintain a consistent sorted child list when building order constraints */ rsc->children = g_list_sort(rsc->children, sort_rsc_id); for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; key = stop_key(child); stop = find_rsc_action(child, key, active_only, NULL); free(key); key = start_key(child); start = find_rsc_action(child, key, active_only, NULL); free(key); if (stop) { if (last_stop) { /* child/child relative stop */ order_actions(stop, last_stop, pe_order_optional); } last_stop = stop; } if (start) { if (last_start) { /* child/child relative start */ order_actions(last_start, start, pe_order_optional); } last_start = start; } } } void clone_create_actions(resource_t * rsc, pe_working_set_t * data_set) { gboolean child_active = FALSE; gboolean child_starting = FALSE; gboolean child_stopping = FALSE; gboolean allow_dependent_migrations = TRUE; action_t *stop = NULL; action_t *stopped = NULL; action_t *start = NULL; action_t *started = NULL; GListPtr gIter = rsc->children; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); pe_rsc_trace(rsc, "Creating actions for %s", rsc->id); for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; gboolean starting = FALSE; gboolean stopping = FALSE; child_rsc->cmds->create_actions(child_rsc, data_set); clone_update_pseudo_status(child_rsc, &stopping, &starting, &child_active); if (stopping && starting) { allow_dependent_migrations = FALSE; } child_stopping |= stopping; child_starting |= starting; } /* start */ start = start_action(rsc, NULL, !child_starting); started = custom_action(rsc, started_key(rsc), RSC_STARTED, NULL, !child_starting, TRUE, data_set); update_action_flags(start, pe_action_pseudo | pe_action_runnable); update_action_flags(started, pe_action_pseudo); started->priority = INFINITY; if (child_active || child_starting) { update_action_flags(started, pe_action_runnable); } child_ordering_constraints(rsc, data_set); if (clone_data->start_notify == NULL) { clone_data->start_notify = create_notification_boundaries(rsc, RSC_START, start, started, data_set); } /* stop */ stop = stop_action(rsc, NULL, !child_stopping); stopped = custom_action(rsc, stopped_key(rsc), RSC_STOPPED, NULL, !child_stopping, TRUE, data_set); stopped->priority = INFINITY; update_action_flags(stop, pe_action_pseudo | pe_action_runnable); if (allow_dependent_migrations) { update_action_flags(stop, pe_action_migrate_runnable); } update_action_flags(stopped, pe_action_pseudo | pe_action_runnable); if (clone_data->stop_notify == NULL) { clone_data->stop_notify = create_notification_boundaries(rsc, RSC_STOP, stop, stopped, data_set); if (clone_data->stop_notify && clone_data->start_notify) { order_actions(clone_data->stop_notify->post_done, clone_data->start_notify->pre, pe_order_optional); } } } void clone_internal_constraints(resource_t * rsc, pe_working_set_t * data_set) { resource_t *last_rsc = NULL; GListPtr gIter; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); pe_rsc_trace(rsc, "Internal constraints for %s", rsc->id); new_rsc_order(rsc, RSC_STOPPED, rsc, RSC_START, pe_order_optional, data_set); new_rsc_order(rsc, RSC_START, rsc, RSC_STARTED, pe_order_runnable_left, data_set); new_rsc_order(rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_runnable_left, data_set); if (rsc->variant == pe_master) { new_rsc_order(rsc, RSC_DEMOTED, rsc, RSC_STOP, pe_order_optional, data_set); new_rsc_order(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_runnable_left, data_set); } if (clone_data->ordered) { /* we have to maintain a consistent sorted child list when building order constraints */ rsc->children = g_list_sort(rsc->children, sort_rsc_id); } for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; child_rsc->cmds->internal_constraints(child_rsc, data_set); order_start_start(rsc, child_rsc, pe_order_runnable_left | pe_order_implies_first_printed); new_rsc_order(child_rsc, RSC_START, rsc, RSC_STARTED, pe_order_implies_then_printed, data_set); if (clone_data->ordered && last_rsc) { order_start_start(last_rsc, child_rsc, pe_order_optional); } order_stop_stop(rsc, child_rsc, pe_order_implies_first_printed); new_rsc_order(child_rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_implies_then_printed, data_set); if (clone_data->ordered && last_rsc) { order_stop_stop(child_rsc, last_rsc, pe_order_optional); } last_rsc = child_rsc; } } -static void +static bool assign_node(resource_t * rsc, node_t * node, gboolean force) { + bool changed = FALSE; + if (rsc->children) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; - native_assign_node(child_rsc, NULL, node, force); + changed |= native_assign_node(child_rsc, NULL, node, force); } - return; + return changed; + } + if (rsc->allocated_to != NULL) { + changed = true; } + native_assign_node(rsc, NULL, node, force); + return changed; } static resource_t * find_compatible_child_by_node(resource_t * local_child, node_t * local_node, resource_t * rsc, enum rsc_role_e filter, gboolean current) { node_t *node = NULL; GListPtr gIter = NULL; if (local_node == NULL) { crm_err("Can't colocate unrunnable child %s with %s", local_child->id, rsc->id); return NULL; } crm_trace("Looking for compatible child from %s for %s on %s", local_child->id, rsc->id, local_node->details->uname); gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, current); if (is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) { /* We only want instances that haven't failed */ node = child_rsc->fns->location(child_rsc, NULL, current); } if (filter != RSC_ROLE_UNKNOWN && next_role != filter) { crm_trace("Filtered %s", child_rsc->id); continue; } if (node && local_node && node->details == local_node->details) { crm_trace("Pairing %s with %s on %s", local_child->id, child_rsc->id, node->details->uname); return child_rsc; } else if (node) { crm_trace("%s - %s vs %s", child_rsc->id, node->details->uname, local_node->details->uname); } else { crm_trace("%s - not allocated %d", child_rsc->id, current); } } crm_trace("Can't pair %s with %s", local_child->id, rsc->id); return NULL; } resource_t * find_compatible_child(resource_t * local_child, resource_t * rsc, enum rsc_role_e filter, gboolean current) { resource_t *pair = NULL; GListPtr gIter = NULL; GListPtr scratch = NULL; node_t *local_node = NULL; local_node = local_child->fns->location(local_child, NULL, current); if (local_node) { return find_compatible_child_by_node(local_child, local_node, rsc, filter, current); } scratch = g_hash_table_get_values(local_child->allowed_nodes); scratch = g_list_sort_with_data(scratch, sort_node_weight, NULL); gIter = scratch; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; pair = find_compatible_child_by_node(local_child, node, rsc, filter, current); if (pair) { goto done; } } pe_rsc_debug(rsc, "Can't pair %s with %s", local_child->id, rsc->id); done: g_list_free(scratch); return pair; } void clone_rsc_colocation_lh(resource_t * rsc_lh, resource_t * rsc_rh, rsc_colocation_t * constraint) { /* -- Never called -- * * Instead we add the colocation constraints to the child and call from there */ GListPtr gIter = rsc_lh->children; CRM_CHECK(FALSE, crm_err("This functionality is not thought to be used. Please report a bug.")); CRM_CHECK(rsc_lh, return); CRM_CHECK(rsc_rh, return); for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; child_rsc->cmds->rsc_colocation_lh(child_rsc, rsc_rh, constraint); } return; } void clone_rsc_colocation_rh(resource_t * rsc_lh, resource_t * rsc_rh, rsc_colocation_t * constraint) { GListPtr gIter = NULL; gboolean do_interleave = FALSE; clone_variant_data_t *clone_data = NULL; clone_variant_data_t *clone_data_lh = NULL; CRM_CHECK(constraint != NULL, return); CRM_CHECK(rsc_lh != NULL, pe_err("rsc_lh was NULL for %s", constraint->id); return); CRM_CHECK(rsc_rh != NULL, pe_err("rsc_rh was NULL for %s", constraint->id); return); CRM_CHECK(rsc_lh->variant == pe_native, return); get_clone_variant_data(clone_data, constraint->rsc_rh); pe_rsc_trace(rsc_rh, "Processing constraint %s: %s -> %s %d", constraint->id, rsc_lh->id, rsc_rh->id, constraint->score); if (constraint->rsc_lh->variant >= pe_clone) { get_clone_variant_data(clone_data_lh, constraint->rsc_lh); if (clone_data_lh->interleave && clone_data->clone_node_max != clone_data_lh->clone_node_max) { crm_config_err("Cannot interleave " XML_CIB_TAG_INCARNATION " %s and %s because" " they do not support the same number of" " resources per node", constraint->rsc_lh->id, constraint->rsc_rh->id); /* only the LHS side needs to be labeled as interleave */ } else if (clone_data_lh->interleave) { do_interleave = TRUE; } } if (is_set(rsc_rh->flags, pe_rsc_provisional)) { pe_rsc_trace(rsc_rh, "%s is still provisional", rsc_rh->id); return; } else if (do_interleave) { resource_t *rh_child = NULL; rh_child = find_compatible_child(rsc_lh, rsc_rh, RSC_ROLE_UNKNOWN, FALSE); if (rh_child) { pe_rsc_debug(rsc_rh, "Pairing %s with %s", rsc_lh->id, rh_child->id); rsc_lh->cmds->rsc_colocation_lh(rsc_lh, rh_child, constraint); } else if (constraint->score >= INFINITY) { crm_notice("Cannot pair %s with instance of %s", rsc_lh->id, rsc_rh->id); assign_node(rsc_lh, NULL, TRUE); } else { pe_rsc_debug(rsc_rh, "Cannot pair %s with instance of %s", rsc_lh->id, rsc_rh->id); } return; } else if (constraint->score >= INFINITY) { GListPtr rhs = NULL; gIter = rsc_rh->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE); if (chosen != NULL && is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) { rhs = g_list_prepend(rhs, chosen); } } node_list_exclude(rsc_lh->allowed_nodes, rhs, FALSE); g_list_free(rhs); return; } gIter = rsc_rh->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; child_rsc->cmds->rsc_colocation_rh(rsc_lh, child_rsc, constraint); } } static enum action_tasks clone_child_action(action_t * action) { enum action_tasks result = no_action; resource_t *child = (resource_t *) action->rsc->children->data; if (safe_str_eq(action->task, "notify") || safe_str_eq(action->task, "notified")) { /* Find the action we're notifying about instead */ int stop = 0; char *key = action->uuid; int lpc = strlen(key); for (; lpc > 0; lpc--) { if (key[lpc] == '_' && stop == 0) { stop = lpc; } else if (key[lpc] == '_') { char *task_mutable = NULL; lpc++; task_mutable = strdup(key + lpc); task_mutable[stop - lpc] = 0; crm_trace("Extracted action '%s' from '%s'", task_mutable, key); result = get_complex_task(child, task_mutable, TRUE); free(task_mutable); break; } } } else { result = get_complex_task(child, action->task, TRUE); } return result; } enum pe_action_flags clone_action_flags(action_t * action, node_t * node) { GListPtr gIter = NULL; gboolean any_runnable = FALSE; gboolean check_runnable = TRUE; enum action_tasks task = clone_child_action(action); enum pe_action_flags flags = (pe_action_optional | pe_action_runnable | pe_action_pseudo); const char *task_s = task2text(task); gIter = action->rsc->children; for (; gIter != NULL; gIter = gIter->next) { action_t *child_action = NULL; resource_t *child = (resource_t *) gIter->data; child_action = find_first_action(child->actions, NULL, task_s, child->children ? NULL : node); pe_rsc_trace(child, "Checking for %s in %s on %s", task_s, child->id, node ? node->details->uname : "none"); if (child_action) { enum pe_action_flags child_flags = child->cmds->action_flags(child_action, node); if (is_set(flags, pe_action_optional) && is_set(child_flags, pe_action_optional) == FALSE) { pe_rsc_trace(child, "%s is mandatory because of %s", action->uuid, child_action->uuid); flags = crm_clear_bit(__FUNCTION__, action->rsc->id, flags, pe_action_optional); pe_clear_action_bit(action, pe_action_optional); } if (is_set(child_flags, pe_action_runnable)) { any_runnable = TRUE; } } else { GListPtr gIter2 = child->actions; for (; gIter2 != NULL; gIter2 = gIter2->next) { action_t *op = (action_t *) gIter2->data; pe_rsc_trace(child, "%s on %s (%s)", op->uuid, op->node ? op->node->details->uname : "none", op->task); } } } if (check_runnable && any_runnable == FALSE) { pe_rsc_trace(action->rsc, "%s is not runnable because no children are", action->uuid); flags = crm_clear_bit(__FUNCTION__, action->rsc->id, flags, pe_action_runnable); if (node == NULL) { pe_clear_action_bit(action, pe_action_runnable); } } return flags; } static enum pe_graph_flags clone_update_actions_interleave(action_t * first, action_t * then, node_t * node, enum pe_action_flags flags, enum pe_action_flags filter, enum pe_ordering type) { gboolean current = FALSE; resource_t *first_child = NULL; GListPtr gIter = then->rsc->children; enum pe_graph_flags changed = pe_graph_none; /*pe_graph_disable */ enum action_tasks task = clone_child_action(first); const char *first_task = task2text(task); /* Fix this - lazy */ if (strstr(first->uuid, "_stopped_0") || strstr(first->uuid, "_demoted_0")) { current = TRUE; } for (; gIter != NULL; gIter = gIter->next) { resource_t *then_child = (resource_t *) gIter->data; CRM_ASSERT(then_child != NULL); first_child = find_compatible_child(then_child, first->rsc, RSC_ROLE_UNKNOWN, current); if (first_child == NULL && current) { crm_trace("Ignore"); } else if (first_child == NULL) { crm_debug("No match found for %s (%d / %s / %s)", then_child->id, current, first->uuid, then->uuid); /* Me no like this hack - but what else can we do? * * If there is no-one active or about to be active * on the same node as then_child, then they must * not be allowed to start */ if (type & (pe_order_runnable_left | pe_order_implies_then) /* Mandatory */ ) { pe_rsc_info(then->rsc, "Inhibiting %s from being active", then_child->id); - assign_node(then_child, NULL, TRUE); - /* TODO - set changed correctly? */ + if(assign_node(then_child, NULL, TRUE)) { + changed |= pe_graph_updated_then; + } } } else { action_t *first_action = NULL; action_t *then_action = NULL; pe_rsc_debug(then->rsc, "Pairing %s with %s", first_child->id, then_child->id); first_action = find_first_action(first_child->actions, NULL, first_task, node); then_action = find_first_action(then_child->actions, NULL, then->task, node); if (first_action == NULL) { if (is_not_set(first_child->flags, pe_rsc_orphan) && crm_str_eq(first_task, RSC_STOP, TRUE) == FALSE && crm_str_eq(first_task, RSC_DEMOTE, TRUE) == FALSE) { crm_err("Internal error: No action found for %s in %s (first)", first_task, first_child->id); } else { crm_trace("No action found for %s in %s%s (first)", first_task, first_child->id, is_set(first_child->flags, pe_rsc_orphan) ? " (ORPHAN)" : ""); } continue; } /* We're only interested if 'then' is neither stopping nor being demoted */ if (then_action == NULL) { if (is_not_set(then_child->flags, pe_rsc_orphan) && crm_str_eq(then->task, RSC_STOP, TRUE) == FALSE && crm_str_eq(then->task, RSC_DEMOTE, TRUE) == FALSE) { crm_err("Internal error: No action found for %s in %s (then)", then->task, then_child->id); } else { crm_trace("No action found for %s in %s%s (then)", then->task, then_child->id, is_set(then_child->flags, pe_rsc_orphan) ? " (ORPHAN)" : ""); } continue; } if (order_actions(first_action, then_action, type)) { crm_debug("Created constraint for %s -> %s", first_action->uuid, then_action->uuid); changed |= (pe_graph_updated_first | pe_graph_updated_then); } changed |= then_child->cmds->update_actions(first_action, then_action, node, first_child->cmds->action_flags(first_action, node), filter, type); } } return changed; } enum pe_graph_flags clone_update_actions(action_t * first, action_t * then, node_t * node, enum pe_action_flags flags, enum pe_action_flags filter, enum pe_ordering type) { const char *rsc = "none"; gboolean interleave = FALSE; enum pe_graph_flags changed = pe_graph_none; if (first->rsc != then->rsc && first->rsc && first->rsc->variant >= pe_clone && then->rsc && then->rsc->variant >= pe_clone) { clone_variant_data_t *clone_data = NULL; if (strstr(then->uuid, "_stop_0") || strstr(then->uuid, "_demote_0")) { get_clone_variant_data(clone_data, first->rsc); rsc = first->rsc->id; } else { get_clone_variant_data(clone_data, then->rsc); rsc = then->rsc->id; } interleave = clone_data->interleave; } crm_trace("Interleave %s -> %s: %s (based on %s)", first->uuid, then->uuid, interleave ? "yes" : "no", rsc); if (interleave) { changed = clone_update_actions_interleave(first, then, node, flags, filter, type); } else if (then->rsc) { GListPtr gIter = then->rsc->children; changed |= native_update_actions(first, then, node, flags, filter, type); for (; gIter != NULL; gIter = gIter->next) { enum pe_graph_flags child_changed = pe_graph_none; GListPtr lpc = NULL; resource_t *child = (resource_t *) gIter->data; action_t *child_action = find_first_action(child->actions, NULL, then->task, node); if (child_action) { enum pe_action_flags child_flags = child->cmds->action_flags(child_action, node); if (is_set(child_flags, pe_action_runnable)) { child_changed |= child->cmds->update_actions(first, child_action, node, flags, filter, type); } changed |= child_changed; if (child_changed & pe_graph_updated_then) { for (lpc = child_action->actions_after; lpc != NULL; lpc = lpc->next) { action_wrapper_t *other = (action_wrapper_t *) lpc->data; update_action(other->action); } } } } } return changed; } void clone_rsc_location(resource_t * rsc, rsc_to_node_t * constraint) { GListPtr gIter = rsc->children; pe_rsc_trace(rsc, "Processing location constraint %s for %s", constraint->id, rsc->id); native_rsc_location(rsc, constraint); for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; child_rsc->cmds->rsc_location(child_rsc, constraint); } } void clone_expand(resource_t * rsc, pe_working_set_t * data_set) { GListPtr gIter = NULL; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *op = (action_t *) gIter->data; rsc->cmds->action_flags(op, NULL); } if (clone_data->start_notify) { collect_notification_data(rsc, TRUE, TRUE, clone_data->start_notify); expand_notification_data(clone_data->start_notify, data_set); create_notifications(rsc, clone_data->start_notify, data_set); } if (clone_data->stop_notify) { collect_notification_data(rsc, TRUE, TRUE, clone_data->stop_notify); expand_notification_data(clone_data->stop_notify, data_set); create_notifications(rsc, clone_data->stop_notify, data_set); } if (clone_data->promote_notify) { collect_notification_data(rsc, TRUE, TRUE, clone_data->promote_notify); expand_notification_data(clone_data->promote_notify, data_set); create_notifications(rsc, clone_data->promote_notify, data_set); } if (clone_data->demote_notify) { collect_notification_data(rsc, TRUE, TRUE, clone_data->demote_notify); expand_notification_data(clone_data->demote_notify, data_set); create_notifications(rsc, clone_data->demote_notify, data_set); } /* Now that the notifcations have been created we can expand the children */ gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; child_rsc->cmds->expand(child_rsc, data_set); } native_expand(rsc, data_set); /* The notifications are in the graph now, we can destroy the notify_data */ free_notification_data(clone_data->demote_notify); clone_data->demote_notify = NULL; free_notification_data(clone_data->stop_notify); clone_data->stop_notify = NULL; free_notification_data(clone_data->start_notify); clone_data->start_notify = NULL; free_notification_data(clone_data->promote_notify); clone_data->promote_notify = NULL; } node_t * rsc_known_on(resource_t * rsc, GListPtr * list) { GListPtr gIter = NULL; node_t *one = NULL; GListPtr result = NULL; if (rsc->children) { gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; rsc_known_on(child, &result); } } else if (rsc->known_on) { result = g_hash_table_get_values(rsc->known_on); } if (result && g_list_length(result) == 1) { one = g_list_nth_data(result, 0); } if (list) { GListPtr gIter = NULL; gIter = result; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; if (*list == NULL || pe_find_node_id(*list, node->details->id) == NULL) { *list = g_list_prepend(*list, node); } } } g_list_free(result); return one; } static resource_t * find_instance_on(resource_t * rsc, node_t * node) { GListPtr gIter = NULL; gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { GListPtr gIter2 = NULL; GListPtr known_list = NULL; resource_t *child = (resource_t *) gIter->data; rsc_known_on(child, &known_list); gIter2 = known_list; for (; gIter2 != NULL; gIter2 = gIter2->next) { node_t *known = (node_t *) gIter2->data; if (node->details == known->details) { g_list_free(known_list); return child; } } g_list_free(known_list); } return NULL; } gboolean clone_create_probe(resource_t * rsc, node_t * node, action_t * complete, gboolean force, pe_working_set_t * data_set) { GListPtr gIter = NULL; gboolean any_created = FALSE; clone_variant_data_t *clone_data = NULL; CRM_ASSERT(rsc); get_clone_variant_data(clone_data, rsc); rsc->children = g_list_sort(rsc->children, sort_rsc_id); if (rsc->children == NULL) { pe_warn("Clone %s has no children", rsc->id); return FALSE; } if (rsc->exclusive_discover) { node_t *allowed = g_hash_table_lookup(rsc->allowed_nodes, node->details->id); if (allowed && allowed->rsc_discover_mode != discover_exclusive) { /* exclusive discover is enabled and this node is not marked * as a node this resource should be discovered on * * remove the node from allowed_nodes so that the * notification contains only nodes that we might ever run * on */ g_hash_table_remove(rsc->allowed_nodes, node->details->id); /* Bit of a shortcut - might as well take it */ return FALSE; } } if (is_not_set(rsc->flags, pe_rsc_unique) && clone_data->clone_node_max == 1) { /* only look for one copy */ resource_t *child = NULL; /* Try whoever we probed last time */ child = find_instance_on(rsc, node); if (child) { return child->cmds->create_probe(child, node, complete, force, data_set); } /* Try whoever we plan on starting there */ gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { node_t *local_node = NULL; resource_t *child_rsc = (resource_t *) gIter->data; CRM_ASSERT(child_rsc); local_node = child_rsc->fns->location(child_rsc, NULL, FALSE); if (local_node == NULL) { continue; } if (local_node->details == node->details) { return child_rsc->cmds->create_probe(child_rsc, node, complete, force, data_set); } } /* Fall back to the first clone instance */ CRM_ASSERT(rsc->children); child = rsc->children->data; return child->cmds->create_probe(child, node, complete, force, data_set); } gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; if (child_rsc->cmds->create_probe(child_rsc, node, complete, force, data_set)) { any_created = TRUE; } if (any_created && is_not_set(rsc->flags, pe_rsc_unique) && clone_data->clone_node_max == 1) { /* only look for one copy (clone :0) */ break; } } return any_created; } void clone_append_meta(resource_t * rsc, xmlNode * xml) { char *name = NULL; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); name = crm_meta_name(XML_RSC_ATTR_UNIQUE); crm_xml_add(xml, name, is_set(rsc->flags, pe_rsc_unique) ? "true" : "false"); free(name); name = crm_meta_name(XML_RSC_ATTR_NOTIFY); crm_xml_add(xml, name, is_set(rsc->flags, pe_rsc_notify) ? "true" : "false"); free(name); name = crm_meta_name(XML_RSC_ATTR_INCARNATION_MAX); crm_xml_add_int(xml, name, clone_data->clone_max); free(name); name = crm_meta_name(XML_RSC_ATTR_INCARNATION_NODEMAX); crm_xml_add_int(xml, name, clone_data->clone_node_max); free(name); } GHashTable * clone_merge_weights(resource_t * rsc, const char *rhs, GHashTable * nodes, const char *attr, float factor, enum pe_weights flags) { return rsc_merge_weights(rsc, rhs, nodes, attr, factor, flags); } diff --git a/pengine/regression.sh b/pengine/regression.sh index 8a2864caae..f86d0f1c0b 100755 --- a/pengine/regression.sh +++ b/pengine/regression.sh @@ -1,844 +1,845 @@ #!/bin/bash # Copyright (C) 2004 Andrew Beekhof # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # core=`dirname $0` . $core/regression.core.sh || exit 1 create_mode="true" info Generating test outputs for these tests... # do_test file description info Done. echo "" info Performing the following tests from $io_dir create_mode="false" echo "" do_test simple1 "Offline " do_test simple2 "Start " do_test simple3 "Start 2 " do_test simple4 "Start Failed" do_test simple6 "Stop Start " do_test simple7 "Shutdown " #do_test simple8 "Stonith " #do_test simple9 "Lower version" #do_test simple10 "Higher version" do_test simple11 "Priority (ne)" do_test simple12 "Priority (eq)" do_test simple8 "Stickiness" echo "" do_test group1 "Group " do_test group2 "Group + Native " do_test group3 "Group + Group " do_test group4 "Group + Native (nothing)" do_test group5 "Group + Native (move) " do_test group6 "Group + Group (move) " do_test group7 "Group colocation" do_test group13 "Group colocation (cant run)" do_test group8 "Group anti-colocation" do_test group9 "Group recovery" do_test group10 "Group partial recovery" do_test group11 "Group target_role" do_test group14 "Group stop (graph terminated)" do_test group15 "-ve group colocation" do_test bug-1573 "Partial stop of a group with two children" do_test bug-1718 "Mandatory group ordering - Stop group_FUN" do_test bug-lf-2613 "Move group on failure" do_test bug-lf-2619 "Move group on clone failure" do_test group-fail "Ensure stop order is preserved for partially active groups" do_test group-unmanaged "No need to restart r115 because r114 is unmanaged" do_test group-unmanaged-stopped "Make sure r115 is stopped when r114 fails" do_test group-dependents "Account for the location preferences of things colocated with a group" echo "" do_test rsc_dep1 "Must not " do_test rsc_dep3 "Must " do_test rsc_dep5 "Must not 3 " do_test rsc_dep7 "Must 3 " do_test rsc_dep10 "Must (but cant)" do_test rsc_dep2 "Must (running) " do_test rsc_dep8 "Must (running : alt) " do_test rsc_dep4 "Must (running + move)" do_test asymmetric "Asymmetric - require explicit location constraints" echo "" do_test orphan-0 "Orphan ignore" do_test orphan-1 "Orphan stop" do_test orphan-2 "Orphan stop, remove failcount" echo "" do_test params-0 "Params: No change" do_test params-1 "Params: Changed" do_test params-2 "Params: Resource definition" do_test params-4 "Params: Reload" do_test params-5 "Params: Restart based on probe digest" do_test novell-251689 "Resource definition change + target_role=stopped" do_test bug-lf-2106 "Restart all anonymous clone instances after config change" do_test params-6 "Params: Detect reload in previously migrated resource" do_test nvpair-id-ref "Support id-ref in nvpair with optional name" do_test not-reschedule-unneeded-monitor "Do not reschedule unneeded monitors while resource definitions have changed" echo "" do_test target-0 "Target Role : baseline" do_test target-1 "Target Role : master" do_test target-2 "Target Role : invalid" echo "" do_test base-score "Set a node's default score for all nodes" echo "" do_test date-1 "Dates" -t "2005-020" do_test date-2 "Date Spec - Pass" -t "2005-020T12:30" do_test date-3 "Date Spec - Fail" -t "2005-020T11:30" do_test origin "Timing of recurring operations" -t "2014-05-07 00:28:00" do_test probe-0 "Probe (anon clone)" do_test probe-1 "Pending Probe" do_test probe-2 "Correctly re-probe cloned groups" do_test probe-3 "Probe (pending node)" do_test probe-4 "Probe (pending node + stopped resource)" do_test standby "Standby" do_test comments "Comments" echo "" do_test one-or-more-0 "Everything starts" do_test one-or-more-1 "Nothing starts because of A" do_test one-or-more-2 "D can start because of C" do_test one-or-more-3 "D cannot start because of B and C" do_test one-or-more-4 "D cannot start because of target-role" do_test one-or-more-5 "Start A and F even though C and D are stopped" do_test one-or-more-6 "Leave A running even though B is stopped" do_test one-or-more-7 "Leave A running even though C is stopped" do_test bug-5140-require-all-false "Allow basegrp:0 to stop" do_test clone-require-all-1 "clone B starts node 3 and 4" do_test clone-require-all-2 "clone B remains stopped everywhere" do_test clone-require-all-3 "clone B stops everywhere because A stops everywhere" do_test clone-require-all-4 "clone B remains on node 3 and 4 with only one instance of A remaining." do_test clone-require-all-5 "clone B starts on node 1 3 and 4" do_test clone-require-all-6 "clone B remains active after shutting down instances of A" do_test clone-require-all-7 "clone A and B both start at the same time. all instances of A start before B." do_test clone-require-all-no-interleave-1 "C starts everywhere after A and B" do_test clone-require-all-no-interleave-2 "C starts on nodes 1, 2, and 4 with only one active instance of B" do_test clone-require-all-no-interleave-3 "C remains active when instance of B is stopped on one node and started on another." do_test one-or-more-unrunnnable-instances "Avoid dependencies on instances that wont ever be started" echo "" do_test order1 "Order start 1 " do_test order2 "Order start 2 " do_test order3 "Order stop " do_test order4 "Order (multiple) " do_test order5 "Order (move) " do_test order6 "Order (move w/ restart) " do_test order7 "Order (mandatory) " do_test order-optional "Order (score=0) " do_test order-required "Order (score=INFINITY) " do_test bug-lf-2171 "Prevent group start when clone is stopped" do_test order-clone "Clone ordering should be able to prevent startup of dependent clones" do_test order-sets "Ordering for resource sets" do_test order-serialize "Serialize resources without inhibiting migration" do_test order-serialize-set "Serialize a set of resources without inhibiting migration" do_test clone-order-primitive "Order clone start after a primitive" do_test clone-order-16instances "Verify ordering of 16 cloned resources" do_test order-optional-keyword "Order (optional keyword)" do_test order-mandatory "Order (mandatory keyword)" do_test bug-lf-2493 "Don't imply colocation requirements when applying ordering constraints with clones" do_test ordered-set-basic-startup "Constraint set with default order settings." do_test ordered-set-natural "Allow natural set ordering" do_test order-wrong-kind "Order (error)" echo "" do_test coloc-loop "Colocation - loop" do_test coloc-many-one "Colocation - many-to-one" do_test coloc-list "Colocation - many-to-one with list" do_test coloc-group "Colocation - groups" do_test coloc-slave-anti "Anti-colocation with slave shouldn't prevent master colocation" do_test coloc-attr "Colocation based on node attributes" do_test coloc-negative-group "Negative colocation with a group" do_test coloc-intra-set "Intra-set colocation" do_test bug-lf-2435 "Colocation sets with a negative score" do_test coloc-clone-stays-active "Ensure clones don't get stopped/demoted because a dependent must stop" do_test coloc_fp_logic "Verify floating point calculations in colocation are working" do_test colo_master_w_native "cl#5070 - Verify promotion order is affected when colocating master to native rsc." do_test colo_slave_w_native "cl#5070 - Verify promotion order is affected when colocating slave to native rsc." do_test anti-colocation-order "cl#5187 - Prevent resources in an anti-colocation from even temporarily running on a same node" do_test anti-colocation-master "Organize order of actions for master resources in anti-colocations" do_test anti-colocation-slave "Organize order of actions for slave resources in anti-colocations" do_test enforce-colo1 "Always enforce B with A INFINITY." do_test complex_enforce_colo "Always enforce B with A INFINITY. (make sure heat-engine stops)" echo "" do_test rsc-sets-seq-true "Resource Sets - sequential=false" do_test rsc-sets-seq-false "Resource Sets - sequential=true" do_test rsc-sets-clone "Resource Sets - Clone" do_test rsc-sets-master "Resource Sets - Master" do_test rsc-sets-clone-1 "Resource Sets - Clone (lf#2404)" #echo "" #do_test agent1 "version: lt (empty)" #do_test agent2 "version: eq " #do_test agent3 "version: gt " echo "" do_test attrs1 "string: eq (and) " do_test attrs2 "string: lt / gt (and)" do_test attrs3 "string: ne (or) " do_test attrs4 "string: exists " do_test attrs5 "string: not_exists " do_test attrs6 "is_dc: true " do_test attrs7 "is_dc: false " do_test attrs8 "score_attribute " do_test per-node-attrs "Per node resource parameters" echo "" do_test mon-rsc-1 "Schedule Monitor - start" do_test mon-rsc-2 "Schedule Monitor - move " do_test mon-rsc-3 "Schedule Monitor - pending start " do_test mon-rsc-4 "Schedule Monitor - move/pending start" echo "" do_test rec-rsc-0 "Resource Recover - no start " do_test rec-rsc-1 "Resource Recover - start " do_test rec-rsc-2 "Resource Recover - monitor " do_test rec-rsc-3 "Resource Recover - stop - ignore" do_test rec-rsc-4 "Resource Recover - stop - block " do_test rec-rsc-5 "Resource Recover - stop - fence " do_test rec-rsc-6 "Resource Recover - multiple - restart" do_test rec-rsc-7 "Resource Recover - multiple - stop " do_test rec-rsc-8 "Resource Recover - multiple - block " do_test rec-rsc-9 "Resource Recover - group/group" do_test monitor-recovery "on-fail=block + resource recovery detected by recurring monitor" do_test stop-failure-no-quorum "Stop failure without quorum" do_test stop-failure-no-fencing "Stop failure without fencing available" do_test stop-failure-with-fencing "Stop failure with fencing available" do_test multiple-active-block-group "Support of multiple-active=block for resource groups" do_test multiple-monitor-one-failed "Consider resource failed if any of the configured monitor operations failed" echo "" do_test quorum-1 "No quorum - ignore" do_test quorum-2 "No quorum - freeze" do_test quorum-3 "No quorum - stop " do_test quorum-4 "No quorum - start anyway" do_test quorum-5 "No quorum - start anyway (group)" do_test quorum-6 "No quorum - start anyway (clone)" do_test bug-cl-5212 "No promotion with no-quorum-policy=freeze" echo "" do_test rec-node-1 "Node Recover - Startup - no fence" do_test rec-node-2 "Node Recover - Startup - fence " do_test rec-node-3 "Node Recover - HA down - no fence" do_test rec-node-4 "Node Recover - HA down - fence " do_test rec-node-5 "Node Recover - CRM down - no fence" do_test rec-node-6 "Node Recover - CRM down - fence " do_test rec-node-7 "Node Recover - no quorum - ignore " do_test rec-node-8 "Node Recover - no quorum - freeze " do_test rec-node-9 "Node Recover - no quorum - stop " do_test rec-node-10 "Node Recover - no quorum - stop w/fence" do_test rec-node-11 "Node Recover - CRM down w/ group - fence " do_test rec-node-12 "Node Recover - nothing active - fence " do_test rec-node-13 "Node Recover - failed resource + shutdown - fence " do_test rec-node-15 "Node Recover - unknown lrm section" do_test rec-node-14 "Serialize all stonith's" echo "" do_test multi1 "Multiple Active (stop/start)" echo "" do_test migrate-begin "Normal migration" do_test migrate-success "Completed migration" do_test migrate-partial-1 "Completed migration, missing stop on source" do_test migrate-partial-2 "Successful migrate_to only" do_test migrate-partial-3 "Successful migrate_to only, target down" do_test migrate-partial-4 "Migrate from the correct host after migrate_to+migrate_from" do_test bug-5186-partial-migrate "Handle partial migration when src node loses membership" do_test migrate-fail-2 "Failed migrate_from" do_test migrate-fail-3 "Failed migrate_from + stop on source" do_test migrate-fail-4 "Failed migrate_from + stop on target - ideally we wouldn't need to re-stop on target" do_test migrate-fail-5 "Failed migrate_from + stop on source and target" do_test migrate-fail-6 "Failed migrate_to" do_test migrate-fail-7 "Failed migrate_to + stop on source" do_test migrate-fail-8 "Failed migrate_to + stop on target - ideally we wouldn't need to re-stop on target" do_test migrate-fail-9 "Failed migrate_to + stop on source and target" do_test migrate-stop "Migration in a stopping stack" do_test migrate-start "Migration in a starting stack" do_test migrate-stop_start "Migration in a restarting stack" do_test migrate-stop-complex "Migration in a complex stopping stack" do_test migrate-start-complex "Migration in a complex starting stack" do_test migrate-stop-start-complex "Migration in a complex moving stack" do_test migrate-shutdown "Order the post-migration 'stop' before node shutdown" do_test migrate-1 "Migrate (migrate)" do_test migrate-2 "Migrate (stable)" do_test migrate-3 "Migrate (failed migrate_to)" do_test migrate-4 "Migrate (failed migrate_from)" do_test novell-252693 "Migration in a stopping stack" do_test novell-252693-2 "Migration in a starting stack" do_test novell-252693-3 "Non-Migration in a starting and stopping stack" do_test bug-1820 "Migration in a group" do_test bug-1820-1 "Non-migration in a group" do_test migrate-5 "Primitive migration with a clone" do_test migrate-fencing "Migration after Fencing" do_test migrate-both-vms "Migrate two VMs that have no colocation" do_test 1-a-then-bm-move-b "Advanced migrate logic. A then B. migrate B." do_test 2-am-then-b-move-a "Advanced migrate logic, A then B, migrate A without stopping B" do_test 3-am-then-bm-both-migrate "Advanced migrate logic. A then B. migrate both" do_test 4-am-then-bm-b-not-migratable "Advanced migrate logic, A then B, B not migratable" do_test 5-am-then-bm-a-not-migratable "Advanced migrate logic. A then B. move both, a not migratable" do_test 6-migrate-group "Advanced migrate logic, migrate a group" do_test 7-migrate-group-one-unmigratable "Advanced migrate logic, migrate group mixed with allow-migrate true/false" do_test 8-am-then-bm-a-migrating-b-stopping "Advanced migrate logic, A then B, A migrating, B stopping" do_test 9-am-then-bm-b-migrating-a-stopping "Advanced migrate logic, A then B, B migrate, A stopping" do_test 10-a-then-bm-b-move-a-clone "Advanced migrate logic, A clone then B, migrate B while stopping A" do_test 11-a-then-bm-b-move-a-clone-starting "Advanced migrate logic, A clone then B, B moving while A is start/stopping" do_test a-promote-then-b-migrate "A promote then B start. migrate B" do_test a-demote-then-b-migrate "A demote then B stop. migrate B" #echo "" #do_test complex1 "Complex " do_test bug-lf-2422 "Dependency on partially active group - stop ocfs:*" echo "" do_test clone-anon-probe-1 "Probe the correct (anonymous) clone instance for each node" do_test clone-anon-probe-2 "Avoid needless re-probing of anonymous clones" do_test clone-anon-failcount "Merge failcounts for anonymous clones" do_test inc0 "Incarnation start" do_test inc1 "Incarnation start order" do_test inc2 "Incarnation silent restart, stop, move" do_test inc3 "Inter-incarnation ordering, silent restart, stop, move" do_test inc4 "Inter-incarnation ordering, silent restart, stop, move (ordered)" do_test inc5 "Inter-incarnation ordering, silent restart, stop, move (restart 1)" do_test inc6 "Inter-incarnation ordering, silent restart, stop, move (restart 2)" do_test inc7 "Clone colocation" do_test inc8 "Clone anti-colocation" do_test inc9 "Non-unique clone" do_test inc10 "Non-unique clone (stop)" do_test inc11 "Primitive colocation with clones" do_test inc12 "Clone shutdown" do_test cloned-group "Make sure only the correct number of cloned groups are started" do_test cloned-group-stop "Ensure stopping qpidd also stops glance and cinder" do_test clone-no-shuffle "Don't prioritize allocation of instances that must be moved" do_test clone-max-zero "Orphan processing with clone-max=0" do_test clone-anon-dup "Bug LF#2087 - Correctly parse the state of anonymous clones that are active more than once per node" do_test bug-lf-2160 "Don't shuffle clones due to colocation" do_test bug-lf-2213 "clone-node-max enforcement for cloned groups" do_test bug-lf-2153 "Clone ordering constraints" do_test bug-lf-2361 "Ensure clones observe mandatory ordering constraints if the LHS is unrunnable" do_test bug-lf-2317 "Avoid needless restart of primitive depending on a clone" do_test clone-colocate-instance-1 "Colocation with a specific clone instance (negative example)" do_test clone-colocate-instance-2 "Colocation with a specific clone instance" do_test clone-order-instance "Ordering with specific clone instances" do_test bug-lf-2453 "Enforce mandatory clone ordering without colocation" do_test bug-lf-2508 "Correctly reconstruct the status of anonymous cloned groups" do_test bug-lf-2544 "Balanced clone placement" do_test bug-lf-2445 "Redistribute clones with node-max > 1 and stickiness = 0" do_test bug-lf-2574 "Avoid clone shuffle" do_test bug-lf-2581 "Avoid group restart due to unrelated clone (re)start" do_test bug-cl-5168 "Don't shuffle clones" do_test bug-cl-5170 "Prevent clone from starting with on-fail=block" do_test clone-fail-block-colocation "Move colocated group when failed clone has on-fail=block" do_test clone-interleave-1 "Clone-3 cannot start on pcmk-1 due to interleaved ordering (no colocation)" do_test clone-interleave-2 "Clone-3 must stop on pcmk-1 due to interleaved ordering (no colocation)" do_test clone-interleave-3 "Clone-3 must be recovered on pcmk-1 due to interleaved ordering (no colocation)" echo "" do_test cloned_start_one "order first clone then clone... first clone_min=2" do_test cloned_start_two "order first clone then clone... first clone_min=2" do_test cloned_stop_one "order first clone then clone... first clone_min=2" do_test cloned_stop_two "order first clone then clone... first clone_min=2" do_test clone_min_interleave_start_one "order first clone then clone... first clone_min=2 and then has interleave=true" do_test clone_min_interleave_start_two "order first clone then clone... first clone_min=2 and then has interleave=true" do_test clone_min_interleave_stop_one "order first clone then clone... first clone_min=2 and then has interleave=true" do_test clone_min_interleave_stop_two "order first clone then clone... first clone_min=2 and then has interleave=true" do_test clone_min_start_one "order first clone then primitive... first clone_min=2" do_test clone_min_start_two "order first clone then primitive... first clone_min=2" do_test clone_min_stop_all "order first clone then primitive... first clone_min=2" do_test clone_min_stop_one "order first clone then primitive... first clone_min=2" do_test clone_min_stop_two "order first clone then primitive... first clone_min=2" echo "" do_test unfence-startup "Clean unfencing" do_test unfence-definition "Unfencing when the agent changes" do_test unfence-parameters "Unfencing when the agent parameters changes" echo "" do_test master-0 "Stopped -> Slave" do_test master-1 "Stopped -> Promote" do_test master-2 "Stopped -> Promote : notify" do_test master-3 "Stopped -> Promote : master location" do_test master-4 "Started -> Promote : master location" do_test master-5 "Promoted -> Promoted" do_test master-6 "Promoted -> Promoted (2)" do_test master-7 "Promoted -> Fenced" do_test master-8 "Promoted -> Fenced -> Moved" do_test master-9 "Stopped + Promotable + No quorum" do_test master-10 "Stopped -> Promotable : notify with monitor" do_test master-11 "Stopped -> Promote : colocation" do_test novell-239082 "Demote/Promote ordering" do_test novell-239087 "Stable master placement" do_test master-12 "Promotion based solely on rsc_location constraints" do_test master-13 "Include preferences of colocated resources when placing master" do_test master-demote "Ordering when actions depends on demoting a slave resource" do_test master-ordering "Prevent resources from starting that need a master" do_test bug-1765 "Master-Master Colocation (dont stop the slaves)" do_test master-group "Promotion of cloned groups" do_test bug-lf-1852 "Don't shuffle master/slave instances unnecessarily" do_test master-failed-demote "Don't retry failed demote actions" do_test master-failed-demote-2 "Don't retry failed demote actions (notify=false)" do_test master-depend "Ensure resources that depend on the master don't get allocated until the master does" do_test master-reattach "Re-attach to a running master" do_test master-allow-start "Don't include master score if it would prevent allocation" do_test master-colocation "Allow master instances placemaker to be influenced by colocation constraints" do_test master-pseudo "Make sure promote/demote pseudo actions are created correctly" do_test master-role "Prevent target-role from promoting more than master-max instances" do_test bug-lf-2358 "Master-Master anti-colocation" do_test master-promotion-constraint "Mandatory master colocation constraints" do_test unmanaged-master "Ensure role is preserved for unmanaged resources" do_test master-unmanaged-monitor "Start the correct monitor operation for unmanaged masters" do_test master-demote-2 "Demote does not clear past failure" do_test master-move "Move master based on failure of colocated group" do_test master-probed-score "Observe the promotion score of probed resources" do_test colocation_constraint_stops_master "cl#5054 - Ensure master is demoted when stopped by colocation constraint" do_test colocation_constraint_stops_slave "cl#5054 - Ensure slave is not demoted when stopped by colocation constraint" do_test order_constraint_stops_master "cl#5054 - Ensure master is demoted when stopped by order constraint" do_test order_constraint_stops_slave "cl#5054 - Ensure slave is not demoted when stopped by order constraint" do_test master_monitor_restart "cl#5072 - Ensure master monitor operation will start after promotion." do_test bug-rh-880249 "Handle replacement of an m/s resource with a primitive" do_test bug-5143-ms-shuffle "Prevent master shuffling due to promotion score" do_test master-demote-block "Block promotion if demote fails with on-fail=block" do_test master-dependent-ban "Don't stop instances from being active because a dependent is banned from that host" do_test master-stop "Stop instances due to location constraint with role=Started" do_test master-partially-demoted-group "Allow partially demoted group to finish demoting" do_test bug-cl-5213 "Ensure role colocation with -INFINITY is enforced" do_test bug-cl-5219 "Allow unrelated resources with a common colocation target to remain promoted" do_test master-asymmetrical-order "Fix the behaviors of multi-state resources with asymmetrical ordering" do_test master-notify "Master promotion with notifies" echo "" do_test history-1 "Correctly parse stateful-1 resource state" echo "" do_test managed-0 "Managed (reference)" do_test managed-1 "Not managed - down " do_test managed-2 "Not managed - up " do_test bug-5028 "Shutdown should block if anything depends on an unmanaged resource" do_test bug-5028-detach "Ensure detach still works" do_test bug-5028-bottom "Ensure shutdown still blocks if the blocked resource is at the bottom of the stack" do_test unmanaged-stop-1 "cl#5155 - Block the stop of resources if any depending resource is unmanaged " do_test unmanaged-stop-2 "cl#5155 - Block the stop of resources if the first resource in a mandatory stop order is unmanaged " do_test unmanaged-stop-3 "cl#5155 - Block the stop of resources if any depending resource in a group is unmanaged " do_test unmanaged-stop-4 "cl#5155 - Block the stop of resources if any depending resource in the middle of a group is unmanaged " do_test unmanaged-block-restart "Block restart of resources if any dependent resource in a group is unmanaged" echo "" do_test interleave-0 "Interleave (reference)" do_test interleave-1 "coloc - not interleaved" do_test interleave-2 "coloc - interleaved " do_test interleave-3 "coloc - interleaved (2)" do_test interleave-pseudo-stop "Interleaved clone during stonith" do_test interleave-stop "Interleaved clone during stop" do_test interleave-restart "Interleaved clone during dependency restart" echo "" do_test notify-0 "Notify reference" do_test notify-1 "Notify simple" do_test notify-2 "Notify simple, confirm" do_test notify-3 "Notify move, confirm" do_test novell-239079 "Notification priority" #do_test notify-2 "Notify - 764" echo "" do_test 594 "OSDL #594 - Unrunnable actions scheduled in transition" do_test 662 "OSDL #662 - Two resources start on one node when incarnation_node_max = 1" do_test 696 "OSDL #696 - CRM starts stonith RA without monitor" do_test 726 "OSDL #726 - Attempting to schedule rsc_posic041_monitor_5000 _after_ a stop" do_test 735 "OSDL #735 - Correctly detect that rsc_hadev1 is stopped on hadev3" do_test 764 "OSDL #764 - Missing monitor op for DoFencing:child_DoFencing:1" do_test 797 "OSDL #797 - Assert triggered: task_id_i > max_call_id" do_test 829 "OSDL #829" do_test 994 "OSDL #994 - Stopping the last resource in a resource group causes the entire group to be restarted" do_test 994-2 "OSDL #994 - with a dependent resource" do_test 1360 "OSDL #1360 - Clone stickiness" do_test 1484 "OSDL #1484 - on_fail=stop" do_test 1494 "OSDL #1494 - Clone stability" do_test unrunnable-1 "Unrunnable" +do_test unrunnable-2 "Unrunnable 2" do_test stonith-0 "Stonith loop - 1" do_test stonith-1 "Stonith loop - 2" do_test stonith-2 "Stonith loop - 3" do_test stonith-3 "Stonith startup" do_test stonith-4 "Stonith node state" do_test bug-1572-1 "Recovery of groups depending on master/slave" do_test bug-1572-2 "Recovery of groups depending on master/slave when the master is never re-promoted" do_test bug-1685 "Depends-on-master ordering" do_test bug-1822 "Don't promote partially active groups" do_test bug-pm-11 "New resource added to a m/s group" do_test bug-pm-12 "Recover only the failed portion of a cloned group" do_test bug-n-387749 "Don't shuffle clone instances" do_test bug-n-385265 "Don't ignore the failure stickiness of group children - resource_idvscommon should stay stopped" do_test bug-n-385265-2 "Ensure groups are migrated instead of remaining partially active on the current node" do_test bug-lf-1920 "Correctly handle probes that find active resources" do_test bnc-515172 "Location constraint with multiple expressions" do_test colocate-primitive-with-clone "Optional colocation with a clone" do_test use-after-free-merge "Use-after-free in native_merge_weights" do_test bug-lf-2551 "STONITH ordering for stop" do_test bug-lf-2606 "Stonith implies demote" do_test bug-lf-2474 "Ensure resource op timeout takes precedence over op_defaults" do_test bug-suse-707150 "Prevent vm-01 from starting due to colocation/ordering" do_test bug-5014-A-start-B-start "Verify when A starts B starts using symmetrical=false" do_test bug-5014-A-stop-B-started "Verify when A stops B does not stop if it has already started using symmetric=false" do_test bug-5014-A-stopped-B-stopped "Verify when A is stopped and B has not started, B does not start before A using symmetric=false" do_test bug-5014-CthenAthenB-C-stopped "Verify when C then A is symmetrical=true, A then B is symmetric=false, and C is stopped that nothing starts." do_test bug-5014-CLONE-A-start-B-start "Verify when A starts B starts using clone resources with symmetric=false" do_test bug-5014-CLONE-A-stop-B-started "Verify when A stops B does not stop if it has already started using clone resources with symmetric=false." do_test bug-5014-GROUP-A-start-B-start "Verify when A starts B starts when using group resources with symmetric=false." do_test bug-5014-GROUP-A-stopped-B-started "Verify when A stops B does not stop if it has already started using group resources with symmetric=false." do_test bug-5014-GROUP-A-stopped-B-stopped "Verify when A is stopped and B has not started, B does not start before A using group resources with symmetric=false." do_test bug-5014-ordered-set-symmetrical-false "Verify ordered sets work with symmetrical=false" do_test bug-5014-ordered-set-symmetrical-true "Verify ordered sets work with symmetrical=true" do_test bug-5007-masterslave_colocation "Verify use of colocation scores other than INFINITY and -INFINITY work on multi-state resources." do_test bug-5038 "Prevent restart of anonymous clones when clone-max decreases" do_test bug-5025-1 "Automatically clean up failcount after resource config change with reload" do_test bug-5025-2 "Make sure clear failcount action isn't set when config does not change." do_test bug-5025-3 "Automatically clean up failcount after resource config change with restart" do_test bug-5025-4 "Clear failcount when last failure is a start op and rsc attributes changed." do_test failcount "Ensure failcounts are correctly expired" do_test failcount-block "Ensure failcounts are not expired when on-fail=block is present" do_test monitor-onfail-restart "bug-5058 - Monitor failure with on-fail set to restart" do_test monitor-onfail-stop "bug-5058 - Monitor failure wiht on-fail set to stop" do_test bug-5059 "No need to restart p_stateful1:*" do_test bug-5069-op-enabled "Test on-fail=ignore with failure when monitor is enabled." do_test bug-5069-op-disabled "Test on-fail-ignore with failure when monitor is disabled." do_test obsolete-lrm-resource "cl#5115 - Do not use obsolete lrm_resource sections" do_test expire-non-blocked-failure "Ignore failure-timeout only if the failed operation has on-fail=block" do_test asymmetrical-order-move "Respect asymmetrical ordering when trying to move resources" do_test ignore_stonith_rsc_order1 "cl#5056- Ignore order constraint between stonith and non-stonith rsc." do_test ignore_stonith_rsc_order2 "cl#5056- Ignore order constraint with group rsc containing mixed stonith and non-stonith." do_test ignore_stonith_rsc_order3 "cl#5056- Ignore order constraint, stonith clone and mixed group" do_test ignore_stonith_rsc_order4 "cl#5056- Ignore order constraint, stonith clone and clone with nested mixed group" do_test honor_stonith_rsc_order1 "cl#5056- Honor order constraint, stonith clone and pure stonith group(single rsc)." do_test honor_stonith_rsc_order2 "cl#5056- Honor order constraint, stonith clone and pure stonith group(multiple rsc)" do_test honor_stonith_rsc_order3 "cl#5056- Honor order constraint, stonith clones with nested pure stonith group." do_test honor_stonith_rsc_order4 "cl#5056- Honor order constraint, between two native stonith rscs." do_test probe-timeout "cl#5099 - Default probe timeout" do_test concurrent-fencing "Allow performing fencing operations in parallel" echo "" do_test systemhealth1 "System Health () #1" do_test systemhealth2 "System Health () #2" do_test systemhealth3 "System Health () #3" do_test systemhealthn1 "System Health (None) #1" do_test systemhealthn2 "System Health (None) #2" do_test systemhealthn3 "System Health (None) #3" do_test systemhealthm1 "System Health (Migrate On Red) #1" do_test systemhealthm2 "System Health (Migrate On Red) #2" do_test systemhealthm3 "System Health (Migrate On Red) #3" do_test systemhealtho1 "System Health (Only Green) #1" do_test systemhealtho2 "System Health (Only Green) #2" do_test systemhealtho3 "System Health (Only Green) #3" do_test systemhealthp1 "System Health (Progessive) #1" do_test systemhealthp2 "System Health (Progessive) #2" do_test systemhealthp3 "System Health (Progessive) #3" echo "" do_test utilization "Placement Strategy - utilization" do_test minimal "Placement Strategy - minimal" do_test balanced "Placement Strategy - balanced" echo "" do_test placement-stickiness "Optimized Placement Strategy - stickiness" do_test placement-priority "Optimized Placement Strategy - priority" do_test placement-location "Optimized Placement Strategy - location" do_test placement-capacity "Optimized Placement Strategy - capacity" echo "" do_test utilization-order1 "Utilization Order - Simple" do_test utilization-order2 "Utilization Order - Complex" do_test utilization-order3 "Utilization Order - Migrate" do_test utilization-order4 "Utilization Order - Live Mirgration (bnc#695440)" do_test utilization-shuffle "Don't displace prmExPostgreSQLDB2 on act2, Start prmExPostgreSQLDB1 on act3" do_test load-stopped-loop "Avoid transition loop due to load_stopped (cl#5044)" do_test load-stopped-loop-2 "cl#5235 - Prevent graph loops that can be introduced by load_stopped -> migrate_to ordering" echo "" do_test colocated-utilization-primitive-1 "Colocated Utilization - Primitive" do_test colocated-utilization-primitive-2 "Colocated Utilization - Choose the most capable node" do_test colocated-utilization-group "Colocated Utilization - Group" do_test colocated-utilization-clone "Colocated Utilization - Clone" do_test utilization-check-allowed-nodes "Only check the capacities of the nodes that can run the resource" echo "" do_test reprobe-target_rc "Ensure correct target_rc for reprobe of inactive resources" do_test node-maintenance-1 "cl#5128 - Node maintenance" do_test node-maintenance-2 "cl#5128 - Node maintenance (coming out of maintenance mode)" do_test rsc-maintenance "Per-resource maintenance" echo "" do_test not-installed-agent "The resource agent is missing" do_test not-installed-tools "Something the resource agent needs is missing" echo "" do_test stopped-monitor-00 "Stopped Monitor - initial start" do_test stopped-monitor-01 "Stopped Monitor - failed started" do_test stopped-monitor-02 "Stopped Monitor - started multi-up" do_test stopped-monitor-03 "Stopped Monitor - stop started" do_test stopped-monitor-04 "Stopped Monitor - failed stop" do_test stopped-monitor-05 "Stopped Monitor - start unmanaged" do_test stopped-monitor-06 "Stopped Monitor - unmanaged multi-up" do_test stopped-monitor-07 "Stopped Monitor - start unmanaged multi-up" do_test stopped-monitor-08 "Stopped Monitor - migrate" do_test stopped-monitor-09 "Stopped Monitor - unmanage started" do_test stopped-monitor-10 "Stopped Monitor - unmanaged started multi-up" do_test stopped-monitor-11 "Stopped Monitor - stop unmanaged started" do_test stopped-monitor-12 "Stopped Monitor - unmanaged started multi-up (targer-role="Stopped")" do_test stopped-monitor-20 "Stopped Monitor - initial stop" do_test stopped-monitor-21 "Stopped Monitor - stopped single-up" do_test stopped-monitor-22 "Stopped Monitor - stopped multi-up" do_test stopped-monitor-23 "Stopped Monitor - start stopped" do_test stopped-monitor-24 "Stopped Monitor - unmanage stopped" do_test stopped-monitor-25 "Stopped Monitor - unmanaged stopped multi-up" do_test stopped-monitor-26 "Stopped Monitor - start unmanaged stopped" do_test stopped-monitor-27 "Stopped Monitor - unmanaged stopped multi-up (target-role="Started")" do_test stopped-monitor-30 "Stopped Monitor - new node started" do_test stopped-monitor-31 "Stopped Monitor - new node stopped" echo"" do_test ticket-primitive-1 "Ticket - Primitive (loss-policy=stop, initial)" do_test ticket-primitive-2 "Ticket - Primitive (loss-policy=stop, granted)" do_test ticket-primitive-3 "Ticket - Primitive (loss-policy-stop, revoked)" do_test ticket-primitive-4 "Ticket - Primitive (loss-policy=demote, initial)" do_test ticket-primitive-5 "Ticket - Primitive (loss-policy=demote, granted)" do_test ticket-primitive-6 "Ticket - Primitive (loss-policy=demote, revoked)" do_test ticket-primitive-7 "Ticket - Primitive (loss-policy=fence, initial)" do_test ticket-primitive-8 "Ticket - Primitive (loss-policy=fence, granted)" do_test ticket-primitive-9 "Ticket - Primitive (loss-policy=fence, revoked)" do_test ticket-primitive-10 "Ticket - Primitive (loss-policy=freeze, initial)" do_test ticket-primitive-11 "Ticket - Primitive (loss-policy=freeze, granted)" do_test ticket-primitive-12 "Ticket - Primitive (loss-policy=freeze, revoked)" do_test ticket-primitive-13 "Ticket - Primitive (loss-policy=stop, standby, granted)" do_test ticket-primitive-14 "Ticket - Primitive (loss-policy=stop, granted, standby)" do_test ticket-primitive-15 "Ticket - Primitive (loss-policy=stop, standby, revoked)" do_test ticket-primitive-16 "Ticket - Primitive (loss-policy=demote, standby, granted)" do_test ticket-primitive-17 "Ticket - Primitive (loss-policy=demote, granted, standby)" do_test ticket-primitive-18 "Ticket - Primitive (loss-policy=demote, standby, revoked)" do_test ticket-primitive-19 "Ticket - Primitive (loss-policy=fence, standby, granted)" do_test ticket-primitive-20 "Ticket - Primitive (loss-policy=fence, granted, standby)" do_test ticket-primitive-21 "Ticket - Primitive (loss-policy=fence, standby, revoked)" do_test ticket-primitive-22 "Ticket - Primitive (loss-policy=freeze, standby, granted)" do_test ticket-primitive-23 "Ticket - Primitive (loss-policy=freeze, granted, standby)" do_test ticket-primitive-24 "Ticket - Primitive (loss-policy=freeze, standby, revoked)" echo"" do_test ticket-group-1 "Ticket - Group (loss-policy=stop, initial)" do_test ticket-group-2 "Ticket - Group (loss-policy=stop, granted)" do_test ticket-group-3 "Ticket - Group (loss-policy-stop, revoked)" do_test ticket-group-4 "Ticket - Group (loss-policy=demote, initial)" do_test ticket-group-5 "Ticket - Group (loss-policy=demote, granted)" do_test ticket-group-6 "Ticket - Group (loss-policy=demote, revoked)" do_test ticket-group-7 "Ticket - Group (loss-policy=fence, initial)" do_test ticket-group-8 "Ticket - Group (loss-policy=fence, granted)" do_test ticket-group-9 "Ticket - Group (loss-policy=fence, revoked)" do_test ticket-group-10 "Ticket - Group (loss-policy=freeze, initial)" do_test ticket-group-11 "Ticket - Group (loss-policy=freeze, granted)" do_test ticket-group-12 "Ticket - Group (loss-policy=freeze, revoked)" do_test ticket-group-13 "Ticket - Group (loss-policy=stop, standby, granted)" do_test ticket-group-14 "Ticket - Group (loss-policy=stop, granted, standby)" do_test ticket-group-15 "Ticket - Group (loss-policy=stop, standby, revoked)" do_test ticket-group-16 "Ticket - Group (loss-policy=demote, standby, granted)" do_test ticket-group-17 "Ticket - Group (loss-policy=demote, granted, standby)" do_test ticket-group-18 "Ticket - Group (loss-policy=demote, standby, revoked)" do_test ticket-group-19 "Ticket - Group (loss-policy=fence, standby, granted)" do_test ticket-group-20 "Ticket - Group (loss-policy=fence, granted, standby)" do_test ticket-group-21 "Ticket - Group (loss-policy=fence, standby, revoked)" do_test ticket-group-22 "Ticket - Group (loss-policy=freeze, standby, granted)" do_test ticket-group-23 "Ticket - Group (loss-policy=freeze, granted, standby)" do_test ticket-group-24 "Ticket - Group (loss-policy=freeze, standby, revoked)" echo"" do_test ticket-clone-1 "Ticket - Clone (loss-policy=stop, initial)" do_test ticket-clone-2 "Ticket - Clone (loss-policy=stop, granted)" do_test ticket-clone-3 "Ticket - Clone (loss-policy-stop, revoked)" do_test ticket-clone-4 "Ticket - Clone (loss-policy=demote, initial)" do_test ticket-clone-5 "Ticket - Clone (loss-policy=demote, granted)" do_test ticket-clone-6 "Ticket - Clone (loss-policy=demote, revoked)" do_test ticket-clone-7 "Ticket - Clone (loss-policy=fence, initial)" do_test ticket-clone-8 "Ticket - Clone (loss-policy=fence, granted)" do_test ticket-clone-9 "Ticket - Clone (loss-policy=fence, revoked)" do_test ticket-clone-10 "Ticket - Clone (loss-policy=freeze, initial)" do_test ticket-clone-11 "Ticket - Clone (loss-policy=freeze, granted)" do_test ticket-clone-12 "Ticket - Clone (loss-policy=freeze, revoked)" do_test ticket-clone-13 "Ticket - Clone (loss-policy=stop, standby, granted)" do_test ticket-clone-14 "Ticket - Clone (loss-policy=stop, granted, standby)" do_test ticket-clone-15 "Ticket - Clone (loss-policy=stop, standby, revoked)" do_test ticket-clone-16 "Ticket - Clone (loss-policy=demote, standby, granted)" do_test ticket-clone-17 "Ticket - Clone (loss-policy=demote, granted, standby)" do_test ticket-clone-18 "Ticket - Clone (loss-policy=demote, standby, revoked)" do_test ticket-clone-19 "Ticket - Clone (loss-policy=fence, standby, granted)" do_test ticket-clone-20 "Ticket - Clone (loss-policy=fence, granted, standby)" do_test ticket-clone-21 "Ticket - Clone (loss-policy=fence, standby, revoked)" do_test ticket-clone-22 "Ticket - Clone (loss-policy=freeze, standby, granted)" do_test ticket-clone-23 "Ticket - Clone (loss-policy=freeze, granted, standby)" do_test ticket-clone-24 "Ticket - Clone (loss-policy=freeze, standby, revoked)" echo"" do_test ticket-master-1 "Ticket - Master (loss-policy=stop, initial)" do_test ticket-master-2 "Ticket - Master (loss-policy=stop, granted)" do_test ticket-master-3 "Ticket - Master (loss-policy-stop, revoked)" do_test ticket-master-4 "Ticket - Master (loss-policy=demote, initial)" do_test ticket-master-5 "Ticket - Master (loss-policy=demote, granted)" do_test ticket-master-6 "Ticket - Master (loss-policy=demote, revoked)" do_test ticket-master-7 "Ticket - Master (loss-policy=fence, initial)" do_test ticket-master-8 "Ticket - Master (loss-policy=fence, granted)" do_test ticket-master-9 "Ticket - Master (loss-policy=fence, revoked)" do_test ticket-master-10 "Ticket - Master (loss-policy=freeze, initial)" do_test ticket-master-11 "Ticket - Master (loss-policy=freeze, granted)" do_test ticket-master-12 "Ticket - Master (loss-policy=freeze, revoked)" do_test ticket-master-13 "Ticket - Master (loss-policy=stop, standby, granted)" do_test ticket-master-14 "Ticket - Master (loss-policy=stop, granted, standby)" do_test ticket-master-15 "Ticket - Master (loss-policy=stop, standby, revoked)" do_test ticket-master-16 "Ticket - Master (loss-policy=demote, standby, granted)" do_test ticket-master-17 "Ticket - Master (loss-policy=demote, granted, standby)" do_test ticket-master-18 "Ticket - Master (loss-policy=demote, standby, revoked)" do_test ticket-master-19 "Ticket - Master (loss-policy=fence, standby, granted)" do_test ticket-master-20 "Ticket - Master (loss-policy=fence, granted, standby)" do_test ticket-master-21 "Ticket - Master (loss-policy=fence, standby, revoked)" do_test ticket-master-22 "Ticket - Master (loss-policy=freeze, standby, granted)" do_test ticket-master-23 "Ticket - Master (loss-policy=freeze, granted, standby)" do_test ticket-master-24 "Ticket - Master (loss-policy=freeze, standby, revoked)" echo "" do_test ticket-rsc-sets-1 "Ticket - Resource sets (1 ticket, initial)" do_test ticket-rsc-sets-2 "Ticket - Resource sets (1 ticket, granted)" do_test ticket-rsc-sets-3 "Ticket - Resource sets (1 ticket, revoked)" do_test ticket-rsc-sets-4 "Ticket - Resource sets (2 tickets, initial)" do_test ticket-rsc-sets-5 "Ticket - Resource sets (2 tickets, granted)" do_test ticket-rsc-sets-6 "Ticket - Resource sets (2 tickets, granted)" do_test ticket-rsc-sets-7 "Ticket - Resource sets (2 tickets, revoked)" do_test ticket-rsc-sets-8 "Ticket - Resource sets (1 ticket, standby, granted)" do_test ticket-rsc-sets-9 "Ticket - Resource sets (1 ticket, granted, standby)" do_test ticket-rsc-sets-10 "Ticket - Resource sets (1 ticket, standby, revoked)" do_test ticket-rsc-sets-11 "Ticket - Resource sets (2 tickets, standby, granted)" do_test ticket-rsc-sets-12 "Ticket - Resource sets (2 tickets, standby, granted)" do_test ticket-rsc-sets-13 "Ticket - Resource sets (2 tickets, granted, standby)" do_test ticket-rsc-sets-14 "Ticket - Resource sets (2 tickets, standby, revoked)" do_test cluster-specific-params "Cluster-specific instance attributes based on rules" do_test site-specific-params "Site-specific instance attributes based on rules" echo "" do_test template-1 "Template - 1" do_test template-2 "Template - 2" do_test template-3 "Template - 3 (merge operations)" do_test template-coloc-1 "Template - Colocation 1" do_test template-coloc-2 "Template - Colocation 2" do_test template-coloc-3 "Template - Colocation 3" do_test template-order-1 "Template - Order 1" do_test template-order-2 "Template - Order 2" do_test template-order-3 "Template - Order 3" do_test template-ticket "Template - Ticket" do_test template-rsc-sets-1 "Template - Resource Sets 1" do_test template-rsc-sets-2 "Template - Resource Sets 2" do_test template-rsc-sets-3 "Template - Resource Sets 3" do_test template-rsc-sets-4 "Template - Resource Sets 4" do_test template-clone-primitive "Cloned primitive from template" do_test template-clone-group "Cloned group from template" do_test location-sets-templates "Resource sets and templates - Location" do_test tags-coloc-order-1 "Tags - Colocation and Order (Simple)" do_test tags-coloc-order-2 "Tags - Colocation and Order (Resource Sets with Templates)" do_test tags-location "Tags - Location" do_test tags-ticket "Tags - Ticket" echo "" do_test container-1 "Container - initial" do_test container-2 "Container - monitor failed" do_test container-3 "Container - stop failed" do_test container-4 "Container - reached migration-threshold" do_test container-group-1 "Container in group - initial" do_test container-group-2 "Container in group - monitor failed" do_test container-group-3 "Container in group - stop failed" do_test container-group-4 "Container in group - reached migration-threshold" do_test container-is-remote-node "Place resource within container when container is remote-node" do_test bug-rh-1097457 "Kill user defined container/contents ordering" do_test bug-cl-5247 "Graph loop when recovering m/s resource in a container" echo "" do_test whitebox-fail1 "Fail whitebox container rsc." do_test whitebox-fail2 "Fail whitebox container rsc lrmd connection." do_test whitebox-fail3 "Failed containers should not run nested on remote nodes." do_test whitebox-start "Start whitebox container with resources assigned to it" do_test whitebox-stop "Stop whitebox container with resources assigned to it" do_test whitebox-move "Move whitebox container with resources assigned to it" do_test whitebox-asymmetric "Verify connection rsc opts-in based on container resource" do_test whitebox-ms-ordering "Verify promote/demote can not occur before connection is established" do_test whitebox-ms-ordering-move "Stop/Start cycle within a moving container" do_test whitebox-orphaned "Properly shutdown orphaned whitebox container" do_test whitebox-orphan-ms "Properly tear down orphan ms resources on remote-nodes" do_test whitebox-unexpectedly-running "Recover container nodes the cluster did not start." do_test whitebox-migrate1 "Migrate both container and connection resource" do_test whitebox-imply-stop-on-fence "imply stop action on container node rsc when host node is fenced" do_test whitebox-nested-group "Verify guest remote-node works nested in a group" echo "" do_test remote-startup-probes "Baremetal remote-node startup probes" do_test remote-startup "Startup a newly discovered remote-nodes with no status." do_test remote-fence-unclean "Fence unclean baremetal remote-node" do_test remote-fence-unclean2 "Fence baremetal remote-node after cluster node fails and connection can not be recovered" do_test remote-move "Move remote-node connection resource" do_test remote-disable "Disable a baremetal remote-node" do_test remote-orphaned "Properly shutdown orphaned connection resource" do_test remote-orphaned2 "verify we can handle orphaned remote connections with active resources on the remote" do_test remote-recover "Recover connection resource after cluster-node fails." do_test remote-stale-node-entry "Make sure we properly handle leftover remote-node entries in the node section" do_test remote-partial-migrate "Make sure partial migrations are handled before ops on the remote node." do_test remote-partial-migrate2 "Make sure partial migration target is prefered for remote connection." do_test remote-recover-fail "Make sure start failure causes fencing if rsc are active on remote." do_test remote-start-fail "Make sure a start failure does not result in fencing if no active resources are on remote." do_test remote-unclean2 "Make monitor failure always results in fencing, even if no rsc are active on remote." do_test remote-fence-before-reconnect "Fence before clearing recurring monitor failure" echo "" do_test resource-discovery "Exercises resource-discovery location constraint option." do_test rsc-discovery-per-node "Disable resource discovery per node" echo "" do_test isolation-start-all "Start docker isolated resources." do_test isolation-restart-all "Restart docker isolated resources." do_test isolation-clone "Cloned isolated primitive." echo "" test_results diff --git a/pengine/test10/unrunnable-2.dot b/pengine/test10/unrunnable-2.dot new file mode 100644 index 0000000000..bfdabe81ff --- /dev/null +++ b/pengine/test10/unrunnable-2.dot @@ -0,0 +1,495 @@ +digraph "g" { +"delay-clone_running_0" -> "openstack-aodh-evaluator-clone_start_0" [ style = dashed] +"delay-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"delay-clone_start_0" -> "delay-clone_running_0" [ style = dashed] +"delay-clone_start_0" -> "delay:1_start_0 overcloud-controller-0" [ style = dashed] +"delay-clone_start_0" -> "delay:2_start_0 overcloud-controller-1" [ style = dashed] +"delay-clone_start_0" -> "delay_start_0 overcloud-controller-2" [ style = dashed] +"delay-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"delay:1_monitor_10000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"delay:1_start_0 overcloud-controller-0" -> "delay-clone_running_0" [ style = dashed] +"delay:1_start_0 overcloud-controller-0" -> "delay:1_monitor_10000 overcloud-controller-0" [ style = dashed] +"delay:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"delay:2_monitor_10000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"delay:2_start_0 overcloud-controller-1" -> "delay-clone_running_0" [ style = dashed] +"delay:2_start_0 overcloud-controller-1" -> "delay:2_monitor_10000 overcloud-controller-1" [ style = dashed] +"delay:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"delay_monitor_10000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"delay_start_0 overcloud-controller-2" -> "delay-clone_running_0" [ style = dashed] +"delay_start_0 overcloud-controller-2" -> "delay_monitor_10000 overcloud-controller-2" [ style = dashed] +"delay_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent-clone_running_0" -> "neutron-l3-agent-clone_start_0" [ style = dashed] +"neutron-dhcp-agent-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent:1_start_0 overcloud-controller-0" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent:2_start_0 overcloud-controller-1" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent_start_0 overcloud-controller-2" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-dhcp-agent:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent:1_start_0 overcloud-controller-0" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent:1_start_0 overcloud-controller-0" -> "neutron-dhcp-agent:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"neutron-dhcp-agent:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent:2_start_0 overcloud-controller-1" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent:2_start_0 overcloud-controller-1" -> "neutron-dhcp-agent:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"neutron-dhcp-agent:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_start_0 overcloud-controller-2" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent_start_0 overcloud-controller-2" -> "neutron-dhcp-agent_monitor_60000 overcloud-controller-2" [ style = dashed] +"neutron-dhcp-agent_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent-clone_running_0" -> "neutron-metadata-agent-clone_start_0" [ style = dashed] +"neutron-l3-agent-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent:1_start_0 overcloud-controller-0" [ style = dashed] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent:2_start_0 overcloud-controller-1" [ style = dashed] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent_start_0 overcloud-controller-2" [ style = dashed] +"neutron-l3-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-l3-agent:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent:1_start_0 overcloud-controller-0" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent:1_start_0 overcloud-controller-0" -> "neutron-l3-agent:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"neutron-l3-agent:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent:2_start_0 overcloud-controller-1" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent:2_start_0 overcloud-controller-1" -> "neutron-l3-agent:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"neutron-l3-agent:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_start_0 overcloud-controller-2" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent_start_0 overcloud-controller-2" -> "neutron-l3-agent_monitor_60000 overcloud-controller-2" [ style = dashed] +"neutron-l3-agent_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent:1_start_0 overcloud-controller-1" [ style = dashed] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent:2_start_0 overcloud-controller-2" [ style = dashed] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent_start_0 overcloud-controller-0" [ style = dashed] +"neutron-metadata-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-metadata-agent:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent:1_start_0 overcloud-controller-1" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent:1_start_0 overcloud-controller-1" -> "neutron-metadata-agent:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"neutron-metadata-agent:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent:2_start_0 overcloud-controller-2" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent:2_start_0 overcloud-controller-2" -> "neutron-metadata-agent:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"neutron-metadata-agent:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_start_0 overcloud-controller-0" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent_start_0 overcloud-controller-0" -> "neutron-metadata-agent_monitor_60000 overcloud-controller-0" [ style = dashed] +"neutron-metadata-agent_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent-clone_running_0" -> "neutron-dhcp-agent-clone_start_0" [ style = dashed] +"neutron-openvswitch-agent-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent:1_start_0 overcloud-controller-0" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent:2_start_0 overcloud-controller-1" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent_start_0 overcloud-controller-2" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-openvswitch-agent:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent:1_start_0 overcloud-controller-0" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent:1_start_0 overcloud-controller-0" -> "neutron-openvswitch-agent:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"neutron-openvswitch-agent:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent:2_start_0 overcloud-controller-1" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent:2_start_0 overcloud-controller-1" -> "neutron-openvswitch-agent:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"neutron-openvswitch-agent:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_start_0 overcloud-controller-2" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent_start_0 overcloud-controller-2" -> "neutron-openvswitch-agent_monitor_60000 overcloud-controller-2" [ style = dashed] +"neutron-openvswitch-agent_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-server-clone_running_0" -> "neutron-openvswitch-agent-clone_start_0" [ style = dashed] +"neutron-server-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-server-clone_start_0" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server-clone_start_0" -> "neutron-server:1_start_0 overcloud-controller-1" [ style = dashed] +"neutron-server-clone_start_0" -> "neutron-server:2_start_0 overcloud-controller-2" [ style = dashed] +"neutron-server-clone_start_0" -> "neutron-server_start_0 overcloud-controller-0" [ style = dashed] +"neutron-server-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-server:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-server:1_start_0 overcloud-controller-1" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server:1_start_0 overcloud-controller-1" -> "neutron-server:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"neutron-server:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"neutron-server:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-server:2_start_0 overcloud-controller-2" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server:2_start_0 overcloud-controller-2" -> "neutron-server:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"neutron-server:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"neutron-server_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"neutron-server_start_0 overcloud-controller-0" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server_start_0 overcloud-controller-0" -> "neutron-server_monitor_60000 overcloud-controller-0" [ style = dashed] +"neutron-server_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator-clone_running_0" -> "openstack-aodh-notifier-clone_start_0" [ style = dashed] +"openstack-aodh-evaluator-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-aodh-evaluator-clone_start_0" -> "openstack-aodh-evaluator-clone_running_0" [ style = dashed] +"openstack-aodh-evaluator-clone_start_0" -> "openstack-aodh-evaluator:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-aodh-evaluator-clone_start_0" -> "openstack-aodh-evaluator:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-aodh-evaluator-clone_start_0" -> "openstack-aodh-evaluator_start_0 overcloud-controller-2" [ style = dashed] +"openstack-aodh-evaluator-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-aodh-evaluator:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator:1_start_0 overcloud-controller-0" -> "openstack-aodh-evaluator-clone_running_0" [ style = dashed] +"openstack-aodh-evaluator:1_start_0 overcloud-controller-0" -> "openstack-aodh-evaluator:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-aodh-evaluator:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator:2_start_0 overcloud-controller-1" -> "openstack-aodh-evaluator-clone_running_0" [ style = dashed] +"openstack-aodh-evaluator:2_start_0 overcloud-controller-1" -> "openstack-aodh-evaluator:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-aodh-evaluator:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-evaluator_start_0 overcloud-controller-2" -> "openstack-aodh-evaluator-clone_running_0" [ style = dashed] +"openstack-aodh-evaluator_start_0 overcloud-controller-2" -> "openstack-aodh-evaluator_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-aodh-evaluator_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-aodh-notifier-clone_start_0" -> "openstack-aodh-notifier-clone_running_0" [ style = dashed] +"openstack-aodh-notifier-clone_start_0" -> "openstack-aodh-notifier:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-aodh-notifier-clone_start_0" -> "openstack-aodh-notifier:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-aodh-notifier-clone_start_0" -> "openstack-aodh-notifier_start_0 overcloud-controller-0" [ style = dashed] +"openstack-aodh-notifier-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-aodh-notifier:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier:1_start_0 overcloud-controller-1" -> "openstack-aodh-notifier-clone_running_0" [ style = dashed] +"openstack-aodh-notifier:1_start_0 overcloud-controller-1" -> "openstack-aodh-notifier:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-aodh-notifier:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier:2_start_0 overcloud-controller-2" -> "openstack-aodh-notifier-clone_running_0" [ style = dashed] +"openstack-aodh-notifier:2_start_0 overcloud-controller-2" -> "openstack-aodh-notifier:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-aodh-notifier:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-aodh-notifier_start_0 overcloud-controller-0" -> "openstack-aodh-notifier-clone_running_0" [ style = dashed] +"openstack-aodh-notifier_start_0 overcloud-controller-0" -> "openstack-aodh-notifier_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-aodh-notifier_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api-clone_running_0" -> "delay-clone_start_0" [ style = dashed] +"openstack-ceilometer-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-api-clone_start_0" -> "openstack-ceilometer-api-clone_running_0" [ style = dashed] +"openstack-ceilometer-api-clone_start_0" -> "openstack-ceilometer-api:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-api-clone_start_0" -> "openstack-ceilometer-api:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-api-clone_start_0" -> "openstack-ceilometer-api_start_0 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-api:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api:1_start_0 overcloud-controller-0" -> "openstack-ceilometer-api-clone_running_0" [ style = dashed] +"openstack-ceilometer-api:1_start_0 overcloud-controller-0" -> "openstack-ceilometer-api:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-api:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api:2_start_0 overcloud-controller-1" -> "openstack-ceilometer-api-clone_running_0" [ style = dashed] +"openstack-ceilometer-api:2_start_0 overcloud-controller-1" -> "openstack-ceilometer-api:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-api:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-api_start_0 overcloud-controller-2" -> "openstack-ceilometer-api-clone_running_0" [ style = dashed] +"openstack-ceilometer-api_start_0 overcloud-controller-2" -> "openstack-ceilometer-api_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-api_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central-clone_running_0" -> "openstack-ceilometer-collector-clone_start_0" [ style = dashed] +"openstack-ceilometer-central-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-central-clone_start_0" -> "openstack-ceilometer-central-clone_running_0" [ style = dashed] +"openstack-ceilometer-central-clone_start_0" -> "openstack-ceilometer-central:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-central-clone_start_0" -> "openstack-ceilometer-central:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-central-clone_start_0" -> "openstack-ceilometer-central_start_0 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-central-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-central:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central:1_start_0 overcloud-controller-1" -> "openstack-ceilometer-central-clone_running_0" [ style = dashed] +"openstack-ceilometer-central:1_start_0 overcloud-controller-1" -> "openstack-ceilometer-central:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-central:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central:2_start_0 overcloud-controller-2" -> "openstack-ceilometer-central-clone_running_0" [ style = dashed] +"openstack-ceilometer-central:2_start_0 overcloud-controller-2" -> "openstack-ceilometer-central:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-central:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-central_start_0 overcloud-controller-0" -> "openstack-ceilometer-central-clone_running_0" [ style = dashed] +"openstack-ceilometer-central_start_0 overcloud-controller-0" -> "openstack-ceilometer-central_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-central_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector-clone_running_0" -> "openstack-ceilometer-api-clone_start_0" [ style = dashed] +"openstack-ceilometer-collector-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-collector-clone_start_0" -> "openstack-ceilometer-collector-clone_running_0" [ style = dashed] +"openstack-ceilometer-collector-clone_start_0" -> "openstack-ceilometer-collector:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-collector-clone_start_0" -> "openstack-ceilometer-collector:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-collector-clone_start_0" -> "openstack-ceilometer-collector_start_0 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-collector-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-ceilometer-collector:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector:1_start_0 overcloud-controller-0" -> "openstack-ceilometer-collector-clone_running_0" [ style = dashed] +"openstack-ceilometer-collector:1_start_0 overcloud-controller-0" -> "openstack-ceilometer-collector:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-ceilometer-collector:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector:2_start_0 overcloud-controller-1" -> "openstack-ceilometer-collector-clone_running_0" [ style = dashed] +"openstack-ceilometer-collector:2_start_0 overcloud-controller-1" -> "openstack-ceilometer-collector:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-ceilometer-collector:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-ceilometer-collector_start_0 overcloud-controller-2" -> "openstack-ceilometer-collector-clone_running_0" [ style = dashed] +"openstack-ceilometer-collector_start_0 overcloud-controller-2" -> "openstack-ceilometer-collector_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-ceilometer-collector_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api-clone_running_0" -> "openstack-cinder-scheduler-clone_start_0" [ style = dashed] +"openstack-cinder-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-cinder-api-clone_start_0" -> "openstack-cinder-api-clone_running_0" [ style = dashed] +"openstack-cinder-api-clone_start_0" -> "openstack-cinder-api:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-cinder-api-clone_start_0" -> "openstack-cinder-api:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-cinder-api-clone_start_0" -> "openstack-cinder-api_start_0 overcloud-controller-2" [ style = dashed] +"openstack-cinder-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-cinder-api:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api:1_start_0 overcloud-controller-0" -> "openstack-cinder-api-clone_running_0" [ style = dashed] +"openstack-cinder-api:1_start_0 overcloud-controller-0" -> "openstack-cinder-api:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-cinder-api:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api:2_start_0 overcloud-controller-1" -> "openstack-cinder-api-clone_running_0" [ style = dashed] +"openstack-cinder-api:2_start_0 overcloud-controller-1" -> "openstack-cinder-api:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-cinder-api:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-api_start_0 overcloud-controller-2" -> "openstack-cinder-api-clone_running_0" [ style = dashed] +"openstack-cinder-api_start_0 overcloud-controller-2" -> "openstack-cinder-api_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-cinder-api_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler-clone_running_0" -> "openstack-cinder-volume_start_0 overcloud-controller-2" [ style = dashed] +"openstack-cinder-scheduler-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-cinder-scheduler-clone_start_0" -> "openstack-cinder-scheduler-clone_running_0" [ style = dashed] +"openstack-cinder-scheduler-clone_start_0" -> "openstack-cinder-scheduler:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-cinder-scheduler-clone_start_0" -> "openstack-cinder-scheduler:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-cinder-scheduler-clone_start_0" -> "openstack-cinder-scheduler_start_0 overcloud-controller-2" [ style = dashed] +"openstack-cinder-scheduler-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-cinder-scheduler:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler:1_start_0 overcloud-controller-0" -> "openstack-cinder-scheduler-clone_running_0" [ style = dashed] +"openstack-cinder-scheduler:1_start_0 overcloud-controller-0" -> "openstack-cinder-scheduler:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-cinder-scheduler:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler:2_start_0 overcloud-controller-1" -> "openstack-cinder-scheduler-clone_running_0" [ style = dashed] +"openstack-cinder-scheduler:2_start_0 overcloud-controller-1" -> "openstack-cinder-scheduler:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-cinder-scheduler:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-scheduler_start_0 overcloud-controller-2" -> "openstack-cinder-scheduler-clone_running_0" [ style = dashed] +"openstack-cinder-scheduler_start_0 overcloud-controller-2" -> "openstack-cinder-scheduler_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-cinder-scheduler_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-volume_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-cinder-volume_start_0 overcloud-controller-2" -> "openstack-cinder-volume_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-cinder-volume_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-glance-api-clone_start_0" -> "openstack-glance-api-clone_running_0" [ style = dashed] +"openstack-glance-api-clone_start_0" -> "openstack-glance-api:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-glance-api-clone_start_0" -> "openstack-glance-api:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-glance-api-clone_start_0" -> "openstack-glance-api_start_0 overcloud-controller-0" [ style = dashed] +"openstack-glance-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-glance-api:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api:1_start_0 overcloud-controller-1" -> "openstack-glance-api-clone_running_0" [ style = dashed] +"openstack-glance-api:1_start_0 overcloud-controller-1" -> "openstack-glance-api:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-glance-api:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api:2_start_0 overcloud-controller-2" -> "openstack-glance-api-clone_running_0" [ style = dashed] +"openstack-glance-api:2_start_0 overcloud-controller-2" -> "openstack-glance-api:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-glance-api:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-api_start_0 overcloud-controller-0" -> "openstack-glance-api-clone_running_0" [ style = dashed] +"openstack-glance-api_start_0 overcloud-controller-0" -> "openstack-glance-api_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-glance-api_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry-clone_running_0" -> "openstack-glance-api-clone_start_0" [ style = dashed] +"openstack-glance-registry-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-glance-registry-clone_start_0" -> "openstack-glance-registry-clone_running_0" [ style = dashed] +"openstack-glance-registry-clone_start_0" -> "openstack-glance-registry:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-glance-registry-clone_start_0" -> "openstack-glance-registry:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-glance-registry-clone_start_0" -> "openstack-glance-registry_start_0 overcloud-controller-0" [ style = dashed] +"openstack-glance-registry-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-glance-registry:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry:1_start_0 overcloud-controller-1" -> "openstack-glance-registry-clone_running_0" [ style = dashed] +"openstack-glance-registry:1_start_0 overcloud-controller-1" -> "openstack-glance-registry:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-glance-registry:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry:2_start_0 overcloud-controller-2" -> "openstack-glance-registry-clone_running_0" [ style = dashed] +"openstack-glance-registry:2_start_0 overcloud-controller-2" -> "openstack-glance-registry:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-glance-registry:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-glance-registry_start_0 overcloud-controller-0" -> "openstack-glance-registry-clone_running_0" [ style = dashed] +"openstack-glance-registry_start_0 overcloud-controller-0" -> "openstack-glance-registry_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-glance-registry_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn-clone_running_0" -> "openstack-heat-api-cloudwatch-clone_start_0" [ style = dashed] +"openstack-heat-api-cfn-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-cfn-clone_start_0" -> "openstack-heat-api-cfn-clone_running_0" [ style = dashed] +"openstack-heat-api-cfn-clone_start_0" -> "openstack-heat-api-cfn:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cfn-clone_start_0" -> "openstack-heat-api-cfn:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cfn-clone_start_0" -> "openstack-heat-api-cfn_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cfn-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-cfn:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cfn-clone_running_0" [ style = dashed] +"openstack-heat-api-cfn:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cfn:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cfn:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cfn:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cfn-clone_running_0" [ style = dashed] +"openstack-heat-api-cfn:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cfn:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cfn:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cfn:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cfn_start_0 overcloud-controller-0" -> "openstack-heat-api-cfn-clone_running_0" [ style = dashed] +"openstack-heat-api-cfn_start_0 overcloud-controller-0" -> "openstack-heat-api-cfn_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cfn_start_0 overcloud-controller-0" -> "openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cfn_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-clone_running_0" -> "openstack-heat-api-cfn-clone_start_0" [ style = dashed] +"openstack-heat-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-clone_start_0" -> "openstack-heat-api-clone_running_0" [ style = dashed] +"openstack-heat-api-clone_start_0" -> "openstack-heat-api:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-clone_start_0" -> "openstack-heat-api:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-clone_start_0" -> "openstack-heat-api_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-cloudwatch-clone_running_0" -> "openstack-heat-engine-clone_start_0" [ style = dashed] +"openstack-heat-api-cloudwatch-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-cloudwatch-clone_start_0" -> "openstack-heat-api-cloudwatch-clone_running_0" [ style = dashed] +"openstack-heat-api-cloudwatch-clone_start_0" -> "openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cloudwatch-clone_start_0" -> "openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cloudwatch-clone_start_0" -> "openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cloudwatch-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-api-cloudwatch:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cloudwatch-clone_running_0" [ style = dashed] +"openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cloudwatch:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" -> "openstack-heat-engine:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api-cloudwatch:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cloudwatch:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cloudwatch-clone_running_0" [ style = dashed] +"openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cloudwatch:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" -> "openstack-heat-engine:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api-cloudwatch:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cloudwatch_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" -> "openstack-heat-api-cloudwatch-clone_running_0" [ style = dashed] +"openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" -> "openstack-heat-api-cloudwatch_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" -> "openstack-heat-engine_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api-cloudwatch_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api:1_start_0 overcloud-controller-1" -> "openstack-heat-api-cfn:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-api:1_start_0 overcloud-controller-1" -> "openstack-heat-api-clone_running_0" [ style = dashed] +"openstack-heat-api:1_start_0 overcloud-controller-1" -> "openstack-heat-api:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-heat-api:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api:2_start_0 overcloud-controller-2" -> "openstack-heat-api-cfn:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-api:2_start_0 overcloud-controller-2" -> "openstack-heat-api-clone_running_0" [ style = dashed] +"openstack-heat-api:2_start_0 overcloud-controller-2" -> "openstack-heat-api:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-heat-api:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-api_start_0 overcloud-controller-0" -> "openstack-heat-api-cfn_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-api_start_0 overcloud-controller-0" -> "openstack-heat-api-clone_running_0" [ style = dashed] +"openstack-heat-api_start_0 overcloud-controller-0" -> "openstack-heat-api_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-heat-api_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-engine-clone_start_0" -> "openstack-heat-engine-clone_running_0" [ style = dashed] +"openstack-heat-engine-clone_start_0" -> "openstack-heat-engine:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-heat-engine-clone_start_0" -> "openstack-heat-engine:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-heat-engine-clone_start_0" -> "openstack-heat-engine_start_0 overcloud-controller-0" [ style = dashed] +"openstack-heat-engine-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-heat-engine:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine:1_start_0 overcloud-controller-1" -> "openstack-heat-engine-clone_running_0" [ style = dashed] +"openstack-heat-engine:1_start_0 overcloud-controller-1" -> "openstack-heat-engine:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-heat-engine:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine:2_start_0 overcloud-controller-2" -> "openstack-heat-engine-clone_running_0" [ style = dashed] +"openstack-heat-engine:2_start_0 overcloud-controller-2" -> "openstack-heat-engine:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-heat-engine:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-heat-engine_start_0 overcloud-controller-0" -> "openstack-heat-engine-clone_running_0" [ style = dashed] +"openstack-heat-engine_start_0 overcloud-controller-0" -> "openstack-heat-engine_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-heat-engine_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api-clone_running_0" -> "openstack-nova-scheduler-clone_start_0" [ style = dashed] +"openstack-nova-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-api-clone_start_0" -> "openstack-nova-api-clone_running_0" [ style = dashed] +"openstack-nova-api-clone_start_0" -> "openstack-nova-api:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-api-clone_start_0" -> "openstack-nova-api:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-api-clone_start_0" -> "openstack-nova-api_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-api:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api:1_start_0 overcloud-controller-0" -> "openstack-nova-api-clone_running_0" [ style = dashed] +"openstack-nova-api:1_start_0 overcloud-controller-0" -> "openstack-nova-api:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-nova-api:1_start_0 overcloud-controller-0" -> "openstack-nova-scheduler:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-api:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api:2_start_0 overcloud-controller-1" -> "openstack-nova-api-clone_running_0" [ style = dashed] +"openstack-nova-api:2_start_0 overcloud-controller-1" -> "openstack-nova-api:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-nova-api:2_start_0 overcloud-controller-1" -> "openstack-nova-scheduler:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-api:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-api_start_0 overcloud-controller-2" -> "openstack-nova-api-clone_running_0" [ style = dashed] +"openstack-nova-api_start_0 overcloud-controller-2" -> "openstack-nova-api_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-nova-api_start_0 overcloud-controller-2" -> "openstack-nova-scheduler_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-api_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-conductor-clone_start_0" -> "openstack-nova-conductor-clone_running_0" [ style = dashed] +"openstack-nova-conductor-clone_start_0" -> "openstack-nova-conductor:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-conductor-clone_start_0" -> "openstack-nova-conductor:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-conductor-clone_start_0" -> "openstack-nova-conductor_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-conductor-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-conductor:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor:1_start_0 overcloud-controller-1" -> "openstack-nova-conductor-clone_running_0" [ style = dashed] +"openstack-nova-conductor:1_start_0 overcloud-controller-1" -> "openstack-nova-conductor:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-nova-conductor:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor:2_start_0 overcloud-controller-2" -> "openstack-nova-conductor-clone_running_0" [ style = dashed] +"openstack-nova-conductor:2_start_0 overcloud-controller-2" -> "openstack-nova-conductor:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-nova-conductor:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-conductor_start_0 overcloud-controller-0" -> "openstack-nova-conductor-clone_running_0" [ style = dashed] +"openstack-nova-conductor_start_0 overcloud-controller-0" -> "openstack-nova-conductor_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-nova-conductor_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth-clone_running_0" -> "openstack-nova-novncproxy-clone_start_0" [ style = dashed] +"openstack-nova-consoleauth-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-consoleauth-clone_start_0" -> "openstack-nova-consoleauth-clone_running_0" [ style = dashed] +"openstack-nova-consoleauth-clone_start_0" -> "openstack-nova-consoleauth:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-consoleauth-clone_start_0" -> "openstack-nova-consoleauth:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-consoleauth-clone_start_0" -> "openstack-nova-consoleauth_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-consoleauth-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-consoleauth:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth:1_start_0 overcloud-controller-0" -> "openstack-nova-consoleauth-clone_running_0" [ style = dashed] +"openstack-nova-consoleauth:1_start_0 overcloud-controller-0" -> "openstack-nova-consoleauth:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-nova-consoleauth:1_start_0 overcloud-controller-0" -> "openstack-nova-novncproxy:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-consoleauth:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth:2_start_0 overcloud-controller-1" -> "openstack-nova-consoleauth-clone_running_0" [ style = dashed] +"openstack-nova-consoleauth:2_start_0 overcloud-controller-1" -> "openstack-nova-consoleauth:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-nova-consoleauth:2_start_0 overcloud-controller-1" -> "openstack-nova-novncproxy:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-consoleauth:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-consoleauth_start_0 overcloud-controller-2" -> "openstack-nova-consoleauth-clone_running_0" [ style = dashed] +"openstack-nova-consoleauth_start_0 overcloud-controller-2" -> "openstack-nova-consoleauth_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-nova-consoleauth_start_0 overcloud-controller-2" -> "openstack-nova-novncproxy_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-consoleauth_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy-clone_running_0" -> "openstack-nova-api-clone_start_0" [ style = dashed] +"openstack-nova-novncproxy-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-novncproxy-clone_start_0" -> "openstack-nova-novncproxy-clone_running_0" [ style = dashed] +"openstack-nova-novncproxy-clone_start_0" -> "openstack-nova-novncproxy:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-novncproxy-clone_start_0" -> "openstack-nova-novncproxy:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-novncproxy-clone_start_0" -> "openstack-nova-novncproxy_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-novncproxy-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-novncproxy:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy:1_start_0 overcloud-controller-0" -> "openstack-nova-api:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-novncproxy:1_start_0 overcloud-controller-0" -> "openstack-nova-novncproxy-clone_running_0" [ style = dashed] +"openstack-nova-novncproxy:1_start_0 overcloud-controller-0" -> "openstack-nova-novncproxy:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-nova-novncproxy:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy:2_start_0 overcloud-controller-1" -> "openstack-nova-api:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-novncproxy:2_start_0 overcloud-controller-1" -> "openstack-nova-novncproxy-clone_running_0" [ style = dashed] +"openstack-nova-novncproxy:2_start_0 overcloud-controller-1" -> "openstack-nova-novncproxy:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-nova-novncproxy:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-novncproxy_start_0 overcloud-controller-2" -> "openstack-nova-api_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-novncproxy_start_0 overcloud-controller-2" -> "openstack-nova-novncproxy-clone_running_0" [ style = dashed] +"openstack-nova-novncproxy_start_0 overcloud-controller-2" -> "openstack-nova-novncproxy_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-nova-novncproxy_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler-clone_running_0" -> "openstack-nova-conductor-clone_start_0" [ style = dashed] +"openstack-nova-scheduler-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-scheduler-clone_start_0" -> "openstack-nova-scheduler-clone_running_0" [ style = dashed] +"openstack-nova-scheduler-clone_start_0" -> "openstack-nova-scheduler:1_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-scheduler-clone_start_0" -> "openstack-nova-scheduler:2_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-scheduler-clone_start_0" -> "openstack-nova-scheduler_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-scheduler-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-nova-scheduler:1_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler:1_start_0 overcloud-controller-0" -> "openstack-nova-conductor_start_0 overcloud-controller-0" [ style = dashed] +"openstack-nova-scheduler:1_start_0 overcloud-controller-0" -> "openstack-nova-scheduler-clone_running_0" [ style = dashed] +"openstack-nova-scheduler:1_start_0 overcloud-controller-0" -> "openstack-nova-scheduler:1_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-nova-scheduler:1_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler:2_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler:2_start_0 overcloud-controller-1" -> "openstack-nova-conductor:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-nova-scheduler:2_start_0 overcloud-controller-1" -> "openstack-nova-scheduler-clone_running_0" [ style = dashed] +"openstack-nova-scheduler:2_start_0 overcloud-controller-1" -> "openstack-nova-scheduler:2_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-nova-scheduler:2_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-nova-scheduler_start_0 overcloud-controller-2" -> "openstack-nova-conductor:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-nova-scheduler_start_0 overcloud-controller-2" -> "openstack-nova-scheduler-clone_running_0" [ style = dashed] +"openstack-nova-scheduler_start_0 overcloud-controller-2" -> "openstack-nova-scheduler_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-nova-scheduler_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-sahara-api-clone_start_0" -> "openstack-sahara-api-clone_running_0" [ style = dashed] +"openstack-sahara-api-clone_start_0" -> "openstack-sahara-api:1_start_0 overcloud-controller-1" [ style = dashed] +"openstack-sahara-api-clone_start_0" -> "openstack-sahara-api:2_start_0 overcloud-controller-2" [ style = dashed] +"openstack-sahara-api-clone_start_0" -> "openstack-sahara-api_start_0 overcloud-controller-0" [ style = dashed] +"openstack-sahara-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"openstack-sahara-api:1_monitor_60000 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api:1_start_0 overcloud-controller-1" -> "openstack-sahara-api-clone_running_0" [ style = dashed] +"openstack-sahara-api:1_start_0 overcloud-controller-1" -> "openstack-sahara-api:1_monitor_60000 overcloud-controller-1" [ style = dashed] +"openstack-sahara-api:1_start_0 overcloud-controller-1" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api:2_monitor_60000 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api:2_start_0 overcloud-controller-2" -> "openstack-sahara-api-clone_running_0" [ style = dashed] +"openstack-sahara-api:2_start_0 overcloud-controller-2" -> "openstack-sahara-api:2_monitor_60000 overcloud-controller-2" [ style = dashed] +"openstack-sahara-api:2_start_0 overcloud-controller-2" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api_monitor_60000 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +"openstack-sahara-api_start_0 overcloud-controller-0" -> "openstack-sahara-api-clone_running_0" [ style = dashed] +"openstack-sahara-api_start_0 overcloud-controller-0" -> "openstack-sahara-api_monitor_60000 overcloud-controller-0" [ style = dashed] +"openstack-sahara-api_start_0 overcloud-controller-0" [ style=dashed color="red" fontcolor="black"] +} diff --git a/pengine/test10/unrunnable-2.exp b/pengine/test10/unrunnable-2.exp new file mode 100644 index 0000000000..56e315ff01 --- /dev/null +++ b/pengine/test10/unrunnable-2.exp @@ -0,0 +1 @@ + diff --git a/pengine/test10/unrunnable-2.scores b/pengine/test10/unrunnable-2.scores new file mode 100644 index 0000000000..6ec65c9e0a --- /dev/null +++ b/pengine/test10/unrunnable-2.scores @@ -0,0 +1,814 @@ +Allocation scores: +clone_color: delay-clone allocation score on overcloud-controller-0: 0 +clone_color: delay-clone allocation score on overcloud-controller-1: 0 +clone_color: delay-clone allocation score on overcloud-controller-2: 0 +clone_color: delay:0 allocation score on overcloud-controller-0: 0 +clone_color: delay:0 allocation score on overcloud-controller-1: 0 +clone_color: delay:0 allocation score on overcloud-controller-2: 0 +clone_color: delay:1 allocation score on overcloud-controller-0: 0 +clone_color: delay:1 allocation score on overcloud-controller-1: 0 +clone_color: delay:1 allocation score on overcloud-controller-2: 0 +clone_color: delay:2 allocation score on overcloud-controller-0: 0 +clone_color: delay:2 allocation score on overcloud-controller-1: 0 +clone_color: delay:2 allocation score on overcloud-controller-2: 0 +clone_color: galera-master allocation score on overcloud-controller-0: 0 +clone_color: galera-master allocation score on overcloud-controller-1: 0 +clone_color: galera-master allocation score on overcloud-controller-2: 0 +clone_color: galera:0 allocation score on overcloud-controller-0: 0 +clone_color: galera:0 allocation score on overcloud-controller-1: INFINITY +clone_color: galera:0 allocation score on overcloud-controller-2: 0 +clone_color: galera:1 allocation score on overcloud-controller-0: INFINITY +clone_color: galera:1 allocation score on overcloud-controller-1: 0 +clone_color: galera:1 allocation score on overcloud-controller-2: 0 +clone_color: galera:2 allocation score on overcloud-controller-0: 0 +clone_color: galera:2 allocation score on overcloud-controller-1: 0 +clone_color: galera:2 allocation score on overcloud-controller-2: INFINITY +clone_color: haproxy-clone allocation score on overcloud-controller-0: INFINITY +clone_color: haproxy-clone allocation score on overcloud-controller-1: INFINITY +clone_color: haproxy-clone allocation score on overcloud-controller-2: 0 +clone_color: haproxy:0 allocation score on overcloud-controller-0: 0 +clone_color: haproxy:0 allocation score on overcloud-controller-1: INFINITY +clone_color: haproxy:0 allocation score on overcloud-controller-2: 0 +clone_color: haproxy:1 allocation score on overcloud-controller-0: INFINITY +clone_color: haproxy:1 allocation score on overcloud-controller-1: 0 +clone_color: haproxy:1 allocation score on overcloud-controller-2: 0 +clone_color: haproxy:2 allocation score on overcloud-controller-0: 0 +clone_color: haproxy:2 allocation score on overcloud-controller-1: 0 +clone_color: haproxy:2 allocation score on overcloud-controller-2: INFINITY +clone_color: httpd-clone allocation score on overcloud-controller-0: 0 +clone_color: httpd-clone allocation score on overcloud-controller-1: 0 +clone_color: httpd-clone allocation score on overcloud-controller-2: 0 +clone_color: httpd:0 allocation score on overcloud-controller-0: 0 +clone_color: httpd:0 allocation score on overcloud-controller-1: 0 +clone_color: httpd:0 allocation score on overcloud-controller-2: 0 +clone_color: httpd:1 allocation score on overcloud-controller-0: 0 +clone_color: httpd:1 allocation score on overcloud-controller-1: 0 +clone_color: httpd:1 allocation score on overcloud-controller-2: 0 +clone_color: httpd:2 allocation score on overcloud-controller-0: 0 +clone_color: httpd:2 allocation score on overcloud-controller-1: 0 +clone_color: httpd:2 allocation score on overcloud-controller-2: 0 +clone_color: memcached-clone allocation score on overcloud-controller-0: 0 +clone_color: memcached-clone allocation score on overcloud-controller-1: 0 +clone_color: memcached-clone allocation score on overcloud-controller-2: 0 +clone_color: memcached:0 allocation score on overcloud-controller-0: 0 +clone_color: memcached:0 allocation score on overcloud-controller-1: INFINITY +clone_color: memcached:0 allocation score on overcloud-controller-2: 0 +clone_color: memcached:1 allocation score on overcloud-controller-0: INFINITY +clone_color: memcached:1 allocation score on overcloud-controller-1: 0 +clone_color: memcached:1 allocation score on overcloud-controller-2: 0 +clone_color: memcached:2 allocation score on overcloud-controller-0: 0 +clone_color: memcached:2 allocation score on overcloud-controller-1: 0 +clone_color: memcached:2 allocation score on overcloud-controller-2: INFINITY +clone_color: mongod-clone allocation score on overcloud-controller-0: 0 +clone_color: mongod-clone allocation score on overcloud-controller-1: 0 +clone_color: mongod-clone allocation score on overcloud-controller-2: 0 +clone_color: mongod:0 allocation score on overcloud-controller-0: 0 +clone_color: mongod:0 allocation score on overcloud-controller-1: INFINITY +clone_color: mongod:0 allocation score on overcloud-controller-2: 0 +clone_color: mongod:1 allocation score on overcloud-controller-0: INFINITY +clone_color: mongod:1 allocation score on overcloud-controller-1: 0 +clone_color: mongod:1 allocation score on overcloud-controller-2: 0 +clone_color: mongod:2 allocation score on overcloud-controller-0: 0 +clone_color: mongod:2 allocation score on overcloud-controller-1: 0 +clone_color: mongod:2 allocation score on overcloud-controller-2: INFINITY +clone_color: neutron-dhcp-agent-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-dhcp-agent-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-dhcp-agent-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-1: 0 +clone_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-0: 0 +clone_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-2: 0 +clone_color: neutron-l3-agent-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-l3-agent-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-l3-agent-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-l3-agent:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-l3-agent:0 allocation score on overcloud-controller-1: 0 +clone_color: neutron-l3-agent:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-l3-agent:1 allocation score on overcloud-controller-0: 0 +clone_color: neutron-l3-agent:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-l3-agent:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-l3-agent:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-l3-agent:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-l3-agent:2 allocation score on overcloud-controller-2: 0 +clone_color: neutron-metadata-agent-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-metadata-agent-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-metadata-agent-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-metadata-agent:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-metadata-agent:0 allocation score on overcloud-controller-1: 0 +clone_color: neutron-metadata-agent:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-metadata-agent:1 allocation score on overcloud-controller-0: 0 +clone_color: neutron-metadata-agent:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-metadata-agent:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-metadata-agent:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-metadata-agent:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-metadata-agent:2 allocation score on overcloud-controller-2: 0 +clone_color: neutron-netns-cleanup-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-netns-cleanup-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-netns-cleanup-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-1: INFINITY +clone_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-0: INFINITY +clone_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-2: INFINITY +clone_color: neutron-openvswitch-agent-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-openvswitch-agent-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-openvswitch-agent-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-1: 0 +clone_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-0: 0 +clone_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-2: 0 +clone_color: neutron-ovs-cleanup-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-ovs-cleanup-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-ovs-cleanup-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-1: INFINITY +clone_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-0: INFINITY +clone_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-2: INFINITY +clone_color: neutron-server-clone allocation score on overcloud-controller-0: 0 +clone_color: neutron-server-clone allocation score on overcloud-controller-1: 0 +clone_color: neutron-server-clone allocation score on overcloud-controller-2: 0 +clone_color: neutron-server:0 allocation score on overcloud-controller-0: 0 +clone_color: neutron-server:0 allocation score on overcloud-controller-1: 0 +clone_color: neutron-server:0 allocation score on overcloud-controller-2: 0 +clone_color: neutron-server:1 allocation score on overcloud-controller-0: 0 +clone_color: neutron-server:1 allocation score on overcloud-controller-1: 0 +clone_color: neutron-server:1 allocation score on overcloud-controller-2: 0 +clone_color: neutron-server:2 allocation score on overcloud-controller-0: 0 +clone_color: neutron-server:2 allocation score on overcloud-controller-1: 0 +clone_color: neutron-server:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-evaluator-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-evaluator-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-evaluator-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-listener-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-listener-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-listener-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-listener:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-listener:0 allocation score on overcloud-controller-1: INFINITY +clone_color: openstack-aodh-listener:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-listener:1 allocation score on overcloud-controller-0: INFINITY +clone_color: openstack-aodh-listener:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-listener:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-listener:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-listener:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-listener:2 allocation score on overcloud-controller-2: INFINITY +clone_color: openstack-aodh-notifier-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-notifier-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-notifier-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-central-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-central-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-central-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-collector-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-collector-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-collector-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-notification-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-notification-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-notification-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-1: INFINITY +clone_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-0: INFINITY +clone_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-2: INFINITY +clone_color: openstack-cinder-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-scheduler-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-scheduler-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-scheduler-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-core-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-core-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-core-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-core:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-core:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-core:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-core:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-core:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-core:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-core:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-core:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-core:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-registry-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-registry-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-registry-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-registry:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-registry:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-registry:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-registry:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-registry:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-registry:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-glance-registry:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-glance-registry:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-glance-registry:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cfn-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cfn-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cfn-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cloudwatch-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cloudwatch-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cloudwatch-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-engine-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-engine-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-engine-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-engine:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-engine:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-engine:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-engine:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-engine:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-engine:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-heat-engine:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-heat-engine:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-heat-engine:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-conductor-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-conductor-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-conductor-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-conductor:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-conductor:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-conductor:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-conductor:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-conductor:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-conductor:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-conductor:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-conductor:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-conductor:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-consoleauth-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-consoleauth-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-consoleauth-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-novncproxy-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-novncproxy-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-novncproxy-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-scheduler-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-scheduler-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-scheduler-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-api-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-api-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-api-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-api:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-api:0 allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-api:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-api:1 allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-api:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-api:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-api:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-api:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-api:2 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-engine-clone allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-engine-clone allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-engine-clone allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-engine:0 allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-engine:0 allocation score on overcloud-controller-1: INFINITY +clone_color: openstack-sahara-engine:0 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-engine:1 allocation score on overcloud-controller-0: INFINITY +clone_color: openstack-sahara-engine:1 allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-engine:1 allocation score on overcloud-controller-2: 0 +clone_color: openstack-sahara-engine:2 allocation score on overcloud-controller-0: 0 +clone_color: openstack-sahara-engine:2 allocation score on overcloud-controller-1: 0 +clone_color: openstack-sahara-engine:2 allocation score on overcloud-controller-2: INFINITY +clone_color: rabbitmq-clone allocation score on overcloud-controller-0: 0 +clone_color: rabbitmq-clone allocation score on overcloud-controller-1: 0 +clone_color: rabbitmq-clone allocation score on overcloud-controller-2: 0 +clone_color: rabbitmq:0 allocation score on overcloud-controller-0: 0 +clone_color: rabbitmq:0 allocation score on overcloud-controller-1: INFINITY +clone_color: rabbitmq:0 allocation score on overcloud-controller-2: 0 +clone_color: rabbitmq:1 allocation score on overcloud-controller-0: INFINITY +clone_color: rabbitmq:1 allocation score on overcloud-controller-1: 0 +clone_color: rabbitmq:1 allocation score on overcloud-controller-2: 0 +clone_color: rabbitmq:2 allocation score on overcloud-controller-0: 0 +clone_color: rabbitmq:2 allocation score on overcloud-controller-1: 0 +clone_color: rabbitmq:2 allocation score on overcloud-controller-2: INFINITY +clone_color: redis-master allocation score on overcloud-controller-0: 0 +clone_color: redis-master allocation score on overcloud-controller-1: 0 +clone_color: redis-master allocation score on overcloud-controller-2: 0 +clone_color: redis:0 allocation score on overcloud-controller-0: 0 +clone_color: redis:0 allocation score on overcloud-controller-1: INFINITY +clone_color: redis:0 allocation score on overcloud-controller-2: 0 +clone_color: redis:1 allocation score on overcloud-controller-0: INFINITY +clone_color: redis:1 allocation score on overcloud-controller-1: 0 +clone_color: redis:1 allocation score on overcloud-controller-2: 0 +clone_color: redis:2 allocation score on overcloud-controller-0: 0 +clone_color: redis:2 allocation score on overcloud-controller-1: 0 +clone_color: redis:2 allocation score on overcloud-controller-2: INFINITY +galera:0 promotion score on overcloud-controller-1: 100 +galera:1 promotion score on overcloud-controller-0: 100 +galera:2 promotion score on overcloud-controller-2: 100 +native_color: delay:0 allocation score on overcloud-controller-0: 0 +native_color: delay:0 allocation score on overcloud-controller-1: 0 +native_color: delay:0 allocation score on overcloud-controller-2: 0 +native_color: delay:1 allocation score on overcloud-controller-0: 0 +native_color: delay:1 allocation score on overcloud-controller-1: 0 +native_color: delay:1 allocation score on overcloud-controller-2: -INFINITY +native_color: delay:2 allocation score on overcloud-controller-0: -INFINITY +native_color: delay:2 allocation score on overcloud-controller-1: 0 +native_color: delay:2 allocation score on overcloud-controller-2: -INFINITY +native_color: galera:0 allocation score on overcloud-controller-0: 0 +native_color: galera:0 allocation score on overcloud-controller-1: INFINITY +native_color: galera:0 allocation score on overcloud-controller-2: 0 +native_color: galera:1 allocation score on overcloud-controller-0: INFINITY +native_color: galera:1 allocation score on overcloud-controller-1: -INFINITY +native_color: galera:1 allocation score on overcloud-controller-2: -INFINITY +native_color: galera:2 allocation score on overcloud-controller-0: 0 +native_color: galera:2 allocation score on overcloud-controller-1: -INFINITY +native_color: galera:2 allocation score on overcloud-controller-2: INFINITY +native_color: haproxy:0 allocation score on overcloud-controller-0: -INFINITY +native_color: haproxy:0 allocation score on overcloud-controller-1: INFINITY +native_color: haproxy:0 allocation score on overcloud-controller-2: 0 +native_color: haproxy:1 allocation score on overcloud-controller-0: INFINITY +native_color: haproxy:1 allocation score on overcloud-controller-1: 0 +native_color: haproxy:1 allocation score on overcloud-controller-2: 0 +native_color: haproxy:2 allocation score on overcloud-controller-0: -INFINITY +native_color: haproxy:2 allocation score on overcloud-controller-1: -INFINITY +native_color: haproxy:2 allocation score on overcloud-controller-2: INFINITY +native_color: httpd:0 allocation score on overcloud-controller-0: -INFINITY +native_color: httpd:0 allocation score on overcloud-controller-1: -INFINITY +native_color: httpd:0 allocation score on overcloud-controller-2: -INFINITY +native_color: httpd:1 allocation score on overcloud-controller-0: -INFINITY +native_color: httpd:1 allocation score on overcloud-controller-1: -INFINITY +native_color: httpd:1 allocation score on overcloud-controller-2: -INFINITY +native_color: httpd:2 allocation score on overcloud-controller-0: -INFINITY +native_color: httpd:2 allocation score on overcloud-controller-1: -INFINITY +native_color: httpd:2 allocation score on overcloud-controller-2: -INFINITY +native_color: ip-192.0.2.11 allocation score on overcloud-controller-0: 0 +native_color: ip-192.0.2.11 allocation score on overcloud-controller-1: INFINITY +native_color: ip-192.0.2.11 allocation score on overcloud-controller-2: 0 +native_color: ip-192.0.2.12 allocation score on overcloud-controller-0: INFINITY +native_color: ip-192.0.2.12 allocation score on overcloud-controller-1: 0 +native_color: ip-192.0.2.12 allocation score on overcloud-controller-2: 0 +native_color: memcached:0 allocation score on overcloud-controller-0: 0 +native_color: memcached:0 allocation score on overcloud-controller-1: INFINITY +native_color: memcached:0 allocation score on overcloud-controller-2: 0 +native_color: memcached:1 allocation score on overcloud-controller-0: INFINITY +native_color: memcached:1 allocation score on overcloud-controller-1: -INFINITY +native_color: memcached:1 allocation score on overcloud-controller-2: -INFINITY +native_color: memcached:2 allocation score on overcloud-controller-0: 0 +native_color: memcached:2 allocation score on overcloud-controller-1: -INFINITY +native_color: memcached:2 allocation score on overcloud-controller-2: INFINITY +native_color: mongod:0 allocation score on overcloud-controller-0: -INFINITY +native_color: mongod:0 allocation score on overcloud-controller-1: INFINITY +native_color: mongod:0 allocation score on overcloud-controller-2: -INFINITY +native_color: mongod:1 allocation score on overcloud-controller-0: INFINITY +native_color: mongod:1 allocation score on overcloud-controller-1: 0 +native_color: mongod:1 allocation score on overcloud-controller-2: -INFINITY +native_color: mongod:2 allocation score on overcloud-controller-0: 0 +native_color: mongod:2 allocation score on overcloud-controller-1: 0 +native_color: mongod:2 allocation score on overcloud-controller-2: INFINITY +native_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-0: 0 +native_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-1: 0 +native_color: neutron-dhcp-agent:0 allocation score on overcloud-controller-2: 0 +native_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-0: 0 +native_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-dhcp-agent:1 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-1: 0 +native_color: neutron-dhcp-agent:2 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-l3-agent:0 allocation score on overcloud-controller-0: 0 +native_color: neutron-l3-agent:0 allocation score on overcloud-controller-1: 0 +native_color: neutron-l3-agent:0 allocation score on overcloud-controller-2: 0 +native_color: neutron-l3-agent:1 allocation score on overcloud-controller-0: 0 +native_color: neutron-l3-agent:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-l3-agent:1 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-l3-agent:2 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-l3-agent:2 allocation score on overcloud-controller-1: 0 +native_color: neutron-l3-agent:2 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-metadata-agent:0 allocation score on overcloud-controller-0: 0 +native_color: neutron-metadata-agent:0 allocation score on overcloud-controller-1: 0 +native_color: neutron-metadata-agent:0 allocation score on overcloud-controller-2: 0 +native_color: neutron-metadata-agent:1 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-metadata-agent:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-metadata-agent:1 allocation score on overcloud-controller-2: 0 +native_color: neutron-metadata-agent:2 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-metadata-agent:2 allocation score on overcloud-controller-1: -INFINITY +native_color: neutron-metadata-agent:2 allocation score on overcloud-controller-2: 0 +native_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-1: INFINITY +native_color: neutron-netns-cleanup:0 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-0: INFINITY +native_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-netns-cleanup:1 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-0: 0 +native_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-1: 0 +native_color: neutron-netns-cleanup:2 allocation score on overcloud-controller-2: INFINITY +native_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-0: 0 +native_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-1: 0 +native_color: neutron-openvswitch-agent:0 allocation score on overcloud-controller-2: 0 +native_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-0: 0 +native_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-openvswitch-agent:1 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-1: 0 +native_color: neutron-openvswitch-agent:2 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-1: INFINITY +native_color: neutron-ovs-cleanup:0 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-0: INFINITY +native_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-ovs-cleanup:1 allocation score on overcloud-controller-2: -INFINITY +native_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-0: 0 +native_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-1: 0 +native_color: neutron-ovs-cleanup:2 allocation score on overcloud-controller-2: INFINITY +native_color: neutron-server:0 allocation score on overcloud-controller-0: 0 +native_color: neutron-server:0 allocation score on overcloud-controller-1: 0 +native_color: neutron-server:0 allocation score on overcloud-controller-2: 0 +native_color: neutron-server:1 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-server:1 allocation score on overcloud-controller-1: 0 +native_color: neutron-server:1 allocation score on overcloud-controller-2: 0 +native_color: neutron-server:2 allocation score on overcloud-controller-0: -INFINITY +native_color: neutron-server:2 allocation score on overcloud-controller-1: -INFINITY +native_color: neutron-server:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-evaluator:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-evaluator:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-evaluator:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-aodh-listener:0 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-aodh-listener:0 allocation score on overcloud-controller-1: INFINITY +native_color: openstack-aodh-listener:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-listener:1 allocation score on overcloud-controller-0: INFINITY +native_color: openstack-aodh-listener:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-listener:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-listener:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-aodh-listener:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-aodh-listener:2 allocation score on overcloud-controller-2: INFINITY +native_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-notifier:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-aodh-notifier:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-aodh-notifier:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-api:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-api:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-central:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-central:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-ceilometer-central:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-collector:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-collector:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-collector:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-1: INFINITY +native_color: openstack-ceilometer-notification:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-0: INFINITY +native_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-ceilometer-notification:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-ceilometer-notification:2 allocation score on overcloud-controller-2: INFINITY +native_color: openstack-cinder-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-cinder-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-cinder-api:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-cinder-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-api:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-cinder-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-cinder-api:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-api:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-scheduler:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-scheduler:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-scheduler:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-cinder-volume allocation score on overcloud-controller-0: 0 +native_color: openstack-cinder-volume allocation score on overcloud-controller-1: 0 +native_color: openstack-cinder-volume allocation score on overcloud-controller-2: 0 +native_color: openstack-core:0 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-core:0 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-core:0 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-core:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-core:1 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-core:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-core:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-core:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-core:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-glance-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-glance-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-glance-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-glance-api:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-glance-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-glance-api:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-glance-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-glance-api:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-glance-api:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-glance-registry:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-glance-registry:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-glance-registry:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-glance-registry:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-glance-registry:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-glance-registry:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-glance-registry:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-glance-registry:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-glance-registry:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api-cfn:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api-cfn:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-heat-api-cfn:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api-cloudwatch:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api-cloudwatch:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-heat-api-cloudwatch:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-heat-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-api:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-api:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-heat-api:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-engine:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-heat-engine:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-engine:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-engine:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-engine:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-heat-engine:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-heat-engine:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-heat-engine:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-heat-engine:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-api:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-api:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-api:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-api:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-conductor:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-conductor:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-conductor:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-conductor:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-conductor:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-conductor:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-conductor:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-conductor:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-nova-conductor:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-consoleauth:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-consoleauth:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-consoleauth:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-novncproxy:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-novncproxy:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-novncproxy:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-scheduler:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-0: 0 +native_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-scheduler:1 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-1: 0 +native_color: openstack-nova-scheduler:2 allocation score on overcloud-controller-2: -INFINITY +native_color: openstack-sahara-api:0 allocation score on overcloud-controller-0: 0 +native_color: openstack-sahara-api:0 allocation score on overcloud-controller-1: 0 +native_color: openstack-sahara-api:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-sahara-api:1 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-sahara-api:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-sahara-api:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-sahara-api:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-sahara-api:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-sahara-api:2 allocation score on overcloud-controller-2: 0 +native_color: openstack-sahara-engine:0 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-sahara-engine:0 allocation score on overcloud-controller-1: INFINITY +native_color: openstack-sahara-engine:0 allocation score on overcloud-controller-2: 0 +native_color: openstack-sahara-engine:1 allocation score on overcloud-controller-0: INFINITY +native_color: openstack-sahara-engine:1 allocation score on overcloud-controller-1: 0 +native_color: openstack-sahara-engine:1 allocation score on overcloud-controller-2: 0 +native_color: openstack-sahara-engine:2 allocation score on overcloud-controller-0: -INFINITY +native_color: openstack-sahara-engine:2 allocation score on overcloud-controller-1: -INFINITY +native_color: openstack-sahara-engine:2 allocation score on overcloud-controller-2: INFINITY +native_color: rabbitmq:0 allocation score on overcloud-controller-0: 0 +native_color: rabbitmq:0 allocation score on overcloud-controller-1: INFINITY +native_color: rabbitmq:0 allocation score on overcloud-controller-2: 0 +native_color: rabbitmq:1 allocation score on overcloud-controller-0: INFINITY +native_color: rabbitmq:1 allocation score on overcloud-controller-1: -INFINITY +native_color: rabbitmq:1 allocation score on overcloud-controller-2: -INFINITY +native_color: rabbitmq:2 allocation score on overcloud-controller-0: 0 +native_color: rabbitmq:2 allocation score on overcloud-controller-1: -INFINITY +native_color: rabbitmq:2 allocation score on overcloud-controller-2: INFINITY +native_color: redis:0 allocation score on overcloud-controller-0: 0 +native_color: redis:0 allocation score on overcloud-controller-1: INFINITY +native_color: redis:0 allocation score on overcloud-controller-2: 0 +native_color: redis:1 allocation score on overcloud-controller-0: INFINITY +native_color: redis:1 allocation score on overcloud-controller-1: -INFINITY +native_color: redis:1 allocation score on overcloud-controller-2: -INFINITY +native_color: redis:2 allocation score on overcloud-controller-0: 0 +native_color: redis:2 allocation score on overcloud-controller-1: -INFINITY +native_color: redis:2 allocation score on overcloud-controller-2: INFINITY +redis:0 promotion score on overcloud-controller-1: 1 +redis:1 promotion score on overcloud-controller-0: 1 +redis:2 promotion score on overcloud-controller-2: 1 diff --git a/pengine/test10/unrunnable-2.summary b/pengine/test10/unrunnable-2.summary new file mode 100644 index 0000000000..0c0c765451 --- /dev/null +++ b/pengine/test10/unrunnable-2.summary @@ -0,0 +1,175 @@ +6 of 117 resources DISABLED and 0 BLOCKED from being started due to failures + +Current cluster status: +Online: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + + ip-192.0.2.12 (ocf::heartbeat:IPaddr2): Started overcloud-controller-0 + Clone Set: haproxy-clone [haproxy] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Master/Slave Set: galera-master [galera] + Masters: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: memcached-clone [memcached] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: rabbitmq-clone [rabbitmq] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-core-clone [openstack-core] + Stopped (disabled): [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Master/Slave Set: redis-master [redis] + Masters: [ overcloud-controller-1 ] + Slaves: [ overcloud-controller-0 overcloud-controller-2 ] + ip-192.0.2.11 (ocf::heartbeat:IPaddr2): Started overcloud-controller-1 + Clone Set: mongod-clone [mongod] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-evaluator-clone [openstack-aodh-evaluator] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-scheduler-clone [openstack-nova-scheduler] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-l3-agent-clone [neutron-l3-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-netns-cleanup-clone [neutron-netns-cleanup] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-ovs-cleanup-clone [neutron-ovs-cleanup] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + openstack-cinder-volume (systemd:openstack-cinder-volume): Stopped + Clone Set: openstack-heat-engine-clone [openstack-heat-engine] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-api-clone [openstack-ceilometer-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-listener-clone [openstack-aodh-listener] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-metadata-agent-clone [neutron-metadata-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-notifier-clone [openstack-aodh-notifier] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-clone [openstack-heat-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-collector-clone [openstack-ceilometer-collector] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-glance-api-clone [openstack-glance-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-cinder-scheduler-clone [openstack-cinder-scheduler] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-api-clone [openstack-nova-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-consoleauth-clone [openstack-nova-consoleauth] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-sahara-api-clone [openstack-sahara-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-cloudwatch-clone [openstack-heat-api-cloudwatch] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-sahara-engine-clone [openstack-sahara-engine] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-glance-registry-clone [openstack-glance-registry] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-notification-clone [openstack-ceilometer-notification] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-cinder-api-clone [openstack-cinder-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-dhcp-agent-clone [neutron-dhcp-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-openvswitch-agent-clone [neutron-openvswitch-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-novncproxy-clone [openstack-nova-novncproxy] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: delay-clone [delay] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-server-clone [neutron-server] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-central-clone [openstack-ceilometer-central] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: httpd-clone [httpd] + Stopped (disabled): [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-cfn-clone [openstack-heat-api-cfn] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-conductor-clone [openstack-nova-conductor] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + +Transition Summary: + * Start openstack-cinder-volume (overcloud-controller-2 - blocked) + +Executing cluster transition: + +Revised cluster status: +Online: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + + ip-192.0.2.12 (ocf::heartbeat:IPaddr2): Started overcloud-controller-0 + Clone Set: haproxy-clone [haproxy] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Master/Slave Set: galera-master [galera] + Masters: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: memcached-clone [memcached] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: rabbitmq-clone [rabbitmq] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-core-clone [openstack-core] + Stopped (disabled): [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Master/Slave Set: redis-master [redis] + Masters: [ overcloud-controller-1 ] + Slaves: [ overcloud-controller-0 overcloud-controller-2 ] + ip-192.0.2.11 (ocf::heartbeat:IPaddr2): Started overcloud-controller-1 + Clone Set: mongod-clone [mongod] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-evaluator-clone [openstack-aodh-evaluator] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-scheduler-clone [openstack-nova-scheduler] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-l3-agent-clone [neutron-l3-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-netns-cleanup-clone [neutron-netns-cleanup] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-ovs-cleanup-clone [neutron-ovs-cleanup] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + openstack-cinder-volume (systemd:openstack-cinder-volume): Stopped + Clone Set: openstack-heat-engine-clone [openstack-heat-engine] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-api-clone [openstack-ceilometer-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-listener-clone [openstack-aodh-listener] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-metadata-agent-clone [neutron-metadata-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-aodh-notifier-clone [openstack-aodh-notifier] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-clone [openstack-heat-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-collector-clone [openstack-ceilometer-collector] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-glance-api-clone [openstack-glance-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-cinder-scheduler-clone [openstack-cinder-scheduler] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-api-clone [openstack-nova-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-consoleauth-clone [openstack-nova-consoleauth] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-sahara-api-clone [openstack-sahara-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-cloudwatch-clone [openstack-heat-api-cloudwatch] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-sahara-engine-clone [openstack-sahara-engine] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-glance-registry-clone [openstack-glance-registry] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-notification-clone [openstack-ceilometer-notification] + Started: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-cinder-api-clone [openstack-cinder-api] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-dhcp-agent-clone [neutron-dhcp-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-openvswitch-agent-clone [neutron-openvswitch-agent] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-novncproxy-clone [openstack-nova-novncproxy] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: delay-clone [delay] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: neutron-server-clone [neutron-server] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-ceilometer-central-clone [openstack-ceilometer-central] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: httpd-clone [httpd] + Stopped (disabled): [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-heat-api-cfn-clone [openstack-heat-api-cfn] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + Clone Set: openstack-nova-conductor-clone [openstack-nova-conductor] + Stopped: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] + diff --git a/pengine/test10/unrunnable-2.xml b/pengine/test10/unrunnable-2.xml new file mode 100644 index 0000000000..cc780eb8eb --- /dev/null +++ b/pengine/test10/unrunnable-2.xml @@ -0,0 +1,1189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/crm_resource.c b/tools/crm_resource.c index a927232747..eb0f88b4de 100644 --- a/tools/crm_resource.c +++ b/tools/crm_resource.c @@ -1,1058 +1,1058 @@ /* * Copyright (C) 2004 Andrew Beekhof * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include bool BE_QUIET = FALSE; bool scope_master = FALSE; int cib_options = cib_sync_call; GMainLoop *mainloop = NULL; #define message_timeout_ms 60*1000 static gboolean resource_ipc_timeout(gpointer data) { fprintf(stderr, "No messages received in %d seconds.. aborting\n", (int)message_timeout_ms / 1000); crm_err("No messages received in %d seconds", (int)message_timeout_ms / 1000); return crm_exit(-1); } static void resource_ipc_connection_destroy(gpointer user_data) { crm_info("Connection to CRMd was terminated"); crm_exit(1); } static void start_mainloop(void) { if (crmd_replies_needed == 0) { return; } mainloop = g_main_new(FALSE); fprintf(stderr, "Waiting for %d replies from the CRMd", crmd_replies_needed); crm_debug("Waiting for %d replies from the CRMd", crmd_replies_needed); g_timeout_add(message_timeout_ms, resource_ipc_timeout, NULL); g_main_run(mainloop); } static int resource_ipc_callback(const char *buffer, ssize_t length, gpointer userdata) { xmlNode *msg = string2xml(buffer); fprintf(stderr, "."); crm_log_xml_trace(msg, "[inbound]"); crmd_replies_needed--; if (crmd_replies_needed == 0) { fprintf(stderr, " OK\n"); crm_debug("Got all the replies we expected"); return crm_exit(pcmk_ok); } free_xml(msg); return 0; } struct ipc_client_callbacks crm_callbacks = { .dispatch = resource_ipc_callback, .destroy = resource_ipc_connection_destroy, }; /* *INDENT-OFF* */ static struct crm_option long_options[] = { /* Top-level Options */ {"help", 0, 0, '?', "\t\tThis text"}, {"version", 0, 0, '$', "\t\tVersion information" }, {"verbose", 0, 0, 'V', "\t\tIncrease debug output"}, {"quiet", 0, 0, 'Q', "\t\tPrint only the value on stdout\n"}, {"resource", 1, 0, 'r', "\tResource ID" }, {"-spacer-",1, 0, '-', "\nQueries:"}, {"list", 0, 0, 'L', "\t\tList all cluster resources"}, {"list-raw", 0, 0, 'l', "\tList the IDs of all instantiated resources (no groups/clones/...)"}, {"list-cts", 0, 0, 'c', NULL, pcmk_option_hidden}, {"list-operations", 0, 0, 'O', "\tList active resource operations. Optionally filtered by resource (-r) and/or node (-N)"}, {"list-all-operations", 0, 0, 'o', "List all resource operations. Optionally filtered by resource (-r) and/or node (-N)"}, {"pending", 0, 0, 'j', "\t\tDisplay pending state if 'record-pending' is enabled\n"}, {"list-standards", 0, 0, 0, "\tList supported standards"}, {"list-ocf-providers", 0, 0, 0, "List all available OCF providers"}, {"list-agents", 1, 0, 0, "List all agents available for the named standard and/or provider."}, {"list-ocf-alternatives", 1, 0, 0, "List all available providers for the named OCF agent\n"}, {"show-metadata", 1, 0, 0, "Show the metadata for the named class:provider:agent"}, {"query-xml", 0, 0, 'q', "\tQuery the definition of a resource (template expanded)"}, {"query-xml-raw", 0, 0, 'w', "\tQuery the definition of a resource (raw xml)"}, {"locate", 0, 0, 'W', "\t\tDisplay the current location(s) of a resource"}, {"stack", 0, 0, 'A', "\t\tDisplay the prerequisites and dependents of a resource"}, {"constraints",0, 0, 'a', "\tDisplay the (co)location constraints that apply to a resource"}, {"-spacer-", 1, 0, '-', "\nCommands:"}, {"cleanup", 0, 0, 'C', "\t\tDelete the resource history and re-check the current state. Optional: --resource"}, {"set-parameter", 1, 0, 'p', "Set the named parameter for a resource. See also -m, --meta"}, {"get-parameter", 1, 0, 'g', "Display the named parameter for a resource. See also -m, --meta"}, {"delete-parameter",1, 0, 'd', "Delete the named parameter for a resource. See also -m, --meta"}, {"get-property", 1, 0, 'G', "Display the 'class', 'type' or 'provider' of a resource", pcmk_option_hidden}, {"set-property", 1, 0, 'S', "(Advanced) Set the class, type or provider of a resource", pcmk_option_hidden}, {"-spacer-", 1, 0, '-', "\nResource location:"}, { "move", 0, 0, 'M', "\t\tMove a resource from its current location to the named destination.\n " "\t\t\t\tRequires: --host. Optional: --lifetime, --master\n\n" "\t\t\t\tNOTE: This may prevent the resource from running on the previous location node until the implicit constraints expire or are removed with --unban\n" }, { "ban", 0, 0, 'B', "\t\tPrevent the named resource from running on the named --host. \n" "\t\t\t\tRequires: --resource. Optional: --host, --lifetime, --master\n\n" "\t\t\t\tIf --host is not specified, it defaults to:\n" "\t\t\t\t * the current location for primitives and groups, or\n\n" "\t\t\t\t * the current location of the master for m/s resources with master-max=1\n\n" "\t\t\t\tAll other situations result in an error as there is no sane default.\n\n" "\t\t\t\tNOTE: This will prevent the resource from running on this node until the constraint expires or is removed with --clear\n" }, { "clear", 0, 0, 'U', "\t\tRemove all constraints created by the --ban and/or --move commands. \n" "\t\t\t\tRequires: --resource. Optional: --host, --master\n\n" "\t\t\t\tIf --host is not specified, all constraints created by --ban and --move will be removed for the named resource.\n" }, {"lifetime", 1, 0, 'u', "\tLifespan of constraints created by the --ban and --move commands"}, { "master", 0, 0, 0, "\t\tLimit the scope of the --ban, --move and --clear commands to the Master role.\n" "\t\t\t\tFor --ban and --move, the previous master can still remain active in the Slave role." }, {"-spacer-", 1, 0, '-', "\nAdvanced Commands:"}, {"delete", 0, 0, 'D', "\t\t(Advanced) Delete a resource from the CIB"}, {"fail", 0, 0, 'F', "\t\t(Advanced) Tell the cluster this resource has failed"}, {"restart", 0, 0, 0, "\t\t(Advanced) Tell the cluster to restart this resource and anything that depends on it"}, {"wait", 0, 0, 0, "\t\t(Advanced) Wait until the cluster settles into a stable state"}, {"force-demote",0,0, 0, "\t(Advanced) Bypass the cluster and demote a resource on the local node. Additional detail with -V"}, {"force-stop", 0, 0, 0, "\t(Advanced) Bypass the cluster and stop a resource on the local node. Additional detail with -V"}, {"force-start",0, 0, 0, "\t(Advanced) Bypass the cluster and start a resource on the local node. Additional detail with -V"}, {"force-promote",0,0, 0, "\t(Advanced) Bypass the cluster and promote a resource on the local node. Additional detail with -V"}, {"force-check",0, 0, 0, "\t(Advanced) Bypass the cluster and check the state of a resource on the local node. Additional detail with -V\n"}, {"-spacer-", 1, 0, '-', "\nAdditional Options:"}, {"node", 1, 0, 'N', "\tHost uname"}, {"recursive", 0, 0, 0, "\tFollow colocation chains when using --set-parameter"}, {"resource-type", 1, 0, 't', "Resource type (primitive, clone, group, ...)"}, {"parameter-value", 1, 0, 'v', "Value to use with -p or -S"}, {"meta", 0, 0, 'm', "\t\tModify a resource's configuration option rather than one which is passed to the resource agent script. For use with -p, -g, -d"}, {"utilization", 0, 0, 'z', "\tModify a resource's utilization attribute. For use with -p, -g, -d"}, {"set-name", 1, 0, 's', "\t(Advanced) ID of the instance_attributes object to change"}, {"nvpair", 1, 0, 'i', "\t(Advanced) ID of the nvpair object to change/delete"}, - {"timeout", 1, 0, 'T', "\t(Advanced) Abort if command does not finish in this time (with --restart or --wait)", pcmk_option_hidden}, + {"timeout", 1, 0, 'T', "\t(Advanced) Abort if command does not finish in this time (with --restart or --wait)"}, {"force", 0, 0, 'f', "\n" /* Is this actually true anymore? "\t\tForce the resource to move by creating a rule for the current location and a score of -INFINITY" "\n\t\tThis should be used if the resource's stickiness and constraint scores total more than INFINITY (Currently 100,000)" "\n\t\tNOTE: This will prevent the resource from running on this node until the constraint is removed with -U or the --lifetime duration expires\n"*/ }, {"xml-file", 1, 0, 'x', NULL, pcmk_option_hidden},\ /* legacy options */ {"host-uname", 1, 0, 'H', NULL, pcmk_option_hidden}, {"migrate", 0, 0, 'M', NULL, pcmk_option_hidden}, {"un-migrate", 0, 0, 'U', NULL, pcmk_option_hidden}, {"un-move", 0, 0, 'U', NULL, pcmk_option_hidden}, {"refresh", 0, 0, 'R', NULL, pcmk_option_hidden}, {"reprobe", 0, 0, 'P', NULL, pcmk_option_hidden}, {"-spacer-", 1, 0, '-', "\nExamples:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', "List the configured resources:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --list", pcmk_option_example}, {"-spacer-", 1, 0, '-', "List the available OCF agents:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --list-agents ocf", pcmk_option_example}, {"-spacer-", 1, 0, '-', "List the available OCF agents from the linux-ha project:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --list-agents ocf:heartbeat", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Display the current location of 'myResource':", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --locate", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Move 'myResource' to another machine:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --move", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Move 'myResource' to a specific machine:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --move --node altNode", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Allow (but not force) 'myResource' to move back to its original location:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --un-move", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Tell the cluster that 'myResource' failed:", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --fail", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Stop 'myResource' (and anything that depends on it):", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --set-parameter target-role --meta --parameter-value Stopped", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Tell the cluster not to manage 'myResource':", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', "The cluster will not attempt to start or stop the resource under any circumstances."}, {"-spacer-", 1, 0, '-', "Useful when performing maintenance tasks on a resource.", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --set-parameter is-managed --meta --parameter-value false", pcmk_option_example}, {"-spacer-", 1, 0, '-', "Erase the operation history of 'myResource' on 'aNode':", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', "The cluster will 'forget' the existing resource state (including any errors) and attempt to recover the resource."}, {"-spacer-", 1, 0, '-', "Useful when a resource had failed permanently and has been repaired by an administrator.", pcmk_option_paragraph}, {"-spacer-", 1, 0, '-', " crm_resource --resource myResource --cleanup --node aNode", pcmk_option_example}, {0, 0, 0, 0} }; /* *INDENT-ON* */ int main(int argc, char **argv) { char rsc_cmd = 'L'; const char *rsc_id = NULL; const char *host_uname = NULL; const char *prop_name = NULL; const char *prop_value = NULL; const char *rsc_type = NULL; const char *prop_id = NULL; const char *prop_set = NULL; const char *rsc_long_cmd = NULL; const char *longname = NULL; GHashTable *override_params = NULL; char *xml_file = NULL; crm_ipc_t *crmd_channel = NULL; pe_working_set_t data_set; cib_t *cib_conn = NULL; bool recursive = FALSE; char *our_pid = NULL; /* Not all commands set these appropriately, but the defaults here are * sufficient to get the logic right. */ bool require_resource = TRUE; /* whether command requires that resource be specified */ bool require_dataset = TRUE; /* whether command requires populated dataset instance */ bool require_crmd = FALSE; /* whether command requires connection to CRMd */ int rc = pcmk_ok; int option_index = 0; int timeout_ms = 0; int argerr = 0; int flag; crm_log_cli_init("crm_resource"); crm_set_options(NULL, "(query|command) [options]", long_options, "Perform tasks related to cluster resources.\nAllows resources to be queried (definition and location), modified, and moved around the cluster.\n"); if (argc < 2) { crm_help('?', EX_USAGE); } while (1) { flag = crm_get_option_long(argc, argv, &option_index, &longname); if (flag == -1) break; switch (flag) { case 0: /* long options with no short equivalent */ if (safe_str_eq("master", longname)) { scope_master = TRUE; } else if(safe_str_eq(longname, "recursive")) { recursive = TRUE; } else if (safe_str_eq("wait", longname)) { rsc_cmd = flag; rsc_long_cmd = longname; require_resource = FALSE; require_dataset = FALSE; } else if ( safe_str_eq("restart", longname) || safe_str_eq("force-demote", longname) || safe_str_eq("force-stop", longname) || safe_str_eq("force-start", longname) || safe_str_eq("force-promote", longname) || safe_str_eq("force-check", longname)) { rsc_cmd = flag; rsc_long_cmd = longname; crm_log_args(argc, argv); } else if (safe_str_eq("list-ocf-providers", longname) || safe_str_eq("list-ocf-alternatives", longname) || safe_str_eq("list-standards", longname)) { const char *text = NULL; lrmd_list_t *list = NULL; lrmd_list_t *iter = NULL; lrmd_t *lrmd_conn = lrmd_api_new(); if (safe_str_eq("list-ocf-providers", longname) || safe_str_eq("list-ocf-alternatives", longname)) { rc = lrmd_conn->cmds->list_ocf_providers(lrmd_conn, optarg, &list); text = "OCF providers"; } else if (safe_str_eq("list-standards", longname)) { rc = lrmd_conn->cmds->list_standards(lrmd_conn, &list); text = "standards"; } if (rc > 0) { rc = 0; for (iter = list; iter != NULL; iter = iter->next) { rc++; printf("%s\n", iter->val); } lrmd_list_freeall(list); } else if (optarg) { fprintf(stderr, "No %s found for %s\n", text, optarg); } else { fprintf(stderr, "No %s found\n", text); } lrmd_api_delete(lrmd_conn); return crm_exit(rc); } else if (safe_str_eq("show-metadata", longname)) { char standard[512]; char provider[512]; char type[512]; char *metadata = NULL; lrmd_t *lrmd_conn = lrmd_api_new(); rc = sscanf(optarg, "%[^:]:%[^:]:%s", standard, provider, type); if (rc == 3) { rc = lrmd_conn->cmds->get_metadata(lrmd_conn, standard, provider, type, &metadata, 0); } else if (rc == 2) { rc = lrmd_conn->cmds->get_metadata(lrmd_conn, standard, NULL, provider, &metadata, 0); } else if (rc < 2) { fprintf(stderr, "Please specify standard:type or standard:provider:type, not %s\n", optarg); rc = -EINVAL; } if (metadata) { printf("%s\n", metadata); } else { fprintf(stderr, "Metadata query for %s failed: %d\n", optarg, rc); } lrmd_api_delete(lrmd_conn); return crm_exit(rc); } else if (safe_str_eq("list-agents", longname)) { lrmd_list_t *list = NULL; lrmd_list_t *iter = NULL; char *provider = strchr (optarg, ':'); lrmd_t *lrmd_conn = lrmd_api_new(); if (provider) { *provider++ = 0; } rc = lrmd_conn->cmds->list_agents(lrmd_conn, &list, optarg, provider); if (rc > 0) { rc = 0; for (iter = list; iter != NULL; iter = iter->next) { printf("%s\n", iter->val); rc++; } lrmd_list_freeall(list); rc = 0; } else { fprintf(stderr, "No agents found for standard=%s, provider=%s\n", optarg, (provider? provider : "*")); rc = -1; } lrmd_api_delete(lrmd_conn); return crm_exit(rc); } else { crm_err("Unhandled long option: %s", longname); } break; case 'V': do_trace = TRUE; crm_bump_log_level(argc, argv); break; case '$': case '?': crm_help(flag, EX_OK); break; case 'x': xml_file = strdup(optarg); break; case 'Q': BE_QUIET = TRUE; break; case 'm': attr_set_type = XML_TAG_META_SETS; break; case 'z': attr_set_type = XML_TAG_UTILIZATION; break; case 'u': move_lifetime = strdup(optarg); break; case 'f': do_force = TRUE; crm_log_args(argc, argv); break; case 'i': prop_id = optarg; break; case 's': prop_set = optarg; break; case 'r': rsc_id = optarg; break; case 'v': prop_value = optarg; break; case 't': rsc_type = optarg; break; case 'T': timeout_ms = crm_get_msec(optarg); break; case 'C': case 'R': case 'P': crm_log_args(argc, argv); require_resource = FALSE; require_crmd = TRUE; rsc_cmd = 'C'; break; case 'F': crm_log_args(argc, argv); require_crmd = TRUE; rsc_cmd = flag; break; case 'U': case 'B': case 'M': case 'D': crm_log_args(argc, argv); rsc_cmd = flag; break; case 'L': case 'c': case 'l': case 'q': case 'w': case 'W': case 'O': case 'o': case 'A': case 'a': rsc_cmd = flag; break; case 'j': print_pending = TRUE; break; case 'p': case 'd': case 'S': crm_log_args(argc, argv); prop_name = optarg; rsc_cmd = flag; break; case 'G': case 'g': prop_name = optarg; rsc_cmd = flag; break; case 'h': case 'H': case 'N': crm_trace("Option %c => %s", flag, optarg); host_uname = optarg; break; default: CMD_ERR("Argument code 0%o (%c) is not (?yet?) supported", flag, flag); ++argerr; break; } } if (optind < argc && argv[optind] != NULL && rsc_cmd == 0 && rsc_long_cmd) { override_params = g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); while (optind < argc && argv[optind] != NULL) { char *name = calloc(1, strlen(argv[optind])); char *value = calloc(1, strlen(argv[optind])); int rc = sscanf(argv[optind], "%[^=]=%s", name, value); if(rc == 2) { g_hash_table_replace(override_params, name, value); } else { CMD_ERR("Error parsing '%s' as a name=value pair for --%s", argv[optind], rsc_long_cmd); free(value); free(name); argerr++; } optind++; } } else if (optind < argc && argv[optind] != NULL && rsc_cmd == 0) { CMD_ERR("non-option ARGV-elements: "); while (optind < argc && argv[optind] != NULL) { CMD_ERR("[%d of %d] %s ", optind, argc, argv[optind]); optind++; argerr++; } } if (optind > argc) { ++argerr; } if (argerr) { CMD_ERR("Invalid option(s) supplied, use --help for valid usage"); return crm_exit(EX_USAGE); } our_pid = calloc(1, 11); if (our_pid != NULL) { snprintf(our_pid, 10, "%d", getpid()); our_pid[10] = '\0'; } if (do_force) { crm_debug("Forcing..."); cib_options |= cib_quorum_override; } data_set.input = NULL; /* make clean-up easier */ /* If user specified resource, look for it, even if it's optional for command */ if (rsc_id) { require_resource = TRUE; } /* We need a dataset to find a resource, even if command doesn't need it */ if (require_resource) { require_dataset = TRUE; } /* Establish a connection to the CIB */ cib_conn = cib_new(); rc = cib_conn->cmds->signon(cib_conn, crm_system_name, cib_command); if (rc != pcmk_ok) { CMD_ERR("Error signing on to the CIB service: %s", pcmk_strerror(rc)); return crm_exit(rc); } /* Populate working set from XML file if specified or CIB query otherwise */ if (require_dataset) { xmlNode *cib_xml_copy = NULL; if (xml_file != NULL) { cib_xml_copy = filename2xml(xml_file); } else { rc = cib_conn->cmds->query(cib_conn, NULL, &cib_xml_copy, cib_scope_local | cib_sync_call); } if(rc != pcmk_ok) { goto bail; } /* Populate the working set instance */ set_working_set_defaults(&data_set); rc = update_working_set_xml(&data_set, &cib_xml_copy); if (rc != pcmk_ok) { goto bail; } cluster_status(&data_set); /* Set rc to -ENXIO if no resource matching rsc_id is found. * This does not bail, but is handled later for certain commands. * That handling could be done here instead if all flags above set * require_resource appropriately. */ if (require_resource && rsc_id && (find_rsc_or_clone(rsc_id, &data_set) == NULL)) { rc = -ENXIO; } } /* Establish a connection to the CRMd if needed */ if (require_crmd) { xmlNode *xml = NULL; mainloop_io_t *source = mainloop_add_ipc_client(CRM_SYSTEM_CRMD, G_PRIORITY_DEFAULT, 0, NULL, &crm_callbacks); crmd_channel = mainloop_get_ipc_client(source); if (crmd_channel == NULL) { CMD_ERR("Error signing on to the CRMd service"); rc = -ENOTCONN; goto bail; } xml = create_hello_message(our_pid, crm_system_name, "0", "1"); crm_ipc_send(crmd_channel, xml, 0, 0, NULL); free_xml(xml); } /* Handle rsc_cmd appropriately */ if (rsc_cmd == 'L') { rc = pcmk_ok; cli_resource_print_list(&data_set, FALSE); } else if (rsc_cmd == 'l') { int found = 0; GListPtr lpc = NULL; rc = pcmk_ok; for (lpc = data_set.resources; lpc != NULL; lpc = lpc->next) { resource_t *rsc = (resource_t *) lpc->data; found++; cli_resource_print_raw(rsc); } if (found == 0) { printf("NO resources configured\n"); rc = -ENXIO; } } else if (rsc_cmd == 0 && rsc_long_cmd && safe_str_eq(rsc_long_cmd, "restart")) { resource_t *rsc = NULL; rc = -ENXIO; if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); goto bail; } rsc = pe_find_resource(data_set.resources, rsc_id); rc = -EINVAL; if (rsc == NULL) { CMD_ERR("Resource '%s' not restarted: unknown", rsc_id); goto bail; } rc = cli_resource_restart(rsc, host_uname, timeout_ms, cib_conn); } else if (rsc_cmd == 0 && rsc_long_cmd && safe_str_eq(rsc_long_cmd, "wait")) { rc = wait_till_stable(timeout_ms, cib_conn); } else if (rsc_cmd == 0 && rsc_long_cmd) { /* force-(stop|start|check) */ rc = cli_resource_execute(rsc_id, rsc_long_cmd, override_params, cib_conn, &data_set); } else if (rsc_cmd == 'A' || rsc_cmd == 'a') { GListPtr lpc = NULL; resource_t *rsc = pe_find_resource(data_set.resources, rsc_id); xmlNode *cib_constraints = get_object_root(XML_CIB_TAG_CONSTRAINTS, data_set.input); if (rsc == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } unpack_constraints(cib_constraints, &data_set); for (lpc = data_set.resources; lpc != NULL; lpc = lpc->next) { resource_t *r = (resource_t *) lpc->data; clear_bit(r->flags, pe_rsc_allocating); } cli_resource_print_colocation(rsc, TRUE, rsc_cmd == 'A', 1); fprintf(stdout, "* %s\n", rsc->id); cli_resource_print_location(rsc, NULL); for (lpc = data_set.resources; lpc != NULL; lpc = lpc->next) { resource_t *r = (resource_t *) lpc->data; clear_bit(r->flags, pe_rsc_allocating); } cli_resource_print_colocation(rsc, FALSE, rsc_cmd == 'A', 1); } else if (rsc_cmd == 'c') { int found = 0; GListPtr lpc = NULL; rc = pcmk_ok; for (lpc = data_set.resources; lpc != NULL; lpc = lpc->next) { resource_t *rsc = (resource_t *) lpc->data; cli_resource_print_cts(rsc); found++; } cli_resource_print_cts_constraints(&data_set); } else if (rsc_cmd == 'F') { rc = cli_resource_fail(crmd_channel, host_uname, rsc_id, &data_set); if (rc == pcmk_ok) { start_mainloop(); } } else if (rsc_cmd == 'O') { rc = cli_resource_print_operations(rsc_id, host_uname, TRUE, &data_set); } else if (rsc_cmd == 'o') { rc = cli_resource_print_operations(rsc_id, host_uname, FALSE, &data_set); /* All remaining commands require that resource exist */ } else if (rc == -ENXIO) { CMD_ERR("Resource '%s' not found: %s", crm_str(rsc_id), pcmk_strerror(rc)); } else if (rsc_cmd == 'W') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } rc = cli_resource_search(rsc_id, &data_set); if (rc >= 0) { rc = pcmk_ok; } } else if (rsc_cmd == 'q') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } rc = cli_resource_print(rsc_id, &data_set, TRUE); } else if (rsc_cmd == 'w') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } rc = cli_resource_print(rsc_id, &data_set, FALSE); } else if (rsc_cmd == 'U') { node_t *dest = NULL; if (rsc_id == NULL) { CMD_ERR("No value specified for --resource"); rc = -ENXIO; goto bail; } if (host_uname) { dest = pe_find_node(data_set.nodes, host_uname); if (dest == NULL) { CMD_ERR("Unknown node: %s", host_uname); rc = -ENXIO; goto bail; } rc = cli_resource_clear(rsc_id, dest->details->uname, NULL, cib_conn); } else { rc = cli_resource_clear(rsc_id, NULL, data_set.nodes, cib_conn); } } else if (rsc_cmd == 'M' && host_uname) { rc = cli_resource_move(rsc_id, host_uname, cib_conn, &data_set); } else if (rsc_cmd == 'B' && host_uname) { resource_t *rsc = pe_find_resource(data_set.resources, rsc_id); node_t *dest = pe_find_node(data_set.nodes, host_uname); rc = -ENXIO; if (rsc_id == NULL) { CMD_ERR("No value specified for --resource"); goto bail; } else if(rsc == NULL) { CMD_ERR("Resource '%s' not moved: unknown", rsc_id); } else if (dest == NULL) { CMD_ERR("Error performing operation: node '%s' is unknown", host_uname); goto bail; } rc = cli_resource_ban(rsc_id, dest->details->uname, NULL, cib_conn); } else if (rsc_cmd == 'B' || rsc_cmd == 'M') { resource_t *rsc = pe_find_resource(data_set.resources, rsc_id); rc = -ENXIO; if (rsc_id == NULL) { CMD_ERR("No value specified for --resource"); goto bail; } rc = -EINVAL; if(rsc == NULL) { CMD_ERR("Resource '%s' not moved: unknown", rsc_id); } else if(g_list_length(rsc->running_on) == 1) { node_t *current = rsc->running_on->data; rc = cli_resource_ban(rsc_id, current->details->uname, NULL, cib_conn); } else if(rsc->variant == pe_master) { int count = 0; GListPtr iter = NULL; node_t *current = NULL; for(iter = rsc->children; iter; iter = iter->next) { resource_t *child = (resource_t *)iter->data; enum rsc_role_e child_role = child->fns->state(child, TRUE); if(child_role == RSC_ROLE_MASTER) { count++; current = child->running_on->data; } } if(count == 1 && current) { rc = cli_resource_ban(rsc_id, current->details->uname, NULL, cib_conn); } else { CMD_ERR("Resource '%s' not moved: active in %d locations (promoted in %d).", rsc_id, g_list_length(rsc->running_on), count); CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --host ", rsc_id); CMD_ERR("You can prevent '%s' from being promoted at a specific location with:" " --ban --master --host ", rsc_id); } } else { CMD_ERR("Resource '%s' not moved: active in %d locations.", rsc_id, g_list_length(rsc->running_on)); CMD_ERR("You can prevent '%s' from running on a specific location with: --ban --host ", rsc_id); } } else if (rsc_cmd == 'G') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } rc = cli_resource_print_property(rsc_id, prop_name, &data_set); } else if (rsc_cmd == 'S') { xmlNode *msg_data = NULL; if (prop_value == NULL || strlen(prop_value) == 0) { CMD_ERR("You need to supply a value with the -v option"); rc = -EINVAL; goto bail; } else if (cib_conn == NULL) { rc = -ENOTCONN; goto bail; } if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } CRM_LOG_ASSERT(rsc_type != NULL); CRM_LOG_ASSERT(prop_name != NULL); CRM_LOG_ASSERT(prop_value != NULL); msg_data = create_xml_node(NULL, rsc_type); crm_xml_add(msg_data, XML_ATTR_ID, rsc_id); crm_xml_add(msg_data, prop_name, prop_value); rc = cib_conn->cmds->modify(cib_conn, XML_CIB_TAG_RESOURCES, msg_data, cib_options); free_xml(msg_data); } else if (rsc_cmd == 'g') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } rc = cli_resource_print_attribute(rsc_id, prop_name, &data_set); } else if (rsc_cmd == 'p') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } if (prop_value == NULL || strlen(prop_value) == 0) { CMD_ERR("You need to supply a value with the -v option"); rc = -EINVAL; goto bail; } /* coverity[var_deref_model] False positive */ rc = cli_resource_update_attribute(rsc_id, prop_set, prop_id, prop_name, prop_value, recursive, cib_conn, &data_set); } else if (rsc_cmd == 'd') { if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } /* coverity[var_deref_model] False positive */ rc = cli_resource_delete_attribute(rsc_id, prop_set, prop_id, prop_name, cib_conn, &data_set); } else if (rsc_cmd == 'C' && rsc_id) { resource_t *rsc = pe_find_resource(data_set.resources, rsc_id); if(do_force == FALSE) { rsc = uber_parent(rsc); } crm_debug("Re-checking the state of %s for %s on %s", rsc->id, rsc_id, host_uname); if(rsc) { crmd_replies_needed = 0; rc = cli_resource_delete(cib_conn, crmd_channel, host_uname, rsc, &data_set); } else { rc = -ENODEV; } if(rc == pcmk_ok && BE_QUIET == FALSE) { /* Now check XML_RSC_ATTR_TARGET_ROLE and XML_RSC_ATTR_MANAGED */ cli_resource_check(cib_conn, rsc); } if (rc == pcmk_ok) { start_mainloop(); } } else if (rsc_cmd == 'C') { #if HAVE_ATOMIC_ATTRD const char *router_node = host_uname; xmlNode *msg_data = NULL; xmlNode *cmd = NULL; if (host_uname) { node_t *node = pe_find_node(data_set.nodes, host_uname); if (node && is_remote_node(node)) { if (node->details->remote_rsc == NULL || node->details->remote_rsc->running_on == NULL) { CMD_ERR("No lrmd connection detected to remote node %s", host_uname); return -ENXIO; } node = node->details->remote_rsc->running_on->data; router_node = node->details->uname; } } msg_data = create_xml_node(NULL, "crm-resource-reprobe-op"); crm_xml_add(msg_data, XML_LRM_ATTR_TARGET, host_uname); if (safe_str_neq(router_node, host_uname)) { crm_xml_add(msg_data, XML_LRM_ATTR_ROUTER_NODE, router_node); } cmd = create_request(CRM_OP_REPROBE, msg_data, router_node, CRM_SYSTEM_CRMD, crm_system_name, our_pid); free_xml(msg_data); crm_debug("Re-checking the state of all resources on %s", host_uname?host_uname:"all nodes"); rc = attrd_update_delegate( NULL, 'u', host_uname, "fail-count-*", NULL, XML_CIB_TAG_STATUS, NULL, NULL, NULL, attrd_opt_none); if (crm_ipc_send(crmd_channel, cmd, 0, 0, NULL) > 0) { start_mainloop(); } free_xml(cmd); #else GListPtr rIter = NULL; crmd_replies_needed = 0; for (rIter = data_set.resources; rIter; rIter = rIter->next) { resource_t *rsc = rIter->data; cli_resource_delete(cib_conn, crmd_channel, host_uname, rsc, &data_set); } start_mainloop(); #endif } else if (rsc_cmd == 'D') { xmlNode *msg_data = NULL; if (rsc_id == NULL) { CMD_ERR("Must supply a resource id with -r"); rc = -ENXIO; goto bail; } if (rsc_type == NULL) { CMD_ERR("You need to specify a resource type with -t"); rc = -ENXIO; goto bail; } else if (cib_conn == NULL) { rc = -ENOTCONN; goto bail; } msg_data = create_xml_node(NULL, rsc_type); crm_xml_add(msg_data, XML_ATTR_ID, rsc_id); rc = cib_conn->cmds->delete(cib_conn, XML_CIB_TAG_RESOURCES, msg_data, cib_options); free_xml(msg_data); } else { CMD_ERR("Unknown command: %c", rsc_cmd); } bail: if (data_set.input != NULL) { cleanup_alloc_calculations(&data_set); } if (cib_conn != NULL) { cib_conn->cmds->signoff(cib_conn); cib_delete(cib_conn); } if (rc == -pcmk_err_no_quorum) { CMD_ERR("Error performing operation: %s", pcmk_strerror(rc)); CMD_ERR("Try using -f"); } else if (rc != pcmk_ok) { CMD_ERR("Error performing operation: %s", pcmk_strerror(rc)); } return crm_exit(rc); }