diff --git a/pengine/allocate.c b/pengine/allocate.c index 7dd70f16f0..0994a8769c 100644 --- a/pengine/allocate.c +++ b/pengine/allocate.c @@ -1,2557 +1,2559 @@ /* * 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 CRM_TRACE_INIT_DATA(pe_allocate); void set_alloc_actions(pe_working_set_t * data_set); void migrate_reload_madness(pe_working_set_t * data_set); resource_alloc_functions_t resource_class_alloc_functions[] = { { native_merge_weights, native_color, native_create_actions, native_create_probe, native_internal_constraints, native_rsc_colocation_lh, native_rsc_colocation_rh, native_rsc_location, native_action_flags, native_update_actions, native_expand, native_append_meta, }, { group_merge_weights, group_color, group_create_actions, native_create_probe, group_internal_constraints, group_rsc_colocation_lh, group_rsc_colocation_rh, group_rsc_location, group_action_flags, group_update_actions, group_expand, group_append_meta, }, { clone_merge_weights, clone_color, clone_create_actions, clone_create_probe, clone_internal_constraints, clone_rsc_colocation_lh, clone_rsc_colocation_rh, clone_rsc_location, clone_action_flags, clone_update_actions, clone_expand, clone_append_meta, }, { master_merge_weights, master_color, master_create_actions, clone_create_probe, master_internal_constraints, clone_rsc_colocation_lh, master_rsc_colocation_rh, clone_rsc_location, clone_action_flags, clone_update_actions, clone_expand, master_append_meta, } }; static gboolean check_rsc_parameters(resource_t * rsc, node_t * node, xmlNode * rsc_entry, gboolean active_here, pe_working_set_t * data_set) { int attr_lpc = 0; gboolean force_restart = FALSE; gboolean delete_resource = FALSE; gboolean changed = FALSE; const char *value = NULL; const char *old_value = NULL; const char *attr_list[] = { XML_ATTR_TYPE, XML_AGENT_ATTR_CLASS, XML_AGENT_ATTR_PROVIDER }; for (; attr_lpc < DIMOF(attr_list); attr_lpc++) { value = crm_element_value(rsc->xml, attr_list[attr_lpc]); old_value = crm_element_value(rsc_entry, attr_list[attr_lpc]); if (value == old_value /* ie. NULL */ || crm_str_eq(value, old_value, TRUE)) { continue; } changed = TRUE; trigger_unfencing(rsc, node, "Device definition changed", NULL, data_set); if (active_here) { force_restart = TRUE; crm_notice("Forcing restart of %s on %s, %s changed: %s -> %s", rsc->id, node->details->uname, attr_list[attr_lpc], crm_str(old_value), crm_str(value)); } } if (force_restart) { /* make sure the restart happens */ stop_action(rsc, node, FALSE); set_bit(rsc->flags, pe_rsc_start_pending); delete_resource = TRUE; } else if (changed) { delete_resource = TRUE; } return delete_resource; } static void CancelXmlOp(resource_t * rsc, xmlNode * xml_op, node_t * active_node, const char *reason, pe_working_set_t * data_set) { int interval = 0; action_t *cancel = NULL; char *key = NULL; const char *task = NULL; const char *call_id = NULL; const char *interval_s = NULL; CRM_CHECK(xml_op != NULL, return); CRM_CHECK(active_node != NULL, return); task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); call_id = crm_element_value(xml_op, XML_LRM_ATTR_CALLID); interval_s = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); interval = crm_parse_int(interval_s, "0"); /* we need to reconstruct the key because of the way we used to construct resource IDs */ key = generate_op_key(rsc->id, task, interval); crm_info("Action %s on %s will be stopped: %s", key, active_node->details->uname, reason ? reason : "unknown"); /* TODO: This looks highly dangerous if we ever try to schedule 'key' too */ cancel = custom_action(rsc, strdup(key), RSC_CANCEL, active_node, FALSE, TRUE, data_set); free(cancel->task); free(cancel->cancel_task); cancel->task = strdup(RSC_CANCEL); cancel->cancel_task = strdup(task); add_hash_param(cancel->meta, XML_LRM_ATTR_TASK, task); add_hash_param(cancel->meta, XML_LRM_ATTR_CALLID, call_id); add_hash_param(cancel->meta, XML_LRM_ATTR_INTERVAL, interval_s); custom_action_order(rsc, stop_key(rsc), NULL, rsc, NULL, cancel, pe_order_optional, data_set); free(key); key = NULL; } static gboolean check_action_definition(resource_t * rsc, node_t * active_node, xmlNode * xml_op, pe_working_set_t * data_set) { char *key = NULL; int interval = 0; const char *interval_s = NULL; const op_digest_cache_t *digest_data = NULL; gboolean did_change = FALSE; const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); const char *op_version; CRM_CHECK(active_node != NULL, return FALSE); if (safe_str_eq(task, RSC_STOP)) { return FALSE; } interval_s = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL); interval = crm_parse_int(interval_s, "0"); if (interval > 0) { xmlNode *op_match = NULL; /* we need to reconstruct the key because of the way we used to construct resource IDs */ key = generate_op_key(rsc->id, task, interval); pe_rsc_trace(rsc, "Checking parameters for %s", key); op_match = find_rsc_op_entry(rsc, key); if (op_match == NULL && is_set(data_set->flags, pe_flag_stop_action_orphans)) { CancelXmlOp(rsc, xml_op, active_node, "orphan", data_set); free(key); return TRUE; } else if (op_match == NULL) { pe_rsc_debug(rsc, "Orphan action detected: %s on %s", key, active_node->details->uname); free(key); return TRUE; } free(key); key = NULL; } crm_trace("Testing %s_%s_%d on %s", rsc->id, task, interval, active_node?active_node->details->uname:"N/A"); if (interval == 0 && safe_str_eq(task, RSC_STATUS)) { /* Reload based on the start action not a probe */ task = RSC_START; } else if (interval == 0 && safe_str_eq(task, RSC_MIGRATED)) { /* Reload based on the start action not a migrate */ task = RSC_START; } digest_data = rsc_action_digest_cmp(rsc, xml_op, active_node, data_set); op_version = crm_element_value(xml_op, XML_ATTR_CRM_VERSION); /* Changes that force a restart */ if (digest_data->rc == RSC_DIGEST_RESTART) { const char *digest_restart = crm_element_value(xml_op, XML_LRM_ATTR_RESTART_DIGEST); did_change = TRUE; key = generate_op_key(rsc->id, task, interval); crm_log_xml_info(digest_data->params_restart, "params:restart"); pe_rsc_info(rsc, "Parameters to %s on %s changed: was %s vs. now %s (restart:%s) %s", key, active_node->details->uname, crm_str(digest_restart), digest_data->digest_restart_calc, op_version, crm_element_value(xml_op, XML_ATTR_TRANSITION_MAGIC)); custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); trigger_unfencing(rsc, NULL, "Device parameters changed", NULL, data_set); } else if ((digest_data->rc == RSC_DIGEST_ALL) || (digest_data->rc == RSC_DIGEST_UNKNOWN)) { /* Changes that can potentially be handled by a reload */ const char *digest_restart = crm_element_value(xml_op, XML_LRM_ATTR_RESTART_DIGEST); const char *digest_all = crm_element_value(xml_op, XML_LRM_ATTR_OP_DIGEST); did_change = TRUE; trigger_unfencing(rsc, NULL, "Device parameters changed (reload)", NULL, data_set); crm_log_xml_info(digest_data->params_all, "params:reload"); key = generate_op_key(rsc->id, task, interval); pe_rsc_info(rsc, "Parameters to %s on %s changed: was %s vs. now %s (reload:%s) %s", key, active_node->details->uname, crm_str(digest_all), digest_data->digest_all_calc, op_version, crm_element_value(xml_op, XML_ATTR_TRANSITION_MAGIC)); if (interval > 0) { action_t *op = NULL; #if 0 /* Always reload/restart the entire resource */ op = custom_action(rsc, start_key(rsc), RSC_START, NULL, FALSE, TRUE, data_set); update_action_flags(op, pe_action_allow_reload_conversion); #else /* Re-sending the recurring op is sufficient - the old one will be cancelled automatically */ op = custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); custom_action_order(rsc, start_key(rsc), NULL, NULL, NULL, op, pe_order_runnable_left, data_set); #endif } else if (digest_restart) { pe_rsc_trace(rsc, "Reloading '%s' action for resource %s", task, rsc->id); /* Allow this resource to reload - unless something else causes a full restart */ set_bit(rsc->flags, pe_rsc_try_reload); /* Create these for now, it keeps the action IDs the same in the regression outputs */ custom_action(rsc, key, task, NULL, TRUE, TRUE, data_set); } else { pe_rsc_trace(rsc, "Resource %s doesn't know how to reload", rsc->id); /* Re-send the start/demote/promote op * Recurring ops will be detected independantly */ custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); } } return did_change; } extern gboolean DeleteRsc(resource_t * rsc, node_t * node, gboolean optional, pe_working_set_t * data_set); static void check_actions_for(xmlNode * rsc_entry, resource_t * rsc, node_t * node, pe_working_set_t * data_set) { GListPtr gIter = NULL; int offset = -1; int interval = 0; int stop_index = 0; int start_index = 0; const char *task = NULL; const char *interval_s = NULL; xmlNode *rsc_op = NULL; GListPtr op_list = NULL; GListPtr sorted_op_list = NULL; gboolean is_probe = FALSE; gboolean did_change = FALSE; CRM_CHECK(node != NULL, return); if (is_set(rsc->flags, pe_rsc_orphan)) { resource_t *parent = uber_parent(rsc); if(parent == NULL || parent->variant < pe_clone || is_set(parent->flags, pe_rsc_unique)) { pe_rsc_trace(rsc, "Skipping param check for %s and deleting: orphan", rsc->id); DeleteRsc(rsc, node, FALSE, data_set); } else { pe_rsc_trace(rsc, "Skipping param check for %s (orphan clone)", rsc->id); } return; } else if (pe_find_node_id(rsc->running_on, node->details->id) == NULL) { if (check_rsc_parameters(rsc, node, rsc_entry, FALSE, data_set)) { DeleteRsc(rsc, node, FALSE, data_set); } pe_rsc_trace(rsc, "Skipping param check for %s: no longer active on %s", rsc->id, node->details->uname); return; } pe_rsc_trace(rsc, "Processing %s on %s", rsc->id, node->details->uname); if (check_rsc_parameters(rsc, node, rsc_entry, TRUE, data_set)) { DeleteRsc(rsc, node, FALSE, data_set); } for (rsc_op = __xml_first_child(rsc_entry); rsc_op != NULL; rsc_op = __xml_next(rsc_op)) { if (crm_str_eq((const char *)rsc_op->name, XML_LRM_TAG_RSC_OP, TRUE)) { op_list = g_list_prepend(op_list, rsc_op); } } sorted_op_list = g_list_sort(op_list, sort_op_by_callid); calculate_active_ops(sorted_op_list, &start_index, &stop_index); for (gIter = sorted_op_list; gIter != NULL; gIter = gIter->next) { xmlNode *rsc_op = (xmlNode *) gIter->data; offset++; if (start_index < stop_index) { /* stopped */ continue; } else if (offset < start_index) { /* action occurred prior to a start */ continue; } is_probe = FALSE; did_change = FALSE; task = crm_element_value(rsc_op, XML_LRM_ATTR_TASK); interval_s = crm_element_value(rsc_op, XML_LRM_ATTR_INTERVAL); interval = crm_parse_int(interval_s, "0"); if (interval == 0 && safe_str_eq(task, RSC_STATUS)) { is_probe = TRUE; } if (interval > 0 && (is_set(rsc->flags, pe_rsc_maintenance) || node->details->maintenance)) { CancelXmlOp(rsc, rsc_op, node, "maintenance mode", data_set); } else if (is_probe || safe_str_eq(task, RSC_START) || interval > 0 || safe_str_eq(task, RSC_MIGRATED)) { did_change = check_action_definition(rsc, node, rsc_op, data_set); } if (did_change && get_failcount(node, rsc, NULL, data_set)) { char *key = NULL; action_t *action_clear = NULL; key = generate_op_key(rsc->id, CRM_OP_CLEAR_FAILCOUNT, 0); action_clear = custom_action(rsc, key, CRM_OP_CLEAR_FAILCOUNT, node, FALSE, TRUE, data_set); set_bit(action_clear->flags, pe_action_runnable); } } g_list_free(sorted_op_list); } static GListPtr find_rsc_list(GListPtr result, resource_t * rsc, const char *id, gboolean renamed_clones, gboolean partial, pe_working_set_t * data_set) { GListPtr gIter = NULL; gboolean match = FALSE; if (id == NULL) { return NULL; } else if (rsc == NULL && data_set) { for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; result = find_rsc_list(result, child, id, renamed_clones, partial, NULL); } return result; } else if (rsc == NULL) { return NULL; } if (partial) { if (strstr(rsc->id, id)) { match = TRUE; } else if (renamed_clones && rsc->clone_name && strstr(rsc->clone_name, id)) { match = TRUE; } } else { if (strcmp(rsc->id, id) == 0) { match = TRUE; } else if (renamed_clones && rsc->clone_name && strcmp(rsc->clone_name, id) == 0) { match = TRUE; } } if (match) { result = g_list_prepend(result, rsc); } if (rsc->children) { gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; result = find_rsc_list(result, child, id, renamed_clones, partial, NULL); } } return result; } static void check_actions(pe_working_set_t * data_set) { const char *id = NULL; node_t *node = NULL; xmlNode *lrm_rscs = NULL; xmlNode *status = get_object_root(XML_CIB_TAG_STATUS, data_set->input); xmlNode *node_state = NULL; for (node_state = __xml_first_child(status); node_state != NULL; node_state = __xml_next(node_state)) { if (crm_str_eq((const char *)node_state->name, XML_CIB_TAG_STATE, TRUE)) { id = crm_element_value(node_state, XML_ATTR_ID); lrm_rscs = find_xml_node(node_state, XML_CIB_TAG_LRM, FALSE); lrm_rscs = find_xml_node(lrm_rscs, XML_LRM_TAG_RESOURCES, FALSE); node = pe_find_node_id(data_set->nodes, id); if (node == NULL) { continue; /* Still need to check actions for a maintenance node to cancel existing monitor operations */ } else if (can_run_resources(node) == FALSE && node->details->maintenance == FALSE) { crm_trace("Skipping param check for %s: cant run resources", node->details->uname); continue; } crm_trace("Processing node %s", node->details->uname); if (node->details->online || is_set(data_set->flags, pe_flag_stonith_enabled)) { xmlNode *rsc_entry = NULL; for (rsc_entry = __xml_first_child(lrm_rscs); rsc_entry != NULL; rsc_entry = __xml_next(rsc_entry)) { if (crm_str_eq((const char *)rsc_entry->name, XML_LRM_TAG_RESOURCE, TRUE)) { if (xml_has_children(rsc_entry)) { GListPtr gIter = NULL; GListPtr result = NULL; const char *rsc_id = ID(rsc_entry); CRM_CHECK(rsc_id != NULL, return); result = find_rsc_list(NULL, NULL, rsc_id, TRUE, FALSE, data_set); for (gIter = result; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; if (rsc->variant != pe_native) { continue; } check_actions_for(rsc_entry, rsc, node, data_set); } g_list_free(result); } } } } } } } static gboolean apply_placement_constraints(pe_working_set_t * data_set) { GListPtr gIter = NULL; crm_trace("Applying constraints..."); for (gIter = data_set->placement_constraints; gIter != NULL; gIter = gIter->next) { rsc_to_node_t *cons = (rsc_to_node_t *) gIter->data; cons->rsc_lh->cmds->rsc_location(cons->rsc_lh, cons); } return TRUE; } static gboolean failcount_clear_action_exists(node_t * node, resource_t * rsc) { gboolean rc = FALSE; char *key = crm_concat(rsc->id, CRM_OP_CLEAR_FAILCOUNT, '_'); GListPtr list = find_actions_exact(rsc->actions, key, node); if (list) { rc = TRUE; } g_list_free(list); free(key); return rc; } static void common_apply_stickiness(resource_t * rsc, node_t * node, pe_working_set_t * data_set) { int fail_count = 0; resource_t *failed = rsc; if (rsc->children) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; common_apply_stickiness(child_rsc, node, data_set); } return; } if (is_set(rsc->flags, pe_rsc_managed) && rsc->stickiness != 0 && g_list_length(rsc->running_on) == 1) { node_t *current = pe_find_node_id(rsc->running_on, node->details->id); node_t *match = pe_hash_table_lookup(rsc->allowed_nodes, node->details->id); if (current == NULL) { } else if (match != NULL || is_set(data_set->flags, pe_flag_symmetric_cluster)) { resource_t *sticky_rsc = rsc; resource_location(sticky_rsc, node, rsc->stickiness, "stickiness", data_set); pe_rsc_debug(sticky_rsc, "Resource %s: preferring current location" " (node=%s, weight=%d)", sticky_rsc->id, node->details->uname, rsc->stickiness); } else { GHashTableIter iter; node_t *nIter = NULL; pe_rsc_debug(rsc, "Ignoring stickiness for %s: the cluster is asymmetric" " and node %s is not explicitly allowed", rsc->id, node->details->uname); g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&nIter)) { crm_err("%s[%s] = %d", rsc->id, nIter->details->uname, nIter->weight); } } } /* only check failcount here if a failcount clear action * has not already been placed for this resource on the node. * There is no sense in potentially forcing the rsc from this * node if the failcount is being reset anyway. */ if (failcount_clear_action_exists(node, rsc) == FALSE) { fail_count = get_failcount_all(node, rsc, NULL, data_set); } if (fail_count > 0 && rsc->migration_threshold != 0) { if (is_not_set(rsc->flags, pe_rsc_unique)) { failed = uber_parent(rsc); } if (rsc->migration_threshold <= fail_count) { resource_location(failed, node, -INFINITY, "__fail_limit__", data_set); crm_warn("Forcing %s away from %s after %d failures (max=%d)", failed->id, node->details->uname, fail_count, rsc->migration_threshold); } else { crm_info("%s can fail %d more times on %s before being forced off", failed->id, rsc->migration_threshold - fail_count, node->details->uname); } } } static void complex_set_cmds(resource_t * rsc) { GListPtr gIter = rsc->children; rsc->cmds = &resource_class_alloc_functions[rsc->variant]; for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; complex_set_cmds(child_rsc); } } void set_alloc_actions(pe_working_set_t * data_set) { GListPtr gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; complex_set_cmds(rsc); } } static void calculate_system_health(gpointer gKey, gpointer gValue, gpointer user_data) { const char *key = (const char *)gKey; const char *value = (const char *)gValue; int *system_health = (int *)user_data; if (!gKey || !gValue || !user_data) { return; } /* Does it start with #health? */ if (0 == strncmp(key, "#health", 7)) { int score; /* Convert the value into an integer */ score = char2score(value); /* Add it to the running total */ *system_health = merge_weights(score, *system_health); } } static gboolean apply_system_health(pe_working_set_t * data_set) { GListPtr gIter = NULL; const char *health_strategy = pe_pref(data_set->config_hash, "node-health-strategy"); if (health_strategy == NULL || safe_str_eq(health_strategy, "none")) { /* Prevent any accidental health -> score translation */ node_score_red = 0; node_score_yellow = 0; node_score_green = 0; return TRUE; } else if (safe_str_eq(health_strategy, "migrate-on-red")) { /* Resources on nodes which have health values of red are * weighted away from that node. */ node_score_red = -INFINITY; node_score_yellow = 0; node_score_green = 0; } else if (safe_str_eq(health_strategy, "only-green")) { /* Resources on nodes which have health values of red or yellow * are forced away from that node. */ node_score_red = -INFINITY; node_score_yellow = -INFINITY; node_score_green = 0; } else if (safe_str_eq(health_strategy, "progressive")) { /* Same as the above, but use the r/y/g scores provided by the user * Defaults are provided by the pe_prefs table */ } else if (safe_str_eq(health_strategy, "custom")) { /* Requires the admin to configure the rsc_location constaints for * processing the stored health scores */ /* TODO: Check for the existance of appropriate node health constraints */ return TRUE; } else { crm_err("Unknown node health strategy: %s", health_strategy); return FALSE; } crm_info("Applying automated node health strategy: %s", health_strategy); for (gIter = data_set->nodes; gIter != NULL; gIter = gIter->next) { int system_health = 0; node_t *node = (node_t *) gIter->data; /* Search through the node hash table for system health entries. */ g_hash_table_foreach(node->details->attrs, calculate_system_health, &system_health); crm_info(" Node %s has an combined system health of %d", node->details->uname, system_health); /* If the health is non-zero, then create a new rsc2node so that the * weight will be added later on. */ if (system_health != 0) { GListPtr gIter2 = data_set->resources; for (; gIter2 != NULL; gIter2 = gIter2->next) { resource_t *rsc = (resource_t *) gIter2->data; rsc2node_new(health_strategy, rsc, system_health, NULL, node, data_set); } } } return TRUE; } gboolean stage0(pe_working_set_t * data_set) { xmlNode *cib_constraints = get_object_root(XML_CIB_TAG_CONSTRAINTS, data_set->input); if (data_set->input == NULL) { return FALSE; } if (is_set(data_set->flags, pe_flag_have_status) == FALSE) { crm_trace("Calculating status"); cluster_status(data_set); } set_alloc_actions(data_set); apply_system_health(data_set); unpack_constraints(cib_constraints, data_set); return TRUE; } static void wait_for_probe(resource_t * rsc, const char *action, action_t * probe_complete, pe_working_set_t * data_set) { if (probe_complete == NULL) { return; } if (rsc->children) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; wait_for_probe(child, action, probe_complete, data_set); } } else { char *key = NULL; if (safe_str_eq(action, RSC_STOP) && g_list_length(rsc->running_on) == 1) { node_t *node = (node_t *) rsc->running_on->data; /* Stop actions on nodes that are shutting down do not need to wait for probes to complete * Doing so prevents node shutdown in the presence of nodes that are coming up * The purpose of waiting is to not stop resources until we know for sure the * intended destination is able to take them */ if (node && node->details->shutdown) { crm_debug("Skipping %s before %s_%s_0 due to %s shutdown", probe_complete->uuid, rsc->id, action, node->details->uname); return; } } key = generate_op_key(rsc->id, action, 0); custom_action_order(NULL, NULL, probe_complete, rsc, key, NULL, pe_order_optional, data_set); } } /* * Check nodes for resources started outside of the LRM */ gboolean probe_resources(pe_working_set_t * data_set) { action_t *probe_complete = NULL; action_t *probe_node_complete = NULL; action_t *probe_cluster_nodes_complete = NULL; GListPtr gIter = NULL; GListPtr gIter2 = NULL; gIter = data_set->nodes; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; const char *probed = g_hash_table_lookup(node->details->attrs, CRM_OP_PROBED); if (node->details->online == FALSE) { continue; } else if (node->details->unclean) { continue; } else if (is_remote_node(node) && node->details->shutdown) { /* Don't try and probe a remote node we're shutting down. * It causes constraint conflicts to try and run any sort of action * other that 'stop' on resources living within a remote-node when * it is being shutdown. */ continue; } else if (is_container_remote_node(node)) { /* TODO enable container node probes once ordered probing is implemented. */ continue; } else if (node->details->rsc_discovery_enabled == FALSE) { /* resource discovery is disabled for this node */ continue; } else if (probe_complete == NULL) { probe_complete = get_pseudo_op(CRM_OP_PROBED, data_set); if (is_set(data_set->flags, pe_flag_have_remote_nodes)) { probe_cluster_nodes_complete = get_pseudo_op(CRM_OP_NODES_PROBED, data_set); } } if (probed != NULL && crm_is_true(probed) == FALSE) { action_t *probe_op = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_REPROBE, node->details->uname), CRM_OP_REPROBE, node, FALSE, TRUE, data_set); add_hash_param(probe_op->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); continue; } probe_node_complete = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_PROBED, node->details->uname), CRM_OP_PROBED, node, FALSE, TRUE, data_set); if (crm_is_true(probed)) { crm_trace("unset"); update_action_flags(probe_node_complete, pe_action_optional); } else { crm_trace("set"); update_action_flags(probe_node_complete, pe_action_optional | pe_action_clear); } crm_trace("%s - %d", node->details->uname, probe_node_complete->flags & pe_action_optional); probe_node_complete->priority = INFINITY; add_hash_param(probe_node_complete->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); if (node->details->pending) { update_action_flags(probe_node_complete, pe_action_runnable | pe_action_clear); crm_info("Action %s on %s is unrunnable (pending)", probe_node_complete->uuid, probe_node_complete->node->details->uname); } if (is_remote_node(node)) { order_actions(probe_node_complete, probe_complete, pe_order_runnable_left /*|pe_order_implies_then */ ); } else if (probe_cluster_nodes_complete == NULL) { order_actions(probe_node_complete, probe_complete, pe_order_runnable_left /*|pe_order_implies_then */ ); } else { order_actions(probe_node_complete, probe_cluster_nodes_complete, pe_order_runnable_left /*|pe_order_implies_then */ ); } gIter2 = data_set->resources; for (; gIter2 != NULL; gIter2 = gIter2->next) { resource_t *rsc = (resource_t *) gIter2->data; if (rsc->cmds->create_probe(rsc, node, probe_node_complete, FALSE, data_set)) { update_action_flags(probe_complete, pe_action_optional | pe_action_clear); update_action_flags(probe_node_complete, pe_action_optional | pe_action_clear); if (probe_cluster_nodes_complete && (rsc->is_remote_node || rsc_contains_remote_node(data_set, rsc))) { update_action_flags(probe_cluster_nodes_complete, pe_action_optional | pe_action_clear); /* allow remote connection resources and resources * containing remote connection resources to run after all * cluster nodes are probed */ wait_for_probe(rsc, RSC_START, probe_cluster_nodes_complete, data_set); } else { wait_for_probe(rsc, RSC_START, probe_complete, data_set); } } } } gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; if (rsc->is_remote_node || rsc_contains_remote_node(data_set, rsc)) { /* allow remote connection resources and any resources containing * remote connection resources to run after cluster nodes are probed.*/ wait_for_probe(rsc, RSC_STOP, probe_cluster_nodes_complete, data_set); } else { wait_for_probe(rsc, RSC_STOP, probe_complete, data_set); } } return TRUE; } static void rsc_discover_filter(resource_t *rsc, node_t *node) { GListPtr gIter = rsc->children; resource_t *top = uber_parent(rsc); node_t *match; if (rsc->exclusive_discover == FALSE && top->exclusive_discover == FALSE) { return; } for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; rsc_discover_filter(child_rsc, node); } match = g_hash_table_lookup(rsc->allowed_nodes, node->details->id); if (match && match->rsc_discover_mode != discover_exclusive) { match->weight = -INFINITY; } } /* * Count how many valid nodes we have (so we know the maximum number of * colors we can resolve). * * Apply node constraints (ie. filter the "allowed_nodes" part of resources */ gboolean stage2(pe_working_set_t * data_set) { GListPtr gIter = NULL; crm_trace("Applying placement constraints"); gIter = data_set->nodes; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; if (node == NULL) { /* error */ } else if (node->weight >= 0.0 /* global weight */ && node->details->online && node->details->type != node_ping) { data_set->max_valid_nodes++; } } apply_placement_constraints(data_set); gIter = data_set->nodes; for (; gIter != NULL; gIter = gIter->next) { GListPtr gIter2 = NULL; node_t *node = (node_t *) gIter->data; gIter2 = data_set->resources; for (; gIter2 != NULL; gIter2 = gIter2->next) { resource_t *rsc = (resource_t *) gIter2->data; common_apply_stickiness(rsc, node, data_set); rsc_discover_filter(rsc, node); } } return TRUE; } /* * Create internal resource constraints before allocation */ gboolean stage3(pe_working_set_t * data_set) { GListPtr gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; rsc->cmds->internal_constraints(rsc, data_set); } return TRUE; } /* * Check for orphaned or redefined actions */ gboolean stage4(pe_working_set_t * data_set) { check_actions(data_set); return TRUE; } static gint sort_rsc_process_order(gconstpointer a, gconstpointer b, gpointer data) { int rc = 0; int r1_weight = -INFINITY; int r2_weight = -INFINITY; const char *reason = "existance"; const GListPtr nodes = (GListPtr) data; resource_t *resource1 = (resource_t *) convert_const_pointer(a); resource_t *resource2 = (resource_t *) convert_const_pointer(b); node_t *node = NULL; GListPtr gIter = NULL; GHashTable *r1_nodes = NULL; GHashTable *r2_nodes = NULL; if (a == NULL && b == NULL) { goto done; } if (a == NULL) { return 1; } if (b == NULL) { return -1; } reason = "priority"; r1_weight = resource1->priority; r2_weight = resource2->priority; if (r1_weight > r2_weight) { rc = -1; goto done; } if (r1_weight < r2_weight) { rc = 1; goto done; } reason = "no node list"; if (nodes == NULL) { goto done; } r1_nodes = rsc_merge_weights(resource1, resource1->id, NULL, NULL, 1, pe_weights_forward | pe_weights_init); dump_node_scores(LOG_TRACE, NULL, resource1->id, r1_nodes); r2_nodes = rsc_merge_weights(resource2, resource2->id, NULL, NULL, 1, pe_weights_forward | pe_weights_init); dump_node_scores(LOG_TRACE, NULL, resource2->id, r2_nodes); /* Current location score */ reason = "current location"; r1_weight = -INFINITY; r2_weight = -INFINITY; if (resource1->running_on) { node = g_list_nth_data(resource1->running_on, 0); node = g_hash_table_lookup(r1_nodes, node->details->id); if (node != NULL) { r1_weight = node->weight; } } if (resource2->running_on) { node = g_list_nth_data(resource2->running_on, 0); node = g_hash_table_lookup(r2_nodes, node->details->id); if (node != NULL) { r2_weight = node->weight; } } if (r1_weight > r2_weight) { rc = -1; goto done; } if (r1_weight < r2_weight) { rc = 1; goto done; } reason = "score"; for (gIter = nodes; gIter != NULL; gIter = gIter->next) { node_t *r1_node = NULL; node_t *r2_node = NULL; node = (node_t *) gIter->data; r1_weight = -INFINITY; if (r1_nodes) { r1_node = g_hash_table_lookup(r1_nodes, node->details->id); } if (r1_node) { r1_weight = r1_node->weight; } r2_weight = -INFINITY; if (r2_nodes) { r2_node = g_hash_table_lookup(r2_nodes, node->details->id); } if (r2_node) { r2_weight = r2_node->weight; } if (r1_weight > r2_weight) { rc = -1; goto done; } if (r1_weight < r2_weight) { rc = 1; goto done; } } done: if (r1_nodes) { g_hash_table_destroy(r1_nodes); } if (r2_nodes) { g_hash_table_destroy(r2_nodes); } crm_trace("%s (%d) %c %s (%d) on %s: %s", resource1->id, r1_weight, rc < 0 ? '>' : rc > 0 ? '<' : '=', resource2->id, r2_weight, node ? node->details->id : "n/a", reason); return rc; } static void allocate_resources(pe_working_set_t * data_set) { GListPtr gIter = NULL; if (is_set(data_set->flags, pe_flag_have_remote_nodes)) { /* Force remote connection resources to be allocated first. This * also forces any colocation dependencies to be allocated as well */ for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; if (rsc->is_remote_node == FALSE) { continue; } pe_rsc_trace(rsc, "Allocating: %s", rsc->id); /* for remote node connection resources, always prefer the partial migration * target during resource allocation if the rsc is in the middle of a * migration */ rsc->cmds->allocate(rsc, rsc->partial_migration_target, data_set); } } /* now do the rest of the resources */ for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; if (rsc->is_remote_node == TRUE) { continue; } pe_rsc_trace(rsc, "Allocating: %s", rsc->id); rsc->cmds->allocate(rsc, NULL, data_set); } } gboolean stage5(pe_working_set_t * data_set) { GListPtr gIter = NULL; if (safe_str_neq(data_set->placement_strategy, "default")) { GListPtr nodes = g_list_copy(data_set->nodes); nodes = g_list_sort_with_data(nodes, sort_node_weight, NULL); data_set->resources = g_list_sort_with_data(data_set->resources, sort_rsc_process_order, nodes); g_list_free(nodes); } gIter = data_set->nodes; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; dump_node_capacity(show_utilization ? 0 : utilization_log_level, "Original", node); } crm_trace("Allocating services"); /* Take (next) highest resource, assign it and create its actions */ allocate_resources(data_set); gIter = data_set->nodes; for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; dump_node_capacity(show_utilization ? 0 : utilization_log_level, "Remaining", node); } if (is_set(data_set->flags, pe_flag_startup_probes)) { crm_trace("Calculating needed probes"); /* This code probably needs optimization * ptest -x with 100 nodes, 100 clones and clone-max=100: With probes: ptest[14781]: 2010/09/27_17:56:46 notice: TRACE: do_calculations: pengine.c:258 Calculate cluster status ptest[14781]: 2010/09/27_17:56:46 notice: TRACE: do_calculations: pengine.c:278 Applying placement constraints ptest[14781]: 2010/09/27_17:56:47 notice: TRACE: do_calculations: pengine.c:285 Create internal constraints ptest[14781]: 2010/09/27_17:56:47 notice: TRACE: do_calculations: pengine.c:292 Check actions ptest[14781]: 2010/09/27_17:56:48 notice: TRACE: do_calculations: pengine.c:299 Allocate resources ptest[14781]: 2010/09/27_17:56:48 notice: TRACE: stage5: allocate.c:881 Allocating services ptest[14781]: 2010/09/27_17:56:49 notice: TRACE: stage5: allocate.c:894 Calculating needed probes ptest[14781]: 2010/09/27_17:56:51 notice: TRACE: stage5: allocate.c:899 Creating actions ptest[14781]: 2010/09/27_17:56:52 notice: TRACE: stage5: allocate.c:905 Creating done ptest[14781]: 2010/09/27_17:56:52 notice: TRACE: do_calculations: pengine.c:306 Processing fencing and shutdown cases ptest[14781]: 2010/09/27_17:56:52 notice: TRACE: do_calculations: pengine.c:313 Applying ordering constraints 36s ptest[14781]: 2010/09/27_17:57:28 notice: TRACE: do_calculations: pengine.c:320 Create transition graph Without probes: ptest[14637]: 2010/09/27_17:56:21 notice: TRACE: do_calculations: pengine.c:258 Calculate cluster status ptest[14637]: 2010/09/27_17:56:22 notice: TRACE: do_calculations: pengine.c:278 Applying placement constraints ptest[14637]: 2010/09/27_17:56:22 notice: TRACE: do_calculations: pengine.c:285 Create internal constraints ptest[14637]: 2010/09/27_17:56:22 notice: TRACE: do_calculations: pengine.c:292 Check actions ptest[14637]: 2010/09/27_17:56:23 notice: TRACE: do_calculations: pengine.c:299 Allocate resources ptest[14637]: 2010/09/27_17:56:23 notice: TRACE: stage5: allocate.c:881 Allocating services ptest[14637]: 2010/09/27_17:56:24 notice: TRACE: stage5: allocate.c:899 Creating actions ptest[14637]: 2010/09/27_17:56:25 notice: TRACE: stage5: allocate.c:905 Creating done ptest[14637]: 2010/09/27_17:56:25 notice: TRACE: do_calculations: pengine.c:306 Processing fencing and shutdown cases ptest[14637]: 2010/09/27_17:56:25 notice: TRACE: do_calculations: pengine.c:313 Applying ordering constraints ptest[14637]: 2010/09/27_17:56:25 notice: TRACE: do_calculations: pengine.c:320 Create transition graph */ probe_resources(data_set); } crm_trace("Creating actions"); gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; rsc->cmds->create_actions(rsc, data_set); } crm_trace("Creating done"); return TRUE; } static gboolean is_managed(const resource_t * rsc) { GListPtr gIter = rsc->children; if (is_set(rsc->flags, pe_rsc_managed)) { return TRUE; } for (; gIter != NULL; gIter = gIter->next) { resource_t *child_rsc = (resource_t *) gIter->data; if (is_managed(child_rsc)) { return TRUE; } } return FALSE; } static gboolean any_managed_resources(pe_working_set_t * data_set) { GListPtr gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; if (is_managed(rsc)) { return TRUE; } } return FALSE; } /* * Create dependancies for stonith and shutdown operations */ gboolean stage6(pe_working_set_t * data_set) { action_t *dc_down = NULL; action_t *dc_fence = NULL; action_t *stonith_op = NULL; action_t *last_stonith = NULL; gboolean integrity_lost = FALSE; action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); action_t *done = get_pseudo_op(STONITH_DONE, data_set); gboolean need_stonith = TRUE; GListPtr gIter = data_set->nodes; crm_trace("Processing fencing and shutdown cases"); if (any_managed_resources(data_set) == FALSE) { crm_notice("Delaying fencing operations until there are resources to manage"); need_stonith = FALSE; } for (; gIter != NULL; gIter = gIter->next) { node_t *node = (node_t *) gIter->data; /* remote-nodes associated with a container resource (such as a vm) are not fenced */ if (is_container_remote_node(node)) { continue; } stonith_op = NULL; if (need_stonith && node->details->unclean && pe_can_fence(data_set, node)) { pe_warn("Scheduling Node %s for STONITH", node->details->uname); stonith_op = pe_fence_op(node, NULL, FALSE, data_set); stonith_constraints(node, stonith_op, data_set); if (node->details->is_dc) { dc_down = stonith_op; dc_fence = stonith_op; } else { if (last_stonith) { order_actions(last_stonith, stonith_op, pe_order_optional); } last_stonith = stonith_op; } } else if (node->details->online && node->details->shutdown && /* TODO define what a shutdown op means for a baremetal remote node. * For now we do not send shutdown operations for remote nodes, but * if we can come up with a good use for this in the future, we will. */ is_remote_node(node) == FALSE) { action_t *down_op = NULL; crm_notice("Scheduling Node %s for shutdown", node->details->uname); down_op = custom_action(NULL, g_strdup_printf("%s-%s", CRM_OP_SHUTDOWN, node->details->uname), CRM_OP_SHUTDOWN, node, FALSE, TRUE, data_set); shutdown_constraints(node, down_op, data_set); add_hash_param(down_op->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); if (node->details->is_dc) { dc_down = down_op; } } if (node->details->unclean && stonith_op == NULL) { integrity_lost = TRUE; pe_warn("Node %s is unclean!", node->details->uname); } } if (integrity_lost) { if (is_set(data_set->flags, pe_flag_stonith_enabled) == FALSE) { pe_warn("YOUR RESOURCES ARE NOW LIKELY COMPROMISED"); pe_err("ENABLE STONITH TO KEEP YOUR RESOURCES SAFE"); } else if (is_set(data_set->flags, pe_flag_have_quorum) == FALSE) { crm_notice("Cannot fence unclean nodes until quorum is" " attained (or no-quorum-policy is set to ignore)"); } } if (dc_down != NULL) { GListPtr gIter = NULL; crm_trace("Ordering shutdowns before %s on %s (DC)", dc_down->task, dc_down->node->details->uname); add_hash_param(dc_down->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); for (gIter = data_set->actions; gIter != NULL; gIter = gIter->next) { action_t *node_stop = (action_t *) gIter->data; if (safe_str_neq(CRM_OP_SHUTDOWN, node_stop->task)) { continue; } else if (node_stop->node->details->is_dc) { continue; } crm_debug("Ordering shutdown on %s before %s on %s", node_stop->node->details->uname, dc_down->task, dc_down->node->details->uname); order_actions(node_stop, dc_down, pe_order_optional); } if (last_stonith && dc_down != last_stonith) { order_actions(last_stonith, dc_down, pe_order_optional); } } if (last_stonith) { order_actions(last_stonith, done, pe_order_implies_then); } else if (dc_fence) { order_actions(dc_down, done, pe_order_implies_then); } order_actions(done, all_stopped, pe_order_implies_then); return TRUE; } /* * Determin the sets of independant actions and the correct order for the * actions in each set. * * Mark dependencies of un-runnable actions un-runnable * */ static GListPtr find_actions_by_task(GListPtr actions, resource_t * rsc, const char *original_key) { GListPtr list = NULL; list = find_actions(actions, original_key, NULL); if (list == NULL) { /* we're potentially searching a child of the original resource */ char *key = NULL; char *tmp = NULL; char *task = NULL; int interval = 0; if (parse_op_key(original_key, &tmp, &task, &interval)) { key = generate_op_key(rsc->id, task, interval); /* crm_err("looking up %s instead of %s", key, original_key); */ /* slist_iter(action, action_t, actions, lpc, */ /* crm_err(" - %s", action->uuid)); */ list = find_actions(actions, key, NULL); } else { crm_err("search key: %s", original_key); } free(key); free(tmp); free(task); } return list; } static void rsc_order_then(action_t * lh_action, resource_t * rsc, order_constraint_t * order) { GListPtr gIter = NULL; GListPtr rh_actions = NULL; action_t *rh_action = NULL; enum pe_ordering type = order->type; CRM_CHECK(rsc != NULL, return); CRM_CHECK(order != NULL, return); rh_action = order->rh_action; crm_trace("Processing RH of ordering constraint %d", order->id); if (rh_action != NULL) { rh_actions = g_list_prepend(NULL, rh_action); } else if (rsc != NULL) { rh_actions = find_actions_by_task(rsc->actions, rsc, order->rh_action_task); } if (rh_actions == NULL) { pe_rsc_trace(rsc, "No RH-Side (%s/%s) found for constraint..." " ignoring", rsc->id, order->rh_action_task); if (lh_action) { pe_rsc_trace(rsc, "LH-Side was: %s", lh_action->uuid); } return; } if (lh_action && lh_action->rsc == rsc && is_set(lh_action->flags, pe_action_dangle)) { pe_rsc_trace(rsc, "Detected dangling operation %s -> %s", lh_action->uuid, order->rh_action_task); clear_bit(type, pe_order_implies_then); } gIter = rh_actions; for (; gIter != NULL; gIter = gIter->next) { action_t *rh_action_iter = (action_t *) gIter->data; if (lh_action) { order_actions(lh_action, rh_action_iter, type); } else if (type & pe_order_implies_then) { update_action_flags(rh_action_iter, pe_action_runnable | pe_action_clear); crm_warn("Unrunnable %s 0x%.6x", rh_action_iter->uuid, type); } else { crm_warn("neither %s 0x%.6x", rh_action_iter->uuid, type); } } g_list_free(rh_actions); } static void rsc_order_first(resource_t * lh_rsc, order_constraint_t * order, pe_working_set_t * data_set) { GListPtr gIter = NULL; GListPtr lh_actions = NULL; action_t *lh_action = order->lh_action; resource_t *rh_rsc = order->rh_rsc; crm_trace("Processing LH of ordering constraint %d", order->id); CRM_ASSERT(lh_rsc != NULL); if (lh_action != NULL) { lh_actions = g_list_prepend(NULL, lh_action); } else if (lh_action == NULL) { lh_actions = find_actions_by_task(lh_rsc->actions, lh_rsc, order->lh_action_task); } if (lh_actions == NULL && lh_rsc != rh_rsc) { char *key = NULL; char *rsc_id = NULL; char *op_type = NULL; int interval = 0; parse_op_key(order->lh_action_task, &rsc_id, &op_type, &interval); key = generate_op_key(lh_rsc->id, op_type, interval); if (lh_rsc->fns->state(lh_rsc, TRUE) == RSC_ROLE_STOPPED && safe_str_eq(op_type, RSC_STOP)) { free(key); pe_rsc_trace(lh_rsc, "No LH-Side (%s/%s) found for constraint %d with %s - ignoring", lh_rsc->id, order->lh_action_task, order->id, order->rh_action_task); } else if (lh_rsc->fns->state(lh_rsc, TRUE) == RSC_ROLE_SLAVE && safe_str_eq(op_type, RSC_DEMOTE)) { free(key); pe_rsc_trace(lh_rsc, "No LH-Side (%s/%s) found for constraint %d with %s - ignoring", lh_rsc->id, order->lh_action_task, order->id, order->rh_action_task); } else { pe_rsc_trace(lh_rsc, "No LH-Side (%s/%s) found for constraint %d with %s - creating", lh_rsc->id, order->lh_action_task, order->id, order->rh_action_task); lh_action = custom_action(lh_rsc, key, op_type, NULL, TRUE, TRUE, data_set); lh_actions = g_list_prepend(NULL, lh_action); } free(op_type); free(rsc_id); } gIter = lh_actions; for (; gIter != NULL; gIter = gIter->next) { action_t *lh_action_iter = (action_t *) gIter->data; if (rh_rsc == NULL && order->rh_action) { rh_rsc = order->rh_action->rsc; } if (rh_rsc) { rsc_order_then(lh_action_iter, rh_rsc, order); } else if (order->rh_action) { order_actions(lh_action_iter, order->rh_action, order->type); } } g_list_free(lh_actions); } extern gboolean update_action(action_t * action); +extern void update_colo_start_chain(action_t * action); static void apply_remote_node_ordering(pe_working_set_t *data_set) { GListPtr gIter = data_set->actions; if (is_set(data_set->flags, pe_flag_have_remote_nodes) == FALSE) { return; } for (; gIter != NULL; gIter = gIter->next) { action_t *action = (action_t *) gIter->data; resource_t *remote_rsc = NULL; resource_t *container = NULL; if (action->node == NULL || is_remote_node(action->node) == FALSE || action->node->details->remote_rsc == NULL || action->rsc == NULL || is_set(action->flags, pe_action_pseudo)) { continue; } remote_rsc = action->node->details->remote_rsc; container = remote_rsc->container; if (safe_str_eq(action->task, "monitor") || safe_str_eq(action->task, "start") || safe_str_eq(action->task, "promote") || safe_str_eq(action->task, CRM_OP_LRM_REFRESH) || safe_str_eq(action->task, CRM_OP_CLEAR_FAILCOUNT) || safe_str_eq(action->task, "delete")) { custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL, action->rsc, NULL, action, pe_order_preserve | pe_order_implies_then | pe_order_runnable_left, data_set); } else if (safe_str_eq(action->task, "demote")) { /* If the connection is being torn down, we don't want * to build a constraint between a resource's demotion and * the connection resource starting... because the connection * resource can not start. The connection might already be up, * but the START action would not be allowed which in turn would * block the demotion of any resournces living in the remote-node. * * In this case, only build the constraint between the demotion and * the connection's stop action. This allows the connection and all the * resources within the remote-node to be torn down properly. */ if (remote_rsc->next_role == RSC_ROLE_STOPPED) { custom_action_order(action->rsc, NULL, action, remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL, pe_order_preserve | pe_order_implies_first, data_set); } else { custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL, action->rsc, NULL, action, pe_order_preserve | pe_order_implies_then | pe_order_runnable_left, data_set); } } else if (safe_str_eq(action->task, "stop") && container && is_set(container->flags, pe_rsc_failed)) { /* when the container representing a remote node fails, the stop * action for all the resources living in that container is implied * by the container stopping. This is similar to how fencing operations * work for cluster nodes. */ pe_set_action_bit(action, pe_action_pseudo); custom_action_order(container, generate_op_key(container->id, RSC_STOP, 0), NULL, action->rsc, NULL, action, pe_order_preserve | pe_order_implies_then | pe_order_runnable_left, data_set); } else if (safe_str_eq(action->task, "stop")) { gboolean after_start = FALSE; /* handle special case with baremetal remote where stop actions need to be * ordered after the connection resource starts somewhere else. */ if (is_baremetal_remote_node(action->node)) { node_t *cluster_node = remote_rsc->running_on ? remote_rsc->running_on->data : NULL; /* if the current cluster node a baremetal connection resource * is residing on is unclean or went offline we can't process any * operations on that remote node until after it starts somewhere else. */ if (cluster_node == NULL || cluster_node->details->unclean == TRUE || cluster_node->details->online == FALSE) { after_start = TRUE; } else if (g_list_length(remote_rsc->running_on) > 1 && remote_rsc->partial_migration_source && remote_rsc->partial_migration_target) { /* if we're caught in the middle of migrating a connection resource, * then we have to wait until after the resource migrates before performing * any actions. */ after_start = TRUE; } } if (after_start) { custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL, action->rsc, NULL, action, pe_order_preserve | pe_order_implies_then | pe_order_runnable_left, data_set); } else { custom_action_order(action->rsc, NULL, action, remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL, pe_order_preserve | pe_order_implies_first, data_set); } } } } gboolean stage7(pe_working_set_t * data_set) { GListPtr gIter = NULL; apply_remote_node_ordering(data_set); crm_trace("Applying ordering constraints"); /* Don't ask me why, but apparently they need to be processed in * the order they were created in... go figure * * Also g_list_prepend() has horrendous performance characteristics * So we need to use g_list_prepend() and then reverse the list here */ data_set->ordering_constraints = g_list_reverse(data_set->ordering_constraints); gIter = data_set->ordering_constraints; for (; gIter != NULL; gIter = gIter->next) { order_constraint_t *order = (order_constraint_t *) gIter->data; resource_t *rsc = order->lh_rsc; crm_trace("Applying ordering constraint: %d", order->id); if (rsc != NULL) { crm_trace("rsc_action-to-*"); rsc_order_first(rsc, order, data_set); continue; } rsc = order->rh_rsc; if (rsc != NULL) { crm_trace("action-to-rsc_action"); rsc_order_then(order->lh_action, rsc, order); } else { crm_trace("action-to-action"); order_actions(order->lh_action, order->rh_action, order->type); } } crm_trace("Updating %d actions", g_list_length(data_set->actions)); gIter = data_set->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *action = (action_t *) gIter->data; + update_colo_start_chain(action); update_action(action); } crm_trace("Processing reloads"); gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; rsc_reload(rsc, data_set); LogActions(rsc, data_set, FALSE); } return TRUE; } static gint sort_notify_entries(gconstpointer a, gconstpointer b) { int tmp; const notify_entry_t *entry_a = a; const notify_entry_t *entry_b = b; if (entry_a == NULL && entry_b == NULL) { return 0; } if (entry_a == NULL) { return 1; } if (entry_b == NULL) { return -1; } if (entry_a->rsc == NULL && entry_b->rsc == NULL) { return 0; } if (entry_a->rsc == NULL) { return 1; } if (entry_b->rsc == NULL) { return -1; } tmp = strcmp(entry_a->rsc->id, entry_b->rsc->id); if (tmp != 0) { return tmp; } if (entry_a->node == NULL && entry_b->node == NULL) { return 0; } if (entry_a->node == NULL) { return 1; } if (entry_b->node == NULL) { return -1; } return strcmp(entry_a->node->details->id, entry_b->node->details->id); } static void expand_list(GListPtr list, char **rsc_list, char **node_list) { GListPtr gIter = NULL; const char *uname = NULL; const char *rsc_id = NULL; const char *last_rsc_id = NULL; if (rsc_list) { *rsc_list = NULL; } if (list == NULL) { if (rsc_list) { *rsc_list = strdup(" "); } if (node_list) { *node_list = strdup(" "); } return; } if (node_list) { *node_list = NULL; } for (gIter = list; gIter != NULL; gIter = gIter->next) { notify_entry_t *entry = (notify_entry_t *) gIter->data; CRM_LOG_ASSERT(entry != NULL); CRM_LOG_ASSERT(entry && entry->rsc != NULL); if(entry == NULL || entry->rsc == NULL) { continue; } /* Uh, why? */ CRM_LOG_ASSERT(node_list == NULL || entry->node != NULL); if(node_list != NULL && entry->node == NULL) { continue; } uname = NULL; rsc_id = entry->rsc->id; CRM_ASSERT(rsc_id != NULL); /* filter dups */ if (safe_str_eq(rsc_id, last_rsc_id)) { continue; } last_rsc_id = rsc_id; if (rsc_list != NULL) { int existing_len = 0; int len = 2 + strlen(rsc_id); /* +1 space, +1 EOS */ if (rsc_list && *rsc_list) { existing_len = strlen(*rsc_list); } crm_trace("Adding %s (%dc) at offset %d", rsc_id, len - 2, existing_len); *rsc_list = realloc_safe(*rsc_list, len + existing_len); sprintf(*rsc_list + existing_len, "%s ", rsc_id); } if (entry->node != NULL) { uname = entry->node->details->uname; } if (node_list != NULL && uname) { int existing_len = 0; int len = 2 + strlen(uname); if (node_list && *node_list) { existing_len = strlen(*node_list); } crm_trace("Adding %s (%dc) at offset %d", uname, len - 2, existing_len); *node_list = realloc_safe(*node_list, len + existing_len); sprintf(*node_list + existing_len, "%s ", uname); } } } static void dup_attr(gpointer key, gpointer value, gpointer user_data) { add_hash_param(user_data, key, value); } static action_t * pe_notify(resource_t * rsc, node_t * node, action_t * op, action_t * confirm, notify_data_t * n_data, pe_working_set_t * data_set) { char *key = NULL; action_t *trigger = NULL; const char *value = NULL; const char *task = NULL; if (op == NULL || confirm == NULL) { pe_rsc_trace(rsc, "Op=%p confirm=%p", op, confirm); return NULL; } CRM_CHECK(rsc != NULL, return NULL); CRM_CHECK(node != NULL, return NULL); if (node->details->online == FALSE) { pe_rsc_trace(rsc, "Skipping notification for %s: node offline", rsc->id); return NULL; } else if (is_set(op->flags, pe_action_runnable) == FALSE) { pe_rsc_trace(rsc, "Skipping notification for %s: not runnable", op->uuid); return NULL; } value = g_hash_table_lookup(op->meta, "notify_type"); task = g_hash_table_lookup(op->meta, "notify_operation"); pe_rsc_trace(rsc, "Creating notify actions for %s: %s (%s-%s)", op->uuid, rsc->id, value, task); key = generate_notify_key(rsc->id, value, task); trigger = custom_action(rsc, key, op->task, node, is_set(op->flags, pe_action_optional), TRUE, data_set); g_hash_table_foreach(op->meta, dup_attr, trigger->meta); g_hash_table_foreach(n_data->keys, dup_attr, trigger->meta); /* pseudo_notify before notify */ pe_rsc_trace(rsc, "Ordering %s before %s (%d->%d)", op->uuid, trigger->uuid, trigger->id, op->id); order_actions(op, trigger, pe_order_optional); order_actions(trigger, confirm, pe_order_optional); return trigger; } static void pe_post_notify(resource_t * rsc, node_t * node, notify_data_t * n_data, pe_working_set_t * data_set) { action_t *notify = NULL; CRM_CHECK(rsc != NULL, return); if (n_data->post == NULL) { return; /* Nothing to do */ } notify = pe_notify(rsc, node, n_data->post, n_data->post_done, n_data, data_set); if (notify != NULL) { notify->priority = INFINITY; } if (n_data->post_done) { GListPtr gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *mon = (action_t *) gIter->data; const char *interval = g_hash_table_lookup(mon->meta, "interval"); if (interval == NULL || safe_str_eq(interval, "0")) { pe_rsc_trace(rsc, "Skipping %s: interval", mon->uuid); continue; } else if (safe_str_eq(mon->task, RSC_CANCEL)) { pe_rsc_trace(rsc, "Skipping %s: cancel", mon->uuid); continue; } order_actions(n_data->post_done, mon, pe_order_optional); } } } notify_data_t * create_notification_boundaries(resource_t * rsc, const char *action, action_t * start, action_t * end, pe_working_set_t * data_set) { /* Create the pseudo ops that preceed and follow the actual notifications */ /* * Creates two sequences (conditional on start and end being supplied): * pre_notify -> pre_notify_complete -> start, and * end -> post_notify -> post_notify_complete * * 'start' and 'end' may be the same event or ${X} and ${X}ed as per clones */ char *key = NULL; notify_data_t *n_data = NULL; if (is_not_set(rsc->flags, pe_rsc_notify)) { return NULL; } n_data = calloc(1, sizeof(notify_data_t)); n_data->action = action; n_data->keys = g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); if (start) { /* create pre-event notification wrappers */ key = generate_notify_key(rsc->id, "pre", start->task); n_data->pre = custom_action(rsc, key, RSC_NOTIFY, NULL, is_set(start->flags, pe_action_optional), TRUE, data_set); update_action_flags(n_data->pre, pe_action_pseudo); update_action_flags(n_data->pre, pe_action_runnable); add_hash_param(n_data->pre->meta, "notify_type", "pre"); add_hash_param(n_data->pre->meta, "notify_operation", n_data->action); add_hash_param(n_data->pre->meta, "notify_key_type", "pre"); add_hash_param(n_data->pre->meta, "notify_key_operation", start->task); /* create pre_notify_complete */ key = generate_notify_key(rsc->id, "confirmed-pre", start->task); n_data->pre_done = custom_action(rsc, key, RSC_NOTIFIED, NULL, is_set(start->flags, pe_action_optional), TRUE, data_set); update_action_flags(n_data->pre_done, pe_action_pseudo); update_action_flags(n_data->pre_done, pe_action_runnable); add_hash_param(n_data->pre_done->meta, "notify_type", "pre"); add_hash_param(n_data->pre_done->meta, "notify_operation", n_data->action); add_hash_param(n_data->pre_done->meta, "notify_key_type", "confirmed-pre"); add_hash_param(n_data->pre_done->meta, "notify_key_operation", start->task); order_actions(n_data->pre_done, start, pe_order_optional); order_actions(n_data->pre, n_data->pre_done, pe_order_optional); } if (end) { /* create post-event notification wrappers */ key = generate_notify_key(rsc->id, "post", end->task); n_data->post = custom_action(rsc, key, RSC_NOTIFY, NULL, is_set(end->flags, pe_action_optional), TRUE, data_set); n_data->post->priority = INFINITY; update_action_flags(n_data->post, pe_action_pseudo); if (is_set(end->flags, pe_action_runnable)) { update_action_flags(n_data->post, pe_action_runnable); } else { update_action_flags(n_data->post, pe_action_runnable | pe_action_clear); } add_hash_param(n_data->post->meta, "notify_type", "post"); add_hash_param(n_data->post->meta, "notify_operation", n_data->action); add_hash_param(n_data->post->meta, "notify_key_type", "post"); add_hash_param(n_data->post->meta, "notify_key_operation", end->task); /* create post_notify_complete */ key = generate_notify_key(rsc->id, "confirmed-post", end->task); n_data->post_done = custom_action(rsc, key, RSC_NOTIFIED, NULL, is_set(end->flags, pe_action_optional), TRUE, data_set); n_data->post_done->priority = INFINITY; update_action_flags(n_data->post_done, pe_action_pseudo); if (is_set(end->flags, pe_action_runnable)) { update_action_flags(n_data->post_done, pe_action_runnable); } else { update_action_flags(n_data->post_done, pe_action_runnable | pe_action_clear); } add_hash_param(n_data->post_done->meta, "notify_type", "post"); add_hash_param(n_data->post_done->meta, "notify_operation", n_data->action); add_hash_param(n_data->post_done->meta, "notify_key_type", "confirmed-post"); add_hash_param(n_data->post_done->meta, "notify_key_operation", end->task); order_actions(end, n_data->post, pe_order_implies_then); order_actions(n_data->post, n_data->post_done, pe_order_implies_then); } if (start && end) { order_actions(n_data->pre_done, n_data->post, pe_order_optional); } if (safe_str_eq(action, RSC_STOP)) { action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); order_actions(n_data->post_done, all_stopped, pe_order_optional); } return n_data; } void collect_notification_data(resource_t * rsc, gboolean state, gboolean activity, notify_data_t * n_data) { if (rsc->children) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; collect_notification_data(child, state, activity, n_data); } return; } if (state) { notify_entry_t *entry = NULL; entry = calloc(1, sizeof(notify_entry_t)); entry->rsc = rsc; if (rsc->running_on) { /* we only take the first one */ entry->node = rsc->running_on->data; } pe_rsc_trace(rsc, "%s state: %s", rsc->id, role2text(rsc->role)); switch (rsc->role) { case RSC_ROLE_STOPPED: n_data->inactive = g_list_prepend(n_data->inactive, entry); break; case RSC_ROLE_STARTED: n_data->active = g_list_prepend(n_data->active, entry); break; case RSC_ROLE_SLAVE: n_data->slave = g_list_prepend(n_data->slave, entry); break; case RSC_ROLE_MASTER: n_data->master = g_list_prepend(n_data->master, entry); break; default: crm_err("Unsupported notify role"); free(entry); break; } } if (activity) { notify_entry_t *entry = NULL; enum action_tasks task; GListPtr gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *op = (action_t *) gIter->data; if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) { entry = calloc(1, sizeof(notify_entry_t)); entry->node = op->node; entry->rsc = rsc; task = text2task(op->task); switch (task) { case start_rsc: n_data->start = g_list_prepend(n_data->start, entry); break; case stop_rsc: n_data->stop = g_list_prepend(n_data->stop, entry); break; case action_promote: n_data->promote = g_list_prepend(n_data->promote, entry); break; case action_demote: n_data->demote = g_list_prepend(n_data->demote, entry); break; default: free(entry); break; } } } } } gboolean expand_notification_data(notify_data_t * n_data) { /* Expand the notification entries into a key=value hashtable * This hashtable is later used in action2xml() */ gboolean required = FALSE; char *rsc_list = NULL; char *node_list = NULL; if (n_data->stop) { n_data->stop = g_list_sort(n_data->stop, sort_notify_entries); } expand_list(n_data->stop, &rsc_list, &node_list); if (rsc_list != NULL && safe_str_neq(" ", rsc_list)) { if (safe_str_eq(n_data->action, RSC_STOP)) { required = TRUE; } } g_hash_table_insert(n_data->keys, strdup("notify_stop_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_stop_uname"), node_list); if (n_data->start) { n_data->start = g_list_sort(n_data->start, sort_notify_entries); if (rsc_list && safe_str_eq(n_data->action, RSC_START)) { required = TRUE; } } expand_list(n_data->start, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_start_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_start_uname"), node_list); if (n_data->demote) { n_data->demote = g_list_sort(n_data->demote, sort_notify_entries); if (safe_str_eq(n_data->action, RSC_DEMOTE)) { required = TRUE; } } expand_list(n_data->demote, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_demote_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_demote_uname"), node_list); if (n_data->promote) { n_data->promote = g_list_sort(n_data->promote, sort_notify_entries); if (safe_str_eq(n_data->action, RSC_PROMOTE)) { required = TRUE; } } expand_list(n_data->promote, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_promote_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_promote_uname"), node_list); if (n_data->active) { n_data->active = g_list_sort(n_data->active, sort_notify_entries); } expand_list(n_data->active, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_active_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_active_uname"), node_list); if (n_data->slave) { n_data->slave = g_list_sort(n_data->slave, sort_notify_entries); } expand_list(n_data->slave, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_slave_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_slave_uname"), node_list); if (n_data->master) { n_data->master = g_list_sort(n_data->master, sort_notify_entries); } expand_list(n_data->master, &rsc_list, &node_list); g_hash_table_insert(n_data->keys, strdup("notify_master_resource"), rsc_list); g_hash_table_insert(n_data->keys, strdup("notify_master_uname"), node_list); if (n_data->inactive) { n_data->inactive = g_list_sort(n_data->inactive, sort_notify_entries); } expand_list(n_data->inactive, &rsc_list, NULL); g_hash_table_insert(n_data->keys, strdup("notify_inactive_resource"), rsc_list); if (required && n_data->pre) { update_action_flags(n_data->pre, pe_action_optional | pe_action_clear); update_action_flags(n_data->pre_done, pe_action_optional | pe_action_clear); } if (required && n_data->post) { update_action_flags(n_data->post, pe_action_optional | pe_action_clear); update_action_flags(n_data->post_done, pe_action_optional | pe_action_clear); } return required; } void create_notifications(resource_t * rsc, notify_data_t * n_data, pe_working_set_t * data_set) { GListPtr gIter = NULL; action_t *stop = NULL; action_t *start = NULL; enum action_tasks task = text2task(n_data->action); if (rsc->children) { gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { resource_t *child = (resource_t *) gIter->data; create_notifications(child, n_data, data_set); } return; } /* Copy notification details into standard ops */ gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *op = (action_t *) gIter->data; if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) { enum action_tasks t = text2task(op->task); switch (t) { case start_rsc: case stop_rsc: case action_promote: case action_demote: g_hash_table_foreach(n_data->keys, dup_attr, op->meta); break; default: break; } } } pe_rsc_trace(rsc, "Creating notificaitons for: %s.%s (%s->%s)", n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role)); stop = find_first_action(rsc->actions, NULL, RSC_STOP, NULL); start = find_first_action(rsc->actions, NULL, RSC_START, NULL); /* stop / demote */ if (rsc->role != RSC_ROLE_STOPPED) { if (task == stop_rsc || task == action_demote) { gIter = rsc->running_on; for (; gIter != NULL; gIter = gIter->next) { node_t *current_node = (node_t *) gIter->data; pe_notify(rsc, current_node, n_data->pre, n_data->pre_done, n_data, data_set); if (task == action_demote || stop == NULL || is_set(stop->flags, pe_action_optional)) { pe_post_notify(rsc, current_node, n_data, data_set); } } } } /* start / promote */ if (rsc->next_role != RSC_ROLE_STOPPED) { if (rsc->allocated_to == NULL) { pe_proc_err("Next role '%s' but %s is not allocated", role2text(rsc->next_role), rsc->id); } else if (task == start_rsc || task == action_promote) { if (task != start_rsc || start == NULL || is_set(start->flags, pe_action_optional)) { pe_notify(rsc, rsc->allocated_to, n_data->pre, n_data->pre_done, n_data, data_set); } pe_post_notify(rsc, rsc->allocated_to, n_data, data_set); } } } void free_notification_data(notify_data_t * n_data) { if (n_data == NULL) { return; } g_list_free_full(n_data->stop, free); g_list_free_full(n_data->start, free); g_list_free_full(n_data->demote, free); g_list_free_full(n_data->promote, free); g_list_free_full(n_data->master, free); g_list_free_full(n_data->slave, free); g_list_free_full(n_data->active, free); g_list_free_full(n_data->inactive, free); g_hash_table_destroy(n_data->keys); free(n_data); } int transition_id = -1; /* * Create a dependency graph to send to the transitioner (via the CRMd) */ gboolean stage8(pe_working_set_t * data_set) { GListPtr gIter = NULL; const char *value = NULL; transition_id++; crm_trace("Creating transition graph %d.", transition_id); data_set->graph = create_xml_node(NULL, XML_TAG_GRAPH); value = pe_pref(data_set->config_hash, "cluster-delay"); crm_xml_add(data_set->graph, "cluster-delay", value); value = pe_pref(data_set->config_hash, "stonith-timeout"); crm_xml_add(data_set->graph, "stonith-timeout", value); crm_xml_add(data_set->graph, "failed-stop-offset", "INFINITY"); if (is_set(data_set->flags, pe_flag_start_failure_fatal)) { crm_xml_add(data_set->graph, "failed-start-offset", "INFINITY"); } else { crm_xml_add(data_set->graph, "failed-start-offset", "1"); } value = pe_pref(data_set->config_hash, "batch-limit"); crm_xml_add(data_set->graph, "batch-limit", value); crm_xml_add_int(data_set->graph, "transition_id", transition_id); value = pe_pref(data_set->config_hash, "migration-limit"); if (crm_int_helper(value, NULL) > 0) { crm_xml_add(data_set->graph, "migration-limit", value); } /* errors... slist_iter(action, action_t, action_list, lpc, if(action->optional == FALSE && action->runnable == FALSE) { print_action("Ignoring", action, TRUE); } ); */ gIter = data_set->resources; for (; gIter != NULL; gIter = gIter->next) { resource_t *rsc = (resource_t *) gIter->data; pe_rsc_trace(rsc, "processing actions for rsc=%s", rsc->id); rsc->cmds->expand(rsc, data_set); } crm_log_xml_trace(data_set->graph, "created resource-driven action list"); /* catch any non-resource specific actions */ crm_trace("processing non-resource actions"); gIter = data_set->actions; for (; gIter != NULL; gIter = gIter->next) { action_t *action = (action_t *) gIter->data; if (action->rsc && action->node && action->node->details->shutdown && is_not_set(action->rsc->flags, pe_rsc_maintenance) && is_not_set(action->flags, pe_action_optional) && is_not_set(action->flags, pe_action_runnable) && crm_str_eq(action->task, RSC_STOP, TRUE) ) { /* Eventually we should just ignore the 'fence' case * But for now its the best way to detect (in CTS) when * CIB resource updates are being lost */ if (is_set(data_set->flags, pe_flag_have_quorum) || data_set->no_quorum_policy == no_quorum_ignore) { crm_crit("Cannot %s node '%s' because of %s:%s%s", action->node->details->unclean ? "fence" : "shut down", action->node->details->uname, action->rsc->id, is_not_set(action->rsc->flags, pe_rsc_managed) ? " unmanaged" : " blocked", is_set(action->rsc->flags, pe_rsc_failed) ? " failed" : ""); } } graph_element_from_action(action, data_set); } crm_log_xml_trace(data_set->graph, "created generic action list"); crm_trace("Created transition graph %d.", transition_id); return TRUE; } void cleanup_alloc_calculations(pe_working_set_t * data_set) { if (data_set == NULL) { return; } crm_trace("deleting %d order cons: %p", g_list_length(data_set->ordering_constraints), data_set->ordering_constraints); pe_free_ordering(data_set->ordering_constraints); data_set->ordering_constraints = NULL; crm_trace("deleting %d node cons: %p", g_list_length(data_set->placement_constraints), data_set->placement_constraints); pe_free_rsc_to_node(data_set->placement_constraints); data_set->placement_constraints = NULL; crm_trace("deleting %d inter-resource cons: %p", g_list_length(data_set->colocation_constraints), data_set->colocation_constraints); g_list_free_full(data_set->colocation_constraints, free); data_set->colocation_constraints = NULL; crm_trace("deleting %d ticket deps: %p", g_list_length(data_set->ticket_constraints), data_set->ticket_constraints); g_list_free_full(data_set->ticket_constraints, free); data_set->ticket_constraints = NULL; cleanup_calculations(data_set); } diff --git a/pengine/graph.c b/pengine/graph.c index 7160bbf08d..8decd51cac 100644 --- a/pengine/graph.c +++ b/pengine/graph.c @@ -1,1271 +1,1326 @@ /* * 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 gboolean update_action(action_t * action); +void update_colo_start_chain(action_t * action); gboolean rsc_update_action(action_t * first, action_t * then, enum pe_ordering type); static enum pe_action_flags get_action_flags(action_t * action, node_t * node) { enum pe_action_flags flags = action->flags; if (action->rsc) { flags = action->rsc->cmds->action_flags(action, NULL); if (action->rsc->variant >= pe_clone && node) { /* We only care about activity on $node */ enum pe_action_flags clone_flags = action->rsc->cmds->action_flags(action, node); /* Go to great lengths to ensure the correct value for pe_action_runnable... * * If we are a clone, then for _ordering_ constraints, its only relevant * if we are runnable _anywhere_. * * This only applies to _runnable_ though, and only for ordering constraints. * If this function is ever used during colocation, then we'll need additional logic * * Not very satisfying, but its logical and appears to work well. */ if (is_not_set(clone_flags, pe_action_runnable) && is_set(flags, pe_action_runnable)) { pe_rsc_trace(action->rsc, "Fixing up runnable flag for %s", action->uuid); set_bit(clone_flags, pe_action_runnable); } flags = clone_flags; } } return flags; } static char * convert_non_atomic_uuid(char *old_uuid, resource_t * rsc, gboolean allow_notify, gboolean free_original) { int interval = 0; char *uuid = NULL; char *rid = NULL; char *raw_task = NULL; int task = no_action; CRM_ASSERT(rsc); pe_rsc_trace(rsc, "Processing %s", old_uuid); if (old_uuid == NULL) { return NULL; } else if (strstr(old_uuid, "notify") != NULL) { goto done; /* no conversion */ } else if (rsc->variant < pe_group) { goto done; /* no conversion */ } CRM_ASSERT(parse_op_key(old_uuid, &rid, &raw_task, &interval)); if (interval > 0) { goto done; /* no conversion */ } task = text2task(raw_task); switch (task) { case stop_rsc: case start_rsc: case action_notify: case action_promote: case action_demote: break; case stopped_rsc: case started_rsc: case action_notified: case action_promoted: case action_demoted: task--; break; case monitor_rsc: case shutdown_crm: case stonith_node: task = no_action; break; default: crm_err("Unknown action: %s", raw_task); task = no_action; break; } if (task != no_action) { if (is_set(rsc->flags, pe_rsc_notify) && allow_notify) { uuid = generate_notify_key(rid, "confirmed-post", task2text(task + 1)); } else { uuid = generate_op_key(rid, task2text(task + 1), 0); } pe_rsc_trace(rsc, "Converted %s -> %s", old_uuid, uuid); } done: if (uuid == NULL) { uuid = strdup(old_uuid); } if (free_original) { free(old_uuid); } free(raw_task); free(rid); return uuid; } static action_t * rsc_expand_action(action_t * action) { action_t *result = action; if (action->rsc && action->rsc->variant >= pe_group) { /* Expand 'start' -> 'started' */ char *uuid = NULL; gboolean notify = FALSE; if (action->rsc->parent == NULL) { /* Only outter-most resources have notification actions */ notify = is_set(action->rsc->flags, pe_rsc_notify); } uuid = convert_non_atomic_uuid(action->uuid, action->rsc, notify, FALSE); if (uuid) { pe_rsc_trace(action->rsc, "Converting %s to %s %d", action->uuid, uuid, is_set(action->rsc->flags, pe_rsc_notify)); result = find_first_action(action->rsc->actions, uuid, NULL, NULL); if (result == NULL) { crm_err("Couldn't expand %s", action->uuid); result = action; } free(uuid); } } return result; } static enum pe_graph_flags graph_update_action(action_t * first, action_t * then, node_t * node, enum pe_action_flags flags, enum pe_ordering type) { enum pe_graph_flags changed = pe_graph_none; gboolean processed = FALSE; /* TODO: Do as many of these in parallel as possible */ if (type & pe_order_implies_then) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags & pe_action_optional, pe_action_optional, pe_order_implies_then); } else if (is_set(flags, pe_action_optional) == FALSE) { if (update_action_flags(then, pe_action_optional | pe_action_clear)) { changed |= pe_graph_updated_then; } } if (changed) { pe_rsc_trace(then->rsc, "implies right: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("implies right: %s then %s", first->uuid, then->uuid); } } if ((type & pe_order_restart) && then->rsc) { enum pe_action_flags restart = (pe_action_optional | pe_action_runnable); processed = TRUE; changed |= then->rsc->cmds->update_actions(first, then, node, flags, restart, pe_order_restart); if (changed) { pe_rsc_trace(then->rsc, "restart: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("restart: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_implies_first) { processed = TRUE; if (first->rsc) { changed |= first->rsc->cmds->update_actions(first, then, node, flags, pe_action_optional, pe_order_implies_first); } else if (is_set(flags, pe_action_optional) == FALSE) { if (update_action_flags(first, pe_action_runnable | pe_action_clear)) { changed |= pe_graph_updated_first; } } if (changed) { pe_rsc_trace(then->rsc, "implies left: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("implies left: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_implies_first_master) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags & pe_action_optional, pe_action_optional, pe_order_implies_first_master); } if (changed) { pe_rsc_trace(then->rsc, "implies left when right rsc is Master role: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("implies left when right rsc is Master role: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_one_or_more) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_runnable, pe_order_one_or_more); } else if (is_set(flags, pe_action_runnable)) { if (update_action_flags(then, pe_action_runnable)) { changed |= pe_graph_updated_then; } } if (changed) { pe_rsc_trace(then->rsc, "runnable_one_or_more: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("runnable_one_or_more: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_runnable_left) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_runnable, pe_order_runnable_left); } else if (is_set(flags, pe_action_runnable) == FALSE) { if (update_action_flags(then, pe_action_runnable | pe_action_clear)) { changed |= pe_graph_updated_then; } } if (changed) { pe_rsc_trace(then->rsc, "runnable: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("runnable: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_implies_first_migratable) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_optional, pe_order_implies_first_migratable); } if (changed) { pe_rsc_trace(then->rsc, "optional: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("optional: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_pseudo_left) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_optional, pe_order_pseudo_left); } if (changed) { pe_rsc_trace(then->rsc, "optional: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("optional: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_optional) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_runnable, pe_order_optional); } if (changed) { pe_rsc_trace(then->rsc, "optional: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("optional: %s then %s", first->uuid, then->uuid); } } if (type & pe_order_asymmetrical) { processed = TRUE; if (then->rsc) { changed |= then->rsc->cmds->update_actions(first, then, node, flags, pe_action_runnable, pe_order_asymmetrical); } if (changed) { pe_rsc_trace(then->rsc, "asymmetrical: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("asymmetrical: %s then %s", first->uuid, then->uuid); } } if ((first->flags & pe_action_runnable) && (type & pe_order_implies_then_printed) && (flags & pe_action_optional) == 0) { processed = TRUE; crm_trace("%s implies %s printed", first->uuid, then->uuid); update_action_flags(then, pe_action_print_always); /* dont care about changed */ } if ((type & pe_order_implies_first_printed) && (flags & pe_action_optional) == 0) { processed = TRUE; crm_trace("%s implies %s printed", then->uuid, first->uuid); update_action_flags(first, pe_action_print_always); /* dont care about changed */ } if ((type & pe_order_implies_then || type & pe_order_implies_first || type & pe_order_restart) && first->rsc && safe_str_eq(first->task, RSC_STOP) && is_not_set(first->rsc->flags, pe_rsc_managed) && is_set(first->rsc->flags, pe_rsc_block) && is_not_set(first->flags, pe_action_runnable)) { if (update_action_flags(then, pe_action_runnable | pe_action_clear)) { changed |= pe_graph_updated_then; } if (changed) { pe_rsc_trace(then->rsc, "unmanaged left: %s then %s: changed", first->uuid, then->uuid); } else { crm_trace("unmanaged left: %s then %s", first->uuid, then->uuid); } } if (processed == FALSE) { crm_trace("Constraint 0x%.6x not applicable", type); } return changed; } +static void +mark_start_blocked(resource_t *rsc) +{ + GListPtr gIter = rsc->actions; + + for (; gIter != NULL; gIter = gIter->next) { + action_t *action = (action_t *) gIter->data; + + if (safe_str_neq(action->task, RSC_START)) { + continue; + } + if (is_set(action->flags, pe_action_runnable)) { + clear_bit(action->flags, pe_action_runnable); + update_colo_start_chain(action); + update_action(action); + } + } +} + +void +update_colo_start_chain(action_t *action) +{ + GListPtr gIter = NULL; + resource_t *rsc = NULL; + + if (is_not_set(action->flags, pe_action_runnable) && safe_str_eq(action->task, RSC_START)) { + rsc = uber_parent(action->rsc); + } + + if (rsc == NULL || rsc->rsc_cons_lhs == NULL) { + return; + } + + /* if rsc has children, all the children need to have start set to + * unrunnable before we follow the colo chain for the parent. */ + for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { + resource_t *child = (resource_t *)gIter->data; + action_t *start = find_first_action(child->actions, NULL, RSC_START, NULL); + if (start == NULL || is_set(start->flags, pe_action_runnable)) { + return; + } + } + + for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { + rsc_colocation_t *colocate_with = (rsc_colocation_t *)gIter->data; + if (colocate_with->score == INFINITY) { + mark_start_blocked(colocate_with->rsc_lh); + } + } +} + gboolean update_action(action_t * then) { GListPtr lpc = NULL; enum pe_graph_flags changed = pe_graph_none; int last_flags = then->flags; crm_trace("Processing %s (%s %s %s)", then->uuid, is_set(then->flags, pe_action_optional) ? "optional" : "required", is_set(then->flags, pe_action_runnable) ? "runnable" : "unrunnable", is_set(then->flags, pe_action_pseudo) ? "pseudo" : then->node ? then->node->details->uname : ""); if (is_set(then->flags, pe_action_requires_any)) { clear_bit(then->flags, pe_action_runnable); } for (lpc = then->actions_before; lpc != NULL; lpc = lpc->next) { action_wrapper_t *other = (action_wrapper_t *) lpc->data; action_t *first = other->action; node_t *then_node = then->node; node_t *first_node = first->node; enum pe_action_flags then_flags = 0; enum pe_action_flags first_flags = 0; if (first->rsc && first->rsc->variant == pe_group && safe_str_eq(first->task, RSC_START)) { first_node = first->rsc->fns->location(first->rsc, NULL, FALSE); if (first_node) { crm_trace("First: Found node %s for %s", first_node->details->uname, first->uuid); } } if (then->rsc && then->rsc->variant == pe_group && safe_str_eq(then->task, RSC_START)) { then_node = then->rsc->fns->location(then->rsc, NULL, FALSE); if (then_node) { crm_trace("Then: Found node %s for %s", then_node->details->uname, then->uuid); } } clear_bit(changed, pe_graph_updated_first); if (first->rsc != then->rsc && first->rsc != NULL && then->rsc != NULL && first->rsc != then->rsc->parent) { first = rsc_expand_action(first); } if (first != other->action) { crm_trace("Ordering %s afer %s instead of %s", then->uuid, first->uuid, other->action->uuid); } first_flags = get_action_flags(first, then_node); then_flags = get_action_flags(then, first_node); crm_trace("Checking %s (%s %s %s) against %s (%s %s %s) filter=0x%.6x type=0x%.6x", then->uuid, is_set(then_flags, pe_action_optional) ? "optional" : "required", is_set(then_flags, pe_action_runnable) ? "runnable" : "unrunnable", is_set(then_flags, pe_action_pseudo) ? "pseudo" : then->node ? then->node->details-> uname : "", first->uuid, is_set(first_flags, pe_action_optional) ? "optional" : "required", is_set(first_flags, pe_action_runnable) ? "runnable" : "unrunnable", is_set(first_flags, pe_action_pseudo) ? "pseudo" : first->node ? first->node->details-> uname : "", first_flags, other->type); if (first == other->action) { /* * 'first' was not expanded (ie. from 'start' to 'running'), which could mean it: * - has no associated resource, * - was a primitive, * - was pre-expanded (ie. 'running' instead of 'start') * * The third argument here to graph_update_action() is a node which is used under two conditions: * - Interleaving, in which case first->node and * then->node are equal (and NULL) * - If 'then' is a clone, to limit the scope of the * constraint to instances on the supplied node * */ int otype = other->type; node_t *node = then->node; if(is_set(otype, pe_order_implies_then_on_node)) { /* Normally we want the _whole_ 'then' clone to * restart if 'first' is restarted, so then->node is * needed. * * However for unfencing, we want to limit this to * instances on the same node as 'first' (the * unfencing operation), so first->node is supplied. * * Swap the node, from then on we can can treat it * like any other 'pe_order_implies_then' */ clear_bit(otype, pe_order_implies_then_on_node); set_bit(otype, pe_order_implies_then); node = first->node; } clear_bit(first_flags, pe_action_pseudo); changed |= graph_update_action(first, then, node, first_flags, otype); /* 'first' was for a complex resource (clone, group, etc), * create a new dependancy if necessary */ } else if (order_actions(first, then, other->type)) { /* This was the first time 'first' and 'then' were associated, * start again to get the new actions_before list */ changed |= (pe_graph_updated_then | pe_graph_disable); } if (changed & pe_graph_disable) { crm_trace("Disabled constraint %s -> %s", other->action->uuid, then->uuid); clear_bit(changed, pe_graph_disable); other->type = pe_order_none; } if (changed & pe_graph_updated_first) { GListPtr lpc2 = NULL; crm_trace("Updated %s (first %s %s %s), processing dependants ", first->uuid, is_set(first->flags, pe_action_optional) ? "optional" : "required", is_set(first->flags, pe_action_runnable) ? "runnable" : "unrunnable", is_set(first->flags, pe_action_pseudo) ? "pseudo" : first->node ? first->node->details-> uname : ""); for (lpc2 = first->actions_after; lpc2 != NULL; lpc2 = lpc2->next) { action_wrapper_t *other = (action_wrapper_t *) lpc2->data; update_action(other->action); } update_action(first); } } if (is_set(then->flags, pe_action_requires_any)) { if (last_flags != then->flags) { changed |= pe_graph_updated_then; } else { clear_bit(changed, pe_graph_updated_then); } } if (changed & pe_graph_updated_then) { crm_trace("Updated %s (then %s %s %s), processing dependants ", then->uuid, is_set(then->flags, pe_action_optional) ? "optional" : "required", is_set(then->flags, pe_action_runnable) ? "runnable" : "unrunnable", is_set(then->flags, pe_action_pseudo) ? "pseudo" : then->node ? then->node->details-> uname : ""); + if (is_set(last_flags, pe_action_runnable) && is_not_set(then->flags, pe_action_runnable)) { + update_colo_start_chain(then); + } update_action(then); for (lpc = then->actions_after; lpc != NULL; lpc = lpc->next) { action_wrapper_t *other = (action_wrapper_t *) lpc->data; update_action(other->action); } } return FALSE; } gboolean shutdown_constraints(node_t * node, action_t * shutdown_op, pe_working_set_t * data_set) { /* add the stop to the before lists so it counts as a pre-req * for the shutdown */ GListPtr lpc = NULL; for (lpc = data_set->actions; lpc != NULL; lpc = lpc->next) { action_t *action = (action_t *) lpc->data; if (action->rsc == NULL || action->node == NULL) { continue; } else if (action->node->details != node->details) { continue; } else if (is_set(action->rsc->flags, pe_rsc_maintenance)) { pe_rsc_trace(action->rsc, "Skipping %s: maintainence mode", action->uuid); continue; } else if (node->details->maintenance) { pe_rsc_trace(action->rsc, "Skipping %s: node %s is in maintenance mode", action->uuid, node->details->uname); continue; } else if (safe_str_neq(action->task, RSC_STOP)) { continue; } else if (is_not_set(action->rsc->flags, pe_rsc_managed) && is_not_set(action->rsc->flags, pe_rsc_block)) { /* * If another action depends on this one, we may still end up blocking */ pe_rsc_trace(action->rsc, "Skipping %s: unmanaged", action->uuid); continue; } pe_rsc_trace(action->rsc, "Ordering %s before shutdown on %s", action->uuid, node->details->uname); pe_clear_action_bit(action, pe_action_optional); custom_action_order(action->rsc, NULL, action, NULL, strdup(CRM_OP_SHUTDOWN), shutdown_op, pe_order_optional | pe_order_runnable_left, data_set); } return TRUE; } gboolean stonith_constraints(node_t * node, action_t * stonith_op, pe_working_set_t * data_set) { CRM_CHECK(stonith_op != NULL, return FALSE); /* * Make sure the stonith OP occurs before we start any shared resources */ if (stonith_op != NULL) { GListPtr lpc = NULL; for (lpc = data_set->resources; lpc != NULL; lpc = lpc->next) { resource_t *rsc = (resource_t *) lpc->data; rsc_stonith_ordering(rsc, stonith_op, data_set); } } /* add the stonith OP as a stop pre-req and the mark the stop * as a pseudo op - since its now redundant */ return TRUE; } static node_t * get_router_node(action_t *action) { node_t *began_on = NULL; node_t *ended_on = NULL; node_t *router_node = NULL; if (is_remote_node(action->node) == FALSE) { return NULL; } CRM_ASSERT(action->node->details->remote_rsc != NULL); if (action->node->details->remote_rsc->running_on) { began_on = action->node->details->remote_rsc->running_on->data; } ended_on = action->node->details->remote_rsc->allocated_to; /* if there is only one location to choose from, * this is easy. Check for those conditions first */ if (!began_on || !ended_on) { /* remote rsc is either shutting down or starting up */ return began_on ? began_on : ended_on; } else if (began_on->details == ended_on->details) { /* remote rsc didn't move nodes. */ return began_on; } /* If we have get here, we know the remote resource * began on one node and is moving to another node. * * This means some actions will get routed through the cluster * node the connection rsc began on, and others are routed through * the cluster node the connection rsc ends up on. * * 1. stop, demote, migrate actions of resources living in the remote * node _MUST_ occur _BEFORE_ the connection can move (these actions * are all required before the remote rsc stop action can occur.) In * this case, we know these actions have to be routed through the initial * cluster node the connection resource lived on before the move takes place. * * 2. Everything else (start, promote, monitor, probe, refresh, clear failcount * delete ....) must occur after the resource starts on the node it is * moving to. */ /* 1. before connection rsc moves. */ if (safe_str_eq(action->task, "stop") || safe_str_eq(action->task, "demote") || safe_str_eq(action->task, "migrate_from") || safe_str_eq(action->task, "migrate_to")) { router_node = began_on; /* 2. after connection rsc moves. */ } else { router_node = ended_on; } return router_node; } static xmlNode * action2xml(action_t * action, gboolean as_input, pe_working_set_t *data_set) { gboolean needs_node_info = TRUE; xmlNode *action_xml = NULL; xmlNode *args_xml = NULL; char *action_id_s = NULL; if (action == NULL) { return NULL; } if (safe_str_eq(action->task, CRM_OP_FENCE)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); /* needs_node_info = FALSE; */ } else if (safe_str_eq(action->task, CRM_OP_SHUTDOWN)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); } else if (safe_str_eq(action->task, CRM_OP_CLEAR_FAILCOUNT)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); } else if (safe_str_eq(action->task, CRM_OP_LRM_REFRESH)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); /* } else if(safe_str_eq(action->task, RSC_PROBED)) { */ /* action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); */ } else if (is_set(action->flags, pe_action_pseudo)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_PSEUDO_EVENT); needs_node_info = FALSE; } else { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_RSC_OP); } action_id_s = crm_itoa(action->id); crm_xml_add(action_xml, XML_ATTR_ID, action_id_s); free(action_id_s); crm_xml_add(action_xml, XML_LRM_ATTR_TASK, action->task); if (action->rsc != NULL && action->rsc->clone_name != NULL) { char *clone_key = NULL; const char *interval_s = g_hash_table_lookup(action->meta, XML_LRM_ATTR_INTERVAL); int interval = crm_parse_int(interval_s, "0"); if (safe_str_eq(action->task, RSC_NOTIFY)) { const char *n_type = g_hash_table_lookup(action->meta, "notify_type"); const char *n_task = g_hash_table_lookup(action->meta, "notify_operation"); CRM_CHECK(n_type != NULL, crm_err("No notify type value found for %s", action->uuid)); CRM_CHECK(n_task != NULL, crm_err("No notify operation value found for %s", action->uuid)); clone_key = generate_notify_key(action->rsc->clone_name, n_type, n_task); } else if(action->cancel_task) { clone_key = generate_op_key(action->rsc->clone_name, action->cancel_task, interval); } else { clone_key = generate_op_key(action->rsc->clone_name, action->task, interval); } CRM_CHECK(clone_key != NULL, crm_err("Could not generate a key for %s", action->uuid)); crm_xml_add(action_xml, XML_LRM_ATTR_TASK_KEY, clone_key); crm_xml_add(action_xml, "internal_" XML_LRM_ATTR_TASK_KEY, action->uuid); free(clone_key); } else { crm_xml_add(action_xml, XML_LRM_ATTR_TASK_KEY, action->uuid); } if (needs_node_info && action->node != NULL) { node_t *router_node = get_router_node(action); crm_xml_add(action_xml, XML_LRM_ATTR_TARGET, action->node->details->uname); crm_xml_add(action_xml, XML_LRM_ATTR_TARGET_UUID, action->node->details->id); if (router_node) { crm_xml_add(action_xml, XML_LRM_ATTR_ROUTER_NODE, router_node->details->uname); } } if (is_set(action->flags, pe_action_failure_is_fatal) == FALSE) { add_hash_param(action->meta, XML_ATTR_TE_ALLOWFAIL, XML_BOOLEAN_TRUE); } if (as_input) { return action_xml; } if (action->rsc) { if (is_set(action->flags, pe_action_pseudo) == FALSE) { int lpc = 0; xmlNode *rsc_xml = create_xml_node(action_xml, crm_element_name(action->rsc->xml)); const char *attr_list[] = { XML_AGENT_ATTR_CLASS, XML_AGENT_ATTR_PROVIDER, XML_ATTR_TYPE }; if (is_set(action->rsc->flags, pe_rsc_orphan) && action->rsc->clone_name) { /* Do not use the 'instance free' name here as that * might interfere with the instance we plan to keep. * Ie. if there are more than two named /anonymous/ * instances on a given node, we need to make sure the * command goes to the right one. * * Keep this block, even when everyone is using * 'instance free' anonymous clone names - it means * we'll do the right thing if anyone toggles the * unique flag to 'off' */ crm_debug("Using orphan clone name %s instead of %s", action->rsc->id, action->rsc->clone_name); crm_xml_add(rsc_xml, XML_ATTR_ID, action->rsc->clone_name); crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->id); } else if (is_not_set(action->rsc->flags, pe_rsc_unique)) { const char *xml_id = ID(action->rsc->xml); crm_debug("Using anonymous clone name %s for %s (aka. %s)", xml_id, action->rsc->id, action->rsc->clone_name); /* ID is what we'd like client to use * ID_LONG is what they might know it as instead * * ID_LONG is only strictly needed /here/ during the * transition period until all nodes in the cluster * are running the new software /and/ have rebooted * once (meaning that they've only ever spoken to a DC * supporting this feature). * * If anyone toggles the unique flag to 'on', the * 'instance free' name will correspond to an orphan * and fall into the claus above instead */ crm_xml_add(rsc_xml, XML_ATTR_ID, xml_id); if (action->rsc->clone_name && safe_str_neq(xml_id, action->rsc->clone_name)) { crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->clone_name); } else { crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->id); } } else { CRM_ASSERT(action->rsc->clone_name == NULL); crm_xml_add(rsc_xml, XML_ATTR_ID, action->rsc->id); } for (lpc = 0; lpc < DIMOF(attr_list); lpc++) { crm_xml_add(rsc_xml, attr_list[lpc], g_hash_table_lookup(action->rsc->meta, attr_list[lpc])); } } } args_xml = create_xml_node(NULL, XML_TAG_ATTRS); crm_xml_add(args_xml, XML_ATTR_CRM_VERSION, CRM_FEATURE_SET); g_hash_table_foreach(action->extra, hash2field, args_xml); if (action->rsc != NULL && action->node) { GHashTable *p = g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); get_rsc_attributes(p, action->rsc, action->node, data_set); g_hash_table_foreach(p, hash2smartfield, args_xml); g_hash_table_destroy(p); } else if(action->rsc) { g_hash_table_foreach(action->rsc->parameters, hash2smartfield, args_xml); } g_hash_table_foreach(action->meta, hash2metafield, args_xml); if (action->rsc != NULL) { resource_t *parent = action->rsc; while (parent != NULL) { parent->cmds->append_meta(parent, args_xml); parent = parent->parent; } } else if (safe_str_eq(action->task, CRM_OP_FENCE) && action->node) { g_hash_table_foreach(action->node->details->attrs, hash2metafield, args_xml); } sorted_xml(args_xml, action_xml, FALSE); crm_log_xml_trace(action_xml, "dumped action"); free_xml(args_xml); return action_xml; } static gboolean should_dump_action(action_t * action) { CRM_CHECK(action != NULL, return FALSE); if (is_set(action->flags, pe_action_dumped)) { crm_trace("action %d (%s) was already dumped", action->id, action->uuid); return FALSE; } else if (is_set(action->flags, pe_action_pseudo) && safe_str_eq(action->task, CRM_OP_PROBED)) { GListPtr lpc = NULL; /* This is a horrible but convenient hack * * It mimimizes the number of actions with unsatisfied inputs * (ie. not included in the graph) * * This in turn, means we can be more concise when printing * aborted/incomplete graphs. * * It also makes it obvious which node is preventing * probe_complete from running (presumably because it is only * partially up) * * For these reasons we tolerate such perversions */ for (lpc = action->actions_after; lpc != NULL; lpc = lpc->next) { action_wrapper_t *wrapper = (action_wrapper_t *) lpc->data; if (is_not_set(wrapper->action->flags, pe_action_runnable)) { /* Only interested in runnable operations */ } else if (safe_str_neq(wrapper->action->task, RSC_START)) { /* Only interested in start operations */ } else if (is_set(wrapper->action->flags, pe_action_dumped)) { crm_trace("action %d (%s) dependancy of %s", action->id, action->uuid, wrapper->action->uuid); return TRUE; } else if (should_dump_action(wrapper->action)) { crm_trace("action %d (%s) dependancy of %s", action->id, action->uuid, wrapper->action->uuid); return TRUE; } } } if (is_set(action->flags, pe_action_runnable) == FALSE) { crm_trace("action %d (%s) was not runnable", action->id, action->uuid); return FALSE; } else if (is_set(action->flags, pe_action_optional) && is_set(action->flags, pe_action_print_always) == FALSE) { crm_trace("action %d (%s) was optional", action->id, action->uuid); return FALSE; } else if (action->rsc != NULL && is_not_set(action->rsc->flags, pe_rsc_managed)) { const char *interval = NULL; interval = g_hash_table_lookup(action->meta, XML_LRM_ATTR_INTERVAL); /* make sure probes and recurring monitors go through */ if (safe_str_neq(action->task, RSC_STATUS) && interval == NULL) { crm_trace("action %d (%s) was for an unmanaged resource (%s)", action->id, action->uuid, action->rsc->id); return FALSE; } } if (is_set(action->flags, pe_action_pseudo) || safe_str_eq(action->task, CRM_OP_FENCE) || safe_str_eq(action->task, CRM_OP_SHUTDOWN)) { /* skip the next checks */ return TRUE; } if (action->node == NULL) { pe_err("action %d (%s) was not allocated", action->id, action->uuid); log_action(LOG_DEBUG, "Unallocated action", action, FALSE); return FALSE; } else if (action->node->details->online == FALSE) { pe_err("action %d was (%s) scheduled for offline node", action->id, action->uuid); log_action(LOG_DEBUG, "Action for offline node", action, FALSE); return FALSE; #if 0 /* but this would also affect resources that can be safely * migrated before a fencing op */ } else if (action->node->details->unclean == FALSE) { pe_err("action %d was (%s) scheduled for unclean node", action->id, action->uuid); log_action(LOG_DEBUG, "Action for unclean node", action, FALSE); return FALSE; #endif } return TRUE; } /* lowest to highest */ static gint sort_action_id(gconstpointer a, gconstpointer b) { const action_wrapper_t *action_wrapper2 = (const action_wrapper_t *)a; const action_wrapper_t *action_wrapper1 = (const action_wrapper_t *)b; if (a == NULL) { return 1; } if (b == NULL) { return -1; } if (action_wrapper1->action->id > action_wrapper2->action->id) { return -1; } if (action_wrapper1->action->id < action_wrapper2->action->id) { return 1; } return 0; } static gboolean should_dump_input(int last_action, action_t * action, action_wrapper_t * wrapper) { int type = wrapper->type; type &= ~pe_order_implies_first_printed; type &= ~pe_order_implies_then_printed; type &= ~pe_order_optional; if (wrapper->action->node && action->rsc && action->rsc->fillers && is_not_set(type, pe_order_preserve) && wrapper->action->node->details->remote_rsc && uber_parent(action->rsc) != uber_parent(wrapper->action->rsc) ) { /* This prevents user-defined ordering constraints between * resources in remote nodes and the resources that * define/represent a remote node. * * There is no known valid reason to allow this sort of thing * but if one arises, we'd need to change the * action->rsc->fillers clause to be more specific, possibly * to check that it contained wrapper->action->rsc */ crm_warn("Invalid ordering constraint between %s and %s", wrapper->action->rsc->id, action->rsc->id); wrapper->type = pe_order_none; return FALSE; } wrapper->state = pe_link_not_dumped; if (last_action == wrapper->action->id) { crm_trace("Input (%d) %s duplicated for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); wrapper->state = pe_link_dup; return FALSE; } else if (wrapper->type == pe_order_none) { crm_trace("Input (%d) %s suppressed for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); return FALSE; } else if (is_set(wrapper->action->flags, pe_action_runnable) == FALSE && type == pe_order_none && safe_str_neq(wrapper->action->uuid, CRM_OP_PROBED)) { crm_trace("Input (%d) %s optional (ordering) for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); return FALSE; } else if (is_set(action->flags, pe_action_pseudo) && (wrapper->type & pe_order_stonith_stop)) { crm_trace("Input (%d) %s suppressed for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); return FALSE; } else if ((wrapper->type & pe_order_implies_first_migratable) && (is_set(wrapper->action->flags, pe_action_runnable) == FALSE)) { return FALSE; } else if ((wrapper->type & pe_order_apply_first_non_migratable) && (is_set(wrapper->action->flags, pe_action_migrate_runnable))) { return FALSE; } else if ((wrapper->type == pe_order_optional) && strstr(wrapper->action->uuid, "_stop_0") && is_set(wrapper->action->flags, pe_action_migrate_runnable)) { /* for optional only ordering, ordering is not preserved for * a stop action that is actually involved with a migration. */ return FALSE; } else if (wrapper->type == pe_order_load) { crm_trace("check load filter %s.%s -> %s.%s", wrapper->action->uuid, wrapper->action->node ? wrapper->action->node->details->uname : "", action->uuid, action->node ? action->node->details->uname : ""); if (action->rsc && safe_str_eq(action->task, RSC_MIGRATE)) { /* Remove the orders like the following if not needed or introducing transition loop: * "load_stopped_node2" -> "rscA_migrate_to node1" * which were created also from: pengine/native.c: MigrateRsc() * order_actions(other, then, other_w->type); */ /* For migrate_to ops, we care about where it has been * allocated to, not where the action will be executed */ if (wrapper->action->node == NULL || action->rsc->allocated_to == NULL || wrapper->action->node->details != action->rsc->allocated_to->details) { /* Check if the actions are for the same node, ignore otherwise */ crm_trace("load filter - migrate"); wrapper->type = pe_order_none; return FALSE; } else { GListPtr lpc = NULL; for (lpc = wrapper->action->actions_before; lpc != NULL; lpc = lpc->next) { action_wrapper_t *wrapper_before = (action_wrapper_t *) lpc->data; /* If there's any order like: * "rscB_stop node2"-> "load_stopped_node2" -> "rscA_migrate_to node1" * rscA is being migrated from node1 to node2, * while rscB is being migrated from node2 to node1. * There will be potential transition loop. * Break the order "load_stopped_node2" -> "rscA_migrate_to node1". */ if (wrapper_before->type != pe_order_load || is_set(wrapper_before->action->flags, pe_action_optional) || is_not_set(wrapper_before->action->flags, pe_action_migrate_runnable) || wrapper_before->action->node == NULL || wrapper->action->node == NULL || wrapper_before->action->node->details != wrapper->action->node->details) { continue; } if (wrapper_before->action->rsc && wrapper_before->action->rsc->allocated_to && action->node && wrapper_before->action->rsc->allocated_to->details == action->node->details) { crm_trace("load filter - migrate loop"); wrapper->type = pe_order_none; return FALSE; } } } } else if (wrapper->action->node == NULL || action->node == NULL || wrapper->action->node->details != action->node->details) { /* Check if the actions are for the same node, ignore otherwise */ crm_trace("load filter - node"); wrapper->type = pe_order_none; return FALSE; } else if (is_set(wrapper->action->flags, pe_action_optional)) { /* Check if the pre-req is optional, ignore if so */ crm_trace("load filter - optional"); wrapper->type = pe_order_none; return FALSE; } } else if (wrapper->type == pe_order_anti_colocation) { crm_trace("check anti-colocation filter %s.%s -> %s.%s", wrapper->action->uuid, wrapper->action->node ? wrapper->action->node->details->uname : "", action->uuid, action->node ? action->node->details->uname : ""); if (wrapper->action->node && action->node && wrapper->action->node->details != action->node->details) { /* Check if the actions are for the same node, ignore otherwise */ crm_trace("anti-colocation filter - node"); wrapper->type = pe_order_none; return FALSE; } else if (is_set(wrapper->action->flags, pe_action_optional)) { /* Check if the pre-req is optional, ignore if so */ crm_trace("anti-colocation filter - optional"); wrapper->type = pe_order_none; return FALSE; } } else if (wrapper->action->rsc && wrapper->action->rsc != action->rsc && is_set(wrapper->action->rsc->flags, pe_rsc_failed) && is_not_set(wrapper->action->rsc->flags, pe_rsc_managed) && strstr(wrapper->action->uuid, "_stop_0") && action->rsc && action->rsc->variant >= pe_clone) { crm_warn("Ignoring requirement that %s complete before %s:" " unmanaged failed resources cannot prevent clone shutdown", wrapper->action->uuid, action->uuid); return FALSE; } else if (is_set(wrapper->action->flags, pe_action_dumped) || should_dump_action(wrapper->action)) { crm_trace("Input (%d) %s should be dumped for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); goto dump; #if 0 } else if (is_set(wrapper->action->flags, pe_action_runnable) && is_set(wrapper->action->flags, pe_action_pseudo) && wrapper->action->rsc->variant != pe_native) { crm_crit("Input (%d) %s should be dumped for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); goto dump; #endif } else if (is_set(wrapper->action->flags, pe_action_optional) == TRUE && is_set(wrapper->action->flags, pe_action_print_always) == FALSE) { crm_trace("Input (%d) %s optional for %s", wrapper->action->id, wrapper->action->uuid, action->uuid); crm_trace("Input (%d) %s n=%p p=%d r=%d o=%d a=%d f=0x%.6x", wrapper->action->id, wrapper->action->uuid, wrapper->action->node, is_set(wrapper->action->flags, pe_action_pseudo), is_set(wrapper->action->flags, pe_action_runnable), is_set(wrapper->action->flags, pe_action_optional), is_set(wrapper->action->flags, pe_action_print_always), wrapper->type); return FALSE; } dump: crm_trace("Input (%d) %s n=%p p=%d r=%d o=%d a=%d f=0x%.6x dumped for %s", wrapper->action->id, wrapper->action->uuid, wrapper->action->node, is_set(wrapper->action->flags, pe_action_pseudo), is_set(wrapper->action->flags, pe_action_runnable), is_set(wrapper->action->flags, pe_action_optional), is_set(wrapper->action->flags, pe_action_print_always), wrapper->type, action->uuid); return TRUE; } void graph_element_from_action(action_t * action, pe_working_set_t * data_set) { GListPtr lpc = NULL; int last_action = -1; int synapse_priority = 0; xmlNode *syn = NULL; xmlNode *set = NULL; xmlNode *in = NULL; xmlNode *input = NULL; xmlNode *xml_action = NULL; if (should_dump_action(action) == FALSE) { return; } set_bit(action->flags, pe_action_dumped); syn = create_xml_node(data_set->graph, "synapse"); set = create_xml_node(syn, "action_set"); in = create_xml_node(syn, "inputs"); crm_xml_add_int(syn, XML_ATTR_ID, data_set->num_synapse); data_set->num_synapse++; if (action->rsc != NULL) { synapse_priority = action->rsc->priority; } if (action->priority > synapse_priority) { synapse_priority = action->priority; } if (synapse_priority > 0) { crm_xml_add_int(syn, XML_CIB_ATTR_PRIORITY, synapse_priority); } xml_action = action2xml(action, FALSE, data_set); add_node_nocopy(set, crm_element_name(xml_action), xml_action); action->actions_before = g_list_sort(action->actions_before, sort_action_id); for (lpc = action->actions_before; lpc != NULL; lpc = lpc->next) { action_wrapper_t *wrapper = (action_wrapper_t *) lpc->data; if (should_dump_input(last_action, action, wrapper) == FALSE) { continue; } wrapper->state = pe_link_dumped; CRM_CHECK(last_action < wrapper->action->id,; ); last_action = wrapper->action->id; input = create_xml_node(in, "trigger"); xml_action = action2xml(wrapper->action, TRUE, data_set); add_node_nocopy(input, crm_element_name(xml_action), xml_action); } } diff --git a/pengine/regression.sh b/pengine/regression.sh index 70e94eda80..1e3eb0528c 100755 --- a/pengine/regression.sh +++ b/pengine/regression.sh @@ -1,798 +1,800 @@ #!/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-dependants "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" 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)" --rc 4 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." 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 (manditory) " 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 dependant 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 dependant 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 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" 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 "Dependancy 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 "Dont 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 "Dont 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 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 "Dont retry failed demote actions" do_test master-failed-demote-2 "Dont 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-dependant-ban "Don't stop instances from being active because a dependant 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" 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 dependancy 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 dependant 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 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" --rc 4 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 "Dont 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 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" 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)" 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" 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-orphaned "Properly shutdown orphaned whitebox container" do_test whitebox-orphan-ms "Properly tear down orphan ms resources on remote-nodes" do_test whitebox-unexpectedly-running "Recover container nodes the cluster did not start." do_test whitebox-migrate1 "Migrate both container and connection resource" do_test whitebox-imply-stop-on-fence "imply stop action on container node rsc when host node is fenced" echo "" do_test remote-startup-probes "Baremetal remote-node startup probes" 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." echo "" do_test resource-discovery "Exercises resource-discovery location constraint option." do_test rsc-discovery-per-node "Disable resource discovery per node" echo "" test_results diff --git a/pengine/test10/complex_enforce_colo.dot b/pengine/test10/complex_enforce_colo.dot new file mode 100644 index 0000000000..a4811b8055 --- /dev/null +++ b/pengine/test10/complex_enforce_colo.dot @@ -0,0 +1,1257 @@ + digraph "g" { +"all_stopped" [ style=bold color="green" fontcolor="orange"] +"ceilometer-alarm-evaluator-clone_running_0" -> "ceilometer-alarm-notifier-clone_start_0" [ style = dashed] +"ceilometer-alarm-evaluator-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-alarm-evaluator-clone_start_0" -> "ceilometer-alarm-evaluator-clone_running_0" [ style = dashed] +"ceilometer-alarm-evaluator-clone_start_0" -> "ceilometer-alarm-evaluator_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-evaluator-clone_start_0" -> "ceilometer-alarm-evaluator_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-evaluator-clone_start_0" -> "ceilometer-alarm-evaluator_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-evaluator-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-alarm-evaluator-clone_stop_0" -> "ceilometer-alarm-evaluator-clone_stopped_0" [ style = bold] +"ceilometer-alarm-evaluator-clone_stop_0" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node1" [ style = bold] +"ceilometer-alarm-evaluator-clone_stop_0" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node2" [ style = bold] +"ceilometer-alarm-evaluator-clone_stop_0" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node3" [ style = bold] +"ceilometer-alarm-evaluator-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-alarm-evaluator-clone_stopped_0" -> "ceilometer-alarm-evaluator-clone_start_0" [ style = dashed] +"ceilometer-alarm-evaluator-clone_stopped_0" -> "ceilometer-delay-clone_stop_0" [ style = bold] +"ceilometer-alarm-evaluator-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-alarm-evaluator_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_start_0 rhos6-node1" -> "ceilometer-alarm-evaluator-clone_running_0" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node1" -> "ceilometer-alarm-evaluator_monitor_60000 rhos6-node1" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node1" -> "ceilometer-alarm-notifier_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_start_0 rhos6-node2" -> "ceilometer-alarm-evaluator-clone_running_0" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node2" -> "ceilometer-alarm-evaluator_monitor_60000 rhos6-node2" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node2" -> "ceilometer-alarm-notifier_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_start_0 rhos6-node3" -> "ceilometer-alarm-evaluator-clone_running_0" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node3" -> "ceilometer-alarm-evaluator_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node3" -> "ceilometer-alarm-notifier_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-evaluator_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-evaluator_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node1" -> "ceilometer-alarm-evaluator-clone_stopped_0" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node1" -> "ceilometer-alarm-evaluator_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-evaluator_stop_0 rhos6-node1" -> "ceilometer-delay_stop_0 rhos6-node1" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-alarm-evaluator_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node2" -> "ceilometer-alarm-evaluator-clone_stopped_0" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node2" -> "ceilometer-alarm-evaluator_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-evaluator_stop_0 rhos6-node2" -> "ceilometer-delay_stop_0 rhos6-node2" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-alarm-evaluator_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node3" -> "ceilometer-alarm-evaluator-clone_stopped_0" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node3" -> "ceilometer-alarm-evaluator_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-evaluator_stop_0 rhos6-node3" -> "ceilometer-delay_stop_0 rhos6-node3" [ style = bold] +"ceilometer-alarm-evaluator_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-alarm-notifier-clone_running_0" -> "ceilometer-notification-clone_start_0" [ style = dashed] +"ceilometer-alarm-notifier-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-alarm-notifier-clone_start_0" -> "ceilometer-alarm-notifier-clone_running_0" [ style = dashed] +"ceilometer-alarm-notifier-clone_start_0" -> "ceilometer-alarm-notifier_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-notifier-clone_start_0" -> "ceilometer-alarm-notifier_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-notifier-clone_start_0" -> "ceilometer-alarm-notifier_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-notifier-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-alarm-notifier-clone_stop_0" -> "ceilometer-alarm-notifier-clone_stopped_0" [ style = bold] +"ceilometer-alarm-notifier-clone_stop_0" -> "ceilometer-alarm-notifier_stop_0 rhos6-node1" [ style = bold] +"ceilometer-alarm-notifier-clone_stop_0" -> "ceilometer-alarm-notifier_stop_0 rhos6-node2" [ style = bold] +"ceilometer-alarm-notifier-clone_stop_0" -> "ceilometer-alarm-notifier_stop_0 rhos6-node3" [ style = bold] +"ceilometer-alarm-notifier-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-alarm-notifier-clone_stopped_0" -> "ceilometer-alarm-evaluator-clone_stop_0" [ style = bold] +"ceilometer-alarm-notifier-clone_stopped_0" -> "ceilometer-alarm-notifier-clone_start_0" [ style = dashed] +"ceilometer-alarm-notifier-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-alarm-notifier_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_start_0 rhos6-node1" -> "ceilometer-alarm-notifier-clone_running_0" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node1" -> "ceilometer-alarm-notifier_monitor_60000 rhos6-node1" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node1" -> "ceilometer-notification_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_start_0 rhos6-node2" -> "ceilometer-alarm-notifier-clone_running_0" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node2" -> "ceilometer-alarm-notifier_monitor_60000 rhos6-node2" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node2" -> "ceilometer-notification_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_start_0 rhos6-node3" -> "ceilometer-alarm-notifier-clone_running_0" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node3" -> "ceilometer-alarm-notifier_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node3" -> "ceilometer-notification_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-notifier_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-alarm-notifier_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node1" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node1" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node1" -> "ceilometer-alarm-notifier-clone_stopped_0" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node1" -> "ceilometer-alarm-notifier_start_0 rhos6-node1" [ style = dashed] +"ceilometer-alarm-notifier_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-alarm-notifier_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node2" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node2" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node2" -> "ceilometer-alarm-notifier-clone_stopped_0" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node2" -> "ceilometer-alarm-notifier_start_0 rhos6-node2" [ style = dashed] +"ceilometer-alarm-notifier_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-alarm-notifier_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node3" -> "ceilometer-alarm-evaluator_stop_0 rhos6-node3" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node3" -> "ceilometer-alarm-notifier-clone_stopped_0" [ style = bold] +"ceilometer-alarm-notifier_stop_0 rhos6-node3" -> "ceilometer-alarm-notifier_start_0 rhos6-node3" [ style = dashed] +"ceilometer-alarm-notifier_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-api-clone_running_0" -> "ceilometer-delay-clone_start_0" [ style = dashed] +"ceilometer-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-api-clone_start_0" -> "ceilometer-api-clone_running_0" [ style = dashed] +"ceilometer-api-clone_start_0" -> "ceilometer-api_start_0 rhos6-node1" [ style = dashed] +"ceilometer-api-clone_start_0" -> "ceilometer-api_start_0 rhos6-node2" [ style = dashed] +"ceilometer-api-clone_start_0" -> "ceilometer-api_start_0 rhos6-node3" [ style = dashed] +"ceilometer-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-api-clone_stop_0" -> "ceilometer-api-clone_stopped_0" [ style = bold] +"ceilometer-api-clone_stop_0" -> "ceilometer-api_stop_0 rhos6-node1" [ style = bold] +"ceilometer-api-clone_stop_0" -> "ceilometer-api_stop_0 rhos6-node2" [ style = bold] +"ceilometer-api-clone_stop_0" -> "ceilometer-api_stop_0 rhos6-node3" [ style = bold] +"ceilometer-api-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-api-clone_stopped_0" -> "ceilometer-api-clone_start_0" [ style = dashed] +"ceilometer-api-clone_stopped_0" -> "ceilometer-collector-clone_stop_0" [ style = bold] +"ceilometer-api-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-api_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_start_0 rhos6-node1" -> "ceilometer-api-clone_running_0" [ style = dashed] +"ceilometer-api_start_0 rhos6-node1" -> "ceilometer-api_monitor_60000 rhos6-node1" [ style = dashed] +"ceilometer-api_start_0 rhos6-node1" -> "ceilometer-delay_start_0 rhos6-node1" [ style = dashed] +"ceilometer-api_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_start_0 rhos6-node2" -> "ceilometer-api-clone_running_0" [ style = dashed] +"ceilometer-api_start_0 rhos6-node2" -> "ceilometer-api_monitor_60000 rhos6-node2" [ style = dashed] +"ceilometer-api_start_0 rhos6-node2" -> "ceilometer-delay_start_0 rhos6-node2" [ style = dashed] +"ceilometer-api_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_start_0 rhos6-node3" -> "ceilometer-api-clone_running_0" [ style = dashed] +"ceilometer-api_start_0 rhos6-node3" -> "ceilometer-api_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-api_start_0 rhos6-node3" -> "ceilometer-delay_start_0 rhos6-node3" [ style = dashed] +"ceilometer-api_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-api_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-api_stop_0 rhos6-node1" -> "ceilometer-api-clone_stopped_0" [ style = bold] +"ceilometer-api_stop_0 rhos6-node1" -> "ceilometer-api_start_0 rhos6-node1" [ style = dashed] +"ceilometer-api_stop_0 rhos6-node1" -> "ceilometer-collector_stop_0 rhos6-node1" [ style = bold] +"ceilometer-api_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-api_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-api_stop_0 rhos6-node2" -> "ceilometer-api-clone_stopped_0" [ style = bold] +"ceilometer-api_stop_0 rhos6-node2" -> "ceilometer-api_start_0 rhos6-node2" [ style = dashed] +"ceilometer-api_stop_0 rhos6-node2" -> "ceilometer-collector_stop_0 rhos6-node2" [ style = bold] +"ceilometer-api_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-api_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-api_stop_0 rhos6-node3" -> "ceilometer-api-clone_stopped_0" [ style = bold] +"ceilometer-api_stop_0 rhos6-node3" -> "ceilometer-api_start_0 rhos6-node3" [ style = dashed] +"ceilometer-api_stop_0 rhos6-node3" -> "ceilometer-collector_stop_0 rhos6-node3" [ style = bold] +"ceilometer-api_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-central_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-central_start_0 rhos6-node3" -> "ceilometer-central_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-central_start_0 rhos6-node3" -> "ceilometer-collector-clone_start_0" [ style = dashed] +"ceilometer-central_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-central_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-central_stop_0 rhos6-node3" -> "ceilometer-central_start_0 rhos6-node3" [ style = dashed] +"ceilometer-central_stop_0 rhos6-node3" -> "keystone-clone_stop_0" [ style = bold] +"ceilometer-central_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-collector-clone_running_0" -> "ceilometer-api-clone_start_0" [ style = dashed] +"ceilometer-collector-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-collector-clone_start_0" -> "ceilometer-collector-clone_running_0" [ style = dashed] +"ceilometer-collector-clone_start_0" -> "ceilometer-collector_start_0 rhos6-node1" [ style = dashed] +"ceilometer-collector-clone_start_0" -> "ceilometer-collector_start_0 rhos6-node2" [ style = dashed] +"ceilometer-collector-clone_start_0" -> "ceilometer-collector_start_0 rhos6-node3" [ style = dashed] +"ceilometer-collector-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-collector-clone_stop_0" -> "ceilometer-collector-clone_stopped_0" [ style = bold] +"ceilometer-collector-clone_stop_0" -> "ceilometer-collector_stop_0 rhos6-node1" [ style = bold] +"ceilometer-collector-clone_stop_0" -> "ceilometer-collector_stop_0 rhos6-node2" [ style = bold] +"ceilometer-collector-clone_stop_0" -> "ceilometer-collector_stop_0 rhos6-node3" [ style = bold] +"ceilometer-collector-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-collector-clone_stopped_0" -> "ceilometer-central_stop_0 rhos6-node3" [ style = bold] +"ceilometer-collector-clone_stopped_0" -> "ceilometer-collector-clone_start_0" [ style = dashed] +"ceilometer-collector-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-collector_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_start_0 rhos6-node1" -> "ceilometer-api_start_0 rhos6-node1" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node1" -> "ceilometer-collector-clone_running_0" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node1" -> "ceilometer-collector_monitor_60000 rhos6-node1" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_start_0 rhos6-node2" -> "ceilometer-api_start_0 rhos6-node2" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node2" -> "ceilometer-collector-clone_running_0" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node2" -> "ceilometer-collector_monitor_60000 rhos6-node2" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_start_0 rhos6-node3" -> "ceilometer-api_start_0 rhos6-node3" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node3" -> "ceilometer-collector-clone_running_0" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node3" -> "ceilometer-collector_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-collector_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-collector_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node1" -> "ceilometer-collector-clone_stopped_0" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node1" -> "ceilometer-collector_start_0 rhos6-node1" [ style = dashed] +"ceilometer-collector_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-collector_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node2" -> "ceilometer-collector-clone_stopped_0" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node2" -> "ceilometer-collector_start_0 rhos6-node2" [ style = dashed] +"ceilometer-collector_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-collector_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node3" -> "ceilometer-collector-clone_stopped_0" [ style = bold] +"ceilometer-collector_stop_0 rhos6-node3" -> "ceilometer-collector_start_0 rhos6-node3" [ style = dashed] +"ceilometer-collector_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-delay-clone_running_0" -> "ceilometer-alarm-evaluator-clone_start_0" [ style = dashed] +"ceilometer-delay-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-delay-clone_start_0" -> "ceilometer-delay-clone_running_0" [ style = dashed] +"ceilometer-delay-clone_start_0" -> "ceilometer-delay_start_0 rhos6-node1" [ style = dashed] +"ceilometer-delay-clone_start_0" -> "ceilometer-delay_start_0 rhos6-node2" [ style = dashed] +"ceilometer-delay-clone_start_0" -> "ceilometer-delay_start_0 rhos6-node3" [ style = dashed] +"ceilometer-delay-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-delay-clone_stop_0" -> "ceilometer-delay-clone_stopped_0" [ style = bold] +"ceilometer-delay-clone_stop_0" -> "ceilometer-delay_stop_0 rhos6-node1" [ style = bold] +"ceilometer-delay-clone_stop_0" -> "ceilometer-delay_stop_0 rhos6-node2" [ style = bold] +"ceilometer-delay-clone_stop_0" -> "ceilometer-delay_stop_0 rhos6-node3" [ style = bold] +"ceilometer-delay-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-delay-clone_stopped_0" -> "ceilometer-api-clone_stop_0" [ style = bold] +"ceilometer-delay-clone_stopped_0" -> "ceilometer-delay-clone_start_0" [ style = dashed] +"ceilometer-delay-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-delay_monitor_10000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_monitor_10000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_monitor_10000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_start_0 rhos6-node1" -> "ceilometer-alarm-evaluator_start_0 rhos6-node1" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node1" -> "ceilometer-delay-clone_running_0" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node1" -> "ceilometer-delay_monitor_10000 rhos6-node1" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_start_0 rhos6-node2" -> "ceilometer-alarm-evaluator_start_0 rhos6-node2" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node2" -> "ceilometer-delay-clone_running_0" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node2" -> "ceilometer-delay_monitor_10000 rhos6-node2" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_start_0 rhos6-node3" -> "ceilometer-alarm-evaluator_start_0 rhos6-node3" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node3" -> "ceilometer-delay-clone_running_0" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node3" -> "ceilometer-delay_monitor_10000 rhos6-node3" [ style = dashed] +"ceilometer-delay_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-delay_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node1" -> "ceilometer-api_stop_0 rhos6-node1" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node1" -> "ceilometer-delay-clone_stopped_0" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node1" -> "ceilometer-delay_start_0 rhos6-node1" [ style = dashed] +"ceilometer-delay_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-delay_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node2" -> "ceilometer-api_stop_0 rhos6-node2" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node2" -> "ceilometer-delay-clone_stopped_0" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node2" -> "ceilometer-delay_start_0 rhos6-node2" [ style = dashed] +"ceilometer-delay_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-delay_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node3" -> "ceilometer-api_stop_0 rhos6-node3" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node3" -> "ceilometer-delay-clone_stopped_0" [ style = bold] +"ceilometer-delay_stop_0 rhos6-node3" -> "ceilometer-delay_start_0 rhos6-node3" [ style = dashed] +"ceilometer-delay_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"ceilometer-notification-clone_running_0" -> "heat-api-clone_start_0" [ style = dashed] +"ceilometer-notification-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-notification-clone_start_0" -> "ceilometer-notification-clone_running_0" [ style = dashed] +"ceilometer-notification-clone_start_0" -> "ceilometer-notification_start_0 rhos6-node1" [ style = dashed] +"ceilometer-notification-clone_start_0" -> "ceilometer-notification_start_0 rhos6-node2" [ style = dashed] +"ceilometer-notification-clone_start_0" -> "ceilometer-notification_start_0 rhos6-node3" [ style = dashed] +"ceilometer-notification-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"ceilometer-notification-clone_stop_0" -> "ceilometer-notification-clone_stopped_0" [ style = bold] +"ceilometer-notification-clone_stop_0" -> "ceilometer-notification_stop_0 rhos6-node1" [ style = bold] +"ceilometer-notification-clone_stop_0" -> "ceilometer-notification_stop_0 rhos6-node2" [ style = bold] +"ceilometer-notification-clone_stop_0" -> "ceilometer-notification_stop_0 rhos6-node3" [ style = bold] +"ceilometer-notification-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-notification-clone_stopped_0" -> "ceilometer-alarm-notifier-clone_stop_0" [ style = bold] +"ceilometer-notification-clone_stopped_0" -> "ceilometer-notification-clone_start_0" [ style = dashed] +"ceilometer-notification-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"ceilometer-notification_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_start_0 rhos6-node1" -> "ceilometer-notification-clone_running_0" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node1" -> "ceilometer-notification_monitor_60000 rhos6-node1" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node1" -> "heat-api_start_0 rhos6-node1" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_start_0 rhos6-node2" -> "ceilometer-notification-clone_running_0" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node2" -> "ceilometer-notification_monitor_60000 rhos6-node2" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node2" -> "heat-api_start_0 rhos6-node2" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_start_0 rhos6-node3" -> "ceilometer-notification-clone_running_0" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node3" -> "ceilometer-notification_monitor_60000 rhos6-node3" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node3" -> "heat-api_start_0 rhos6-node3" [ style = dashed] +"ceilometer-notification_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"ceilometer-notification_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node1" -> "ceilometer-alarm-notifier_stop_0 rhos6-node1" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node1" -> "ceilometer-notification-clone_stopped_0" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node1" -> "ceilometer-notification_start_0 rhos6-node1" [ style = dashed] +"ceilometer-notification_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"ceilometer-notification_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node2" -> "ceilometer-alarm-notifier_stop_0 rhos6-node2" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node2" -> "ceilometer-notification-clone_stopped_0" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node2" -> "ceilometer-notification_start_0 rhos6-node2" [ style = dashed] +"ceilometer-notification_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"ceilometer-notification_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node3" -> "ceilometer-alarm-notifier_stop_0 rhos6-node3" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node3" -> "ceilometer-notification-clone_stopped_0" [ style = bold] +"ceilometer-notification_stop_0 rhos6-node3" -> "ceilometer-notification_start_0 rhos6-node3" [ style = dashed] +"ceilometer-notification_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"cinder-api_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-api_start_0 rhos6-node1" -> "cinder-api_monitor_60000 rhos6-node1" [ style = dashed] +"cinder-api_start_0 rhos6-node1" -> "cinder-scheduler_start_0 rhos6-node1" [ style = dashed] +"cinder-api_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-api_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"cinder-api_stop_0 rhos6-node1" -> "cinder-api_start_0 rhos6-node1" [ style = dashed] +"cinder-api_stop_0 rhos6-node1" -> "keystone-clone_stop_0" [ style = bold] +"cinder-api_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"cinder-scheduler_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-scheduler_start_0 rhos6-node1" -> "cinder-scheduler_monitor_60000 rhos6-node1" [ style = dashed] +"cinder-scheduler_start_0 rhos6-node1" -> "cinder-volume_start_0 rhos6-node1" [ style = dashed] +"cinder-scheduler_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-scheduler_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"cinder-scheduler_stop_0 rhos6-node1" -> "cinder-api_stop_0 rhos6-node1" [ style = bold] +"cinder-scheduler_stop_0 rhos6-node1" -> "cinder-scheduler_start_0 rhos6-node1" [ style = dashed] +"cinder-scheduler_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"cinder-volume_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-volume_start_0 rhos6-node1" -> "cinder-volume_monitor_60000 rhos6-node1" [ style = dashed] +"cinder-volume_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"cinder-volume_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"cinder-volume_stop_0 rhos6-node1" -> "cinder-scheduler_stop_0 rhos6-node1" [ style = bold] +"cinder-volume_stop_0 rhos6-node1" -> "cinder-volume_start_0 rhos6-node1" [ style = dashed] +"cinder-volume_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"glance-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"glance-api-clone_start_0" -> "glance-api-clone_running_0" [ style = dashed] +"glance-api-clone_start_0" -> "glance-api_start_0 rhos6-node1" [ style = dashed] +"glance-api-clone_start_0" -> "glance-api_start_0 rhos6-node2" [ style = dashed] +"glance-api-clone_start_0" -> "glance-api_start_0 rhos6-node3" [ style = dashed] +"glance-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"glance-api-clone_stop_0" -> "glance-api-clone_stopped_0" [ style = bold] +"glance-api-clone_stop_0" -> "glance-api_stop_0 rhos6-node1" [ style = bold] +"glance-api-clone_stop_0" -> "glance-api_stop_0 rhos6-node2" [ style = bold] +"glance-api-clone_stop_0" -> "glance-api_stop_0 rhos6-node3" [ style = bold] +"glance-api-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"glance-api-clone_stopped_0" -> "glance-api-clone_start_0" [ style = dashed] +"glance-api-clone_stopped_0" -> "glance-registry-clone_stop_0" [ style = bold] +"glance-api-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"glance-api_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"glance-api_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"glance-api_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"glance-api_start_0 rhos6-node1" -> "glance-api-clone_running_0" [ style = dashed] +"glance-api_start_0 rhos6-node1" -> "glance-api_monitor_60000 rhos6-node1" [ style = dashed] +"glance-api_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"glance-api_start_0 rhos6-node2" -> "glance-api-clone_running_0" [ style = dashed] +"glance-api_start_0 rhos6-node2" -> "glance-api_monitor_60000 rhos6-node2" [ style = dashed] +"glance-api_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"glance-api_start_0 rhos6-node3" -> "glance-api-clone_running_0" [ style = dashed] +"glance-api_start_0 rhos6-node3" -> "glance-api_monitor_60000 rhos6-node3" [ style = dashed] +"glance-api_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"glance-api_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"glance-api_stop_0 rhos6-node1" -> "glance-api-clone_stopped_0" [ style = bold] +"glance-api_stop_0 rhos6-node1" -> "glance-api_start_0 rhos6-node1" [ style = dashed] +"glance-api_stop_0 rhos6-node1" -> "glance-registry_stop_0 rhos6-node1" [ style = bold] +"glance-api_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"glance-api_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"glance-api_stop_0 rhos6-node2" -> "glance-api-clone_stopped_0" [ style = bold] +"glance-api_stop_0 rhos6-node2" -> "glance-api_start_0 rhos6-node2" [ style = dashed] +"glance-api_stop_0 rhos6-node2" -> "glance-registry_stop_0 rhos6-node2" [ style = bold] +"glance-api_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"glance-api_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"glance-api_stop_0 rhos6-node3" -> "glance-api-clone_stopped_0" [ style = bold] +"glance-api_stop_0 rhos6-node3" -> "glance-api_start_0 rhos6-node3" [ style = dashed] +"glance-api_stop_0 rhos6-node3" -> "glance-registry_stop_0 rhos6-node3" [ style = bold] +"glance-api_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"glance-registry-clone_running_0" -> "glance-api-clone_start_0" [ style = dashed] +"glance-registry-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"glance-registry-clone_start_0" -> "glance-registry-clone_running_0" [ style = dashed] +"glance-registry-clone_start_0" -> "glance-registry_start_0 rhos6-node1" [ style = dashed] +"glance-registry-clone_start_0" -> "glance-registry_start_0 rhos6-node2" [ style = dashed] +"glance-registry-clone_start_0" -> "glance-registry_start_0 rhos6-node3" [ style = dashed] +"glance-registry-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"glance-registry-clone_stop_0" -> "glance-registry-clone_stopped_0" [ style = bold] +"glance-registry-clone_stop_0" -> "glance-registry_stop_0 rhos6-node1" [ style = bold] +"glance-registry-clone_stop_0" -> "glance-registry_stop_0 rhos6-node2" [ style = bold] +"glance-registry-clone_stop_0" -> "glance-registry_stop_0 rhos6-node3" [ style = bold] +"glance-registry-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"glance-registry-clone_stopped_0" -> "glance-registry-clone_start_0" [ style = dashed] +"glance-registry-clone_stopped_0" -> "keystone-clone_stop_0" [ style = bold] +"glance-registry-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"glance-registry_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"glance-registry_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"glance-registry_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"glance-registry_start_0 rhos6-node1" -> "glance-registry-clone_running_0" [ style = dashed] +"glance-registry_start_0 rhos6-node1" -> "glance-registry_monitor_60000 rhos6-node1" [ style = dashed] +"glance-registry_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"glance-registry_start_0 rhos6-node2" -> "glance-registry-clone_running_0" [ style = dashed] +"glance-registry_start_0 rhos6-node2" -> "glance-registry_monitor_60000 rhos6-node2" [ style = dashed] +"glance-registry_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"glance-registry_start_0 rhos6-node3" -> "glance-registry-clone_running_0" [ style = dashed] +"glance-registry_start_0 rhos6-node3" -> "glance-registry_monitor_60000 rhos6-node3" [ style = dashed] +"glance-registry_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"glance-registry_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"glance-registry_stop_0 rhos6-node1" -> "glance-registry-clone_stopped_0" [ style = bold] +"glance-registry_stop_0 rhos6-node1" -> "glance-registry_start_0 rhos6-node1" [ style = dashed] +"glance-registry_stop_0 rhos6-node1" -> "keystone_stop_0 rhos6-node1" [ style = bold] +"glance-registry_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"glance-registry_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"glance-registry_stop_0 rhos6-node2" -> "glance-registry-clone_stopped_0" [ style = bold] +"glance-registry_stop_0 rhos6-node2" -> "glance-registry_start_0 rhos6-node2" [ style = dashed] +"glance-registry_stop_0 rhos6-node2" -> "keystone_stop_0 rhos6-node2" [ style = bold] +"glance-registry_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"glance-registry_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"glance-registry_stop_0 rhos6-node3" -> "glance-registry-clone_stopped_0" [ style = bold] +"glance-registry_stop_0 rhos6-node3" -> "glance-registry_start_0 rhos6-node3" [ style = dashed] +"glance-registry_stop_0 rhos6-node3" -> "keystone_stop_0 rhos6-node3" [ style = bold] +"glance-registry_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"heat-api-cfn-clone_running_0" -> "heat-api-cloudwatch-clone_start_0" [ style = dashed] +"heat-api-cfn-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-cfn-clone_start_0" -> "heat-api-cfn-clone_running_0" [ style = dashed] +"heat-api-cfn-clone_start_0" -> "heat-api-cfn_start_0 rhos6-node1" [ style = dashed] +"heat-api-cfn-clone_start_0" -> "heat-api-cfn_start_0 rhos6-node2" [ style = dashed] +"heat-api-cfn-clone_start_0" -> "heat-api-cfn_start_0 rhos6-node3" [ style = dashed] +"heat-api-cfn-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-cfn-clone_stop_0" -> "heat-api-cfn-clone_stopped_0" [ style = bold] +"heat-api-cfn-clone_stop_0" -> "heat-api-cfn_stop_0 rhos6-node1" [ style = bold] +"heat-api-cfn-clone_stop_0" -> "heat-api-cfn_stop_0 rhos6-node2" [ style = bold] +"heat-api-cfn-clone_stop_0" -> "heat-api-cfn_stop_0 rhos6-node3" [ style = bold] +"heat-api-cfn-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-cfn-clone_stopped_0" -> "heat-api-cfn-clone_start_0" [ style = dashed] +"heat-api-cfn-clone_stopped_0" -> "heat-api-clone_stop_0" [ style = bold] +"heat-api-cfn-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-cfn_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_start_0 rhos6-node1" -> "heat-api-cfn-clone_running_0" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node1" -> "heat-api-cfn_monitor_60000 rhos6-node1" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node1" -> "heat-api-cloudwatch_start_0 rhos6-node1" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_start_0 rhos6-node2" -> "heat-api-cfn-clone_running_0" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node2" -> "heat-api-cfn_monitor_60000 rhos6-node2" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node2" -> "heat-api-cloudwatch_start_0 rhos6-node2" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_start_0 rhos6-node3" -> "heat-api-cfn-clone_running_0" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node3" -> "heat-api-cfn_monitor_60000 rhos6-node3" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node3" -> "heat-api-cloudwatch_start_0 rhos6-node3" [ style = dashed] +"heat-api-cfn_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api-cfn_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node1" -> "heat-api-cfn-clone_stopped_0" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node1" -> "heat-api-cfn_start_0 rhos6-node1" [ style = dashed] +"heat-api-cfn_stop_0 rhos6-node1" -> "heat-api_stop_0 rhos6-node1" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"heat-api-cfn_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node2" -> "heat-api-cfn-clone_stopped_0" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node2" -> "heat-api-cfn_start_0 rhos6-node2" [ style = dashed] +"heat-api-cfn_stop_0 rhos6-node2" -> "heat-api_stop_0 rhos6-node2" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"heat-api-cfn_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node3" -> "heat-api-cfn-clone_stopped_0" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node3" -> "heat-api-cfn_start_0 rhos6-node3" [ style = dashed] +"heat-api-cfn_stop_0 rhos6-node3" -> "heat-api_stop_0 rhos6-node3" [ style = bold] +"heat-api-cfn_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"heat-api-clone_running_0" -> "heat-api-cfn-clone_start_0" [ style = dashed] +"heat-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-clone_start_0" -> "heat-api-clone_running_0" [ style = dashed] +"heat-api-clone_start_0" -> "heat-api_start_0 rhos6-node1" [ style = dashed] +"heat-api-clone_start_0" -> "heat-api_start_0 rhos6-node2" [ style = dashed] +"heat-api-clone_start_0" -> "heat-api_start_0 rhos6-node3" [ style = dashed] +"heat-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-clone_stop_0" -> "heat-api-clone_stopped_0" [ style = bold] +"heat-api-clone_stop_0" -> "heat-api_stop_0 rhos6-node1" [ style = bold] +"heat-api-clone_stop_0" -> "heat-api_stop_0 rhos6-node2" [ style = bold] +"heat-api-clone_stop_0" -> "heat-api_stop_0 rhos6-node3" [ style = bold] +"heat-api-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-clone_stopped_0" -> "ceilometer-notification-clone_stop_0" [ style = bold] +"heat-api-clone_stopped_0" -> "heat-api-clone_start_0" [ style = dashed] +"heat-api-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-cloudwatch-clone_running_0" -> "heat-engine_start_0 rhos6-node2" [ style = dashed] +"heat-api-cloudwatch-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-cloudwatch-clone_start_0" -> "heat-api-cloudwatch-clone_running_0" [ style = dashed] +"heat-api-cloudwatch-clone_start_0" -> "heat-api-cloudwatch_start_0 rhos6-node1" [ style = dashed] +"heat-api-cloudwatch-clone_start_0" -> "heat-api-cloudwatch_start_0 rhos6-node2" [ style = dashed] +"heat-api-cloudwatch-clone_start_0" -> "heat-api-cloudwatch_start_0 rhos6-node3" [ style = dashed] +"heat-api-cloudwatch-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"heat-api-cloudwatch-clone_stop_0" -> "heat-api-cloudwatch-clone_stopped_0" [ style = bold] +"heat-api-cloudwatch-clone_stop_0" -> "heat-api-cloudwatch_stop_0 rhos6-node1" [ style = bold] +"heat-api-cloudwatch-clone_stop_0" -> "heat-api-cloudwatch_stop_0 rhos6-node2" [ style = bold] +"heat-api-cloudwatch-clone_stop_0" -> "heat-api-cloudwatch_stop_0 rhos6-node3" [ style = bold] +"heat-api-cloudwatch-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-cloudwatch-clone_stopped_0" -> "heat-api-cfn-clone_stop_0" [ style = bold] +"heat-api-cloudwatch-clone_stopped_0" -> "heat-api-cloudwatch-clone_start_0" [ style = dashed] +"heat-api-cloudwatch-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"heat-api-cloudwatch_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_start_0 rhos6-node1" -> "heat-api-cloudwatch-clone_running_0" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node1" -> "heat-api-cloudwatch_monitor_60000 rhos6-node1" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_start_0 rhos6-node2" -> "heat-api-cloudwatch-clone_running_0" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node2" -> "heat-api-cloudwatch_monitor_60000 rhos6-node2" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_start_0 rhos6-node3" -> "heat-api-cloudwatch-clone_running_0" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node3" -> "heat-api-cloudwatch_monitor_60000 rhos6-node3" [ style = dashed] +"heat-api-cloudwatch_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api-cloudwatch_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node1" -> "heat-api-cfn_stop_0 rhos6-node1" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node1" -> "heat-api-cloudwatch-clone_stopped_0" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node1" -> "heat-api-cloudwatch_start_0 rhos6-node1" [ style = dashed] +"heat-api-cloudwatch_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"heat-api-cloudwatch_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node2" -> "heat-api-cfn_stop_0 rhos6-node2" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node2" -> "heat-api-cloudwatch-clone_stopped_0" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node2" -> "heat-api-cloudwatch_start_0 rhos6-node2" [ style = dashed] +"heat-api-cloudwatch_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"heat-api-cloudwatch_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node3" -> "heat-api-cfn_stop_0 rhos6-node3" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node3" -> "heat-api-cloudwatch-clone_stopped_0" [ style = bold] +"heat-api-cloudwatch_stop_0 rhos6-node3" -> "heat-api-cloudwatch_start_0 rhos6-node3" [ style = dashed] +"heat-api-cloudwatch_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"heat-api_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api_start_0 rhos6-node1" -> "heat-api-cfn_start_0 rhos6-node1" [ style = dashed] +"heat-api_start_0 rhos6-node1" -> "heat-api-clone_running_0" [ style = dashed] +"heat-api_start_0 rhos6-node1" -> "heat-api_monitor_60000 rhos6-node1" [ style = dashed] +"heat-api_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"heat-api_start_0 rhos6-node2" -> "heat-api-cfn_start_0 rhos6-node2" [ style = dashed] +"heat-api_start_0 rhos6-node2" -> "heat-api-clone_running_0" [ style = dashed] +"heat-api_start_0 rhos6-node2" -> "heat-api_monitor_60000 rhos6-node2" [ style = dashed] +"heat-api_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-api_start_0 rhos6-node3" -> "heat-api-cfn_start_0 rhos6-node3" [ style = dashed] +"heat-api_start_0 rhos6-node3" -> "heat-api-clone_running_0" [ style = dashed] +"heat-api_start_0 rhos6-node3" -> "heat-api_monitor_60000 rhos6-node3" [ style = dashed] +"heat-api_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"heat-api_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"heat-api_stop_0 rhos6-node1" -> "ceilometer-notification_stop_0 rhos6-node1" [ style = bold] +"heat-api_stop_0 rhos6-node1" -> "heat-api-clone_stopped_0" [ style = bold] +"heat-api_stop_0 rhos6-node1" -> "heat-api_start_0 rhos6-node1" [ style = dashed] +"heat-api_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"heat-api_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"heat-api_stop_0 rhos6-node2" -> "ceilometer-notification_stop_0 rhos6-node2" [ style = bold] +"heat-api_stop_0 rhos6-node2" -> "heat-api-clone_stopped_0" [ style = bold] +"heat-api_stop_0 rhos6-node2" -> "heat-api_start_0 rhos6-node2" [ style = dashed] +"heat-api_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"heat-api_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"heat-api_stop_0 rhos6-node3" -> "ceilometer-notification_stop_0 rhos6-node3" [ style = bold] +"heat-api_stop_0 rhos6-node3" -> "heat-api-clone_stopped_0" [ style = bold] +"heat-api_stop_0 rhos6-node3" -> "heat-api_start_0 rhos6-node3" [ style = dashed] +"heat-api_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"heat-engine_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-engine_start_0 rhos6-node2" -> "heat-engine_monitor_60000 rhos6-node2" [ style = dashed] +"heat-engine_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"heat-engine_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"heat-engine_stop_0 rhos6-node2" -> "heat-api-cloudwatch-clone_stop_0" [ style = bold] +"heat-engine_stop_0 rhos6-node2" -> "heat-engine_start_0 rhos6-node2" [ style = dashed] +"heat-engine_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"keystone-clone_stop_0" -> "keystone-clone_stopped_0" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhos6-node1" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhos6-node2" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhos6-node3" [ style = bold] +"keystone-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"keystone-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"keystone_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhos6-node1" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"keystone_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhos6-node2" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"keystone_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhos6-node3" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhos6-node3" [ style=bold color="green" 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_start_0 rhos6-node1" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" -> "neutron-dhcp-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-dhcp-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-dhcp-agent-clone_stop_0" -> "neutron-dhcp-agent-clone_stopped_0" [ style = bold] +"neutron-dhcp-agent-clone_stop_0" -> "neutron-dhcp-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-dhcp-agent-clone_stop_0" -> "neutron-dhcp-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-dhcp-agent-clone_stop_0" -> "neutron-dhcp-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-dhcp-agent-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-dhcp-agent-clone_stopped_0" -> "neutron-dhcp-agent-clone_start_0" [ style = dashed] +"neutron-dhcp-agent-clone_stopped_0" -> "neutron-openvswitch-agent-clone_stop_0" [ style = bold] +"neutron-dhcp-agent-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-dhcp-agent_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_start_0 rhos6-node1" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node1" -> "neutron-dhcp-agent_monitor_60000 rhos6-node1" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_start_0 rhos6-node2" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node2" -> "neutron-dhcp-agent_monitor_60000 rhos6-node2" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_start_0 rhos6-node3" -> "neutron-dhcp-agent-clone_running_0" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node3" -> "neutron-dhcp-agent_monitor_60000 rhos6-node3" [ style = dashed] +"neutron-dhcp-agent_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-dhcp-agent_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node1" -> "neutron-dhcp-agent-clone_stopped_0" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node1" -> "neutron-dhcp-agent_start_0 rhos6-node1" [ style = dashed] +"neutron-dhcp-agent_stop_0 rhos6-node1" -> "neutron-openvswitch-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-dhcp-agent_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node2" -> "neutron-dhcp-agent-clone_stopped_0" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node2" -> "neutron-dhcp-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-dhcp-agent_stop_0 rhos6-node2" -> "neutron-openvswitch-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-dhcp-agent_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node3" -> "neutron-dhcp-agent-clone_stopped_0" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node3" -> "neutron-dhcp-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-dhcp-agent_stop_0 rhos6-node3" -> "neutron-openvswitch-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-dhcp-agent_stop_0 rhos6-node3" [ style=bold color="green" 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_start_0 rhos6-node1" [ style = dashed] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-l3-agent-clone_start_0" -> "neutron-l3-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-l3-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-l3-agent-clone_stop_0" -> "neutron-l3-agent-clone_stopped_0" [ style = bold] +"neutron-l3-agent-clone_stop_0" -> "neutron-l3-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-l3-agent-clone_stop_0" -> "neutron-l3-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-l3-agent-clone_stop_0" -> "neutron-l3-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-l3-agent-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-l3-agent-clone_stopped_0" -> "neutron-dhcp-agent-clone_stop_0" [ style = bold] +"neutron-l3-agent-clone_stopped_0" -> "neutron-l3-agent-clone_start_0" [ style = dashed] +"neutron-l3-agent-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-l3-agent_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_start_0 rhos6-node1" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node1" -> "neutron-l3-agent_monitor_60000 rhos6-node1" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_start_0 rhos6-node2" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node2" -> "neutron-l3-agent_monitor_60000 rhos6-node2" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_start_0 rhos6-node3" -> "neutron-l3-agent-clone_running_0" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node3" -> "neutron-l3-agent_monitor_60000 rhos6-node3" [ style = dashed] +"neutron-l3-agent_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-l3-agent_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node1" -> "neutron-dhcp-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node1" -> "neutron-l3-agent-clone_stopped_0" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node1" -> "neutron-l3-agent_start_0 rhos6-node1" [ style = dashed] +"neutron-l3-agent_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-l3-agent_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node2" -> "neutron-dhcp-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node2" -> "neutron-l3-agent-clone_stopped_0" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node2" -> "neutron-l3-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-l3-agent_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-l3-agent_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node3" -> "neutron-dhcp-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node3" -> "neutron-l3-agent-clone_stopped_0" [ style = bold] +"neutron-l3-agent_stop_0 rhos6-node3" -> "neutron-l3-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-l3-agent_stop_0 rhos6-node3" [ style=bold color="green" 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_start_0 rhos6-node1" [ style = dashed] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-metadata-agent-clone_start_0" -> "neutron-metadata-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-metadata-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-metadata-agent-clone_stop_0" -> "neutron-metadata-agent-clone_stopped_0" [ style = bold] +"neutron-metadata-agent-clone_stop_0" -> "neutron-metadata-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-metadata-agent-clone_stop_0" -> "neutron-metadata-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-metadata-agent-clone_stop_0" -> "neutron-metadata-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-metadata-agent-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-metadata-agent-clone_stopped_0" -> "neutron-l3-agent-clone_stop_0" [ style = bold] +"neutron-metadata-agent-clone_stopped_0" -> "neutron-metadata-agent-clone_start_0" [ style = dashed] +"neutron-metadata-agent-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-metadata-agent_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_start_0 rhos6-node1" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node1" -> "neutron-metadata-agent_monitor_60000 rhos6-node1" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_start_0 rhos6-node2" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node2" -> "neutron-metadata-agent_monitor_60000 rhos6-node2" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_start_0 rhos6-node3" -> "neutron-metadata-agent-clone_running_0" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node3" -> "neutron-metadata-agent_monitor_60000 rhos6-node3" [ style = dashed] +"neutron-metadata-agent_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-metadata-agent_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node1" -> "neutron-l3-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node1" -> "neutron-metadata-agent-clone_stopped_0" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node1" -> "neutron-metadata-agent_start_0 rhos6-node1" [ style = dashed] +"neutron-metadata-agent_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-metadata-agent_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node2" -> "neutron-l3-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node2" -> "neutron-metadata-agent-clone_stopped_0" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node2" -> "neutron-metadata-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-metadata-agent_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-metadata-agent_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node3" -> "neutron-l3-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node3" -> "neutron-metadata-agent-clone_stopped_0" [ style = bold] +"neutron-metadata-agent_stop_0 rhos6-node3" -> "neutron-metadata-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-metadata-agent_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"neutron-netns-cleanup-clone_running_0" -> "neutron-openvswitch-agent-clone_start_0" [ style = dashed] +"neutron-netns-cleanup-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-netns-cleanup-clone_start_0" -> "neutron-netns-cleanup-clone_running_0" [ style = dashed] +"neutron-netns-cleanup-clone_start_0" -> "neutron-netns-cleanup_start_0 rhos6-node1" [ style = dashed] +"neutron-netns-cleanup-clone_start_0" -> "neutron-netns-cleanup_start_0 rhos6-node2" [ style = dashed] +"neutron-netns-cleanup-clone_start_0" -> "neutron-netns-cleanup_start_0 rhos6-node3" [ style = dashed] +"neutron-netns-cleanup-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-netns-cleanup-clone_stop_0" -> "neutron-netns-cleanup-clone_stopped_0" [ style = bold] +"neutron-netns-cleanup-clone_stop_0" -> "neutron-netns-cleanup_stop_0 rhos6-node1" [ style = bold] +"neutron-netns-cleanup-clone_stop_0" -> "neutron-netns-cleanup_stop_0 rhos6-node2" [ style = bold] +"neutron-netns-cleanup-clone_stop_0" -> "neutron-netns-cleanup_stop_0 rhos6-node3" [ style = bold] +"neutron-netns-cleanup-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-netns-cleanup-clone_stopped_0" -> "neutron-netns-cleanup-clone_start_0" [ style = dashed] +"neutron-netns-cleanup-clone_stopped_0" -> "neutron-ovs-cleanup-clone_stop_0" [ style = bold] +"neutron-netns-cleanup-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-netns-cleanup_monitor_10000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_monitor_10000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_monitor_10000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_start_0 rhos6-node1" -> "neutron-netns-cleanup-clone_running_0" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node1" -> "neutron-netns-cleanup_monitor_10000 rhos6-node1" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_start_0 rhos6-node2" -> "neutron-netns-cleanup-clone_running_0" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node2" -> "neutron-netns-cleanup_monitor_10000 rhos6-node2" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_start_0 rhos6-node3" -> "neutron-netns-cleanup-clone_running_0" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node3" -> "neutron-netns-cleanup_monitor_10000 rhos6-node3" [ style = dashed] +"neutron-netns-cleanup_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-netns-cleanup_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node1" -> "neutron-netns-cleanup-clone_stopped_0" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node1" -> "neutron-netns-cleanup_start_0 rhos6-node1" [ style = dashed] +"neutron-netns-cleanup_stop_0 rhos6-node1" -> "neutron-ovs-cleanup_stop_0 rhos6-node1" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-netns-cleanup_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node2" -> "neutron-netns-cleanup-clone_stopped_0" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node2" -> "neutron-netns-cleanup_start_0 rhos6-node2" [ style = dashed] +"neutron-netns-cleanup_stop_0 rhos6-node2" -> "neutron-ovs-cleanup_stop_0 rhos6-node2" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-netns-cleanup_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node3" -> "neutron-netns-cleanup-clone_stopped_0" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node3" -> "neutron-netns-cleanup_start_0 rhos6-node3" [ style = dashed] +"neutron-netns-cleanup_stop_0 rhos6-node3" -> "neutron-ovs-cleanup_stop_0 rhos6-node3" [ style = bold] +"neutron-netns-cleanup_stop_0 rhos6-node3" [ style=bold color="green" 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_start_0 rhos6-node1" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" -> "neutron-openvswitch-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-openvswitch-agent-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-openvswitch-agent-clone_stop_0" -> "neutron-openvswitch-agent-clone_stopped_0" [ style = bold] +"neutron-openvswitch-agent-clone_stop_0" -> "neutron-openvswitch-agent_stop_0 rhos6-node1" [ style = bold] +"neutron-openvswitch-agent-clone_stop_0" -> "neutron-openvswitch-agent_stop_0 rhos6-node2" [ style = bold] +"neutron-openvswitch-agent-clone_stop_0" -> "neutron-openvswitch-agent_stop_0 rhos6-node3" [ style = bold] +"neutron-openvswitch-agent-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-openvswitch-agent-clone_stopped_0" -> "neutron-netns-cleanup-clone_stop_0" [ style = bold] +"neutron-openvswitch-agent-clone_stopped_0" -> "neutron-openvswitch-agent-clone_start_0" [ style = dashed] +"neutron-openvswitch-agent-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-openvswitch-agent_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_start_0 rhos6-node1" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node1" -> "neutron-openvswitch-agent_monitor_60000 rhos6-node1" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_start_0 rhos6-node2" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node2" -> "neutron-openvswitch-agent_monitor_60000 rhos6-node2" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_start_0 rhos6-node3" -> "neutron-openvswitch-agent-clone_running_0" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node3" -> "neutron-openvswitch-agent_monitor_60000 rhos6-node3" [ style = dashed] +"neutron-openvswitch-agent_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-openvswitch-agent_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node1" -> "neutron-netns-cleanup_stop_0 rhos6-node1" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node1" -> "neutron-openvswitch-agent-clone_stopped_0" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node1" -> "neutron-openvswitch-agent_start_0 rhos6-node1" [ style = dashed] +"neutron-openvswitch-agent_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-openvswitch-agent_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node2" -> "neutron-netns-cleanup_stop_0 rhos6-node2" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node2" -> "neutron-openvswitch-agent-clone_stopped_0" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node2" -> "neutron-openvswitch-agent_start_0 rhos6-node2" [ style = dashed] +"neutron-openvswitch-agent_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-openvswitch-agent_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node3" -> "neutron-netns-cleanup_stop_0 rhos6-node3" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node3" -> "neutron-openvswitch-agent-clone_stopped_0" [ style = bold] +"neutron-openvswitch-agent_stop_0 rhos6-node3" -> "neutron-openvswitch-agent_start_0 rhos6-node3" [ style = dashed] +"neutron-openvswitch-agent_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"neutron-ovs-cleanup-clone_running_0" -> "neutron-netns-cleanup-clone_start_0" [ style = dashed] +"neutron-ovs-cleanup-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-ovs-cleanup-clone_start_0" -> "neutron-ovs-cleanup-clone_running_0" [ style = dashed] +"neutron-ovs-cleanup-clone_start_0" -> "neutron-ovs-cleanup_start_0 rhos6-node1" [ style = dashed] +"neutron-ovs-cleanup-clone_start_0" -> "neutron-ovs-cleanup_start_0 rhos6-node2" [ style = dashed] +"neutron-ovs-cleanup-clone_start_0" -> "neutron-ovs-cleanup_start_0 rhos6-node3" [ style = dashed] +"neutron-ovs-cleanup-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-ovs-cleanup-clone_stop_0" -> "neutron-ovs-cleanup-clone_stopped_0" [ style = bold] +"neutron-ovs-cleanup-clone_stop_0" -> "neutron-ovs-cleanup_stop_0 rhos6-node1" [ style = bold] +"neutron-ovs-cleanup-clone_stop_0" -> "neutron-ovs-cleanup_stop_0 rhos6-node2" [ style = bold] +"neutron-ovs-cleanup-clone_stop_0" -> "neutron-ovs-cleanup_stop_0 rhos6-node3" [ style = bold] +"neutron-ovs-cleanup-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-ovs-cleanup-clone_stopped_0" -> "neutron-ovs-cleanup-clone_start_0" [ style = dashed] +"neutron-ovs-cleanup-clone_stopped_0" -> "neutron-scale-clone_stop_0" [ style = bold] +"neutron-ovs-cleanup-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-ovs-cleanup_monitor_10000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_monitor_10000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_monitor_10000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_start_0 rhos6-node1" -> "neutron-ovs-cleanup-clone_running_0" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node1" -> "neutron-ovs-cleanup_monitor_10000 rhos6-node1" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_start_0 rhos6-node2" -> "neutron-ovs-cleanup-clone_running_0" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node2" -> "neutron-ovs-cleanup_monitor_10000 rhos6-node2" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_start_0 rhos6-node3" -> "neutron-ovs-cleanup-clone_running_0" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node3" -> "neutron-ovs-cleanup_monitor_10000 rhos6-node3" [ style = dashed] +"neutron-ovs-cleanup_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-ovs-cleanup_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node1" -> "neutron-ovs-cleanup-clone_stopped_0" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node1" -> "neutron-ovs-cleanup_start_0 rhos6-node1" [ style = dashed] +"neutron-ovs-cleanup_stop_0 rhos6-node1" -> "neutron-scale:2_stop_0 rhos6-node1" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-ovs-cleanup_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node2" -> "neutron-ovs-cleanup-clone_stopped_0" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node2" -> "neutron-ovs-cleanup_start_0 rhos6-node2" [ style = dashed] +"neutron-ovs-cleanup_stop_0 rhos6-node2" -> "neutron-scale:1_stop_0 rhos6-node2" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-ovs-cleanup_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node3" -> "neutron-ovs-cleanup-clone_stopped_0" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node3" -> "neutron-ovs-cleanup_start_0 rhos6-node3" [ style = dashed] +"neutron-ovs-cleanup_stop_0 rhos6-node3" -> "neutron-scale:0_stop_0 rhos6-node3" [ style = bold] +"neutron-ovs-cleanup_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"neutron-scale-clone_running_0" -> "neutron-ovs-cleanup-clone_start_0" [ style = dashed] +"neutron-scale-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-scale-clone_start_0" -> "neutron-scale-clone_running_0" [ style = dashed] +"neutron-scale-clone_start_0" -> "neutron-scale:0_start_0 rhos6-node3" [ style = dashed] +"neutron-scale-clone_start_0" -> "neutron-scale:1_start_0 rhos6-node2" [ style = dashed] +"neutron-scale-clone_start_0" -> "neutron-scale:2_start_0 rhos6-node1" [ style = dashed] +"neutron-scale-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-scale-clone_stop_0" -> "neutron-scale-clone_stopped_0" [ style = bold] +"neutron-scale-clone_stop_0" -> "neutron-scale:0_stop_0 rhos6-node3" [ style = bold] +"neutron-scale-clone_stop_0" -> "neutron-scale:1_stop_0 rhos6-node2" [ style = bold] +"neutron-scale-clone_stop_0" -> "neutron-scale:2_stop_0 rhos6-node1" [ style = bold] +"neutron-scale-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-scale-clone_stopped_0" -> "neutron-scale-clone_start_0" [ style = dashed] +"neutron-scale-clone_stopped_0" -> "neutron-server-clone_stop_0" [ style = bold] +"neutron-scale-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-scale:0_monitor_10000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:0_start_0 rhos6-node3" -> "neutron-scale-clone_running_0" [ style = dashed] +"neutron-scale:0_start_0 rhos6-node3" -> "neutron-scale:0_monitor_10000 rhos6-node3" [ style = dashed] +"neutron-scale:0_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:0_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-scale:0_stop_0 rhos6-node3" -> "neutron-scale-clone_stopped_0" [ style = bold] +"neutron-scale:0_stop_0 rhos6-node3" -> "neutron-scale:0_start_0 rhos6-node3" [ style = dashed] +"neutron-scale:0_stop_0 rhos6-node3" -> "neutron-server_stop_0 rhos6-node3" [ style = bold] +"neutron-scale:0_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"neutron-scale:1_monitor_10000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:1_start_0 rhos6-node2" -> "neutron-scale-clone_running_0" [ style = dashed] +"neutron-scale:1_start_0 rhos6-node2" -> "neutron-scale:1_monitor_10000 rhos6-node2" [ style = dashed] +"neutron-scale:1_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:1_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-scale:1_stop_0 rhos6-node2" -> "neutron-scale-clone_stopped_0" [ style = bold] +"neutron-scale:1_stop_0 rhos6-node2" -> "neutron-scale:1_start_0 rhos6-node2" [ style = dashed] +"neutron-scale:1_stop_0 rhos6-node2" -> "neutron-server_stop_0 rhos6-node2" [ style = bold] +"neutron-scale:1_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-scale:2_monitor_10000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:2_start_0 rhos6-node1" -> "neutron-scale-clone_running_0" [ style = dashed] +"neutron-scale:2_start_0 rhos6-node1" -> "neutron-scale:2_monitor_10000 rhos6-node1" [ style = dashed] +"neutron-scale:2_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-scale:2_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-scale:2_stop_0 rhos6-node1" -> "neutron-scale-clone_stopped_0" [ style = bold] +"neutron-scale:2_stop_0 rhos6-node1" -> "neutron-scale:2_start_0 rhos6-node1" [ style = dashed] +"neutron-scale:2_stop_0 rhos6-node1" -> "neutron-server_stop_0 rhos6-node1" [ style = bold] +"neutron-scale:2_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-server-clone_running_0" -> "neutron-scale-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_start_0 rhos6-node1" [ style = dashed] +"neutron-server-clone_start_0" -> "neutron-server_start_0 rhos6-node2" [ style = dashed] +"neutron-server-clone_start_0" -> "neutron-server_start_0 rhos6-node3" [ style = dashed] +"neutron-server-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"neutron-server-clone_stop_0" -> "neutron-server-clone_stopped_0" [ style = bold] +"neutron-server-clone_stop_0" -> "neutron-server_stop_0 rhos6-node1" [ style = bold] +"neutron-server-clone_stop_0" -> "neutron-server_stop_0 rhos6-node2" [ style = bold] +"neutron-server-clone_stop_0" -> "neutron-server_stop_0 rhos6-node3" [ style = bold] +"neutron-server-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"neutron-server-clone_stopped_0" -> "keystone-clone_stop_0" [ style = bold] +"neutron-server-clone_stopped_0" -> "neutron-server-clone_start_0" [ style = dashed] +"neutron-server-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"neutron-server_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-server_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-server_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-server_start_0 rhos6-node1" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server_start_0 rhos6-node1" -> "neutron-server_monitor_60000 rhos6-node1" [ style = dashed] +"neutron-server_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"neutron-server_start_0 rhos6-node2" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server_start_0 rhos6-node2" -> "neutron-server_monitor_60000 rhos6-node2" [ style = dashed] +"neutron-server_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"neutron-server_start_0 rhos6-node3" -> "neutron-server-clone_running_0" [ style = dashed] +"neutron-server_start_0 rhos6-node3" -> "neutron-server_monitor_60000 rhos6-node3" [ style = dashed] +"neutron-server_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"neutron-server_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"neutron-server_stop_0 rhos6-node1" -> "keystone_stop_0 rhos6-node1" [ style = bold] +"neutron-server_stop_0 rhos6-node1" -> "neutron-server-clone_stopped_0" [ style = bold] +"neutron-server_stop_0 rhos6-node1" -> "neutron-server_start_0 rhos6-node1" [ style = dashed] +"neutron-server_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"neutron-server_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"neutron-server_stop_0 rhos6-node2" -> "keystone_stop_0 rhos6-node2" [ style = bold] +"neutron-server_stop_0 rhos6-node2" -> "neutron-server-clone_stopped_0" [ style = bold] +"neutron-server_stop_0 rhos6-node2" -> "neutron-server_start_0 rhos6-node2" [ style = dashed] +"neutron-server_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"neutron-server_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"neutron-server_stop_0 rhos6-node3" -> "keystone_stop_0 rhos6-node3" [ style = bold] +"neutron-server_stop_0 rhos6-node3" -> "neutron-server-clone_stopped_0" [ style = bold] +"neutron-server_stop_0 rhos6-node3" -> "neutron-server_start_0 rhos6-node3" [ style = dashed] +"neutron-server_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"nova-api-clone_running_0" -> "nova-scheduler-clone_start_0" [ style = dashed] +"nova-api-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"nova-api-clone_start_0" -> "nova-api-clone_running_0" [ style = dashed] +"nova-api-clone_start_0" -> "nova-api_start_0 rhos6-node1" [ style = dashed] +"nova-api-clone_start_0" -> "nova-api_start_0 rhos6-node2" [ style = dashed] +"nova-api-clone_start_0" -> "nova-api_start_0 rhos6-node3" [ style = dashed] +"nova-api-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"nova-api-clone_stop_0" -> "nova-api-clone_stopped_0" [ style = bold] +"nova-api-clone_stop_0" -> "nova-api_stop_0 rhos6-node1" [ style = bold] +"nova-api-clone_stop_0" -> "nova-api_stop_0 rhos6-node2" [ style = bold] +"nova-api-clone_stop_0" -> "nova-api_stop_0 rhos6-node3" [ style = bold] +"nova-api-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"nova-api-clone_stopped_0" -> "nova-api-clone_start_0" [ style = dashed] +"nova-api-clone_stopped_0" -> "nova-novncproxy-clone_stop_0" [ style = bold] +"nova-api-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"nova-api_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-api_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-api_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-api_start_0 rhos6-node1" -> "nova-api-clone_running_0" [ style = dashed] +"nova-api_start_0 rhos6-node1" -> "nova-api_monitor_60000 rhos6-node1" [ style = dashed] +"nova-api_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-api_start_0 rhos6-node2" -> "nova-api-clone_running_0" [ style = dashed] +"nova-api_start_0 rhos6-node2" -> "nova-api_monitor_60000 rhos6-node2" [ style = dashed] +"nova-api_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-api_start_0 rhos6-node3" -> "nova-api-clone_running_0" [ style = dashed] +"nova-api_start_0 rhos6-node3" -> "nova-api_monitor_60000 rhos6-node3" [ style = dashed] +"nova-api_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-api_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"nova-api_stop_0 rhos6-node1" -> "nova-api-clone_stopped_0" [ style = bold] +"nova-api_stop_0 rhos6-node1" -> "nova-api_start_0 rhos6-node1" [ style = dashed] +"nova-api_stop_0 rhos6-node1" -> "nova-novncproxy_stop_0 rhos6-node1" [ style = bold] +"nova-api_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"nova-api_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"nova-api_stop_0 rhos6-node2" -> "nova-api-clone_stopped_0" [ style = bold] +"nova-api_stop_0 rhos6-node2" -> "nova-api_start_0 rhos6-node2" [ style = dashed] +"nova-api_stop_0 rhos6-node2" -> "nova-novncproxy_stop_0 rhos6-node2" [ style = bold] +"nova-api_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"nova-api_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"nova-api_stop_0 rhos6-node3" -> "nova-api-clone_stopped_0" [ style = bold] +"nova-api_stop_0 rhos6-node3" -> "nova-api_start_0 rhos6-node3" [ style = dashed] +"nova-api_stop_0 rhos6-node3" -> "nova-novncproxy_stop_0 rhos6-node3" [ style = bold] +"nova-api_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"nova-conductor-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"nova-conductor-clone_start_0" -> "nova-conductor-clone_running_0" [ style = dashed] +"nova-conductor-clone_start_0" -> "nova-conductor_start_0 rhos6-node1" [ style = dashed] +"nova-conductor-clone_start_0" -> "nova-conductor_start_0 rhos6-node2" [ style = dashed] +"nova-conductor-clone_start_0" -> "nova-conductor_start_0 rhos6-node3" [ style = dashed] +"nova-conductor-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"nova-conductor-clone_stop_0" -> "nova-conductor-clone_stopped_0" [ style = bold] +"nova-conductor-clone_stop_0" -> "nova-conductor_stop_0 rhos6-node1" [ style = bold] +"nova-conductor-clone_stop_0" -> "nova-conductor_stop_0 rhos6-node2" [ style = bold] +"nova-conductor-clone_stop_0" -> "nova-conductor_stop_0 rhos6-node3" [ style = bold] +"nova-conductor-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"nova-conductor-clone_stopped_0" -> "nova-conductor-clone_start_0" [ style = dashed] +"nova-conductor-clone_stopped_0" -> "nova-scheduler-clone_stop_0" [ style = bold] +"nova-conductor-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"nova-conductor_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_start_0 rhos6-node1" -> "nova-conductor-clone_running_0" [ style = dashed] +"nova-conductor_start_0 rhos6-node1" -> "nova-conductor_monitor_60000 rhos6-node1" [ style = dashed] +"nova-conductor_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_start_0 rhos6-node2" -> "nova-conductor-clone_running_0" [ style = dashed] +"nova-conductor_start_0 rhos6-node2" -> "nova-conductor_monitor_60000 rhos6-node2" [ style = dashed] +"nova-conductor_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_start_0 rhos6-node3" -> "nova-conductor-clone_running_0" [ style = dashed] +"nova-conductor_start_0 rhos6-node3" -> "nova-conductor_monitor_60000 rhos6-node3" [ style = dashed] +"nova-conductor_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-conductor_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"nova-conductor_stop_0 rhos6-node1" -> "nova-conductor-clone_stopped_0" [ style = bold] +"nova-conductor_stop_0 rhos6-node1" -> "nova-conductor_start_0 rhos6-node1" [ style = dashed] +"nova-conductor_stop_0 rhos6-node1" -> "nova-scheduler_stop_0 rhos6-node1" [ style = bold] +"nova-conductor_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"nova-conductor_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"nova-conductor_stop_0 rhos6-node2" -> "nova-conductor-clone_stopped_0" [ style = bold] +"nova-conductor_stop_0 rhos6-node2" -> "nova-conductor_start_0 rhos6-node2" [ style = dashed] +"nova-conductor_stop_0 rhos6-node2" -> "nova-scheduler_stop_0 rhos6-node2" [ style = bold] +"nova-conductor_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"nova-conductor_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"nova-conductor_stop_0 rhos6-node3" -> "nova-conductor-clone_stopped_0" [ style = bold] +"nova-conductor_stop_0 rhos6-node3" -> "nova-conductor_start_0 rhos6-node3" [ style = dashed] +"nova-conductor_stop_0 rhos6-node3" -> "nova-scheduler_stop_0 rhos6-node3" [ style = bold] +"nova-conductor_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"nova-consoleauth-clone_running_0" -> "nova-novncproxy-clone_start_0" [ style = dashed] +"nova-consoleauth-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"nova-consoleauth-clone_start_0" -> "nova-consoleauth-clone_running_0" [ style = dashed] +"nova-consoleauth-clone_start_0" -> "nova-consoleauth_start_0 rhos6-node1" [ style = dashed] +"nova-consoleauth-clone_start_0" -> "nova-consoleauth_start_0 rhos6-node2" [ style = dashed] +"nova-consoleauth-clone_start_0" -> "nova-consoleauth_start_0 rhos6-node3" [ style = dashed] +"nova-consoleauth-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"nova-consoleauth-clone_stop_0" -> "nova-consoleauth-clone_stopped_0" [ style = bold] +"nova-consoleauth-clone_stop_0" -> "nova-consoleauth_stop_0 rhos6-node1" [ style = bold] +"nova-consoleauth-clone_stop_0" -> "nova-consoleauth_stop_0 rhos6-node2" [ style = bold] +"nova-consoleauth-clone_stop_0" -> "nova-consoleauth_stop_0 rhos6-node3" [ style = bold] +"nova-consoleauth-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"nova-consoleauth-clone_stopped_0" -> "keystone-clone_stop_0" [ style = bold] +"nova-consoleauth-clone_stopped_0" -> "nova-consoleauth-clone_start_0" [ style = dashed] +"nova-consoleauth-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"nova-consoleauth_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_start_0 rhos6-node1" -> "nova-consoleauth-clone_running_0" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node1" -> "nova-consoleauth_monitor_60000 rhos6-node1" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_start_0 rhos6-node2" -> "nova-consoleauth-clone_running_0" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node2" -> "nova-consoleauth_monitor_60000 rhos6-node2" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_start_0 rhos6-node3" -> "nova-consoleauth-clone_running_0" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node3" -> "nova-consoleauth_monitor_60000 rhos6-node3" [ style = dashed] +"nova-consoleauth_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-consoleauth_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node1" -> "keystone_stop_0 rhos6-node1" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node1" -> "nova-consoleauth-clone_stopped_0" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node1" -> "nova-consoleauth_start_0 rhos6-node1" [ style = dashed] +"nova-consoleauth_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"nova-consoleauth_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node2" -> "keystone_stop_0 rhos6-node2" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node2" -> "nova-consoleauth-clone_stopped_0" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node2" -> "nova-consoleauth_start_0 rhos6-node2" [ style = dashed] +"nova-consoleauth_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"nova-consoleauth_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node3" -> "keystone_stop_0 rhos6-node3" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node3" -> "nova-consoleauth-clone_stopped_0" [ style = bold] +"nova-consoleauth_stop_0 rhos6-node3" -> "nova-consoleauth_start_0 rhos6-node3" [ style = dashed] +"nova-consoleauth_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"nova-novncproxy-clone_running_0" -> "nova-api-clone_start_0" [ style = dashed] +"nova-novncproxy-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"nova-novncproxy-clone_start_0" -> "nova-novncproxy-clone_running_0" [ style = dashed] +"nova-novncproxy-clone_start_0" -> "nova-novncproxy_start_0 rhos6-node1" [ style = dashed] +"nova-novncproxy-clone_start_0" -> "nova-novncproxy_start_0 rhos6-node2" [ style = dashed] +"nova-novncproxy-clone_start_0" -> "nova-novncproxy_start_0 rhos6-node3" [ style = dashed] +"nova-novncproxy-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"nova-novncproxy-clone_stop_0" -> "nova-novncproxy-clone_stopped_0" [ style = bold] +"nova-novncproxy-clone_stop_0" -> "nova-novncproxy_stop_0 rhos6-node1" [ style = bold] +"nova-novncproxy-clone_stop_0" -> "nova-novncproxy_stop_0 rhos6-node2" [ style = bold] +"nova-novncproxy-clone_stop_0" -> "nova-novncproxy_stop_0 rhos6-node3" [ style = bold] +"nova-novncproxy-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"nova-novncproxy-clone_stopped_0" -> "nova-consoleauth-clone_stop_0" [ style = bold] +"nova-novncproxy-clone_stopped_0" -> "nova-novncproxy-clone_start_0" [ style = dashed] +"nova-novncproxy-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"nova-novncproxy_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_start_0 rhos6-node1" -> "nova-novncproxy-clone_running_0" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node1" -> "nova-novncproxy_monitor_60000 rhos6-node1" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_start_0 rhos6-node2" -> "nova-novncproxy-clone_running_0" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node2" -> "nova-novncproxy_monitor_60000 rhos6-node2" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_start_0 rhos6-node3" -> "nova-novncproxy-clone_running_0" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node3" -> "nova-novncproxy_monitor_60000 rhos6-node3" [ style = dashed] +"nova-novncproxy_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-novncproxy_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node1" -> "nova-consoleauth_stop_0 rhos6-node1" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node1" -> "nova-novncproxy-clone_stopped_0" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node1" -> "nova-novncproxy_start_0 rhos6-node1" [ style = dashed] +"nova-novncproxy_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"nova-novncproxy_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node2" -> "nova-consoleauth_stop_0 rhos6-node2" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node2" -> "nova-novncproxy-clone_stopped_0" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node2" -> "nova-novncproxy_start_0 rhos6-node2" [ style = dashed] +"nova-novncproxy_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"nova-novncproxy_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node3" -> "nova-consoleauth_stop_0 rhos6-node3" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node3" -> "nova-novncproxy-clone_stopped_0" [ style = bold] +"nova-novncproxy_stop_0 rhos6-node3" -> "nova-novncproxy_start_0 rhos6-node3" [ style = dashed] +"nova-novncproxy_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"nova-scheduler-clone_running_0" -> "nova-conductor-clone_start_0" [ style = dashed] +"nova-scheduler-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"nova-scheduler-clone_start_0" -> "nova-scheduler-clone_running_0" [ style = dashed] +"nova-scheduler-clone_start_0" -> "nova-scheduler_start_0 rhos6-node1" [ style = dashed] +"nova-scheduler-clone_start_0" -> "nova-scheduler_start_0 rhos6-node2" [ style = dashed] +"nova-scheduler-clone_start_0" -> "nova-scheduler_start_0 rhos6-node3" [ style = dashed] +"nova-scheduler-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"nova-scheduler-clone_stop_0" -> "nova-scheduler-clone_stopped_0" [ style = bold] +"nova-scheduler-clone_stop_0" -> "nova-scheduler_stop_0 rhos6-node1" [ style = bold] +"nova-scheduler-clone_stop_0" -> "nova-scheduler_stop_0 rhos6-node2" [ style = bold] +"nova-scheduler-clone_stop_0" -> "nova-scheduler_stop_0 rhos6-node3" [ style = bold] +"nova-scheduler-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"nova-scheduler-clone_stopped_0" -> "nova-api-clone_stop_0" [ style = bold] +"nova-scheduler-clone_stopped_0" -> "nova-scheduler-clone_start_0" [ style = dashed] +"nova-scheduler-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"nova-scheduler_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_start_0 rhos6-node1" -> "nova-scheduler-clone_running_0" [ style = dashed] +"nova-scheduler_start_0 rhos6-node1" -> "nova-scheduler_monitor_60000 rhos6-node1" [ style = dashed] +"nova-scheduler_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_start_0 rhos6-node2" -> "nova-scheduler-clone_running_0" [ style = dashed] +"nova-scheduler_start_0 rhos6-node2" -> "nova-scheduler_monitor_60000 rhos6-node2" [ style = dashed] +"nova-scheduler_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_start_0 rhos6-node3" -> "nova-scheduler-clone_running_0" [ style = dashed] +"nova-scheduler_start_0 rhos6-node3" -> "nova-scheduler_monitor_60000 rhos6-node3" [ style = dashed] +"nova-scheduler_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"nova-scheduler_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"nova-scheduler_stop_0 rhos6-node1" -> "nova-api_stop_0 rhos6-node1" [ style = bold] +"nova-scheduler_stop_0 rhos6-node1" -> "nova-scheduler-clone_stopped_0" [ style = bold] +"nova-scheduler_stop_0 rhos6-node1" -> "nova-scheduler_start_0 rhos6-node1" [ style = dashed] +"nova-scheduler_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"nova-scheduler_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"nova-scheduler_stop_0 rhos6-node2" -> "nova-api_stop_0 rhos6-node2" [ style = bold] +"nova-scheduler_stop_0 rhos6-node2" -> "nova-scheduler-clone_stopped_0" [ style = bold] +"nova-scheduler_stop_0 rhos6-node2" -> "nova-scheduler_start_0 rhos6-node2" [ style = dashed] +"nova-scheduler_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"nova-scheduler_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"nova-scheduler_stop_0 rhos6-node3" -> "nova-api_stop_0 rhos6-node3" [ style = bold] +"nova-scheduler_stop_0 rhos6-node3" -> "nova-scheduler-clone_stopped_0" [ style = bold] +"nova-scheduler_stop_0 rhos6-node3" -> "nova-scheduler_start_0 rhos6-node3" [ style = dashed] +"nova-scheduler_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"swift-account-clone_running_0" -> "swift-container-clone_start_0" [ style = dashed] +"swift-account-clone_running_0" -> "swift-proxy-clone_start_0" [ style = dashed] +"swift-account-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"swift-account-clone_start_0" -> "swift-account-clone_running_0" [ style = dashed] +"swift-account-clone_start_0" -> "swift-account_start_0 rhos6-node1" [ style = dashed] +"swift-account-clone_start_0" -> "swift-account_start_0 rhos6-node2" [ style = dashed] +"swift-account-clone_start_0" -> "swift-account_start_0 rhos6-node3" [ style = dashed] +"swift-account-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"swift-account-clone_stop_0" -> "swift-account-clone_stopped_0" [ style = bold] +"swift-account-clone_stop_0" -> "swift-account_stop_0 rhos6-node1" [ style = bold] +"swift-account-clone_stop_0" -> "swift-account_stop_0 rhos6-node2" [ style = bold] +"swift-account-clone_stop_0" -> "swift-account_stop_0 rhos6-node3" [ style = bold] +"swift-account-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"swift-account-clone_stopped_0" -> "keystone-clone_stop_0" [ style = bold] +"swift-account-clone_stopped_0" -> "swift-account-clone_start_0" [ style = dashed] +"swift-account-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"swift-account_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-account_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-account_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-account_start_0 rhos6-node1" -> "swift-account-clone_running_0" [ style = dashed] +"swift-account_start_0 rhos6-node1" -> "swift-account_monitor_60000 rhos6-node1" [ style = dashed] +"swift-account_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-account_start_0 rhos6-node2" -> "swift-account-clone_running_0" [ style = dashed] +"swift-account_start_0 rhos6-node2" -> "swift-account_monitor_60000 rhos6-node2" [ style = dashed] +"swift-account_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-account_start_0 rhos6-node3" -> "swift-account-clone_running_0" [ style = dashed] +"swift-account_start_0 rhos6-node3" -> "swift-account_monitor_60000 rhos6-node3" [ style = dashed] +"swift-account_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-account_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"swift-account_stop_0 rhos6-node1" -> "keystone_stop_0 rhos6-node1" [ style = bold] +"swift-account_stop_0 rhos6-node1" -> "swift-account-clone_stopped_0" [ style = bold] +"swift-account_stop_0 rhos6-node1" -> "swift-account_start_0 rhos6-node1" [ style = dashed] +"swift-account_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"swift-account_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"swift-account_stop_0 rhos6-node2" -> "keystone_stop_0 rhos6-node2" [ style = bold] +"swift-account_stop_0 rhos6-node2" -> "swift-account-clone_stopped_0" [ style = bold] +"swift-account_stop_0 rhos6-node2" -> "swift-account_start_0 rhos6-node2" [ style = dashed] +"swift-account_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"swift-account_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"swift-account_stop_0 rhos6-node3" -> "keystone_stop_0 rhos6-node3" [ style = bold] +"swift-account_stop_0 rhos6-node3" -> "swift-account-clone_stopped_0" [ style = bold] +"swift-account_stop_0 rhos6-node3" -> "swift-account_start_0 rhos6-node3" [ style = dashed] +"swift-account_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"swift-container-clone_running_0" -> "swift-object-clone_start_0" [ style = dashed] +"swift-container-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"swift-container-clone_start_0" -> "swift-container-clone_running_0" [ style = dashed] +"swift-container-clone_start_0" -> "swift-container_start_0 rhos6-node1" [ style = dashed] +"swift-container-clone_start_0" -> "swift-container_start_0 rhos6-node2" [ style = dashed] +"swift-container-clone_start_0" -> "swift-container_start_0 rhos6-node3" [ style = dashed] +"swift-container-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"swift-container-clone_stop_0" -> "swift-container-clone_stopped_0" [ style = bold] +"swift-container-clone_stop_0" -> "swift-container_stop_0 rhos6-node1" [ style = bold] +"swift-container-clone_stop_0" -> "swift-container_stop_0 rhos6-node2" [ style = bold] +"swift-container-clone_stop_0" -> "swift-container_stop_0 rhos6-node3" [ style = bold] +"swift-container-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"swift-container-clone_stopped_0" -> "swift-account-clone_stop_0" [ style = bold] +"swift-container-clone_stopped_0" -> "swift-container-clone_start_0" [ style = dashed] +"swift-container-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"swift-container_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-container_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-container_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-container_start_0 rhos6-node1" -> "swift-container-clone_running_0" [ style = dashed] +"swift-container_start_0 rhos6-node1" -> "swift-container_monitor_60000 rhos6-node1" [ style = dashed] +"swift-container_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-container_start_0 rhos6-node2" -> "swift-container-clone_running_0" [ style = dashed] +"swift-container_start_0 rhos6-node2" -> "swift-container_monitor_60000 rhos6-node2" [ style = dashed] +"swift-container_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-container_start_0 rhos6-node3" -> "swift-container-clone_running_0" [ style = dashed] +"swift-container_start_0 rhos6-node3" -> "swift-container_monitor_60000 rhos6-node3" [ style = dashed] +"swift-container_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-container_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"swift-container_stop_0 rhos6-node1" -> "swift-account_stop_0 rhos6-node1" [ style = bold] +"swift-container_stop_0 rhos6-node1" -> "swift-container-clone_stopped_0" [ style = bold] +"swift-container_stop_0 rhos6-node1" -> "swift-container_start_0 rhos6-node1" [ style = dashed] +"swift-container_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"swift-container_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"swift-container_stop_0 rhos6-node2" -> "swift-account_stop_0 rhos6-node2" [ style = bold] +"swift-container_stop_0 rhos6-node2" -> "swift-container-clone_stopped_0" [ style = bold] +"swift-container_stop_0 rhos6-node2" -> "swift-container_start_0 rhos6-node2" [ style = dashed] +"swift-container_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"swift-container_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"swift-container_stop_0 rhos6-node3" -> "swift-account_stop_0 rhos6-node3" [ style = bold] +"swift-container_stop_0 rhos6-node3" -> "swift-container-clone_stopped_0" [ style = bold] +"swift-container_stop_0 rhos6-node3" -> "swift-container_start_0 rhos6-node3" [ style = dashed] +"swift-container_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"swift-object-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"swift-object-clone_start_0" -> "swift-object-clone_running_0" [ style = dashed] +"swift-object-clone_start_0" -> "swift-object_start_0 rhos6-node1" [ style = dashed] +"swift-object-clone_start_0" -> "swift-object_start_0 rhos6-node2" [ style = dashed] +"swift-object-clone_start_0" -> "swift-object_start_0 rhos6-node3" [ style = dashed] +"swift-object-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"swift-object-clone_stop_0" -> "swift-object-clone_stopped_0" [ style = bold] +"swift-object-clone_stop_0" -> "swift-object_stop_0 rhos6-node1" [ style = bold] +"swift-object-clone_stop_0" -> "swift-object_stop_0 rhos6-node2" [ style = bold] +"swift-object-clone_stop_0" -> "swift-object_stop_0 rhos6-node3" [ style = bold] +"swift-object-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"swift-object-clone_stopped_0" -> "swift-container-clone_stop_0" [ style = bold] +"swift-object-clone_stopped_0" -> "swift-object-clone_start_0" [ style = dashed] +"swift-object-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"swift-object-expirer_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-object-expirer_start_0 rhos6-node2" -> "swift-object-expirer_monitor_60000 rhos6-node2" [ style = dashed] +"swift-object-expirer_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-object-expirer_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"swift-object-expirer_stop_0 rhos6-node2" -> "swift-object-expirer_start_0 rhos6-node2" [ style = dashed] +"swift-object-expirer_stop_0 rhos6-node2" -> "swift-proxy-clone_stop_0" [ style = bold] +"swift-object-expirer_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"swift-object_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-object_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-object_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-object_start_0 rhos6-node1" -> "swift-object-clone_running_0" [ style = dashed] +"swift-object_start_0 rhos6-node1" -> "swift-object_monitor_60000 rhos6-node1" [ style = dashed] +"swift-object_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-object_start_0 rhos6-node2" -> "swift-object-clone_running_0" [ style = dashed] +"swift-object_start_0 rhos6-node2" -> "swift-object_monitor_60000 rhos6-node2" [ style = dashed] +"swift-object_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-object_start_0 rhos6-node3" -> "swift-object-clone_running_0" [ style = dashed] +"swift-object_start_0 rhos6-node3" -> "swift-object_monitor_60000 rhos6-node3" [ style = dashed] +"swift-object_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-object_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"swift-object_stop_0 rhos6-node1" -> "swift-container_stop_0 rhos6-node1" [ style = bold] +"swift-object_stop_0 rhos6-node1" -> "swift-object-clone_stopped_0" [ style = bold] +"swift-object_stop_0 rhos6-node1" -> "swift-object_start_0 rhos6-node1" [ style = dashed] +"swift-object_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"swift-object_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"swift-object_stop_0 rhos6-node2" -> "swift-container_stop_0 rhos6-node2" [ style = bold] +"swift-object_stop_0 rhos6-node2" -> "swift-object-clone_stopped_0" [ style = bold] +"swift-object_stop_0 rhos6-node2" -> "swift-object_start_0 rhos6-node2" [ style = dashed] +"swift-object_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"swift-object_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"swift-object_stop_0 rhos6-node3" -> "swift-container_stop_0 rhos6-node3" [ style = bold] +"swift-object_stop_0 rhos6-node3" -> "swift-object-clone_stopped_0" [ style = bold] +"swift-object_stop_0 rhos6-node3" -> "swift-object_start_0 rhos6-node3" [ style = dashed] +"swift-object_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +"swift-proxy-clone_running_0" -> "swift-object-expirer_start_0 rhos6-node2" [ style = dashed] +"swift-proxy-clone_running_0" [ style=dashed color="red" fontcolor="orange"] +"swift-proxy-clone_start_0" -> "swift-proxy-clone_running_0" [ style = dashed] +"swift-proxy-clone_start_0" -> "swift-proxy_start_0 rhos6-node1" [ style = dashed] +"swift-proxy-clone_start_0" -> "swift-proxy_start_0 rhos6-node2" [ style = dashed] +"swift-proxy-clone_start_0" -> "swift-proxy_start_0 rhos6-node3" [ style = dashed] +"swift-proxy-clone_start_0" [ style=dashed color="red" fontcolor="orange"] +"swift-proxy-clone_stop_0" -> "swift-proxy-clone_stopped_0" [ style = bold] +"swift-proxy-clone_stop_0" -> "swift-proxy_stop_0 rhos6-node1" [ style = bold] +"swift-proxy-clone_stop_0" -> "swift-proxy_stop_0 rhos6-node2" [ style = bold] +"swift-proxy-clone_stop_0" -> "swift-proxy_stop_0 rhos6-node3" [ style = bold] +"swift-proxy-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"swift-proxy-clone_stopped_0" -> "swift-account-clone_stop_0" [ style = bold] +"swift-proxy-clone_stopped_0" -> "swift-proxy-clone_start_0" [ style = dashed] +"swift-proxy-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"swift-proxy_monitor_60000 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_monitor_60000 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_monitor_60000 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_start_0 rhos6-node1" -> "swift-proxy-clone_running_0" [ style = dashed] +"swift-proxy_start_0 rhos6-node1" -> "swift-proxy_monitor_60000 rhos6-node1" [ style = dashed] +"swift-proxy_start_0 rhos6-node1" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_start_0 rhos6-node2" -> "swift-proxy-clone_running_0" [ style = dashed] +"swift-proxy_start_0 rhos6-node2" -> "swift-proxy_monitor_60000 rhos6-node2" [ style = dashed] +"swift-proxy_start_0 rhos6-node2" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_start_0 rhos6-node3" -> "swift-proxy-clone_running_0" [ style = dashed] +"swift-proxy_start_0 rhos6-node3" -> "swift-proxy_monitor_60000 rhos6-node3" [ style = dashed] +"swift-proxy_start_0 rhos6-node3" [ style=dashed color="red" fontcolor="black"] +"swift-proxy_stop_0 rhos6-node1" -> "all_stopped" [ style = bold] +"swift-proxy_stop_0 rhos6-node1" -> "swift-account_stop_0 rhos6-node1" [ style = bold] +"swift-proxy_stop_0 rhos6-node1" -> "swift-proxy-clone_stopped_0" [ style = bold] +"swift-proxy_stop_0 rhos6-node1" -> "swift-proxy_start_0 rhos6-node1" [ style = dashed] +"swift-proxy_stop_0 rhos6-node1" [ style=bold color="green" fontcolor="black"] +"swift-proxy_stop_0 rhos6-node2" -> "all_stopped" [ style = bold] +"swift-proxy_stop_0 rhos6-node2" -> "swift-account_stop_0 rhos6-node2" [ style = bold] +"swift-proxy_stop_0 rhos6-node2" -> "swift-proxy-clone_stopped_0" [ style = bold] +"swift-proxy_stop_0 rhos6-node2" -> "swift-proxy_start_0 rhos6-node2" [ style = dashed] +"swift-proxy_stop_0 rhos6-node2" [ style=bold color="green" fontcolor="black"] +"swift-proxy_stop_0 rhos6-node3" -> "all_stopped" [ style = bold] +"swift-proxy_stop_0 rhos6-node3" -> "swift-account_stop_0 rhos6-node3" [ style = bold] +"swift-proxy_stop_0 rhos6-node3" -> "swift-proxy-clone_stopped_0" [ style = bold] +"swift-proxy_stop_0 rhos6-node3" -> "swift-proxy_start_0 rhos6-node3" [ style = dashed] +"swift-proxy_stop_0 rhos6-node3" [ style=bold color="green" fontcolor="black"] +} diff --git a/pengine/test10/complex_enforce_colo.exp b/pengine/test10/complex_enforce_colo.exp new file mode 100644 index 0000000000..c19c4331d3 --- /dev/null +++ b/pengine/test10/complex_enforce_colo.exp @@ -0,0 +1,2689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/test10/complex_enforce_colo.scores b/pengine/test10/complex_enforce_colo.scores new file mode 100644 index 0000000000..9394084a4d --- /dev/null +++ b/pengine/test10/complex_enforce_colo.scores @@ -0,0 +1,844 @@ +Allocation scores: +clone_color: ceilometer-alarm-evaluator-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-evaluator-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-evaluator-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node3: 1 +clone_color: ceilometer-alarm-notifier-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-notifier-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-notifier-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node3: 1 +clone_color: ceilometer-api-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-api-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-api-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-api:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-api:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-api:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-api:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-api:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-api:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-api:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-api:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-api:2 allocation score on rhos6-node3: 1 +clone_color: ceilometer-collector-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-collector-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-collector-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-collector:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-collector:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-collector:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-collector:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-collector:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-collector:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-collector:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-collector:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-collector:2 allocation score on rhos6-node3: 1 +clone_color: ceilometer-delay-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-delay-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-delay-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-delay:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-delay:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-delay:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-delay:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-delay:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-delay:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-delay:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-delay:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-delay:2 allocation score on rhos6-node3: 1 +clone_color: ceilometer-notification-clone allocation score on rhos6-node1: 0 +clone_color: ceilometer-notification-clone allocation score on rhos6-node2: 0 +clone_color: ceilometer-notification-clone allocation score on rhos6-node3: 0 +clone_color: ceilometer-notification:0 allocation score on rhos6-node1: 1 +clone_color: ceilometer-notification:0 allocation score on rhos6-node2: 0 +clone_color: ceilometer-notification:0 allocation score on rhos6-node3: 0 +clone_color: ceilometer-notification:1 allocation score on rhos6-node1: 0 +clone_color: ceilometer-notification:1 allocation score on rhos6-node2: 1 +clone_color: ceilometer-notification:1 allocation score on rhos6-node3: 0 +clone_color: ceilometer-notification:2 allocation score on rhos6-node1: 0 +clone_color: ceilometer-notification:2 allocation score on rhos6-node2: 0 +clone_color: ceilometer-notification:2 allocation score on rhos6-node3: 1 +clone_color: galera-master allocation score on rhos6-node1: 0 +clone_color: galera-master allocation score on rhos6-node2: 0 +clone_color: galera-master allocation score on rhos6-node3: 0 +clone_color: galera:0 allocation score on rhos6-node1: 101 +clone_color: galera:0 allocation score on rhos6-node2: 0 +clone_color: galera:0 allocation score on rhos6-node3: 0 +clone_color: galera:1 allocation score on rhos6-node1: 0 +clone_color: galera:1 allocation score on rhos6-node2: 101 +clone_color: galera:1 allocation score on rhos6-node3: 0 +clone_color: galera:2 allocation score on rhos6-node1: 0 +clone_color: galera:2 allocation score on rhos6-node2: 0 +clone_color: galera:2 allocation score on rhos6-node3: 101 +clone_color: glance-api-clone allocation score on rhos6-node1: 0 +clone_color: glance-api-clone allocation score on rhos6-node2: 0 +clone_color: glance-api-clone allocation score on rhos6-node3: 0 +clone_color: glance-api:0 allocation score on rhos6-node1: 1 +clone_color: glance-api:0 allocation score on rhos6-node2: 0 +clone_color: glance-api:0 allocation score on rhos6-node3: 0 +clone_color: glance-api:1 allocation score on rhos6-node1: 0 +clone_color: glance-api:1 allocation score on rhos6-node2: 1 +clone_color: glance-api:1 allocation score on rhos6-node3: 0 +clone_color: glance-api:2 allocation score on rhos6-node1: 0 +clone_color: glance-api:2 allocation score on rhos6-node2: 0 +clone_color: glance-api:2 allocation score on rhos6-node3: 1 +clone_color: glance-fs-clone allocation score on rhos6-node1: 0 +clone_color: glance-fs-clone allocation score on rhos6-node2: 0 +clone_color: glance-fs-clone allocation score on rhos6-node3: 0 +clone_color: glance-fs:0 allocation score on rhos6-node1: 1 +clone_color: glance-fs:0 allocation score on rhos6-node2: 0 +clone_color: glance-fs:0 allocation score on rhos6-node3: 0 +clone_color: glance-fs:1 allocation score on rhos6-node1: 0 +clone_color: glance-fs:1 allocation score on rhos6-node2: 1 +clone_color: glance-fs:1 allocation score on rhos6-node3: 0 +clone_color: glance-fs:2 allocation score on rhos6-node1: 0 +clone_color: glance-fs:2 allocation score on rhos6-node2: 0 +clone_color: glance-fs:2 allocation score on rhos6-node3: 1 +clone_color: glance-registry-clone allocation score on rhos6-node1: 0 +clone_color: glance-registry-clone allocation score on rhos6-node2: 0 +clone_color: glance-registry-clone allocation score on rhos6-node3: 0 +clone_color: glance-registry:0 allocation score on rhos6-node1: 1 +clone_color: glance-registry:0 allocation score on rhos6-node2: 0 +clone_color: glance-registry:0 allocation score on rhos6-node3: 0 +clone_color: glance-registry:1 allocation score on rhos6-node1: 0 +clone_color: glance-registry:1 allocation score on rhos6-node2: 1 +clone_color: glance-registry:1 allocation score on rhos6-node3: 0 +clone_color: glance-registry:2 allocation score on rhos6-node1: 0 +clone_color: glance-registry:2 allocation score on rhos6-node2: 0 +clone_color: glance-registry:2 allocation score on rhos6-node3: 1 +clone_color: heat-api-cfn-clone allocation score on rhos6-node1: 0 +clone_color: heat-api-cfn-clone allocation score on rhos6-node2: 0 +clone_color: heat-api-cfn-clone allocation score on rhos6-node3: 0 +clone_color: heat-api-cfn:0 allocation score on rhos6-node1: 1 +clone_color: heat-api-cfn:0 allocation score on rhos6-node2: 0 +clone_color: heat-api-cfn:0 allocation score on rhos6-node3: 0 +clone_color: heat-api-cfn:1 allocation score on rhos6-node1: 0 +clone_color: heat-api-cfn:1 allocation score on rhos6-node2: 1 +clone_color: heat-api-cfn:1 allocation score on rhos6-node3: 0 +clone_color: heat-api-cfn:2 allocation score on rhos6-node1: 0 +clone_color: heat-api-cfn:2 allocation score on rhos6-node2: 0 +clone_color: heat-api-cfn:2 allocation score on rhos6-node3: 1 +clone_color: heat-api-clone allocation score on rhos6-node1: 0 +clone_color: heat-api-clone allocation score on rhos6-node2: 0 +clone_color: heat-api-clone allocation score on rhos6-node3: 0 +clone_color: heat-api-cloudwatch-clone allocation score on rhos6-node1: 0 +clone_color: heat-api-cloudwatch-clone allocation score on rhos6-node2: 0 +clone_color: heat-api-cloudwatch-clone allocation score on rhos6-node3: 0 +clone_color: heat-api-cloudwatch:0 allocation score on rhos6-node1: 1 +clone_color: heat-api-cloudwatch:0 allocation score on rhos6-node2: 0 +clone_color: heat-api-cloudwatch:0 allocation score on rhos6-node3: 0 +clone_color: heat-api-cloudwatch:1 allocation score on rhos6-node1: 0 +clone_color: heat-api-cloudwatch:1 allocation score on rhos6-node2: 1 +clone_color: heat-api-cloudwatch:1 allocation score on rhos6-node3: 0 +clone_color: heat-api-cloudwatch:2 allocation score on rhos6-node1: 0 +clone_color: heat-api-cloudwatch:2 allocation score on rhos6-node2: 0 +clone_color: heat-api-cloudwatch:2 allocation score on rhos6-node3: 1 +clone_color: heat-api:0 allocation score on rhos6-node1: 1 +clone_color: heat-api:0 allocation score on rhos6-node2: 0 +clone_color: heat-api:0 allocation score on rhos6-node3: 0 +clone_color: heat-api:1 allocation score on rhos6-node1: 0 +clone_color: heat-api:1 allocation score on rhos6-node2: 1 +clone_color: heat-api:1 allocation score on rhos6-node3: 0 +clone_color: heat-api:2 allocation score on rhos6-node1: 0 +clone_color: heat-api:2 allocation score on rhos6-node2: 0 +clone_color: heat-api:2 allocation score on rhos6-node3: 1 +clone_color: horizon-clone allocation score on rhos6-node1: 0 +clone_color: horizon-clone allocation score on rhos6-node2: 0 +clone_color: horizon-clone allocation score on rhos6-node3: 0 +clone_color: horizon:0 allocation score on rhos6-node1: 1 +clone_color: horizon:0 allocation score on rhos6-node2: 0 +clone_color: horizon:0 allocation score on rhos6-node3: 0 +clone_color: horizon:1 allocation score on rhos6-node1: 0 +clone_color: horizon:1 allocation score on rhos6-node2: 1 +clone_color: horizon:1 allocation score on rhos6-node3: 0 +clone_color: horizon:2 allocation score on rhos6-node1: 0 +clone_color: horizon:2 allocation score on rhos6-node2: 0 +clone_color: horizon:2 allocation score on rhos6-node3: 1 +clone_color: keystone-clone allocation score on rhos6-node1: 0 +clone_color: keystone-clone allocation score on rhos6-node2: 0 +clone_color: keystone-clone allocation score on rhos6-node3: 0 +clone_color: keystone:0 allocation score on rhos6-node1: 1 +clone_color: keystone:0 allocation score on rhos6-node2: 0 +clone_color: keystone:0 allocation score on rhos6-node3: 0 +clone_color: keystone:1 allocation score on rhos6-node1: 0 +clone_color: keystone:1 allocation score on rhos6-node2: 1 +clone_color: keystone:1 allocation score on rhos6-node3: 0 +clone_color: keystone:2 allocation score on rhos6-node1: 0 +clone_color: keystone:2 allocation score on rhos6-node2: 0 +clone_color: keystone:2 allocation score on rhos6-node3: 1 +clone_color: lb-haproxy-clone allocation score on rhos6-node1: 0 +clone_color: lb-haproxy-clone allocation score on rhos6-node2: 0 +clone_color: lb-haproxy-clone allocation score on rhos6-node3: 0 +clone_color: lb-haproxy:0 allocation score on rhos6-node1: 1 +clone_color: lb-haproxy:0 allocation score on rhos6-node2: 0 +clone_color: lb-haproxy:0 allocation score on rhos6-node3: 0 +clone_color: lb-haproxy:1 allocation score on rhos6-node1: 0 +clone_color: lb-haproxy:1 allocation score on rhos6-node2: 1 +clone_color: lb-haproxy:1 allocation score on rhos6-node3: 0 +clone_color: lb-haproxy:2 allocation score on rhos6-node1: 0 +clone_color: lb-haproxy:2 allocation score on rhos6-node2: 0 +clone_color: lb-haproxy:2 allocation score on rhos6-node3: 1 +clone_color: memcached-clone allocation score on rhos6-node1: 0 +clone_color: memcached-clone allocation score on rhos6-node2: 0 +clone_color: memcached-clone allocation score on rhos6-node3: 0 +clone_color: memcached:0 allocation score on rhos6-node1: 1 +clone_color: memcached:0 allocation score on rhos6-node2: 0 +clone_color: memcached:0 allocation score on rhos6-node3: 0 +clone_color: memcached:1 allocation score on rhos6-node1: 0 +clone_color: memcached:1 allocation score on rhos6-node2: 1 +clone_color: memcached:1 allocation score on rhos6-node3: 0 +clone_color: memcached:2 allocation score on rhos6-node1: 0 +clone_color: memcached:2 allocation score on rhos6-node2: 0 +clone_color: memcached:2 allocation score on rhos6-node3: 1 +clone_color: mongodb-clone allocation score on rhos6-node1: 0 +clone_color: mongodb-clone allocation score on rhos6-node2: 0 +clone_color: mongodb-clone allocation score on rhos6-node3: 0 +clone_color: mongodb:0 allocation score on rhos6-node1: 1 +clone_color: mongodb:0 allocation score on rhos6-node2: 0 +clone_color: mongodb:0 allocation score on rhos6-node3: 0 +clone_color: mongodb:1 allocation score on rhos6-node1: 0 +clone_color: mongodb:1 allocation score on rhos6-node2: 1 +clone_color: mongodb:1 allocation score on rhos6-node3: 0 +clone_color: mongodb:2 allocation score on rhos6-node1: 0 +clone_color: mongodb:2 allocation score on rhos6-node2: 0 +clone_color: mongodb:2 allocation score on rhos6-node3: 1 +clone_color: neutron-dhcp-agent-clone allocation score on rhos6-node1: 0 +clone_color: neutron-dhcp-agent-clone allocation score on rhos6-node2: 0 +clone_color: neutron-dhcp-agent-clone allocation score on rhos6-node3: 0 +clone_color: neutron-dhcp-agent:0 allocation score on rhos6-node1: 1 +clone_color: neutron-dhcp-agent:0 allocation score on rhos6-node2: 0 +clone_color: neutron-dhcp-agent:0 allocation score on rhos6-node3: 0 +clone_color: neutron-dhcp-agent:1 allocation score on rhos6-node1: 0 +clone_color: neutron-dhcp-agent:1 allocation score on rhos6-node2: 1 +clone_color: neutron-dhcp-agent:1 allocation score on rhos6-node3: 0 +clone_color: neutron-dhcp-agent:2 allocation score on rhos6-node1: 0 +clone_color: neutron-dhcp-agent:2 allocation score on rhos6-node2: 0 +clone_color: neutron-dhcp-agent:2 allocation score on rhos6-node3: 1 +clone_color: neutron-l3-agent-clone allocation score on rhos6-node1: 0 +clone_color: neutron-l3-agent-clone allocation score on rhos6-node2: 0 +clone_color: neutron-l3-agent-clone allocation score on rhos6-node3: 0 +clone_color: neutron-l3-agent:0 allocation score on rhos6-node1: 1 +clone_color: neutron-l3-agent:0 allocation score on rhos6-node2: 0 +clone_color: neutron-l3-agent:0 allocation score on rhos6-node3: 0 +clone_color: neutron-l3-agent:1 allocation score on rhos6-node1: 0 +clone_color: neutron-l3-agent:1 allocation score on rhos6-node2: 1 +clone_color: neutron-l3-agent:1 allocation score on rhos6-node3: 0 +clone_color: neutron-l3-agent:2 allocation score on rhos6-node1: 0 +clone_color: neutron-l3-agent:2 allocation score on rhos6-node2: 0 +clone_color: neutron-l3-agent:2 allocation score on rhos6-node3: 1 +clone_color: neutron-metadata-agent-clone allocation score on rhos6-node1: 0 +clone_color: neutron-metadata-agent-clone allocation score on rhos6-node2: 0 +clone_color: neutron-metadata-agent-clone allocation score on rhos6-node3: 0 +clone_color: neutron-metadata-agent:0 allocation score on rhos6-node1: 1 +clone_color: neutron-metadata-agent:0 allocation score on rhos6-node2: 0 +clone_color: neutron-metadata-agent:0 allocation score on rhos6-node3: 0 +clone_color: neutron-metadata-agent:1 allocation score on rhos6-node1: 0 +clone_color: neutron-metadata-agent:1 allocation score on rhos6-node2: 1 +clone_color: neutron-metadata-agent:1 allocation score on rhos6-node3: 0 +clone_color: neutron-metadata-agent:2 allocation score on rhos6-node1: 0 +clone_color: neutron-metadata-agent:2 allocation score on rhos6-node2: 0 +clone_color: neutron-metadata-agent:2 allocation score on rhos6-node3: 1 +clone_color: neutron-netns-cleanup-clone allocation score on rhos6-node1: 0 +clone_color: neutron-netns-cleanup-clone allocation score on rhos6-node2: 0 +clone_color: neutron-netns-cleanup-clone allocation score on rhos6-node3: 0 +clone_color: neutron-netns-cleanup:0 allocation score on rhos6-node1: 1 +clone_color: neutron-netns-cleanup:0 allocation score on rhos6-node2: 0 +clone_color: neutron-netns-cleanup:0 allocation score on rhos6-node3: 0 +clone_color: neutron-netns-cleanup:1 allocation score on rhos6-node1: 0 +clone_color: neutron-netns-cleanup:1 allocation score on rhos6-node2: 1 +clone_color: neutron-netns-cleanup:1 allocation score on rhos6-node3: 0 +clone_color: neutron-netns-cleanup:2 allocation score on rhos6-node1: 0 +clone_color: neutron-netns-cleanup:2 allocation score on rhos6-node2: 0 +clone_color: neutron-netns-cleanup:2 allocation score on rhos6-node3: 1 +clone_color: neutron-openvswitch-agent-clone allocation score on rhos6-node1: 0 +clone_color: neutron-openvswitch-agent-clone allocation score on rhos6-node2: 0 +clone_color: neutron-openvswitch-agent-clone allocation score on rhos6-node3: 0 +clone_color: neutron-openvswitch-agent:0 allocation score on rhos6-node1: 1 +clone_color: neutron-openvswitch-agent:0 allocation score on rhos6-node2: 0 +clone_color: neutron-openvswitch-agent:0 allocation score on rhos6-node3: 0 +clone_color: neutron-openvswitch-agent:1 allocation score on rhos6-node1: 0 +clone_color: neutron-openvswitch-agent:1 allocation score on rhos6-node2: 1 +clone_color: neutron-openvswitch-agent:1 allocation score on rhos6-node3: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on rhos6-node1: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on rhos6-node2: 0 +clone_color: neutron-openvswitch-agent:2 allocation score on rhos6-node3: 1 +clone_color: neutron-ovs-cleanup-clone allocation score on rhos6-node1: 0 +clone_color: neutron-ovs-cleanup-clone allocation score on rhos6-node2: 0 +clone_color: neutron-ovs-cleanup-clone allocation score on rhos6-node3: 0 +clone_color: neutron-ovs-cleanup:0 allocation score on rhos6-node1: 1 +clone_color: neutron-ovs-cleanup:0 allocation score on rhos6-node2: 0 +clone_color: neutron-ovs-cleanup:0 allocation score on rhos6-node3: 0 +clone_color: neutron-ovs-cleanup:1 allocation score on rhos6-node1: 0 +clone_color: neutron-ovs-cleanup:1 allocation score on rhos6-node2: 1 +clone_color: neutron-ovs-cleanup:1 allocation score on rhos6-node3: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on rhos6-node1: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on rhos6-node2: 0 +clone_color: neutron-ovs-cleanup:2 allocation score on rhos6-node3: 1 +clone_color: neutron-scale-clone allocation score on rhos6-node1: 0 +clone_color: neutron-scale-clone allocation score on rhos6-node2: 0 +clone_color: neutron-scale-clone allocation score on rhos6-node3: 0 +clone_color: neutron-scale:0 allocation score on rhos6-node1: 0 +clone_color: neutron-scale:0 allocation score on rhos6-node2: 0 +clone_color: neutron-scale:0 allocation score on rhos6-node3: 1 +clone_color: neutron-scale:1 allocation score on rhos6-node1: 0 +clone_color: neutron-scale:1 allocation score on rhos6-node2: 1 +clone_color: neutron-scale:1 allocation score on rhos6-node3: 0 +clone_color: neutron-scale:2 allocation score on rhos6-node1: 1 +clone_color: neutron-scale:2 allocation score on rhos6-node2: 0 +clone_color: neutron-scale:2 allocation score on rhos6-node3: 0 +clone_color: neutron-server-clone allocation score on rhos6-node1: 0 +clone_color: neutron-server-clone allocation score on rhos6-node2: 0 +clone_color: neutron-server-clone allocation score on rhos6-node3: 0 +clone_color: neutron-server:0 allocation score on rhos6-node1: 1 +clone_color: neutron-server:0 allocation score on rhos6-node2: 0 +clone_color: neutron-server:0 allocation score on rhos6-node3: 0 +clone_color: neutron-server:1 allocation score on rhos6-node1: 0 +clone_color: neutron-server:1 allocation score on rhos6-node2: 1 +clone_color: neutron-server:1 allocation score on rhos6-node3: 0 +clone_color: neutron-server:2 allocation score on rhos6-node1: 0 +clone_color: neutron-server:2 allocation score on rhos6-node2: 0 +clone_color: neutron-server:2 allocation score on rhos6-node3: 1 +clone_color: nova-api-clone allocation score on rhos6-node1: 0 +clone_color: nova-api-clone allocation score on rhos6-node2: 0 +clone_color: nova-api-clone allocation score on rhos6-node3: 0 +clone_color: nova-api:0 allocation score on rhos6-node1: 1 +clone_color: nova-api:0 allocation score on rhos6-node2: 0 +clone_color: nova-api:0 allocation score on rhos6-node3: 0 +clone_color: nova-api:1 allocation score on rhos6-node1: 0 +clone_color: nova-api:1 allocation score on rhos6-node2: 1 +clone_color: nova-api:1 allocation score on rhos6-node3: 0 +clone_color: nova-api:2 allocation score on rhos6-node1: 0 +clone_color: nova-api:2 allocation score on rhos6-node2: 0 +clone_color: nova-api:2 allocation score on rhos6-node3: 1 +clone_color: nova-conductor-clone allocation score on rhos6-node1: 0 +clone_color: nova-conductor-clone allocation score on rhos6-node2: 0 +clone_color: nova-conductor-clone allocation score on rhos6-node3: 0 +clone_color: nova-conductor:0 allocation score on rhos6-node1: 1 +clone_color: nova-conductor:0 allocation score on rhos6-node2: 0 +clone_color: nova-conductor:0 allocation score on rhos6-node3: 0 +clone_color: nova-conductor:1 allocation score on rhos6-node1: 0 +clone_color: nova-conductor:1 allocation score on rhos6-node2: 1 +clone_color: nova-conductor:1 allocation score on rhos6-node3: 0 +clone_color: nova-conductor:2 allocation score on rhos6-node1: 0 +clone_color: nova-conductor:2 allocation score on rhos6-node2: 0 +clone_color: nova-conductor:2 allocation score on rhos6-node3: 1 +clone_color: nova-consoleauth-clone allocation score on rhos6-node1: 0 +clone_color: nova-consoleauth-clone allocation score on rhos6-node2: 0 +clone_color: nova-consoleauth-clone allocation score on rhos6-node3: 0 +clone_color: nova-consoleauth:0 allocation score on rhos6-node1: 1 +clone_color: nova-consoleauth:0 allocation score on rhos6-node2: 0 +clone_color: nova-consoleauth:0 allocation score on rhos6-node3: 0 +clone_color: nova-consoleauth:1 allocation score on rhos6-node1: 0 +clone_color: nova-consoleauth:1 allocation score on rhos6-node2: 1 +clone_color: nova-consoleauth:1 allocation score on rhos6-node3: 0 +clone_color: nova-consoleauth:2 allocation score on rhos6-node1: 0 +clone_color: nova-consoleauth:2 allocation score on rhos6-node2: 0 +clone_color: nova-consoleauth:2 allocation score on rhos6-node3: 1 +clone_color: nova-novncproxy-clone allocation score on rhos6-node1: 0 +clone_color: nova-novncproxy-clone allocation score on rhos6-node2: 0 +clone_color: nova-novncproxy-clone allocation score on rhos6-node3: 0 +clone_color: nova-novncproxy:0 allocation score on rhos6-node1: 1 +clone_color: nova-novncproxy:0 allocation score on rhos6-node2: 0 +clone_color: nova-novncproxy:0 allocation score on rhos6-node3: 0 +clone_color: nova-novncproxy:1 allocation score on rhos6-node1: 0 +clone_color: nova-novncproxy:1 allocation score on rhos6-node2: 1 +clone_color: nova-novncproxy:1 allocation score on rhos6-node3: 0 +clone_color: nova-novncproxy:2 allocation score on rhos6-node1: 0 +clone_color: nova-novncproxy:2 allocation score on rhos6-node2: 0 +clone_color: nova-novncproxy:2 allocation score on rhos6-node3: 1 +clone_color: nova-scheduler-clone allocation score on rhos6-node1: 0 +clone_color: nova-scheduler-clone allocation score on rhos6-node2: 0 +clone_color: nova-scheduler-clone allocation score on rhos6-node3: 0 +clone_color: nova-scheduler:0 allocation score on rhos6-node1: 1 +clone_color: nova-scheduler:0 allocation score on rhos6-node2: 0 +clone_color: nova-scheduler:0 allocation score on rhos6-node3: 0 +clone_color: nova-scheduler:1 allocation score on rhos6-node1: 0 +clone_color: nova-scheduler:1 allocation score on rhos6-node2: 1 +clone_color: nova-scheduler:1 allocation score on rhos6-node3: 0 +clone_color: nova-scheduler:2 allocation score on rhos6-node1: 0 +clone_color: nova-scheduler:2 allocation score on rhos6-node2: 0 +clone_color: nova-scheduler:2 allocation score on rhos6-node3: 1 +clone_color: rabbitmq-server-clone allocation score on rhos6-node1: 0 +clone_color: rabbitmq-server-clone allocation score on rhos6-node2: 0 +clone_color: rabbitmq-server-clone allocation score on rhos6-node3: 0 +clone_color: rabbitmq-server:0 allocation score on rhos6-node1: 1 +clone_color: rabbitmq-server:0 allocation score on rhos6-node2: 0 +clone_color: rabbitmq-server:0 allocation score on rhos6-node3: 0 +clone_color: rabbitmq-server:1 allocation score on rhos6-node1: 0 +clone_color: rabbitmq-server:1 allocation score on rhos6-node2: 1 +clone_color: rabbitmq-server:1 allocation score on rhos6-node3: 0 +clone_color: rabbitmq-server:2 allocation score on rhos6-node1: 0 +clone_color: rabbitmq-server:2 allocation score on rhos6-node2: 0 +clone_color: rabbitmq-server:2 allocation score on rhos6-node3: 1 +clone_color: swift-account-clone allocation score on rhos6-node1: 0 +clone_color: swift-account-clone allocation score on rhos6-node2: 0 +clone_color: swift-account-clone allocation score on rhos6-node3: 0 +clone_color: swift-account:0 allocation score on rhos6-node1: 1 +clone_color: swift-account:0 allocation score on rhos6-node2: 0 +clone_color: swift-account:0 allocation score on rhos6-node3: 0 +clone_color: swift-account:1 allocation score on rhos6-node1: 0 +clone_color: swift-account:1 allocation score on rhos6-node2: 1 +clone_color: swift-account:1 allocation score on rhos6-node3: 0 +clone_color: swift-account:2 allocation score on rhos6-node1: 0 +clone_color: swift-account:2 allocation score on rhos6-node2: 0 +clone_color: swift-account:2 allocation score on rhos6-node3: 1 +clone_color: swift-container-clone allocation score on rhos6-node1: 0 +clone_color: swift-container-clone allocation score on rhos6-node2: 0 +clone_color: swift-container-clone allocation score on rhos6-node3: 0 +clone_color: swift-container:0 allocation score on rhos6-node1: 1 +clone_color: swift-container:0 allocation score on rhos6-node2: 0 +clone_color: swift-container:0 allocation score on rhos6-node3: 0 +clone_color: swift-container:1 allocation score on rhos6-node1: 0 +clone_color: swift-container:1 allocation score on rhos6-node2: 1 +clone_color: swift-container:1 allocation score on rhos6-node3: 0 +clone_color: swift-container:2 allocation score on rhos6-node1: 0 +clone_color: swift-container:2 allocation score on rhos6-node2: 0 +clone_color: swift-container:2 allocation score on rhos6-node3: 1 +clone_color: swift-fs-clone allocation score on rhos6-node1: 0 +clone_color: swift-fs-clone allocation score on rhos6-node2: 0 +clone_color: swift-fs-clone allocation score on rhos6-node3: 0 +clone_color: swift-fs:0 allocation score on rhos6-node1: 1 +clone_color: swift-fs:0 allocation score on rhos6-node2: 0 +clone_color: swift-fs:0 allocation score on rhos6-node3: 0 +clone_color: swift-fs:1 allocation score on rhos6-node1: 0 +clone_color: swift-fs:1 allocation score on rhos6-node2: 1 +clone_color: swift-fs:1 allocation score on rhos6-node3: 0 +clone_color: swift-fs:2 allocation score on rhos6-node1: 0 +clone_color: swift-fs:2 allocation score on rhos6-node2: 0 +clone_color: swift-fs:2 allocation score on rhos6-node3: 1 +clone_color: swift-object-clone allocation score on rhos6-node1: 0 +clone_color: swift-object-clone allocation score on rhos6-node2: 0 +clone_color: swift-object-clone allocation score on rhos6-node3: 0 +clone_color: swift-object:0 allocation score on rhos6-node1: 1 +clone_color: swift-object:0 allocation score on rhos6-node2: 0 +clone_color: swift-object:0 allocation score on rhos6-node3: 0 +clone_color: swift-object:1 allocation score on rhos6-node1: 0 +clone_color: swift-object:1 allocation score on rhos6-node2: 1 +clone_color: swift-object:1 allocation score on rhos6-node3: 0 +clone_color: swift-object:2 allocation score on rhos6-node1: 0 +clone_color: swift-object:2 allocation score on rhos6-node2: 0 +clone_color: swift-object:2 allocation score on rhos6-node3: 1 +clone_color: swift-proxy-clone allocation score on rhos6-node1: 0 +clone_color: swift-proxy-clone allocation score on rhos6-node2: 0 +clone_color: swift-proxy-clone allocation score on rhos6-node3: 0 +clone_color: swift-proxy:0 allocation score on rhos6-node1: 1 +clone_color: swift-proxy:0 allocation score on rhos6-node2: 0 +clone_color: swift-proxy:0 allocation score on rhos6-node3: 0 +clone_color: swift-proxy:1 allocation score on rhos6-node1: 0 +clone_color: swift-proxy:1 allocation score on rhos6-node2: 1 +clone_color: swift-proxy:1 allocation score on rhos6-node3: 0 +clone_color: swift-proxy:2 allocation score on rhos6-node1: 0 +clone_color: swift-proxy:2 allocation score on rhos6-node2: 0 +clone_color: swift-proxy:2 allocation score on rhos6-node3: 1 +galera:0 promotion score on rhos6-node1: 100 +galera:1 promotion score on rhos6-node2: 100 +galera:2 promotion score on rhos6-node3: 100 +native_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-alarm-evaluator:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-alarm-evaluator:1 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-alarm-evaluator:2 allocation score on rhos6-node3: 1 +native_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-alarm-notifier:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-alarm-notifier:1 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-alarm-notifier:2 allocation score on rhos6-node3: 1 +native_color: ceilometer-api:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-api:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-api:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-api:1 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-api:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-api:1 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-api:2 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-api:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-api:2 allocation score on rhos6-node3: 1 +native_color: ceilometer-central allocation score on rhos6-node1: 0 +native_color: ceilometer-central allocation score on rhos6-node2: 0 +native_color: ceilometer-central allocation score on rhos6-node3: 0 +native_color: ceilometer-collector:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-collector:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-collector:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-collector:1 allocation score on rhos6-node1: 0 +native_color: ceilometer-collector:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-collector:1 allocation score on rhos6-node3: 0 +native_color: ceilometer-collector:2 allocation score on rhos6-node1: 0 +native_color: ceilometer-collector:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-collector:2 allocation score on rhos6-node3: 1 +native_color: ceilometer-delay:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-delay:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-delay:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-delay:1 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-delay:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-delay:1 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-delay:2 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-delay:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-delay:2 allocation score on rhos6-node3: 1 +native_color: ceilometer-notification:0 allocation score on rhos6-node1: 1 +native_color: ceilometer-notification:0 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-notification:0 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-notification:1 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-notification:1 allocation score on rhos6-node2: 1 +native_color: ceilometer-notification:1 allocation score on rhos6-node3: -INFINITY +native_color: ceilometer-notification:2 allocation score on rhos6-node1: -INFINITY +native_color: ceilometer-notification:2 allocation score on rhos6-node2: -INFINITY +native_color: ceilometer-notification:2 allocation score on rhos6-node3: 1 +native_color: cinder-api allocation score on rhos6-node1: 0 +native_color: cinder-api allocation score on rhos6-node2: 0 +native_color: cinder-api allocation score on rhos6-node3: 0 +native_color: cinder-scheduler allocation score on rhos6-node1: 0 +native_color: cinder-scheduler allocation score on rhos6-node2: -INFINITY +native_color: cinder-scheduler allocation score on rhos6-node3: -INFINITY +native_color: cinder-volume allocation score on rhos6-node1: 0 +native_color: cinder-volume allocation score on rhos6-node2: -INFINITY +native_color: cinder-volume allocation score on rhos6-node3: -INFINITY +native_color: galera:0 allocation score on rhos6-node1: 101 +native_color: galera:0 allocation score on rhos6-node2: 0 +native_color: galera:0 allocation score on rhos6-node3: 0 +native_color: galera:1 allocation score on rhos6-node1: -INFINITY +native_color: galera:1 allocation score on rhos6-node2: 101 +native_color: galera:1 allocation score on rhos6-node3: 0 +native_color: galera:2 allocation score on rhos6-node1: -INFINITY +native_color: galera:2 allocation score on rhos6-node2: -INFINITY +native_color: galera:2 allocation score on rhos6-node3: 101 +native_color: glance-api:0 allocation score on rhos6-node1: 1 +native_color: glance-api:0 allocation score on rhos6-node2: -INFINITY +native_color: glance-api:0 allocation score on rhos6-node3: -INFINITY +native_color: glance-api:1 allocation score on rhos6-node1: -INFINITY +native_color: glance-api:1 allocation score on rhos6-node2: 1 +native_color: glance-api:1 allocation score on rhos6-node3: -INFINITY +native_color: glance-api:2 allocation score on rhos6-node1: -INFINITY +native_color: glance-api:2 allocation score on rhos6-node2: -INFINITY +native_color: glance-api:2 allocation score on rhos6-node3: 1 +native_color: glance-fs:0 allocation score on rhos6-node1: 1 +native_color: glance-fs:0 allocation score on rhos6-node2: 0 +native_color: glance-fs:0 allocation score on rhos6-node3: 0 +native_color: glance-fs:1 allocation score on rhos6-node1: -INFINITY +native_color: glance-fs:1 allocation score on rhos6-node2: 1 +native_color: glance-fs:1 allocation score on rhos6-node3: 0 +native_color: glance-fs:2 allocation score on rhos6-node1: -INFINITY +native_color: glance-fs:2 allocation score on rhos6-node2: -INFINITY +native_color: glance-fs:2 allocation score on rhos6-node3: 1 +native_color: glance-registry:0 allocation score on rhos6-node1: 1 +native_color: glance-registry:0 allocation score on rhos6-node2: -INFINITY +native_color: glance-registry:0 allocation score on rhos6-node3: -INFINITY +native_color: glance-registry:1 allocation score on rhos6-node1: -INFINITY +native_color: glance-registry:1 allocation score on rhos6-node2: 1 +native_color: glance-registry:1 allocation score on rhos6-node3: -INFINITY +native_color: glance-registry:2 allocation score on rhos6-node1: -INFINITY +native_color: glance-registry:2 allocation score on rhos6-node2: -INFINITY +native_color: glance-registry:2 allocation score on rhos6-node3: 1 +native_color: heat-api-cfn:0 allocation score on rhos6-node1: 1 +native_color: heat-api-cfn:0 allocation score on rhos6-node2: -INFINITY +native_color: heat-api-cfn:0 allocation score on rhos6-node3: -INFINITY +native_color: heat-api-cfn:1 allocation score on rhos6-node1: -INFINITY +native_color: heat-api-cfn:1 allocation score on rhos6-node2: 1 +native_color: heat-api-cfn:1 allocation score on rhos6-node3: -INFINITY +native_color: heat-api-cfn:2 allocation score on rhos6-node1: -INFINITY +native_color: heat-api-cfn:2 allocation score on rhos6-node2: -INFINITY +native_color: heat-api-cfn:2 allocation score on rhos6-node3: 1 +native_color: heat-api-cloudwatch:0 allocation score on rhos6-node1: 1 +native_color: heat-api-cloudwatch:0 allocation score on rhos6-node2: -INFINITY +native_color: heat-api-cloudwatch:0 allocation score on rhos6-node3: -INFINITY +native_color: heat-api-cloudwatch:1 allocation score on rhos6-node1: -INFINITY +native_color: heat-api-cloudwatch:1 allocation score on rhos6-node2: 1 +native_color: heat-api-cloudwatch:1 allocation score on rhos6-node3: -INFINITY +native_color: heat-api-cloudwatch:2 allocation score on rhos6-node1: -INFINITY +native_color: heat-api-cloudwatch:2 allocation score on rhos6-node2: -INFINITY +native_color: heat-api-cloudwatch:2 allocation score on rhos6-node3: 1 +native_color: heat-api:0 allocation score on rhos6-node1: 1 +native_color: heat-api:0 allocation score on rhos6-node2: -INFINITY +native_color: heat-api:0 allocation score on rhos6-node3: -INFINITY +native_color: heat-api:1 allocation score on rhos6-node1: 0 +native_color: heat-api:1 allocation score on rhos6-node2: 1 +native_color: heat-api:1 allocation score on rhos6-node3: 0 +native_color: heat-api:2 allocation score on rhos6-node1: 0 +native_color: heat-api:2 allocation score on rhos6-node2: -INFINITY +native_color: heat-api:2 allocation score on rhos6-node3: 1 +native_color: heat-engine allocation score on rhos6-node1: 0 +native_color: heat-engine allocation score on rhos6-node2: 0 +native_color: heat-engine allocation score on rhos6-node3: 0 +native_color: horizon:0 allocation score on rhos6-node1: 1 +native_color: horizon:0 allocation score on rhos6-node2: -INFINITY +native_color: horizon:0 allocation score on rhos6-node3: -INFINITY +native_color: horizon:1 allocation score on rhos6-node1: 0 +native_color: horizon:1 allocation score on rhos6-node2: 1 +native_color: horizon:1 allocation score on rhos6-node3: -INFINITY +native_color: horizon:2 allocation score on rhos6-node1: 0 +native_color: horizon:2 allocation score on rhos6-node2: 0 +native_color: horizon:2 allocation score on rhos6-node3: 1 +native_color: keystone:0 allocation score on rhos6-node1: -INFINITY +native_color: keystone:0 allocation score on rhos6-node2: -INFINITY +native_color: keystone:0 allocation score on rhos6-node3: -INFINITY +native_color: keystone:1 allocation score on rhos6-node1: -INFINITY +native_color: keystone:1 allocation score on rhos6-node2: -INFINITY +native_color: keystone:1 allocation score on rhos6-node3: -INFINITY +native_color: keystone:2 allocation score on rhos6-node1: -INFINITY +native_color: keystone:2 allocation score on rhos6-node2: -INFINITY +native_color: keystone:2 allocation score on rhos6-node3: -INFINITY +native_color: lb-haproxy:0 allocation score on rhos6-node1: 1 +native_color: lb-haproxy:0 allocation score on rhos6-node2: 0 +native_color: lb-haproxy:0 allocation score on rhos6-node3: 0 +native_color: lb-haproxy:1 allocation score on rhos6-node1: -INFINITY +native_color: lb-haproxy:1 allocation score on rhos6-node2: 1 +native_color: lb-haproxy:1 allocation score on rhos6-node3: 0 +native_color: lb-haproxy:2 allocation score on rhos6-node1: -INFINITY +native_color: lb-haproxy:2 allocation score on rhos6-node2: -INFINITY +native_color: lb-haproxy:2 allocation score on rhos6-node3: 1 +native_color: memcached:0 allocation score on rhos6-node1: 1 +native_color: memcached:0 allocation score on rhos6-node2: 0 +native_color: memcached:0 allocation score on rhos6-node3: 0 +native_color: memcached:1 allocation score on rhos6-node1: -INFINITY +native_color: memcached:1 allocation score on rhos6-node2: 1 +native_color: memcached:1 allocation score on rhos6-node3: 0 +native_color: memcached:2 allocation score on rhos6-node1: -INFINITY +native_color: memcached:2 allocation score on rhos6-node2: -INFINITY +native_color: memcached:2 allocation score on rhos6-node3: 1 +native_color: mongodb:0 allocation score on rhos6-node1: 1 +native_color: mongodb:0 allocation score on rhos6-node2: 0 +native_color: mongodb:0 allocation score on rhos6-node3: 0 +native_color: mongodb:1 allocation score on rhos6-node1: -INFINITY +native_color: mongodb:1 allocation score on rhos6-node2: 1 +native_color: mongodb:1 allocation score on rhos6-node3: 0 +native_color: mongodb:2 allocation score on rhos6-node1: -INFINITY +native_color: mongodb:2 allocation score on rhos6-node2: -INFINITY +native_color: mongodb:2 allocation score on rhos6-node3: 1 +native_color: neutron-dhcp-agent:0 allocation score on rhos6-node1: 1 +native_color: neutron-dhcp-agent:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-dhcp-agent:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-dhcp-agent:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-dhcp-agent:1 allocation score on rhos6-node2: 1 +native_color: neutron-dhcp-agent:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-dhcp-agent:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-dhcp-agent:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-dhcp-agent:2 allocation score on rhos6-node3: 1 +native_color: neutron-l3-agent:0 allocation score on rhos6-node1: 1 +native_color: neutron-l3-agent:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-l3-agent:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-l3-agent:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-l3-agent:1 allocation score on rhos6-node2: 1 +native_color: neutron-l3-agent:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-l3-agent:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-l3-agent:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-l3-agent:2 allocation score on rhos6-node3: 1 +native_color: neutron-metadata-agent:0 allocation score on rhos6-node1: 1 +native_color: neutron-metadata-agent:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-metadata-agent:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-metadata-agent:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-metadata-agent:1 allocation score on rhos6-node2: 1 +native_color: neutron-metadata-agent:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-metadata-agent:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-metadata-agent:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-metadata-agent:2 allocation score on rhos6-node3: 1 +native_color: neutron-netns-cleanup:0 allocation score on rhos6-node1: 1 +native_color: neutron-netns-cleanup:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-netns-cleanup:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-netns-cleanup:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-netns-cleanup:1 allocation score on rhos6-node2: 1 +native_color: neutron-netns-cleanup:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-netns-cleanup:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-netns-cleanup:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-netns-cleanup:2 allocation score on rhos6-node3: 1 +native_color: neutron-openvswitch-agent:0 allocation score on rhos6-node1: 1 +native_color: neutron-openvswitch-agent:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-openvswitch-agent:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-openvswitch-agent:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-openvswitch-agent:1 allocation score on rhos6-node2: 1 +native_color: neutron-openvswitch-agent:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-openvswitch-agent:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-openvswitch-agent:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-openvswitch-agent:2 allocation score on rhos6-node3: 1 +native_color: neutron-ovs-cleanup:0 allocation score on rhos6-node1: 1 +native_color: neutron-ovs-cleanup:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-ovs-cleanup:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-ovs-cleanup:1 allocation score on rhos6-node1: -INFINITY +native_color: neutron-ovs-cleanup:1 allocation score on rhos6-node2: 1 +native_color: neutron-ovs-cleanup:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-ovs-cleanup:2 allocation score on rhos6-node1: -INFINITY +native_color: neutron-ovs-cleanup:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-ovs-cleanup:2 allocation score on rhos6-node3: 1 +native_color: neutron-scale:0 allocation score on rhos6-node1: 0 +native_color: neutron-scale:0 allocation score on rhos6-node2: 0 +native_color: neutron-scale:0 allocation score on rhos6-node3: 1 +native_color: neutron-scale:1 allocation score on rhos6-node1: 0 +native_color: neutron-scale:1 allocation score on rhos6-node2: 1 +native_color: neutron-scale:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-scale:2 allocation score on rhos6-node1: 1 +native_color: neutron-scale:2 allocation score on rhos6-node2: -INFINITY +native_color: neutron-scale:2 allocation score on rhos6-node3: -INFINITY +native_color: neutron-server:0 allocation score on rhos6-node1: 1 +native_color: neutron-server:0 allocation score on rhos6-node2: -INFINITY +native_color: neutron-server:0 allocation score on rhos6-node3: -INFINITY +native_color: neutron-server:1 allocation score on rhos6-node1: 0 +native_color: neutron-server:1 allocation score on rhos6-node2: 1 +native_color: neutron-server:1 allocation score on rhos6-node3: -INFINITY +native_color: neutron-server:2 allocation score on rhos6-node1: 0 +native_color: neutron-server:2 allocation score on rhos6-node2: 0 +native_color: neutron-server:2 allocation score on rhos6-node3: 1 +native_color: node1-fence allocation score on rhos6-node1: 0 +native_color: node1-fence allocation score on rhos6-node2: 0 +native_color: node1-fence allocation score on rhos6-node3: 0 +native_color: node2-fence allocation score on rhos6-node1: 0 +native_color: node2-fence allocation score on rhos6-node2: 0 +native_color: node2-fence allocation score on rhos6-node3: 0 +native_color: node3-fence allocation score on rhos6-node1: 0 +native_color: node3-fence allocation score on rhos6-node2: 0 +native_color: node3-fence allocation score on rhos6-node3: 0 +native_color: nova-api:0 allocation score on rhos6-node1: 1 +native_color: nova-api:0 allocation score on rhos6-node2: -INFINITY +native_color: nova-api:0 allocation score on rhos6-node3: -INFINITY +native_color: nova-api:1 allocation score on rhos6-node1: -INFINITY +native_color: nova-api:1 allocation score on rhos6-node2: 1 +native_color: nova-api:1 allocation score on rhos6-node3: -INFINITY +native_color: nova-api:2 allocation score on rhos6-node1: -INFINITY +native_color: nova-api:2 allocation score on rhos6-node2: -INFINITY +native_color: nova-api:2 allocation score on rhos6-node3: 1 +native_color: nova-conductor:0 allocation score on rhos6-node1: 1 +native_color: nova-conductor:0 allocation score on rhos6-node2: -INFINITY +native_color: nova-conductor:0 allocation score on rhos6-node3: -INFINITY +native_color: nova-conductor:1 allocation score on rhos6-node1: -INFINITY +native_color: nova-conductor:1 allocation score on rhos6-node2: 1 +native_color: nova-conductor:1 allocation score on rhos6-node3: -INFINITY +native_color: nova-conductor:2 allocation score on rhos6-node1: -INFINITY +native_color: nova-conductor:2 allocation score on rhos6-node2: -INFINITY +native_color: nova-conductor:2 allocation score on rhos6-node3: 1 +native_color: nova-consoleauth:0 allocation score on rhos6-node1: 1 +native_color: nova-consoleauth:0 allocation score on rhos6-node2: -INFINITY +native_color: nova-consoleauth:0 allocation score on rhos6-node3: -INFINITY +native_color: nova-consoleauth:1 allocation score on rhos6-node1: 0 +native_color: nova-consoleauth:1 allocation score on rhos6-node2: 1 +native_color: nova-consoleauth:1 allocation score on rhos6-node3: -INFINITY +native_color: nova-consoleauth:2 allocation score on rhos6-node1: 0 +native_color: nova-consoleauth:2 allocation score on rhos6-node2: 0 +native_color: nova-consoleauth:2 allocation score on rhos6-node3: 1 +native_color: nova-novncproxy:0 allocation score on rhos6-node1: 1 +native_color: nova-novncproxy:0 allocation score on rhos6-node2: -INFINITY +native_color: nova-novncproxy:0 allocation score on rhos6-node3: -INFINITY +native_color: nova-novncproxy:1 allocation score on rhos6-node1: -INFINITY +native_color: nova-novncproxy:1 allocation score on rhos6-node2: 1 +native_color: nova-novncproxy:1 allocation score on rhos6-node3: -INFINITY +native_color: nova-novncproxy:2 allocation score on rhos6-node1: -INFINITY +native_color: nova-novncproxy:2 allocation score on rhos6-node2: -INFINITY +native_color: nova-novncproxy:2 allocation score on rhos6-node3: 1 +native_color: nova-scheduler:0 allocation score on rhos6-node1: 1 +native_color: nova-scheduler:0 allocation score on rhos6-node2: -INFINITY +native_color: nova-scheduler:0 allocation score on rhos6-node3: -INFINITY +native_color: nova-scheduler:1 allocation score on rhos6-node1: -INFINITY +native_color: nova-scheduler:1 allocation score on rhos6-node2: 1 +native_color: nova-scheduler:1 allocation score on rhos6-node3: -INFINITY +native_color: nova-scheduler:2 allocation score on rhos6-node1: -INFINITY +native_color: nova-scheduler:2 allocation score on rhos6-node2: -INFINITY +native_color: nova-scheduler:2 allocation score on rhos6-node3: 1 +native_color: rabbitmq-server:0 allocation score on rhos6-node1: 1 +native_color: rabbitmq-server:0 allocation score on rhos6-node2: 0 +native_color: rabbitmq-server:0 allocation score on rhos6-node3: 0 +native_color: rabbitmq-server:1 allocation score on rhos6-node1: -INFINITY +native_color: rabbitmq-server:1 allocation score on rhos6-node2: 1 +native_color: rabbitmq-server:1 allocation score on rhos6-node3: 0 +native_color: rabbitmq-server:2 allocation score on rhos6-node1: -INFINITY +native_color: rabbitmq-server:2 allocation score on rhos6-node2: -INFINITY +native_color: rabbitmq-server:2 allocation score on rhos6-node3: 1 +native_color: swift-account:0 allocation score on rhos6-node1: 1 +native_color: swift-account:0 allocation score on rhos6-node2: -INFINITY +native_color: swift-account:0 allocation score on rhos6-node3: -INFINITY +native_color: swift-account:1 allocation score on rhos6-node1: -INFINITY +native_color: swift-account:1 allocation score on rhos6-node2: 1 +native_color: swift-account:1 allocation score on rhos6-node3: -INFINITY +native_color: swift-account:2 allocation score on rhos6-node1: -INFINITY +native_color: swift-account:2 allocation score on rhos6-node2: -INFINITY +native_color: swift-account:2 allocation score on rhos6-node3: 1 +native_color: swift-container:0 allocation score on rhos6-node1: 1 +native_color: swift-container:0 allocation score on rhos6-node2: -INFINITY +native_color: swift-container:0 allocation score on rhos6-node3: -INFINITY +native_color: swift-container:1 allocation score on rhos6-node1: -INFINITY +native_color: swift-container:1 allocation score on rhos6-node2: 1 +native_color: swift-container:1 allocation score on rhos6-node3: -INFINITY +native_color: swift-container:2 allocation score on rhos6-node1: -INFINITY +native_color: swift-container:2 allocation score on rhos6-node2: -INFINITY +native_color: swift-container:2 allocation score on rhos6-node3: 1 +native_color: swift-fs:0 allocation score on rhos6-node1: 1 +native_color: swift-fs:0 allocation score on rhos6-node2: -INFINITY +native_color: swift-fs:0 allocation score on rhos6-node3: -INFINITY +native_color: swift-fs:1 allocation score on rhos6-node1: 0 +native_color: swift-fs:1 allocation score on rhos6-node2: 1 +native_color: swift-fs:1 allocation score on rhos6-node3: 0 +native_color: swift-fs:2 allocation score on rhos6-node1: 0 +native_color: swift-fs:2 allocation score on rhos6-node2: -INFINITY +native_color: swift-fs:2 allocation score on rhos6-node3: 1 +native_color: swift-object-expirer allocation score on rhos6-node1: 0 +native_color: swift-object-expirer allocation score on rhos6-node2: 0 +native_color: swift-object-expirer allocation score on rhos6-node3: 0 +native_color: swift-object:0 allocation score on rhos6-node1: 1 +native_color: swift-object:0 allocation score on rhos6-node2: -INFINITY +native_color: swift-object:0 allocation score on rhos6-node3: -INFINITY +native_color: swift-object:1 allocation score on rhos6-node1: -INFINITY +native_color: swift-object:1 allocation score on rhos6-node2: 1 +native_color: swift-object:1 allocation score on rhos6-node3: -INFINITY +native_color: swift-object:2 allocation score on rhos6-node1: -INFINITY +native_color: swift-object:2 allocation score on rhos6-node2: -INFINITY +native_color: swift-object:2 allocation score on rhos6-node3: 1 +native_color: swift-proxy:0 allocation score on rhos6-node1: 1 +native_color: swift-proxy:0 allocation score on rhos6-node2: -INFINITY +native_color: swift-proxy:0 allocation score on rhos6-node3: -INFINITY +native_color: swift-proxy:1 allocation score on rhos6-node1: 0 +native_color: swift-proxy:1 allocation score on rhos6-node2: 1 +native_color: swift-proxy:1 allocation score on rhos6-node3: 0 +native_color: swift-proxy:2 allocation score on rhos6-node1: 0 +native_color: swift-proxy:2 allocation score on rhos6-node2: -INFINITY +native_color: swift-proxy:2 allocation score on rhos6-node3: 1 +native_color: vip-ceilometer allocation score on rhos6-node1: 0 +native_color: vip-ceilometer allocation score on rhos6-node2: 0 +native_color: vip-ceilometer allocation score on rhos6-node3: 0 +native_color: vip-cinder allocation score on rhos6-node1: 0 +native_color: vip-cinder allocation score on rhos6-node2: 0 +native_color: vip-cinder allocation score on rhos6-node3: 0 +native_color: vip-db allocation score on rhos6-node1: 0 +native_color: vip-db allocation score on rhos6-node2: 0 +native_color: vip-db allocation score on rhos6-node3: 0 +native_color: vip-glance allocation score on rhos6-node1: 0 +native_color: vip-glance allocation score on rhos6-node2: 0 +native_color: vip-glance allocation score on rhos6-node3: 0 +native_color: vip-heat allocation score on rhos6-node1: 0 +native_color: vip-heat allocation score on rhos6-node2: 0 +native_color: vip-heat allocation score on rhos6-node3: 0 +native_color: vip-horizon allocation score on rhos6-node1: 0 +native_color: vip-horizon allocation score on rhos6-node2: 0 +native_color: vip-horizon allocation score on rhos6-node3: 0 +native_color: vip-keystone allocation score on rhos6-node1: 0 +native_color: vip-keystone allocation score on rhos6-node2: 0 +native_color: vip-keystone allocation score on rhos6-node3: 0 +native_color: vip-neutron allocation score on rhos6-node1: 0 +native_color: vip-neutron allocation score on rhos6-node2: 0 +native_color: vip-neutron allocation score on rhos6-node3: 0 +native_color: vip-nova allocation score on rhos6-node1: 0 +native_color: vip-nova allocation score on rhos6-node2: 0 +native_color: vip-nova allocation score on rhos6-node3: 0 +native_color: vip-qpid allocation score on rhos6-node1: 0 +native_color: vip-qpid allocation score on rhos6-node2: 0 +native_color: vip-qpid allocation score on rhos6-node3: 0 +native_color: vip-rabbitmq allocation score on rhos6-node1: 0 +native_color: vip-rabbitmq allocation score on rhos6-node2: 0 +native_color: vip-rabbitmq allocation score on rhos6-node3: 0 +native_color: vip-swift allocation score on rhos6-node1: 0 +native_color: vip-swift allocation score on rhos6-node2: 0 +native_color: vip-swift allocation score on rhos6-node3: 0 diff --git a/pengine/test10/complex_enforce_colo.summary b/pengine/test10/complex_enforce_colo.summary new file mode 100644 index 0000000000..6f64364e2b --- /dev/null +++ b/pengine/test10/complex_enforce_colo.summary @@ -0,0 +1,452 @@ + +Current cluster status: +Online: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + + node1-fence (stonith:fence_xvm): Started rhos6-node1 + node2-fence (stonith:fence_xvm): Started rhos6-node2 + node3-fence (stonith:fence_xvm): Started rhos6-node3 + Clone Set: lb-haproxy-clone [lb-haproxy] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + vip-db (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-rabbitmq (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-qpid (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-keystone (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-glance (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-cinder (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-swift (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-neutron (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-nova (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-horizon (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-heat (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-ceilometer (ocf::heartbeat:IPaddr2): Started rhos6-node3 + Master/Slave Set: galera-master [galera] + Masters: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: rabbitmq-server-clone [rabbitmq-server] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: memcached-clone [memcached] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: mongodb-clone [mongodb] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: keystone-clone [keystone] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-fs-clone [glance-fs] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-registry-clone [glance-registry] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-api-clone [glance-api] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + cinder-api (systemd:openstack-cinder-api): Started rhos6-node1 + cinder-scheduler (systemd:openstack-cinder-scheduler): Started rhos6-node1 + cinder-volume (systemd:openstack-cinder-volume): Started rhos6-node1 + Clone Set: swift-fs-clone [swift-fs] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-account-clone [swift-account] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-container-clone [swift-container] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-object-clone [swift-object] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-proxy-clone [swift-proxy] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + swift-object-expirer (systemd:openstack-swift-object-expirer): Started rhos6-node2 + Clone Set: neutron-server-clone [neutron-server] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-scale-clone [neutron-scale] (unique) + neutron-scale:0 (ocf::neutron:NeutronScale): Started rhos6-node3 + neutron-scale:1 (ocf::neutron:NeutronScale): Started rhos6-node2 + neutron-scale:2 (ocf::neutron:NeutronScale): Started rhos6-node1 + Clone Set: neutron-ovs-cleanup-clone [neutron-ovs-cleanup] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-netns-cleanup-clone [neutron-netns-cleanup] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-openvswitch-agent-clone [neutron-openvswitch-agent] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-dhcp-agent-clone [neutron-dhcp-agent] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-l3-agent-clone [neutron-l3-agent] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-metadata-agent-clone [neutron-metadata-agent] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-consoleauth-clone [nova-consoleauth] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-novncproxy-clone [nova-novncproxy] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-api-clone [nova-api] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-scheduler-clone [nova-scheduler] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-conductor-clone [nova-conductor] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + ceilometer-central (systemd:openstack-ceilometer-central): Started rhos6-node3 + Clone Set: ceilometer-collector-clone [ceilometer-collector] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-api-clone [ceilometer-api] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-delay-clone [ceilometer-delay] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-alarm-evaluator-clone [ceilometer-alarm-evaluator] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-alarm-notifier-clone [ceilometer-alarm-notifier] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-notification-clone [ceilometer-notification] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-clone [heat-api] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-cfn-clone [heat-api-cfn] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-cloudwatch-clone [heat-api-cloudwatch] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + heat-engine (systemd:openstack-heat-engine): Started rhos6-node2 + Clone Set: horizon-clone [horizon] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + +Transition Summary: + * Stop keystone:0 (rhos6-node1) + * Stop keystone:1 (rhos6-node2) + * Stop keystone:2 (rhos6-node3) + * Stop glance-registry:0 (rhos6-node1) + * Stop glance-registry:1 (rhos6-node2) + * Stop glance-registry:2 (rhos6-node3) + * Stop glance-api:0 (rhos6-node1) + * Stop glance-api:1 (rhos6-node2) + * Stop glance-api:2 (rhos6-node3) + * Stop cinder-api (Started rhos6-node1) + * Stop cinder-scheduler (Started rhos6-node1) + * Stop cinder-volume (Started rhos6-node1) + * Stop swift-account:0 (rhos6-node1) + * Stop swift-account:1 (rhos6-node2) + * Stop swift-account:2 (rhos6-node3) + * Stop swift-container:0 (rhos6-node1) + * Stop swift-container:1 (rhos6-node2) + * Stop swift-container:2 (rhos6-node3) + * Stop swift-object:0 (rhos6-node1) + * Stop swift-object:1 (rhos6-node2) + * Stop swift-object:2 (rhos6-node3) + * Stop swift-proxy:0 (rhos6-node1) + * Stop swift-proxy:1 (rhos6-node2) + * Stop swift-proxy:2 (rhos6-node3) + * Stop swift-object-expirer (Started rhos6-node2) + * Stop neutron-server:0 (rhos6-node1) + * Stop neutron-server:1 (rhos6-node2) + * Stop neutron-server:2 (rhos6-node3) + * Stop neutron-scale:0 (rhos6-node3) + * Stop neutron-scale:1 (rhos6-node2) + * Stop neutron-scale:2 (rhos6-node1) + * Stop neutron-ovs-cleanup:0 (rhos6-node1) + * Stop neutron-ovs-cleanup:1 (rhos6-node2) + * Stop neutron-ovs-cleanup:2 (rhos6-node3) + * Stop neutron-netns-cleanup:0 (rhos6-node1) + * Stop neutron-netns-cleanup:1 (rhos6-node2) + * Stop neutron-netns-cleanup:2 (rhos6-node3) + * Stop neutron-openvswitch-agent:0 (rhos6-node1) + * Stop neutron-openvswitch-agent:1 (rhos6-node2) + * Stop neutron-openvswitch-agent:2 (rhos6-node3) + * Stop neutron-dhcp-agent:0 (rhos6-node1) + * Stop neutron-dhcp-agent:1 (rhos6-node2) + * Stop neutron-dhcp-agent:2 (rhos6-node3) + * Stop neutron-l3-agent:0 (rhos6-node1) + * Stop neutron-l3-agent:1 (rhos6-node2) + * Stop neutron-l3-agent:2 (rhos6-node3) + * Stop neutron-metadata-agent:0 (rhos6-node1) + * Stop neutron-metadata-agent:1 (rhos6-node2) + * Stop neutron-metadata-agent:2 (rhos6-node3) + * Stop nova-consoleauth:0 (rhos6-node1) + * Stop nova-consoleauth:1 (rhos6-node2) + * Stop nova-consoleauth:2 (rhos6-node3) + * Stop nova-novncproxy:0 (rhos6-node1) + * Stop nova-novncproxy:1 (rhos6-node2) + * Stop nova-novncproxy:2 (rhos6-node3) + * Stop nova-api:0 (rhos6-node1) + * Stop nova-api:1 (rhos6-node2) + * Stop nova-api:2 (rhos6-node3) + * Stop nova-scheduler:0 (rhos6-node1) + * Stop nova-scheduler:1 (rhos6-node2) + * Stop nova-scheduler:2 (rhos6-node3) + * Stop nova-conductor:0 (rhos6-node1) + * Stop nova-conductor:1 (rhos6-node2) + * Stop nova-conductor:2 (rhos6-node3) + * Stop ceilometer-central (Started rhos6-node3) + * Stop ceilometer-collector:0 (Started rhos6-node1) + * Stop ceilometer-collector:1 (Started rhos6-node2) + * Stop ceilometer-collector:2 (Started rhos6-node3) + * Stop ceilometer-api:0 (Started rhos6-node1) + * Stop ceilometer-api:1 (Started rhos6-node2) + * Stop ceilometer-api:2 (Started rhos6-node3) + * Stop ceilometer-delay:0 (Started rhos6-node1) + * Stop ceilometer-delay:1 (Started rhos6-node2) + * Stop ceilometer-delay:2 (Started rhos6-node3) + * Stop ceilometer-alarm-evaluator:0 (Started rhos6-node1) + * Stop ceilometer-alarm-evaluator:1 (Started rhos6-node2) + * Stop ceilometer-alarm-evaluator:2 (Started rhos6-node3) + * Stop ceilometer-alarm-notifier:0 (Started rhos6-node1) + * Stop ceilometer-alarm-notifier:1 (Started rhos6-node2) + * Stop ceilometer-alarm-notifier:2 (Started rhos6-node3) + * Stop ceilometer-notification:0 (Started rhos6-node1) + * Stop ceilometer-notification:1 (Started rhos6-node2) + * Stop ceilometer-notification:2 (Started rhos6-node3) + * Stop heat-api:0 (Started rhos6-node1) + * Stop heat-api:1 (Started rhos6-node2) + * Stop heat-api:2 (Started rhos6-node3) + * Stop heat-api-cfn:0 (Started rhos6-node1) + * Stop heat-api-cfn:1 (Started rhos6-node2) + * Stop heat-api-cfn:2 (Started rhos6-node3) + * Stop heat-api-cloudwatch:0 (Started rhos6-node1) + * Stop heat-api-cloudwatch:1 (Started rhos6-node2) + * Stop heat-api-cloudwatch:2 (Started rhos6-node3) + * Stop heat-engine (Started rhos6-node2) + +Executing cluster transition: + * Pseudo action: glance-api-clone_stop_0 + * Resource action: cinder-volume stop on rhos6-node1 + * Pseudo action: swift-object-clone_stop_0 + * Resource action: swift-object-expirer stop on rhos6-node2 + * Pseudo action: neutron-metadata-agent-clone_stop_0 + * Pseudo action: nova-conductor-clone_stop_0 + * Resource action: heat-engine stop on rhos6-node2 + * Resource action: glance-api stop on rhos6-node1 + * Resource action: glance-api stop on rhos6-node2 + * Resource action: glance-api stop on rhos6-node3 + * Pseudo action: glance-api-clone_stopped_0 + * Resource action: cinder-scheduler stop on rhos6-node1 + * Resource action: swift-object stop on rhos6-node1 + * Resource action: swift-object stop on rhos6-node2 + * Resource action: swift-object stop on rhos6-node3 + * Pseudo action: swift-object-clone_stopped_0 + * Pseudo action: swift-proxy-clone_stop_0 + * Resource action: neutron-metadata-agent stop on rhos6-node1 + * Resource action: neutron-metadata-agent stop on rhos6-node2 + * Resource action: neutron-metadata-agent stop on rhos6-node3 + * Pseudo action: neutron-metadata-agent-clone_stopped_0 + * Resource action: nova-conductor stop on rhos6-node1 + * Resource action: nova-conductor stop on rhos6-node2 + * Resource action: nova-conductor stop on rhos6-node3 + * Pseudo action: nova-conductor-clone_stopped_0 + * Pseudo action: heat-api-cloudwatch-clone_stop_0 + * Pseudo action: glance-registry-clone_stop_0 + * Resource action: cinder-api stop on rhos6-node1 + * Pseudo action: swift-container-clone_stop_0 + * Resource action: swift-proxy stop on rhos6-node1 + * Resource action: swift-proxy stop on rhos6-node2 + * Resource action: swift-proxy stop on rhos6-node3 + * Pseudo action: swift-proxy-clone_stopped_0 + * Pseudo action: neutron-l3-agent-clone_stop_0 + * Pseudo action: nova-scheduler-clone_stop_0 + * Resource action: heat-api-cloudwatch stop on rhos6-node1 + * Resource action: heat-api-cloudwatch stop on rhos6-node2 + * Resource action: heat-api-cloudwatch stop on rhos6-node3 + * Pseudo action: heat-api-cloudwatch-clone_stopped_0 + * Resource action: glance-registry stop on rhos6-node1 + * Resource action: glance-registry stop on rhos6-node2 + * Resource action: glance-registry stop on rhos6-node3 + * Pseudo action: glance-registry-clone_stopped_0 + * Resource action: swift-container stop on rhos6-node1 + * Resource action: swift-container stop on rhos6-node2 + * Resource action: swift-container stop on rhos6-node3 + * Pseudo action: swift-container-clone_stopped_0 + * Resource action: neutron-l3-agent stop on rhos6-node1 + * Resource action: neutron-l3-agent stop on rhos6-node2 + * Resource action: neutron-l3-agent stop on rhos6-node3 + * Pseudo action: neutron-l3-agent-clone_stopped_0 + * Resource action: nova-scheduler stop on rhos6-node1 + * Resource action: nova-scheduler stop on rhos6-node2 + * Resource action: nova-scheduler stop on rhos6-node3 + * Pseudo action: nova-scheduler-clone_stopped_0 + * Pseudo action: heat-api-cfn-clone_stop_0 + * Pseudo action: swift-account-clone_stop_0 + * Pseudo action: neutron-dhcp-agent-clone_stop_0 + * Pseudo action: nova-api-clone_stop_0 + * Resource action: heat-api-cfn stop on rhos6-node1 + * Resource action: heat-api-cfn stop on rhos6-node2 + * Resource action: heat-api-cfn stop on rhos6-node3 + * Pseudo action: heat-api-cfn-clone_stopped_0 + * Resource action: swift-account stop on rhos6-node1 + * Resource action: swift-account stop on rhos6-node2 + * Resource action: swift-account stop on rhos6-node3 + * Pseudo action: swift-account-clone_stopped_0 + * Resource action: neutron-dhcp-agent stop on rhos6-node1 + * Resource action: neutron-dhcp-agent stop on rhos6-node2 + * Resource action: neutron-dhcp-agent stop on rhos6-node3 + * Pseudo action: neutron-dhcp-agent-clone_stopped_0 + * Resource action: nova-api stop on rhos6-node1 + * Resource action: nova-api stop on rhos6-node2 + * Resource action: nova-api stop on rhos6-node3 + * Pseudo action: nova-api-clone_stopped_0 + * Pseudo action: heat-api-clone_stop_0 + * Pseudo action: neutron-openvswitch-agent-clone_stop_0 + * Pseudo action: nova-novncproxy-clone_stop_0 + * Resource action: heat-api stop on rhos6-node1 + * Resource action: heat-api stop on rhos6-node2 + * Resource action: heat-api stop on rhos6-node3 + * Pseudo action: heat-api-clone_stopped_0 + * Resource action: neutron-openvswitch-agent stop on rhos6-node1 + * Resource action: neutron-openvswitch-agent stop on rhos6-node2 + * Resource action: neutron-openvswitch-agent stop on rhos6-node3 + * Pseudo action: neutron-openvswitch-agent-clone_stopped_0 + * Resource action: nova-novncproxy stop on rhos6-node1 + * Resource action: nova-novncproxy stop on rhos6-node2 + * Resource action: nova-novncproxy stop on rhos6-node3 + * Pseudo action: nova-novncproxy-clone_stopped_0 + * Pseudo action: ceilometer-notification-clone_stop_0 + * Pseudo action: neutron-netns-cleanup-clone_stop_0 + * Pseudo action: nova-consoleauth-clone_stop_0 + * Resource action: ceilometer-notification stop on rhos6-node1 + * Resource action: ceilometer-notification stop on rhos6-node2 + * Resource action: ceilometer-notification stop on rhos6-node3 + * Pseudo action: ceilometer-notification-clone_stopped_0 + * Resource action: neutron-netns-cleanup stop on rhos6-node1 + * Resource action: neutron-netns-cleanup stop on rhos6-node2 + * Resource action: neutron-netns-cleanup stop on rhos6-node3 + * Pseudo action: neutron-netns-cleanup-clone_stopped_0 + * Resource action: nova-consoleauth stop on rhos6-node1 + * Resource action: nova-consoleauth stop on rhos6-node2 + * Resource action: nova-consoleauth stop on rhos6-node3 + * Pseudo action: nova-consoleauth-clone_stopped_0 + * Pseudo action: ceilometer-alarm-notifier-clone_stop_0 + * Pseudo action: neutron-ovs-cleanup-clone_stop_0 + * Resource action: ceilometer-alarm-notifier stop on rhos6-node1 + * Resource action: ceilometer-alarm-notifier stop on rhos6-node2 + * Resource action: ceilometer-alarm-notifier stop on rhos6-node3 + * Pseudo action: ceilometer-alarm-notifier-clone_stopped_0 + * Resource action: neutron-ovs-cleanup stop on rhos6-node1 + * Resource action: neutron-ovs-cleanup stop on rhos6-node2 + * Resource action: neutron-ovs-cleanup stop on rhos6-node3 + * Pseudo action: neutron-ovs-cleanup-clone_stopped_0 + * Pseudo action: ceilometer-alarm-evaluator-clone_stop_0 + * Pseudo action: neutron-scale-clone_stop_0 + * Resource action: ceilometer-alarm-evaluator stop on rhos6-node1 + * Resource action: ceilometer-alarm-evaluator stop on rhos6-node2 + * Resource action: ceilometer-alarm-evaluator stop on rhos6-node3 + * Pseudo action: ceilometer-alarm-evaluator-clone_stopped_0 + * Resource action: neutron-scale:0 stop on rhos6-node3 + * Resource action: neutron-scale:1 stop on rhos6-node2 + * Resource action: neutron-scale:2 stop on rhos6-node1 + * Pseudo action: neutron-scale-clone_stopped_0 + * Pseudo action: ceilometer-delay-clone_stop_0 + * Pseudo action: neutron-server-clone_stop_0 + * Resource action: ceilometer-delay stop on rhos6-node1 + * Resource action: ceilometer-delay stop on rhos6-node2 + * Resource action: ceilometer-delay stop on rhos6-node3 + * Pseudo action: ceilometer-delay-clone_stopped_0 + * Resource action: neutron-server stop on rhos6-node1 + * Resource action: neutron-server stop on rhos6-node2 + * Resource action: neutron-server stop on rhos6-node3 + * Pseudo action: neutron-server-clone_stopped_0 + * Pseudo action: ceilometer-api-clone_stop_0 + * Resource action: ceilometer-api stop on rhos6-node1 + * Resource action: ceilometer-api stop on rhos6-node2 + * Resource action: ceilometer-api stop on rhos6-node3 + * Pseudo action: ceilometer-api-clone_stopped_0 + * Pseudo action: ceilometer-collector-clone_stop_0 + * Resource action: ceilometer-collector stop on rhos6-node1 + * Resource action: ceilometer-collector stop on rhos6-node2 + * Resource action: ceilometer-collector stop on rhos6-node3 + * Pseudo action: ceilometer-collector-clone_stopped_0 + * Resource action: ceilometer-central stop on rhos6-node3 + * Pseudo action: keystone-clone_stop_0 + * Resource action: keystone stop on rhos6-node1 + * Resource action: keystone stop on rhos6-node2 + * Resource action: keystone stop on rhos6-node3 + * Pseudo action: keystone-clone_stopped_0 + * Pseudo action: all_stopped + +Revised cluster status: +Online: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + + node1-fence (stonith:fence_xvm): Started rhos6-node1 + node2-fence (stonith:fence_xvm): Started rhos6-node2 + node3-fence (stonith:fence_xvm): Started rhos6-node3 + Clone Set: lb-haproxy-clone [lb-haproxy] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + vip-db (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-rabbitmq (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-qpid (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-keystone (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-glance (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-cinder (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-swift (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-neutron (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-nova (ocf::heartbeat:IPaddr2): Started rhos6-node3 + vip-horizon (ocf::heartbeat:IPaddr2): Started rhos6-node1 + vip-heat (ocf::heartbeat:IPaddr2): Started rhos6-node2 + vip-ceilometer (ocf::heartbeat:IPaddr2): Started rhos6-node3 + Master/Slave Set: galera-master [galera] + Masters: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: rabbitmq-server-clone [rabbitmq-server] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: memcached-clone [memcached] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: mongodb-clone [mongodb] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: keystone-clone [keystone] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-fs-clone [glance-fs] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-registry-clone [glance-registry] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: glance-api-clone [glance-api] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + cinder-api (systemd:openstack-cinder-api): Stopped + cinder-scheduler (systemd:openstack-cinder-scheduler): Stopped + cinder-volume (systemd:openstack-cinder-volume): Stopped + Clone Set: swift-fs-clone [swift-fs] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-account-clone [swift-account] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-container-clone [swift-container] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-object-clone [swift-object] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: swift-proxy-clone [swift-proxy] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + swift-object-expirer (systemd:openstack-swift-object-expirer): Stopped + Clone Set: neutron-server-clone [neutron-server] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-scale-clone [neutron-scale] (unique) + neutron-scale:0 (ocf::neutron:NeutronScale): Stopped + neutron-scale:1 (ocf::neutron:NeutronScale): Stopped + neutron-scale:2 (ocf::neutron:NeutronScale): Stopped + Clone Set: neutron-ovs-cleanup-clone [neutron-ovs-cleanup] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-netns-cleanup-clone [neutron-netns-cleanup] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-openvswitch-agent-clone [neutron-openvswitch-agent] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-dhcp-agent-clone [neutron-dhcp-agent] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-l3-agent-clone [neutron-l3-agent] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: neutron-metadata-agent-clone [neutron-metadata-agent] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-consoleauth-clone [nova-consoleauth] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-novncproxy-clone [nova-novncproxy] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-api-clone [nova-api] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-scheduler-clone [nova-scheduler] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: nova-conductor-clone [nova-conductor] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + ceilometer-central (systemd:openstack-ceilometer-central): Stopped + Clone Set: ceilometer-collector-clone [ceilometer-collector] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-api-clone [ceilometer-api] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-delay-clone [ceilometer-delay] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-alarm-evaluator-clone [ceilometer-alarm-evaluator] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-alarm-notifier-clone [ceilometer-alarm-notifier] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: ceilometer-notification-clone [ceilometer-notification] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-clone [heat-api] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-cfn-clone [heat-api-cfn] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + Clone Set: heat-api-cloudwatch-clone [heat-api-cloudwatch] + Stopped: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + heat-engine (systemd:openstack-heat-engine): Stopped + Clone Set: horizon-clone [horizon] + Started: [ rhos6-node1 rhos6-node2 rhos6-node3 ] + diff --git a/pengine/test10/complex_enforce_colo.xml b/pengine/test10/complex_enforce_colo.xml new file mode 100644 index 0000000000..a6f9526be9 --- /dev/null +++ b/pengine/test10/complex_enforce_colo.xml @@ -0,0 +1,1461 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/test10/enforce-colo1.dot b/pengine/test10/enforce-colo1.dot new file mode 100644 index 0000000000..68200fead1 --- /dev/null +++ b/pengine/test10/enforce-colo1.dot @@ -0,0 +1,31 @@ + digraph "g" { +"all_stopped" [ style=bold color="green" fontcolor="orange"] +"central_monitor_10000 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] +"central_start_0 rhel7-auto3" -> "central_monitor_10000 rhel7-auto3" [ style = dashed] +"central_start_0 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] +"central_stop_0 rhel7-auto3" -> "all_stopped" [ style = bold] +"central_stop_0 rhel7-auto3" -> "central_start_0 rhel7-auto3" [ style = dashed] +"central_stop_0 rhel7-auto3" -> "keystone-clone_stop_0" [ style = bold] +"central_stop_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] +"engine_monitor_10000 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] +"engine_start_0 rhel7-auto3" -> "engine_monitor_10000 rhel7-auto3" [ style = dashed] +"engine_start_0 rhel7-auto3" [ style=dashed color="red" fontcolor="black"] +"engine_stop_0 rhel7-auto3" -> "all_stopped" [ style = bold] +"engine_stop_0 rhel7-auto3" -> "engine_start_0 rhel7-auto3" [ style = dashed] +"engine_stop_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] +"keystone-clone_stop_0" -> "keystone-clone_stopped_0" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhel7-auto1" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhel7-auto2" [ style = bold] +"keystone-clone_stop_0" -> "keystone_stop_0 rhel7-auto3" [ style = bold] +"keystone-clone_stop_0" [ style=bold color="green" fontcolor="orange"] +"keystone-clone_stopped_0" [ style=bold color="green" fontcolor="orange"] +"keystone_stop_0 rhel7-auto1" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhel7-auto1" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhel7-auto1" [ style=bold color="green" fontcolor="black"] +"keystone_stop_0 rhel7-auto2" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhel7-auto2" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhel7-auto2" [ style=bold color="green" fontcolor="black"] +"keystone_stop_0 rhel7-auto3" -> "all_stopped" [ style = bold] +"keystone_stop_0 rhel7-auto3" -> "keystone-clone_stopped_0" [ style = bold] +"keystone_stop_0 rhel7-auto3" [ style=bold color="green" fontcolor="black"] +} diff --git a/pengine/test10/enforce-colo1.exp b/pengine/test10/enforce-colo1.exp new file mode 100644 index 0000000000..ea8744350f --- /dev/null +++ b/pengine/test10/enforce-colo1.exp @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/test10/enforce-colo1.scores b/pengine/test10/enforce-colo1.scores new file mode 100644 index 0000000000..b3dee71514 --- /dev/null +++ b/pengine/test10/enforce-colo1.scores @@ -0,0 +1,31 @@ +Allocation scores: +clone_color: keystone-clone allocation score on rhel7-auto1: 0 +clone_color: keystone-clone allocation score on rhel7-auto2: 0 +clone_color: keystone-clone allocation score on rhel7-auto3: 0 +clone_color: keystone:0 allocation score on rhel7-auto1: 0 +clone_color: keystone:0 allocation score on rhel7-auto2: 1 +clone_color: keystone:0 allocation score on rhel7-auto3: 0 +clone_color: keystone:1 allocation score on rhel7-auto1: 0 +clone_color: keystone:1 allocation score on rhel7-auto2: 0 +clone_color: keystone:1 allocation score on rhel7-auto3: 1 +clone_color: keystone:2 allocation score on rhel7-auto1: 1 +clone_color: keystone:2 allocation score on rhel7-auto2: 0 +clone_color: keystone:2 allocation score on rhel7-auto3: 0 +native_color: central allocation score on rhel7-auto1: 0 +native_color: central allocation score on rhel7-auto2: 0 +native_color: central allocation score on rhel7-auto3: 0 +native_color: engine allocation score on rhel7-auto1: -INFINITY +native_color: engine allocation score on rhel7-auto2: -INFINITY +native_color: engine allocation score on rhel7-auto3: 0 +native_color: keystone:0 allocation score on rhel7-auto1: -INFINITY +native_color: keystone:0 allocation score on rhel7-auto2: -INFINITY +native_color: keystone:0 allocation score on rhel7-auto3: -INFINITY +native_color: keystone:1 allocation score on rhel7-auto1: -INFINITY +native_color: keystone:1 allocation score on rhel7-auto2: -INFINITY +native_color: keystone:1 allocation score on rhel7-auto3: -INFINITY +native_color: keystone:2 allocation score on rhel7-auto1: -INFINITY +native_color: keystone:2 allocation score on rhel7-auto2: -INFINITY +native_color: keystone:2 allocation score on rhel7-auto3: -INFINITY +native_color: shooter allocation score on rhel7-auto1: 0 +native_color: shooter allocation score on rhel7-auto2: 0 +native_color: shooter allocation score on rhel7-auto3: 0 diff --git a/pengine/test10/enforce-colo1.summary b/pengine/test10/enforce-colo1.summary new file mode 100644 index 0000000000..d8b16ed4a4 --- /dev/null +++ b/pengine/test10/enforce-colo1.summary @@ -0,0 +1,36 @@ + +Current cluster status: +Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] + + shooter (stonith:fence_xvm): Started rhel7-auto2 + engine (ocf::heartbeat:Dummy): Started rhel7-auto3 + Clone Set: keystone-clone [keystone] + Started: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] + central (ocf::heartbeat:Dummy): Started rhel7-auto3 + +Transition Summary: + * Stop engine (Started rhel7-auto3) + * Stop keystone:0 (rhel7-auto2) + * Stop keystone:1 (rhel7-auto3) + * Stop keystone:2 (rhel7-auto1) + * Stop central (Started rhel7-auto3) + +Executing cluster transition: + * Resource action: engine stop on rhel7-auto3 + * Resource action: central stop on rhel7-auto3 + * Pseudo action: keystone-clone_stop_0 + * Resource action: keystone stop on rhel7-auto2 + * Resource action: keystone stop on rhel7-auto3 + * Resource action: keystone stop on rhel7-auto1 + * Pseudo action: keystone-clone_stopped_0 + * Pseudo action: all_stopped + +Revised cluster status: +Online: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] + + shooter (stonith:fence_xvm): Started rhel7-auto2 + engine (ocf::heartbeat:Dummy): Stopped + Clone Set: keystone-clone [keystone] + Stopped: [ rhel7-auto1 rhel7-auto2 rhel7-auto3 ] + central (ocf::heartbeat:Dummy): Stopped + diff --git a/pengine/test10/enforce-colo1.xml b/pengine/test10/enforce-colo1.xml new file mode 100644 index 0000000000..0378f34f34 --- /dev/null +++ b/pengine/test10/enforce-colo1.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +