diff --git a/pengine/allocate.c b/pengine/allocate.c index 6a15d71b79..be9fe0ede7 100644 --- a/pengine/allocate.c +++ b/pengine/allocate.c @@ -1,840 +1,835 @@ /* * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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_order_lh, native_rsc_order_rh, native_rsc_location, native_expand, complex_migrate_reload, complex_stonith_ordering, complex_create_notify_element, }, { group_merge_weights, group_color, group_create_actions, native_create_probe, group_internal_constraints, group_rsc_colocation_lh, group_rsc_colocation_rh, group_rsc_order_lh, group_rsc_order_rh, group_rsc_location, group_expand, complex_migrate_reload, complex_stonith_ordering, complex_create_notify_element, }, { native_merge_weights, clone_color, clone_create_actions, clone_create_probe, clone_internal_constraints, clone_rsc_colocation_lh, clone_rsc_colocation_rh, clone_rsc_order_lh, clone_rsc_order_rh, clone_rsc_location, clone_expand, complex_migrate_reload, complex_stonith_ordering, complex_create_notify_element, }, { native_merge_weights, master_color, master_create_actions, clone_create_probe, master_internal_constraints, clone_rsc_colocation_lh, master_rsc_colocation_rh, clone_rsc_order_lh, clone_rsc_order_rh, clone_rsc_location, clone_expand, complex_migrate_reload, complex_stonith_ordering, complex_create_notify_element, } }; static gboolean check_rsc_parameters(resource_t *rsc, node_t *node, crm_data_t *rsc_entry, pe_working_set_t *data_set) { int attr_lpc = 0; gboolean force_restart = FALSE; gboolean delete_resource = 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; } 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; } return delete_resource; } static gboolean check_action_definition(resource_t *rsc, node_t *active_node, crm_data_t *xml_op, pe_working_set_t *data_set) { char *key = NULL; int interval = 0; const char *interval_s = NULL; gboolean did_change = FALSE; gboolean start_op = FALSE; crm_data_t *params_all = NULL; crm_data_t *params_restart = NULL; GHashTable *local_rsc_params = NULL; char *digest_all_calc = NULL; const char *digest_all = NULL; const char *restart_list = NULL; const char *digest_restart = NULL; char *digest_restart_calc = NULL; action_t *action = NULL; const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK); const char *op_version = crm_element_value(xml_op, XML_ATTR_CRM_VERSION); CRM_CHECK(active_node != NULL, return FALSE); 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); if(interval > 0) { crm_data_t *op_match = NULL; crm_debug_2("Checking parameters for %s", key); op_match = find_rsc_op_entry(rsc, key); if(op_match == NULL && data_set->stop_action_orphans) { /* create a cancel action */ action_t *cancel = NULL; char *cancel_key = NULL; const char *call_id = crm_element_value(xml_op, XML_LRM_ATTR_CALLID); crm_info("Orphan action will be stopped: %s on %s", key, active_node->details->uname); cancel_key = generate_op_key( rsc->id, CRMD_ACTION_CANCEL, interval); cancel = custom_action( rsc, cancel_key, CRMD_ACTION_CANCEL, active_node, FALSE, TRUE, data_set); 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); crm_free(key); key = NULL; return TRUE; } else if(op_match == NULL) { crm_debug("Orphan action detected: %s on %s", key, active_node->details->uname); crm_free(key); key = NULL; return TRUE; } } action = custom_action(rsc, key, task, active_node, TRUE, FALSE, data_set); local_rsc_params = g_hash_table_new_full( g_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str); unpack_instance_attributes( rsc->xml, XML_TAG_ATTR_SETS, active_node->details->attrs, local_rsc_params, NULL, data_set->now); params_all = create_xml_node(NULL, XML_TAG_PARAMS); g_hash_table_foreach(action->extra, hash2field, params_all); g_hash_table_foreach(rsc->parameters, hash2field, params_all); g_hash_table_foreach(action->meta, hash2metafield, params_all); g_hash_table_foreach(local_rsc_params, hash2field, params_all); filter_action_parameters(params_all, op_version); digest_all_calc = calculate_xml_digest(params_all, TRUE, FALSE); digest_all = crm_element_value(xml_op, XML_LRM_ATTR_OP_DIGEST); digest_restart = crm_element_value(xml_op, XML_LRM_ATTR_RESTART_DIGEST); restart_list = crm_element_value(xml_op, XML_LRM_ATTR_OP_RESTART); if(crm_str_eq(task, CRMD_ACTION_START, TRUE)) { start_op = TRUE; } if(start_op && digest_restart) { params_restart = copy_xml(params_all); if(restart_list) { filter_reload_parameters(params_restart, restart_list); } digest_restart_calc = calculate_xml_digest(params_restart, TRUE, FALSE); if(safe_str_neq(digest_restart_calc, digest_restart)) { did_change = TRUE; crm_log_xml_info(params_restart, "params:restart"); crm_warn("Parameters to %s on %s changed: recorded %s vs. %s (restart:%s) %s", key, active_node->details->uname, crm_str(digest_restart), digest_restart_calc, op_version, crm_element_value(xml_op, XML_ATTR_TRANSITION_MAGIC)); key = generate_op_key(rsc->id, task, interval); custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); goto cleanup; } } if(safe_str_neq(digest_all_calc, digest_all)) { action_t *op = NULL; did_change = TRUE; crm_log_xml_info(params_all, "params:all"); crm_warn("Parameters to %s on %s changed: recorded %s vs. %s (all:%s) %s", key, active_node->details->uname, crm_str(digest_all), digest_all_calc, op_version, crm_element_value(xml_op, XML_ATTR_TRANSITION_MAGIC)); key = generate_op_key(rsc->id, task, interval); op = custom_action(rsc, key, task, NULL, FALSE, TRUE, data_set); if(start_op && digest_restart) { op->allow_reload_conversion = TRUE; } else if(interval > 0) { custom_action_order(rsc, start_key(rsc), NULL, NULL, crm_strdup(op->task), op, pe_order_runnable_left, data_set); } } cleanup: free_xml(params_all); free_xml(params_restart); crm_free(digest_all_calc); crm_free(digest_restart_calc); g_hash_table_destroy(local_rsc_params); pe_free_action(action); 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(crm_data_t *rsc_entry, node_t *node, pe_working_set_t *data_set) { const char *id = NULL; const char *task = NULL; int interval = 0; const char *interval_s = NULL; GListPtr op_list = NULL; GListPtr sorted_op_list = NULL; const char *rsc_id = ID(rsc_entry); gboolean is_probe = FALSE; int start_index = 0, stop_index = 0; resource_t *rsc = pe_find_resource(data_set->resources, rsc_id); CRM_CHECK(rsc != NULL, return); CRM_CHECK(node != NULL, return); CRM_CHECK(rsc_id != NULL, return); if(is_set(rsc->flags, pe_rsc_orphan)) { crm_debug_2("Skipping param check for %s: orphan", rsc->id); return; } else if(pe_find_node_id(rsc->running_on, node->details->id) == NULL) { crm_debug_2("Skipping param check for %s: no longer active on %s", rsc->id, node->details->uname); return; } crm_debug_3("Processing %s on %s", rsc->id, node->details->uname); if(check_rsc_parameters(rsc, node, rsc_entry, data_set)) { DeleteRsc(rsc, node, FALSE, data_set); } xml_child_iter_filter( rsc_entry, rsc_op, XML_LRM_TAG_RSC_OP, op_list = g_list_append(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); slist_iter( rsc_op, crm_data_t, sorted_op_list, lpc, if(start_index < stop_index) { /* stopped */ continue; } else if(lpc < start_index) { /* action occurred prior to a start */ continue; } id = ID(rsc_op); is_probe = 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, CRMD_ACTION_STATUS)) { is_probe = TRUE; } if(is_probe || safe_str_eq(task, CRMD_ACTION_START) || interval > 0) { check_action_definition(rsc, node, rsc_op, data_set); } ); g_list_free(sorted_op_list); } static void check_actions(pe_working_set_t *data_set) { const char *id = NULL; node_t *node = NULL; crm_data_t *lrm_rscs = NULL; crm_data_t *status = get_object_root(XML_CIB_TAG_STATUS, data_set->input); xml_child_iter_filter( status, node_state, XML_CIB_TAG_STATE, 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; } else if(can_run_resources(node) == FALSE) { crm_debug_2("Skipping param check for %s: cant run resources", node->details->uname); continue; } crm_debug_2("Processing node %s", node->details->uname); if(node->details->online || data_set->stonith_enabled) { xml_child_iter_filter( lrm_rscs, rsc_entry, XML_LRM_TAG_RESOURCE, if(xml_has_children(rsc_entry)) { check_actions_for(rsc_entry, node, data_set); } ); } ); } static gboolean apply_placement_constraints(pe_working_set_t *data_set) { crm_debug_3("Applying constraints..."); slist_iter( cons, rsc_to_node_t, data_set->placement_constraints, lpc, cons->rsc_lh->cmds->rsc_location(cons->rsc_lh, cons); ); return TRUE; } static void complex_set_cmds(resource_t *rsc) { rsc->cmds = &resource_class_alloc_functions[rsc->variant]; slist_iter( child_rsc, resource_t, rsc->children, lpc, complex_set_cmds(child_rsc); ); } void set_alloc_actions(pe_working_set_t *data_set) { slist_iter( rsc, resource_t, data_set->resources, lpc, complex_set_cmds(rsc); ); } gboolean stage0(pe_working_set_t *data_set) { crm_data_t * cib_constraints = get_object_root( XML_CIB_TAG_CONSTRAINTS, data_set->input); if(data_set->input == NULL) { return FALSE; } cluster_status(data_set); set_alloc_actions(data_set); unpack_constraints(cib_constraints, data_set); return TRUE; } /* * Check nodes for resources started outside of the LRM */ gboolean stage1(pe_working_set_t *data_set) { action_t *probe_complete = NULL; action_t *probe_node_complete = NULL; slist_iter( node, node_t, data_set->nodes, lpc, gboolean force_probe = FALSE; const char *probed = g_hash_table_lookup( node->details->attrs, CRM_OP_PROBED); crm_debug_2("%s probed: %s", node->details->uname, probed); if(node->details->online == FALSE) { continue; } else if(node->details->unclean) { continue; } else if(probe_complete == NULL) { - probe_complete = custom_action( - NULL, crm_strdup(CRM_OP_PROBED), - CRM_OP_PROBED, NULL, FALSE, TRUE, - data_set); - - probe_complete->pseudo = TRUE; - probe_complete->optional = TRUE; + probe_complete = get_pseudo_op(CRM_OP_PROBED, data_set); } if(probed != NULL && crm_is_true(probed) == FALSE) { force_probe = TRUE; } probe_node_complete = custom_action( NULL, crm_strdup(CRM_OP_PROBED), CRM_OP_PROBED, node, FALSE, TRUE, data_set); probe_node_complete->optional = crm_is_true(probed); probe_node_complete->priority = INFINITY; add_hash_param(probe_node_complete->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); custom_action_order(NULL, NULL, probe_node_complete, NULL, NULL, probe_complete, pe_order_optional, data_set); slist_iter( rsc, resource_t, data_set->resources, lpc2, if(rsc->cmds->create_probe( rsc, node, probe_node_complete, force_probe, data_set)) { probe_complete->optional = FALSE; probe_node_complete->optional = FALSE; + custom_action_order( NULL, NULL, probe_complete, rsc, start_key(rsc), NULL, pe_order_optional, data_set); } ); ); return TRUE; } /* * 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) { crm_debug_3("Applying placement constraints"); slist_iter( node, node_t, data_set->nodes, lpc, if(node == NULL) { /* error */ } else if(node->weight >= 0.0 /* global weight */ && node->details->online && node->details->type == node_member) { data_set->max_valid_nodes++; } ); apply_placement_constraints(data_set); return TRUE; } /* * Create internal resource constraints before allocation */ gboolean stage3(pe_working_set_t *data_set) { slist_iter( rsc, resource_t, data_set->resources, lpc, 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; } gboolean stage5(pe_working_set_t *data_set) { /* Take (next) highest resource, assign it and create its actions */ slist_iter( rsc, resource_t, data_set->resources, lpc, rsc->cmds->color(rsc, data_set); rsc->cmds->create_actions(rsc, data_set); ); return TRUE; } /* * Create dependancies for stonith and shutdown operations */ gboolean stage6(pe_working_set_t *data_set) { action_t *dc_down = NULL; action_t *stonith_op = NULL; action_t *last_stonith = NULL; gboolean integrity_lost = FALSE; action_t *ready = get_pseudo_op(STONITH_UP, data_set); action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); crm_debug_3("Processing fencing and shutdown cases"); slist_iter( node, node_t, data_set->nodes, lpc, stonith_op = NULL; if(node->details->unclean && data_set->stonith_enabled && (data_set->have_quorum || data_set->no_quorum_policy == no_quorum_ignore)) { pe_warn("Scheduling Node %s for STONITH", node->details->uname); stonith_op = custom_action( NULL, crm_strdup(CRM_OP_FENCE), CRM_OP_FENCE, node, FALSE, TRUE, data_set); add_hash_param( stonith_op->meta, XML_LRM_ATTR_TARGET, node->details->uname); add_hash_param( stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id); add_hash_param( stonith_op->meta, "stonith_action", data_set->stonith_action); stonith_constraints(node, stonith_op, data_set); order_actions(ready, stonith_op, pe_order_implies_left); order_actions(stonith_op, all_stopped, pe_order_implies_right); if(node->details->is_dc) { dc_down = stonith_op; } else { if(last_stonith) { order_actions(last_stonith, stonith_op, pe_order_implies_left); } last_stonith = stonith_op; } } else if(node->details->online && node->details->shutdown) { action_t *down_op = NULL; crm_info("Scheduling Node %s for shutdown", node->details->uname); down_op = custom_action( NULL, crm_strdup(CRM_OP_SHUTDOWN), CRM_OP_SHUTDOWN, node, FALSE, TRUE, data_set); shutdown_constraints(node, down_op, data_set); 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(data_set->have_quorum == FALSE) { crm_notice("Cannot fence unclean nodes until quorum is" " attained (or no_quorum_policy is set to ignore)"); } else if(data_set->stonith_enabled == FALSE) { pe_warn("YOUR RESOURCES ARE NOW LIKELY COMPROMISED"); pe_err("ENABLE STONITH TO KEEP YOUR RESOURCES SAFE"); } } if(dc_down != NULL) { GListPtr shutdown_matches = find_actions( data_set->actions, CRM_OP_SHUTDOWN, NULL); crm_debug_2("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); slist_iter( node_stop, action_t, shutdown_matches, lpc, 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_implies_left); ); if(last_stonith && dc_down != last_stonith) { order_actions(last_stonith, dc_down, pe_order_implies_left); } g_list_free(shutdown_matches); } 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 * */ gboolean stage7(pe_working_set_t *data_set) { crm_debug_4("Applying ordering constraints"); slist_iter( order, order_constraint_t, data_set->ordering_constraints, lpc, resource_t *rsc = order->lh_rsc; crm_debug_2("Applying ordering constraint: %d", order->id); if(rsc != NULL) { crm_debug_4("rsc_action-to-*"); rsc->cmds->rsc_order_lh(rsc, order, data_set); continue; } rsc = order->rh_rsc; if(rsc != NULL) { crm_debug_4("action-to-rsc_action"); rsc->cmds->rsc_order_rh(order->lh_action, rsc, order); } else { crm_debug_4("action-to-action"); order_actions( order->lh_action, order->rh_action, order->type); } ); update_action_states(data_set->actions); slist_iter( rsc, resource_t, data_set->resources, lpc, rsc->cmds->migrate_reload(rsc, data_set); ); return TRUE; } int transition_id = -1; /* * Create a dependency graph to send to the transitioner (via the CRMd) */ gboolean stage8(pe_working_set_t *data_set) { const char *value = NULL; char *transition_id_s = NULL; transition_id++; transition_id_s = crm_itoa(transition_id); crm_debug_2("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, "batch-limit"); crm_xml_add(data_set->graph, "batch-limit", value); crm_xml_add(data_set->graph, "transition_id", transition_id_s); crm_free(transition_id_s); /* errors... slist_iter(action, action_t, action_list, lpc, if(action->optional == FALSE && action->runnable == FALSE) { print_action("Ignoring", action, TRUE); } ); */ slist_iter( rsc, resource_t, data_set->resources, lpc, crm_debug_4("processing actions for rsc=%s", rsc->id); rsc->cmds->expand(rsc, data_set); ); crm_log_xml_debug_3( data_set->graph, "created resource-driven action list"); /* catch any non-resource specific actions */ crm_debug_4("processing non-resource actions"); slist_iter( action, action_t, data_set->actions, lpc, graph_element_from_action(action, data_set); ); crm_log_xml_debug_3(data_set->graph, "created generic action list"); crm_debug_2("Created transition graph %d.", transition_id); return TRUE; } void cleanup_alloc_calculations(pe_working_set_t *data_set) { if(data_set == NULL) { return; } crm_debug_3("deleting order cons: %p", data_set->ordering_constraints); pe_free_ordering(data_set->ordering_constraints); data_set->ordering_constraints = NULL; crm_debug_3("deleting node cons: %p", data_set->placement_constraints); pe_free_rsc_to_node(data_set->placement_constraints); data_set->placement_constraints = NULL; crm_debug_3("deleting inter-resource cons: %p", data_set->colocation_constraints); pe_free_shallow(data_set->colocation_constraints); data_set->colocation_constraints = NULL; cleanup_calculations(data_set); } diff --git a/pengine/graph.c b/pengine/graph.c index 7886510423..c4a0279a1d 100644 --- a/pengine/graph.c +++ b/pengine/graph.c @@ -1,644 +1,670 @@ /* * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include gboolean update_action(action_t *action); gboolean update_action_states(GListPtr actions) { crm_debug_2("Updating %d actions", g_list_length(actions)); slist_iter( action, action_t, actions, lpc, update_action(action); ); return TRUE; } gboolean update_action(action_t *action) { int local_type = 0; int log_level = LOG_DEBUG_2; gboolean changed = FALSE; - + do_crm_log(log_level, "Processing action %s: %s %s %s", action->uuid, action->optional?"optional":"required", action->runnable?"runnable":"unrunnable", action->pseudo?"pseudo":action->task); - + slist_iter( other, action_wrapper_t, action->actions_before, lpc, gboolean other_changed = FALSE; node_t *node = other->action->node; resource_t *other_rsc = other->action->rsc; enum rsc_role_e other_role = RSC_ROLE_UNKNOWN; if(other_rsc) { other_role = other_rsc->fns->state(other_rsc, TRUE); } - + + if(other->type & pe_order_test) { + log_level = LOG_NOTICE; + do_crm_log(log_level, "Processing action %s: %s %s %s", + action->uuid, + action->optional?"optional":"required", + action->runnable?"runnable":"unrunnable", + action->pseudo?"pseudo":action->task); + } else { + log_level = LOG_DEBUG_2; + } + do_crm_log(log_level, " Checking action %s: %s %s %s (flags=0x%.6x)", other->action->uuid, other->action->optional?"optional":"required", other->action->runnable?"runnable":"unrunnable", other->action->pseudo?"pseudo":other->action->task, other->type); local_type = other->type; if((local_type & pe_order_demote_stop) && other->action->pseudo == FALSE && other_role > RSC_ROLE_SLAVE && node != NULL && node->details->online) { local_type |= pe_order_implies_left; do_crm_log(log_level,"Upgrading demote->stop constraint to implies_left"); } if((local_type & pe_order_demote) && other->action->pseudo == FALSE && other_role > RSC_ROLE_SLAVE && node != NULL && node->details->online) { local_type |= pe_order_runnable_left; do_crm_log(log_level,"Upgrading restart constraint to runnable_left"); } + if((local_type & pe_order_complex_right) + && action->optional + && other->action->optional == FALSE) { + local_type |= pe_order_implies_right; + do_crm_log(log_level,"Upgrading complex constraint to implies_right"); + } + + if((local_type & pe_order_complex_left) + && action->optional == FALSE + && other->action->optional) { + local_type |= pe_order_implies_left; + do_crm_log(log_level,"Upgrading complex constraint to implies_left"); + } + if((local_type & pe_order_shutdown) && action->optional && other->action->optional == FALSE && is_set(other_rsc->flags, pe_rsc_shutdown)) { action->optional = FALSE; changed = TRUE; do_crm_log(log_level-1, " * Marking action %s manditory because of %s (complex)", action->uuid, other->action->uuid); } if((local_type & pe_order_restart) && other_role > RSC_ROLE_STOPPED) { if(other_rsc->variant == pe_native) { local_type |= pe_order_implies_left; do_crm_log(log_level,"Upgrading restart constraint to implies_left"); } if(other->action->optional && other->action->runnable && action->runnable == FALSE) { do_crm_log(log_level-1, " * Marking action %s manditory because %s is unrunnable", other->action->uuid, action->uuid); other->action->optional = FALSE; set_bit(other_rsc->flags, pe_rsc_shutdown); other_changed = TRUE; } } if((local_type & pe_order_runnable_left) && other->action->runnable == FALSE) { if(other->action->implied_by_stonith) { do_crm_log(log_level, "Ignoring un-runnable - implied_by_stonith"); } else if(action->runnable == FALSE) { do_crm_log(log_level+1, "Already un-runnable"); } else { action->runnable = FALSE; do_crm_log(log_level-1, " * Marking action %s un-runnable because of %s", action->uuid, other->action->uuid); changed = TRUE; } } if((local_type & pe_order_runnable_right) && action->runnable == FALSE) { if(action->pseudo) { do_crm_log(log_level, "Ignoring un-runnable - pseudo"); } else if(other->action->runnable == FALSE) { do_crm_log(log_level+1, "Already un-runnable"); } else { other->action->runnable = FALSE; do_crm_log(log_level-1, " * Marking action %s un-runnable because of %s", other->action->uuid, action->uuid); other_changed = TRUE; } } if(local_type & pe_order_implies_left) { if(other->action->optional == FALSE) { /* nothing to do */ do_crm_log(log_level+1, " Ignoring implies left - redundant"); } else if(safe_str_eq(other->action->task, CRMD_ACTION_STOP) && other_role == RSC_ROLE_STOPPED) { do_crm_log(log_level-1, " Ignoring implies left - %s already stopped", other_rsc->id); } else if((local_type & pe_order_demote) && other_rsc->role < RSC_ROLE_MASTER) { do_crm_log(log_level-1, " Ignoring implies left - %s already demoted", other_rsc->id); } else if(action->optional == FALSE) { other->action->optional = FALSE; do_crm_log(log_level-1, " * (implies left) Marking action %s mandatory because of %s", other->action->uuid, action->uuid); other_changed = TRUE; } else { do_crm_log(log_level, " Ignoring implies left"); } } if(local_type & pe_order_implies_right) { if(action->optional == FALSE) { /* nothing to do */ do_crm_log(log_level+1, " Ignoring implies right - redundant"); + } else if(other->action->optional == FALSE) { action->optional = FALSE; do_crm_log(log_level-1, " * (implies right) Marking action %s mandatory because of %s", action->uuid, other->action->uuid); changed = TRUE; } else { do_crm_log(log_level, " Ignoring implies right"); } } if(other_changed) { do_crm_log(log_level, "%s changed, processing after list", other->action->uuid); update_action(other->action); slist_iter( before_other, action_wrapper_t, other->action->actions_after, lpc2, do_crm_log(log_level, "%s changed, processing %s", other->action->uuid, before_other->action->uuid); update_action(before_other->action); ); slist_iter( before_other, action_wrapper_t, other->action->actions_before, lpc2, do_crm_log(log_level, "%s changed, processing %s", other->action->uuid, before_other->action->uuid); update_action(before_other->action); ); } ); if(changed) { do_crm_log(log_level, "%s changed, processing after list", action->uuid); slist_iter( other, action_wrapper_t, action->actions_after, lpc, do_crm_log(log_level, "%s changed, processing %s", action->uuid, other->action->uuid); update_action(other->action); ); do_crm_log(log_level, "%s changed, processing before list", action->uuid); slist_iter( other, action_wrapper_t, action->actions_before, lpc, do_crm_log(log_level, "%s changed, processing %s", action->uuid, other->action->uuid); 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 */ slist_iter( rsc, resource_t, node->details->running_rsc, lpc, if(is_not_set(rsc->flags, pe_rsc_managed)) { continue; } custom_action_order( rsc, stop_key(rsc), NULL, NULL, crm_strdup(CRM_OP_SHUTDOWN), shutdown_op, pe_order_implies_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) { slist_iter( rsc, resource_t, data_set->resources, lpc, rsc->cmds->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 void dup_attr(gpointer key, gpointer value, gpointer user_data) { g_hash_table_replace(user_data, crm_strdup(key), crm_strdup(value)); } crm_data_t * action2xml(action_t *action, gboolean as_input) { gboolean needs_node_info = TRUE; crm_data_t * action_xml = NULL; crm_data_t * args_xml = NULL; char *action_id_s = NULL; if(action == NULL) { return NULL; } crm_debug_4("Dumping action %d as XML", action->id); 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_LRM_REFRESH)) { action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); /* } else if(safe_str_eq(action->task, CRMD_ACTION_PROBED)) { */ /* action_xml = create_xml_node(NULL, XML_GRAPH_TAG_CRM_EVENT); */ } else if(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); crm_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, "interval"); int interval = crm_parse_int(interval_s, "0"); if(safe_str_eq(action->task, CRMD_ACTION_NOTIFY)) { const char *n_type = g_hash_table_lookup( action->extra, crm_meta_name("notify_type")); const char *n_task = g_hash_table_lookup( action->extra, crm_meta_name("notify_operation")); CRM_CHECK(n_type != NULL, ;); CRM_CHECK(n_task != NULL, ;); clone_key = generate_notify_key(action->rsc->clone_name, n_type, n_task); } else { clone_key = generate_op_key(action->rsc->clone_name, action->task, interval); } 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); crm_free(clone_key); } else { crm_xml_add(action_xml, XML_LRM_ATTR_TASK_KEY, action->uuid); } if(needs_node_info && action->node != NULL) { 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(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->notify_keys != NULL) { g_hash_table_foreach( action->notify_keys, dup_attr, action->meta); } if(action->rsc != NULL && action->pseudo == FALSE) { int lpc = 0; crm_data_t *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(action->rsc->clone_name != NULL) { crm_debug("Using clone name %s for %s", action->rsc->clone_name, action->rsc->id); 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 { crm_xml_add(rsc_xml, XML_ATTR_ID, action->rsc->id); crm_xml_add(rsc_xml, XML_ATTR_ID_LONG, action->rsc->long_name); } 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(action_xml, 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 && safe_str_neq(action->task, CRMD_ACTION_STOP)) { g_hash_table_foreach(action->rsc->parameters, hash2field, args_xml); } g_hash_table_foreach(action->meta, hash2metafield, args_xml); if(action->rsc != NULL) { int lpc = 0; const char *key = NULL; const char *value = NULL; const char *meta_list[] = { XML_RSC_ATTR_UNIQUE, XML_RSC_ATTR_INCARNATION, XML_RSC_ATTR_INCARNATION_MAX, XML_RSC_ATTR_INCARNATION_NODEMAX, XML_RSC_ATTR_MASTER_MAX, XML_RSC_ATTR_MASTER_NODEMAX, }; for(lpc = 0; lpc < DIMOF(meta_list); lpc++) { key = meta_list[lpc]; value = g_hash_table_lookup(action->rsc->meta, key); if(value != NULL) { char *crm_name = crm_concat(CRM_META, key, '_'); crm_xml_add(args_xml, crm_name, value); crm_free(crm_name); } } } crm_log_xml_debug_4(action_xml, "dumped action"); return action_xml; } static gboolean should_dump_action(action_t *action) { const char * interval = NULL; CRM_CHECK(action != NULL, return FALSE); interval = g_hash_table_lookup(action->meta, XML_LRM_ATTR_INTERVAL); if(action->optional) { crm_debug_5("action %d (%s) was optional", action->id, action->uuid); return FALSE; } else if(action->runnable == FALSE) { crm_debug_5("action %d (%s) was not runnable", action->id, action->uuid); return FALSE; } else if(action->dumped) { crm_debug_5("action %d (%s) was already dumped", action->id, action->uuid); return FALSE; } else if(action->rsc != NULL && is_not_set(action->rsc->flags, pe_rsc_managed)) { /* make sure probes go through */ if(safe_str_neq(action->task, CRMD_ACTION_STATUS)) { pe_warn("action %d (%s) was for an unmanaged resource (%s)", action->id, action->uuid, action->rsc->id); return FALSE; } if(interval != NULL && safe_str_neq(interval, "0")) { pe_warn("action %d (%s) was for an unmanaged resource (%s)", action->id, action->uuid, action->rsc->id); return FALSE; } } if(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) { wrapper->state = pe_link_not_dumped; if(last_action == wrapper->action->id) { crm_debug_2("Input (%d) %s duplicated", wrapper->action->id, wrapper->action->uuid); wrapper->state = pe_link_dup; return FALSE; } else if(wrapper->type == pe_order_none) { crm_debug_2("Input (%d) %s suppressed", wrapper->action->id, wrapper->action->uuid); return FALSE; } else if(wrapper->action->optional == TRUE) { crm_debug_2("Input (%d) %s optional", wrapper->action->id, wrapper->action->uuid); return FALSE; } else if(wrapper->action->runnable == FALSE && wrapper->action->pseudo == FALSE && wrapper->type == pe_order_optional) { crm_debug("Input (%d) %s optional (ordering)", wrapper->action->id, wrapper->action->uuid); return FALSE; } else if(action->pseudo && (wrapper->type & pe_order_stonith_stop)) { crm_debug("Input (%d) %s suppressed", wrapper->action->id, wrapper->action->uuid); return FALSE; } crm_debug_3("Input (%d) %s n=%p p=%d r=%d f=0x%.6x dumped for %s", wrapper->action->id, wrapper->action->uuid, wrapper->action->node, wrapper->action->pseudo, wrapper->action->runnable, wrapper->type, action->uuid); return TRUE; } void graph_element_from_action(action_t *action, pe_working_set_t *data_set) { int last_action = -1; int synapse_priority = 0; crm_data_t * syn = NULL; crm_data_t * set = NULL; crm_data_t * in = NULL; crm_data_t * input = NULL; crm_data_t * xml_action = NULL; if(should_dump_action(action) == FALSE) { return; } action->dumped = TRUE; 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); add_node_nocopy(set, crm_element_name(xml_action), xml_action); action->actions_before = g_list_sort( action->actions_before, sort_action_id); slist_iter(wrapper,action_wrapper_t,action->actions_before,lpc, 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); add_node_nocopy(input, crm_element_name(xml_action), xml_action); ); } diff --git a/pengine/group.c b/pengine/group.c index fa7784ab69..a943d43e28 100644 --- a/pengine/group.c +++ b/pengine/group.c @@ -1,403 +1,455 @@ /* * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #define VARIANT_GROUP 1 #include node_t * group_color(resource_t *rsc, pe_working_set_t *data_set) { node_t *node = NULL; node_t *group_node = NULL; group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); if(is_not_set(rsc->flags, pe_rsc_provisional)) { return rsc->allocated_to; } crm_debug_2("Processing %s", rsc->id); if(is_set(rsc->flags, pe_rsc_allocating)) { crm_debug("Dependancy loop detected involving %s", rsc->id); return NULL; } if(group_data->first_child == NULL) { /* nothign to allocate */ clear_bit(rsc->flags, pe_rsc_provisional); return NULL; } set_bit(rsc->flags, pe_rsc_allocating); rsc->role = group_data->first_child->role; group_data->first_child->rsc_cons = g_list_concat( group_data->first_child->rsc_cons, rsc->rsc_cons); rsc->rsc_cons = NULL; slist_iter( child_rsc, resource_t, rsc->children, lpc, node = child_rsc->cmds->color(child_rsc, data_set); if(group_node == NULL) { group_node = node; } ); rsc->next_role = group_data->first_child->next_role; clear_bit(rsc->flags, pe_rsc_allocating); clear_bit(rsc->flags, pe_rsc_provisional); if(group_data->colocated) { return group_node; } return NULL; } void group_update_pseudo_status(resource_t *parent, resource_t *child); void group_create_actions(resource_t *rsc, pe_working_set_t *data_set) { action_t *op = NULL; group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); crm_debug_2("Creating actions for %s", rsc->id); slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->create_actions(child_rsc, data_set); group_update_pseudo_status(rsc, child_rsc); ); - op = start_action(rsc, NULL, !group_data->child_starting); + op = start_action(rsc, NULL, TRUE/* !group_data->child_starting */); op->pseudo = TRUE; op->runnable = TRUE; op = custom_action(rsc, started_key(rsc), CRMD_ACTION_STARTED, NULL, - !group_data->child_starting, TRUE, data_set); + TRUE/* !group_data->child_starting */, TRUE, data_set); op->pseudo = TRUE; op->runnable = TRUE; - op = stop_action(rsc, NULL, !group_data->child_stopping); + op = stop_action(rsc, NULL, TRUE/* !group_data->child_stopping */); op->pseudo = TRUE; op->runnable = TRUE; op = custom_action(rsc, stopped_key(rsc), CRMD_ACTION_STOPPED, NULL, - !group_data->child_stopping, TRUE, data_set); + TRUE/* !group_data->child_stopping */, TRUE, data_set); op->pseudo = TRUE; op->runnable = TRUE; rsc->actions = rsc->actions; /* rsc->actions = NULL; */ } void group_update_pseudo_status(resource_t *parent, resource_t *child) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, parent); if(group_data->child_stopping && group_data->child_starting) { return; } slist_iter( action, action_t, child->actions, lpc, if(action->optional) { continue; } if(safe_str_eq(CRMD_ACTION_STOP, action->task) && action->runnable) { group_data->child_stopping = TRUE; crm_debug_3("Based on %s the group is stopping", action->uuid); } else if(safe_str_eq(CRMD_ACTION_START, action->task) && action->runnable) { group_data->child_starting = TRUE; crm_debug_3("Based on %s the group is starting", action->uuid); } ); } void group_internal_constraints(resource_t *rsc, pe_working_set_t *data_set) { resource_t *last_rsc = NULL; - int stopstop = pe_order_shutdown; group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); native_internal_constraints(rsc, data_set); - if(group_data->ordered == FALSE) { - stopstop |= pe_order_implies_right; - } - custom_action_order( rsc, stopped_key(rsc), NULL, rsc, start_key(rsc), NULL, pe_order_optional, data_set); custom_action_order( rsc, stop_key(rsc), NULL, rsc, stopped_key(rsc), NULL, - pe_order_runnable_left, data_set); + pe_order_runnable_left|pe_order_implies_right|pe_order_implies_left, data_set); custom_action_order( rsc, start_key(rsc), NULL, rsc, started_key(rsc), NULL, pe_order_runnable_left, data_set); slist_iter( child_rsc, resource_t, rsc->children, lpc, - + int stop = pe_order_shutdown|pe_order_implies_right; + int stopped = pe_order_optional; child_rsc->cmds->internal_constraints(child_rsc, data_set); - if(group_data->colocated && last_rsc != NULL) { + if(last_rsc == NULL) { + stop |= pe_order_implies_left; + stopped = pe_order_implies_right; + + } else if(group_data->colocated) { rsc_colocation_new( "group:internal_colocation", NULL, INFINITY, child_rsc, last_rsc, NULL, NULL, data_set); } - order_stop_stop(rsc, child_rsc, stopstop); + order_stop_stop(rsc, child_rsc, stop); custom_action_order(child_rsc, stop_key(child_rsc), NULL, rsc, stopped_key(rsc), NULL, - pe_order_optional, data_set); + stopped, data_set); custom_action_order(child_rsc, start_key(child_rsc), NULL, rsc, started_key(rsc), NULL, - pe_order_runnable_left, data_set); + pe_order_runnable_left|pe_order_implies_right, data_set); if(group_data->ordered == FALSE) { order_start_start(rsc, child_rsc, pe_order_implies_right|pe_order_runnable_left); } else if(last_rsc != NULL) { order_start_start(last_rsc, child_rsc, pe_order_implies_right|pe_order_runnable_left); - order_stop_stop(child_rsc, last_rsc, pe_order_implies_left); + order_stop_stop(child_rsc, last_rsc, pe_order_implies_left|pe_order_test); child_rsc->restart_type = pe_restart_restart; } else { /* If anyone in the group is starting, then * pe_order_implies_right will cause _everyone_ in the group * to be sent a start action * But this is safe since starting something that is already * started is required to be "safe" */ order_start_start(rsc, child_rsc, - pe_order_implies_right|pe_order_implies_left|pe_order_runnable_right|pe_order_runnable_left); + pe_order_implies_left|pe_order_implies_right|pe_order_runnable_right|pe_order_runnable_left); } last_rsc = child_rsc; ); if(group_data->ordered && last_rsc != NULL) { order_stop_stop(rsc, last_rsc, pe_order_implies_right); + custom_action_order(last_rsc, stop_key(last_rsc), NULL, + rsc, stopped_key(rsc), NULL, + pe_order_implies_left, data_set); } } void group_rsc_colocation_lh( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { group_variant_data_t *group_data = NULL; if(rsc_lh == NULL) { pe_err("rsc_lh was NULL for %s", constraint->id); return; } else if(rsc_rh == NULL) { pe_err("rsc_rh was NULL for %s", constraint->id); return; } crm_debug_4("Processing constraints from %s", rsc_lh->id); get_group_variant_data(group_data, rsc_lh); if(group_data->colocated) { group_data->first_child->cmds->rsc_colocation_lh( group_data->first_child, rsc_rh, constraint); return; } else if(constraint->score >= INFINITY) { crm_config_err("%s: Cannot perform manditory colocation" " between non-colocated group and %s", rsc_lh->id, rsc_rh->id); return; } slist_iter( child_rsc, resource_t, rsc_lh->children, lpc, child_rsc->cmds->rsc_colocation_lh( child_rsc, rsc_rh, constraint); ); } void group_rsc_colocation_rh( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc_rh); CRM_CHECK(rsc_lh->variant == pe_native, return); crm_debug_3("Processing RH of constraint %s", constraint->id); print_resource(LOG_DEBUG_3, "LHS", rsc_lh, TRUE); if(is_set(rsc_rh->flags, pe_rsc_provisional)) { return; } else if(group_data->colocated && group_data->first_child) { group_data->first_child->cmds->rsc_colocation_rh( rsc_lh, group_data->first_child, constraint); return; } else if(constraint->score >= INFINITY) { crm_config_err("%s: Cannot perform manditory colocation with" " non-colocated group: %s", rsc_lh->id, rsc_rh->id); return; } slist_iter( child_rsc, resource_t, rsc_rh->children, lpc, child_rsc->cmds->rsc_colocation_rh( rsc_lh, child_rsc, constraint); ); } void group_rsc_order_lh(resource_t *rsc, order_constraint_t *order, pe_working_set_t *data_set) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); crm_debug_2("%s->%s", order->lh_action_task, order->rh_action_task); if(order->rh_rsc != NULL && (rsc == order->rh_rsc || rsc == order->rh_rsc->parent)) { native_rsc_order_lh(rsc, order, data_set); return; } - +#if 0 if(order->type != pe_order_optional) { native_rsc_order_lh(rsc, order, data_set); } if(order->type & pe_order_implies_left) { native_rsc_order_lh(group_data->first_child, order, data_set); } +#endif convert_non_atomic_task(rsc, order); native_rsc_order_lh(rsc, order, data_set); } void group_rsc_order_rh( action_t *lh_action, resource_t *rsc, order_constraint_t *order) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); crm_debug_2("%s->%s", lh_action->uuid, order->rh_action_task); if(rsc == NULL) { return; } + if(safe_str_eq(CRM_OP_PROBED, lh_action->uuid)) { + slist_iter( + child_rsc, resource_t, rsc->children, lpc, + child_rsc->cmds->rsc_order_rh(lh_action, child_rsc, order); + ); + + if(rsc->fns->state(rsc, TRUE) < RSC_ROLE_STARTED + && rsc->fns->state(rsc, FALSE) > RSC_ROLE_STOPPED) { + order->type |= pe_order_implies_right; + } + + } else if(lh_action->rsc != NULL + && lh_action->rsc != rsc + && lh_action->rsc != rsc->parent + && lh_action->rsc->parent != rsc) { + char *tmp = NULL; + char *task_s = NULL; + int interval = 0; + enum action_tasks task = 0; + + parse_op_key(order->lh_action_task, &tmp, &task_s, &interval); + task = text2task(task_s); + crm_free(task_s); + crm_free(tmp); + + switch(task) { + case no_action: + case monitor_rsc: + case action_notify: + case action_notified: + case shutdown_crm: + case stonith_node: + break; + case stop_rsc: + case stopped_rsc: + case action_demote: + case action_demoted: + order->type |= pe_order_complex_left; + break; + case start_rsc: + case started_rsc: + case action_promote: + case action_promoted: + order->type |= pe_order_complex_right; + break; + } + } + native_rsc_order_rh(lh_action, rsc, order); } void group_rsc_location(resource_t *rsc, rsc_to_node_t *constraint) { GListPtr saved = constraint->node_list_rh; GListPtr zero = node_list_dup(constraint->node_list_rh, TRUE, FALSE); gboolean reset_scores = TRUE; group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); crm_debug("Processing rsc_location %s for %s", constraint->id, rsc->id); slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->rsc_location(child_rsc, constraint); if(group_data->colocated && reset_scores) { reset_scores = FALSE; constraint->node_list_rh = zero; } ); constraint->node_list_rh = saved; pe_free_shallow_adv(zero, TRUE); } void group_expand(resource_t *rsc, pe_working_set_t *data_set) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); crm_debug_3("Processing actions from %s", rsc->id); CRM_CHECK(rsc != NULL, return); native_expand(rsc, data_set); slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->expand(child_rsc, data_set); ); } GListPtr group_merge_weights( resource_t *rsc, const char *rhs, GListPtr nodes, int factor, gboolean allow_rollback) { group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); if(is_set(rsc->flags, pe_rsc_merging)) { crm_debug("Breaking dependancy loop with %s at %s", rsc->id, rhs); return nodes; } else if(is_not_set(rsc->flags, pe_rsc_provisional) || can_run_any(nodes) == FALSE) { return nodes; } set_bit(rsc->flags, pe_rsc_merging); nodes = group_data->first_child->cmds->merge_weights( group_data->first_child, rhs, nodes, factor, allow_rollback); slist_iter( constraint, rsc_colocation_t, rsc->rsc_cons_lhs, lpc, nodes = native_merge_weights( constraint->rsc_lh, rsc->id, nodes, constraint->score/INFINITY, allow_rollback); ); clear_bit(rsc->flags, pe_rsc_merging); return nodes; } diff --git a/pengine/native.c b/pengine/native.c index 07d618fda6..3a289e8451 100644 --- a/pengine/native.c +++ b/pengine/native.c @@ -1,1964 +1,1989 @@ /* * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #define DELETE_THEN_REFRESH 1 /* The crmd will remove the resource from the CIB itself, making this redundant */ #define VARIANT_NATIVE 1 #include gboolean at_stack_bottom(resource_t *rsc); void node_list_update(GListPtr list1, GListPtr list2, int factor); void native_rsc_colocation_rh_must(resource_t *rsc_lh, gboolean update_lh, resource_t *rsc_rh, gboolean update_rh); void native_rsc_colocation_rh_mustnot(resource_t *rsc_lh, gboolean update_lh, resource_t *rsc_rh, gboolean update_rh); void create_notifications(resource_t *rsc, pe_working_set_t *data_set); void Recurring(resource_t *rsc, action_t *start, node_t *node, pe_working_set_t *data_set); void RecurringOp(resource_t *rsc, action_t *start, node_t *node, crm_data_t *operation, pe_working_set_t *data_set); void pe_pre_notify( resource_t *rsc, node_t *node, action_t *op, notify_data_t *n_data, pe_working_set_t *data_set); void pe_post_notify( resource_t *rsc, node_t *node, action_t *op, notify_data_t *n_data, pe_working_set_t *data_set); void NoRoleChange (resource_t *rsc, node_t *current, node_t *next, pe_working_set_t *data_set); gboolean DeleteRsc (resource_t *rsc, node_t *node, gboolean optional, pe_working_set_t *data_set); gboolean StopRsc (resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); gboolean StartRsc (resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); gboolean DemoteRsc (resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); gboolean PromoteRsc(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); gboolean RoleError (resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); gboolean NullOp (resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set); enum rsc_role_e rsc_state_matrix[RSC_ROLE_MAX][RSC_ROLE_MAX] = { /* Current State */ /* Next State: Unknown Stopped Started Slave Master */ /* Unknown */ { RSC_ROLE_UNKNOWN, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, }, /* Stopped */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STARTED, RSC_ROLE_SLAVE, RSC_ROLE_SLAVE, }, /* Started */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STARTED, RSC_ROLE_SLAVE, RSC_ROLE_MASTER, }, /* Slave */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_UNKNOWN, RSC_ROLE_SLAVE, RSC_ROLE_MASTER, }, /* Master */ { RSC_ROLE_STOPPED, RSC_ROLE_SLAVE, RSC_ROLE_UNKNOWN, RSC_ROLE_SLAVE, RSC_ROLE_MASTER, }, }; gboolean (*rsc_action_matrix[RSC_ROLE_MAX][RSC_ROLE_MAX])(resource_t*,node_t*,gboolean,pe_working_set_t*) = { /* Current State */ /* Next State: Unknown Stopped Started Slave Master */ /* Unknown */ { RoleError, StopRsc, RoleError, RoleError, RoleError, }, /* Stopped */ { RoleError, NullOp, StartRsc, StartRsc, RoleError, }, /* Started */ { RoleError, StopRsc, NullOp, NullOp, PromoteRsc, }, /* Slave */ { RoleError, StopRsc, RoleError, NullOp, PromoteRsc, }, /* Master */ { RoleError, RoleError, RoleError, DemoteRsc, NullOp, }, }; static gboolean native_choose_node(resource_t *rsc) { /* 1. Sort by weight 2. color.chosen_node = the node (of those with the highest wieght) with the fewest resources 3. remove color.chosen_node from all other colors */ GListPtr nodes = NULL; node_t *chosen = NULL; if(is_not_set(rsc->flags, pe_rsc_provisional)) { return rsc->allocated_to?TRUE:FALSE; } crm_debug_3("Choosing node for %s from %d candidates", rsc->id, g_list_length(rsc->allowed_nodes)); if(rsc->allowed_nodes) { rsc->allowed_nodes = g_list_sort( rsc->allowed_nodes, sort_node_weight); nodes = rsc->allowed_nodes; chosen = g_list_nth_data(nodes, 0); } return native_assign_node(rsc, nodes, chosen); } GListPtr native_merge_weights( resource_t *rsc, const char *rhs, GListPtr nodes, int factor, gboolean allow_rollback) { GListPtr archive = NULL; if(is_set(rsc->flags, pe_rsc_merging)) { crm_debug("%s: Breaking dependancy loop", rhs); return nodes; } else if(is_not_set(rsc->flags, pe_rsc_provisional) || can_run_any(nodes) == FALSE) { return nodes; } set_bit(rsc->flags, pe_rsc_merging); crm_debug_2("%s: Combining scores from %s", rhs, rsc->id); if(allow_rollback) { archive = node_list_dup(nodes, FALSE, FALSE); } node_list_update(nodes, rsc->allowed_nodes, factor); if(archive && can_run_any(nodes) == FALSE) { crm_debug("%s: Rolling back scores from %s", rhs, rsc->id); pe_free_shallow_adv(nodes, TRUE); nodes = archive; goto bail; } pe_free_shallow_adv(archive, TRUE); slist_iter( constraint, rsc_colocation_t, rsc->rsc_cons_lhs, lpc, nodes = constraint->rsc_lh->cmds->merge_weights( constraint->rsc_lh, rhs, nodes, constraint->score/INFINITY, allow_rollback); ); bail: clear_bit(rsc->flags, pe_rsc_merging); return nodes; } node_t * native_color(resource_t *rsc, pe_working_set_t *data_set) { int alloc_details = LOG_DEBUG_2; if(rsc->parent && is_not_set(rsc->parent->flags, pe_rsc_allocating)) { /* never allocate children on their own */ crm_debug("Escalating allocation of %s to its parent: %s", rsc->id, rsc->parent->id); rsc->parent->cmds->color(rsc->parent, data_set); } if(is_not_set(rsc->flags, pe_rsc_provisional)) { return rsc->allocated_to; } if(is_set(rsc->flags, pe_rsc_allocating)) { crm_debug("Dependancy loop detected involving %s", rsc->id); return NULL; } set_bit(rsc->flags, pe_rsc_allocating); print_resource(alloc_details, "Allocating: ", rsc, FALSE); dump_node_scores(alloc_details, rsc, "Pre-allloc", rsc->allowed_nodes); slist_iter( constraint, rsc_colocation_t, rsc->rsc_cons, lpc, resource_t *rsc_rh = constraint->rsc_rh; crm_debug("%s: Pre-Processing %s (%s)", rsc->id, constraint->id, rsc_rh->id); rsc_rh->cmds->color(rsc_rh, data_set); rsc->cmds->rsc_colocation_lh(rsc, rsc_rh, constraint); ); dump_node_scores(alloc_details, rsc, "Post-coloc", rsc->allowed_nodes); slist_iter( constraint, rsc_colocation_t, rsc->rsc_cons_lhs, lpc, rsc->allowed_nodes = constraint->rsc_lh->cmds->merge_weights( constraint->rsc_lh, rsc->id, rsc->allowed_nodes, constraint->score/INFINITY, TRUE); ); dump_node_scores(alloc_details, rsc, "Post-merge", rsc->allowed_nodes); print_resource(LOG_DEBUG, "Allocating: ", rsc, FALSE); if(rsc->next_role == RSC_ROLE_STOPPED) { crm_debug_2("Making sure %s doesn't get allocated", rsc->id); /* make sure it doesnt come up again */ resource_location( rsc, NULL, -INFINITY, "target_role", data_set); } if(is_set(rsc->flags, pe_rsc_provisional) && native_choose_node(rsc) ) { crm_debug_3("Allocated resource %s to %s", rsc->id, rsc->allocated_to->details->uname); } else if(rsc->allocated_to == NULL) { if(is_not_set(rsc->flags, pe_rsc_orphan)) { pe_warn("Resource %s cannot run anywhere", rsc->id); } else { crm_info("Stopping orphan resource %s", rsc->id); } } else { crm_debug("Pre-Allocated resource %s to %s", rsc->id, rsc->allocated_to->details->uname); } clear_bit(rsc->flags, pe_rsc_allocating); print_resource(LOG_DEBUG_3, "Allocated ", rsc, TRUE); return rsc->allocated_to; } static gboolean is_op_dup( resource_t *rsc, const char *name, const char *interval) { gboolean dup = FALSE; const char *id = NULL; const char *value = NULL; xml_child_iter_filter( rsc->ops_xml, operation, "op", value = crm_element_value(operation, "name"); if(safe_str_neq(value, name)) { continue; } value = crm_element_value(operation, XML_LRM_ATTR_INTERVAL); if(value == NULL) { value = "0"; } if(safe_str_neq(value, interval)) { continue; } if(id == NULL) { id = ID(operation); } else { crm_config_err("Operation %s is a duplicate of %s", ID(operation), id); crm_config_err("Do not use the same (name, interval) combination more than once per resource"); dup = TRUE; } ); return dup; } void RecurringOp(resource_t *rsc, action_t *start, node_t *node, crm_data_t *operation, pe_working_set_t *data_set) { char *key = NULL; const char *name = NULL; const char *value = NULL; const char *interval = NULL; const char *node_uname = NULL; int interval_ms = 0; action_t *mon = NULL; gboolean is_optional = TRUE; GListPtr possible_matches = NULL; crm_debug_2("Creating recurring action %s for %s", ID(operation), rsc->id); if(node != NULL) { node_uname = node->details->uname; } interval = crm_element_value(operation, XML_LRM_ATTR_INTERVAL); interval_ms = crm_get_msec(interval); if(interval_ms == 0) { return; } else if(interval_ms < 0) { crm_config_warn("%s contains an invalid interval: %s", ID(operation), interval); return; } value = crm_element_value(operation, "disabled"); if(crm_is_true(value)) { return; } name = crm_element_value(operation, "name"); if(is_op_dup(rsc, name, interval)) { return; } key = generate_op_key(rsc->id, name, interval_ms); if(start != NULL) { crm_debug_3("Marking %s %s due to %s", key, start->optional?"optional":"manditory", start->uuid); is_optional = start->optional; } else { crm_debug_2("Marking %s optional", key); is_optional = TRUE; } /* start a monitor for an already active resource */ possible_matches = find_actions_exact(rsc->actions, key, node); if(possible_matches == NULL) { is_optional = FALSE; crm_debug_3("Marking %s manditory: not active", key); } else { g_list_free(possible_matches); } value = crm_element_value(operation, "role"); if((rsc->next_role == RSC_ROLE_MASTER && value == NULL) || (value != NULL && text2role(value) != rsc->next_role)) { int log_level = LOG_DEBUG_2; const char *result = "Ignoring"; if(is_optional) { char *local_key = crm_strdup(key); log_level = LOG_INFO; result = "Cancelling"; /* its running : cancel it */ mon = custom_action( rsc, local_key, CRMD_ACTION_CANCEL, node, FALSE, TRUE, data_set); crm_free(mon->task); mon->task = crm_strdup(CRMD_ACTION_CANCEL); add_hash_param(mon->meta, XML_LRM_ATTR_INTERVAL, interval); add_hash_param(mon->meta, XML_LRM_ATTR_TASK, name); custom_action_order( rsc, NULL, mon, rsc, promote_key(rsc), NULL, pe_order_runnable_left, data_set); mon = NULL; } do_crm_log(log_level, "%s action %s (%s vs. %s)", result , key, value?value:role2text(RSC_ROLE_SLAVE), role2text(rsc->next_role)); crm_free(key); key = NULL; return; } mon = custom_action(rsc, key, name, node, is_optional, TRUE, data_set); key = mon->uuid; if(is_optional) { crm_debug_2("%s\t %s (optional)", crm_str(node_uname), mon->uuid); } if(start == NULL || start->runnable == FALSE) { crm_debug("%s\t %s (cancelled : start un-runnable)", crm_str(node_uname), mon->uuid); mon->runnable = FALSE; } else if(node == NULL || node->details->online == FALSE || node->details->unclean) { crm_debug("%s\t %s (cancelled : no node available)", crm_str(node_uname), mon->uuid); mon->runnable = FALSE; } else if(mon->optional == FALSE) { crm_notice("%s\t %s", crm_str(node_uname),mon->uuid); } custom_action_order(rsc, start_key(rsc), NULL, NULL, crm_strdup(key), mon, pe_order_implies_right|pe_order_runnable_left, data_set); if(rsc->next_role == RSC_ROLE_MASTER) { char *running_master = crm_itoa(EXECRA_RUNNING_MASTER); add_hash_param(mon->meta, XML_ATTR_TE_TARGET_RC, running_master); custom_action_order( rsc, promote_key(rsc), NULL, rsc, NULL, mon, pe_order_optional|pe_order_runnable_left, data_set); crm_free(running_master); } } void Recurring(resource_t *rsc, action_t *start, node_t *node, pe_working_set_t *data_set) { xml_child_iter_filter( rsc->ops_xml, operation, "op", RecurringOp(rsc, start, node, operation, data_set); ); } void native_create_actions(resource_t *rsc, pe_working_set_t *data_set) { action_t *start = NULL; node_t *chosen = NULL; enum rsc_role_e role = RSC_ROLE_UNKNOWN; enum rsc_role_e next_role = RSC_ROLE_UNKNOWN; crm_debug_2("Creating actions for %s", rsc->id); chosen = rsc->allocated_to; if(chosen != NULL) { CRM_CHECK(rsc->next_role != RSC_ROLE_UNKNOWN, rsc->next_role = RSC_ROLE_STARTED); } unpack_instance_attributes( rsc->xml, XML_TAG_ATTR_SETS, chosen?chosen->details->attrs:NULL, rsc->parameters, NULL, data_set->now); crm_debug_2("%s: %s->%s", rsc->id, role2text(rsc->role), role2text(rsc->next_role)); if(g_list_length(rsc->running_on) > 1) { if(rsc->recovery_type == recovery_stop_start) { pe_proc_err("Attempting recovery of resource %s", rsc->id); StopRsc(rsc, NULL, FALSE, data_set); rsc->role = RSC_ROLE_STOPPED; } } else if(rsc->running_on != NULL) { node_t *current = rsc->running_on->data; NoRoleChange(rsc, current, chosen, data_set); } else if(rsc->role == RSC_ROLE_STOPPED && rsc->next_role == RSC_ROLE_STOPPED) { char *key = start_key(rsc); GListPtr possible_matches = find_actions(rsc->actions, key, NULL); slist_iter( action, action_t, possible_matches, lpc, action->optional = TRUE; /* action->pseudo = TRUE; */ ); g_list_free(possible_matches); crm_debug_2("Stopping a stopped resource"); crm_free(key); return; } role = rsc->role; while(role != rsc->next_role) { next_role = rsc_state_matrix[role][rsc->next_role]; crm_debug_2("Executing: %s->%s (%s)", role2text(role), role2text(next_role), rsc->id); if(rsc_action_matrix[role][next_role]( rsc, chosen, FALSE, data_set) == FALSE) { break; } role = next_role; } if(rsc->next_role != RSC_ROLE_STOPPED && is_set(rsc->flags, pe_rsc_managed)) { start = start_action(rsc, chosen, TRUE); Recurring(rsc, start, chosen, data_set); } } void native_internal_constraints(resource_t *rsc, pe_working_set_t *data_set) { int type = pe_order_optional; const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); if(rsc->variant == pe_native) { type |= pe_order_implies_right; } if(rsc->parent == NULL) { type |= pe_order_restart; } custom_action_order(rsc, stop_key(rsc), NULL, rsc, start_key(rsc), NULL, type, data_set); custom_action_order(rsc, demote_key(rsc), NULL, rsc, stop_key(rsc), NULL, pe_order_demote_stop, data_set); custom_action_order(rsc, start_key(rsc), NULL, rsc, promote_key(rsc), NULL, pe_order_runnable_left, data_set); custom_action_order( rsc, delete_key(rsc), NULL, rsc, start_key(rsc), NULL, pe_order_optional, data_set); if(is_set(rsc->flags, pe_rsc_notify)) { char *key1 = NULL; char *key2 = NULL; key1 = generate_op_key(rsc->id, "confirmed-post_notify_start", 0); key2 = generate_op_key(rsc->id, "pre_notify_promote", 0); custom_action_order( rsc, key1, NULL, rsc, key2, NULL, pe_order_optional, data_set); key1 = generate_op_key(rsc->id, "confirmed-post_notify_demote", 0); key2 = generate_op_key(rsc->id, "pre_notify_stop", 0); custom_action_order( rsc, key1, NULL, rsc, key2, NULL, pe_order_optional, data_set); } if(is_not_set(rsc->flags, pe_rsc_managed)) { crm_debug_3("Skipping fencing constraints for unmanaged resource: %s", rsc->id); return; } if(rsc->variant == pe_native && safe_str_neq(class, "stonith")) { custom_action_order( rsc, stop_key(rsc), NULL, NULL, crm_strdup(all_stopped->task), all_stopped, pe_order_implies_right|pe_order_runnable_left, data_set); } } void native_rsc_colocation_lh( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { if(rsc_lh == NULL) { pe_err("rsc_lh was NULL for %s", constraint->id); return; } else if(constraint->rsc_rh == NULL) { pe_err("rsc_rh was NULL for %s", constraint->id); return; } crm_debug_2("Processing colocation constraint between %s and %s", rsc_lh->id, rsc_rh->id); rsc_rh->cmds->rsc_colocation_rh(rsc_lh, rsc_rh, constraint); } static gboolean filter_colocation_constraint( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { int level = LOG_DEBUG_4; if(constraint->score == 0){ return FALSE; } if(constraint->score > 0 && constraint->role_lh != RSC_ROLE_UNKNOWN && constraint->role_lh != rsc_lh->next_role) { do_crm_log(level, "LH: Skipping constraint: \"%s\" state filter", role2text(constraint->role_rh)); return FALSE; } if(constraint->score > 0 && constraint->role_rh != RSC_ROLE_UNKNOWN && constraint->role_rh != rsc_rh->next_role) { do_crm_log(level, "RH: Skipping constraint: \"%s\" state filter", role2text(constraint->role_rh)); return FALSE; } if(constraint->score < 0 && constraint->role_lh != RSC_ROLE_UNKNOWN && constraint->role_lh == rsc_lh->next_role) { do_crm_log(level, "LH: Skipping -ve constraint: \"%s\" state filter", role2text(constraint->role_rh)); return FALSE; } if(constraint->score < 0 && constraint->role_rh != RSC_ROLE_UNKNOWN && constraint->role_rh == rsc_rh->next_role) { do_crm_log(level, "RH: Skipping -ve constraint: \"%s\" state filter", role2text(constraint->role_rh)); return FALSE; } return TRUE; } static void colocation_match( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { const char *tmp = NULL; const char *value = NULL; gboolean do_check = FALSE; const char *attribute = "#id"; if(constraint->node_attribute != NULL) { attribute = constraint->node_attribute; } if(rsc_rh->allocated_to) { value = g_hash_table_lookup( rsc_rh->allocated_to->details->attrs, attribute); do_check = TRUE; } else if(constraint->score < 0) { /* nothing to do: * anti-colocation with something thats not running */ return; } slist_iter( node, node_t, rsc_lh->allowed_nodes, lpc, tmp = g_hash_table_lookup(node->details->attrs, attribute); if(do_check && safe_str_eq(tmp, value)) { crm_debug_2("%s: %s.%s += %d", constraint->id, rsc_lh->id, node->details->uname, constraint->score); node->weight = merge_weights( constraint->score, node->weight); } else if(do_check == FALSE || constraint->score >= INFINITY) { crm_debug_2("%s: %s.%s = -INFINITY (%s)", constraint->id, rsc_lh->id, node->details->uname, do_check?"failed":"unallocated"); node->weight = -INFINITY; } ); } void native_rsc_colocation_rh( resource_t *rsc_lh, resource_t *rsc_rh, rsc_colocation_t *constraint) { crm_debug_2("%sColocating %s with %s (%s, weight=%d)", constraint->score >= 0?"":"Anti-", rsc_lh->id, rsc_rh->id, constraint->id, constraint->score); if(filter_colocation_constraint(rsc_lh, rsc_rh, constraint) == FALSE) { return; } if(is_set(rsc_rh->flags, pe_rsc_provisional)) { return; } else if(is_not_set(rsc_lh->flags, pe_rsc_provisional)) { /* error check */ struct node_shared_s *details_lh; struct node_shared_s *details_rh; if((constraint->score > -INFINITY) && (constraint->score < INFINITY)) { return; } details_rh = rsc_rh->allocated_to?rsc_rh->allocated_to->details:NULL; details_lh = rsc_lh->allocated_to?rsc_lh->allocated_to->details:NULL; if(constraint->score == INFINITY && details_lh != details_rh) { crm_err("%s and %s are both allocated" " but to different nodes: %s vs. %s", rsc_lh->id, rsc_rh->id, details_lh?details_lh->uname:"n/a", details_rh?details_rh->uname:"n/a"); } else if(constraint->score == -INFINITY && details_lh == details_rh) { crm_err("%s and %s are both allocated" " but to the SAME node: %s", rsc_lh->id, rsc_rh->id, details_rh?details_rh->uname:"n/a"); } return; } else { colocation_match(rsc_lh, rsc_rh, constraint); } } void node_list_update(GListPtr list1, GListPtr list2, int factor) { node_t *other_node = NULL; slist_iter( node, node_t, list1, lpc, if(node == NULL) { continue; } other_node = (node_t*)pe_find_node_id( list2, node->details->id); if(other_node != NULL) { crm_debug_2("%s: %d + %d", node->details->uname, node->weight, other_node->weight); node->weight = merge_weights( factor*other_node->weight, node->weight); } ); } +GListPtr find_actions_by_task(GListPtr actions, resource_t *rsc, const char *original_key); +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; + parse_op_key(original_key, &tmp, &task, &interval); + + key = generate_op_key(rsc->id, task, interval); + list = find_actions(actions, key, NULL); + + crm_free(key); + crm_free(tmp); + crm_free(task); + } + + return list; +} + void native_rsc_order_lh(resource_t *lh_rsc, order_constraint_t *order, pe_working_set_t *data_set) { GListPtr lh_actions = NULL; action_t *lh_action = order->lh_action; resource_t *rh_rsc = order->rh_rsc; crm_debug_2("Processing LH of ordering constraint %d", order->id); CRM_ASSERT(lh_rsc != NULL); if(lh_action != NULL) { lh_actions = g_list_append(NULL, lh_action); } else if(lh_action == NULL) { - lh_actions = find_actions( - lh_rsc->actions, order->lh_action_task, 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; crm_debug_2("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); parse_op_key( order->lh_action_task, &rsc_id, &op_type, &interval); key = generate_op_key(lh_rsc->id, op_type, interval); lh_action = custom_action(lh_rsc, key, op_type, NULL, TRUE, TRUE, data_set); if(lh_rsc->fns->state(lh_rsc, TRUE) == RSC_ROLE_STOPPED && safe_str_eq(op_type, CRMD_ACTION_STOP)) { lh_action->pseudo = TRUE; lh_action->runnable = TRUE; } lh_actions = g_list_append(NULL, lh_action); crm_free(op_type); crm_free(rsc_id); } slist_iter( lh_action_iter, action_t, lh_actions, lpc, if(rh_rsc == NULL && order->rh_action) { rh_rsc = order->rh_action->rsc; } if(rh_rsc) { rh_rsc->cmds->rsc_order_rh( lh_action_iter, rh_rsc, order); } else if(order->rh_action) { order_actions( lh_action_iter, order->rh_action, order->type); } ); pe_free_shallow_adv(lh_actions, FALSE); } void native_rsc_order_rh( action_t *lh_action, resource_t *rsc, order_constraint_t *order) { GListPtr rh_actions = NULL; action_t *rh_action = NULL; CRM_CHECK(rsc != NULL, return); CRM_CHECK(order != NULL, return); rh_action = order->rh_action; crm_debug_3("Processing RH of ordering constraint %d", order->id); if(rh_action != NULL) { rh_actions = g_list_append(NULL, rh_action); } else if(rsc != NULL) { - rh_actions = find_actions( - rsc->actions, order->rh_action_task, NULL); + rh_actions = find_actions_by_task( + rsc->actions, rsc, order->rh_action_task); } if(rh_actions == NULL) { crm_debug_4("No RH-Side (%s/%s) found for constraint..." " ignoring", rsc->id,order->rh_action_task); if(lh_action) { crm_debug_4("LH-Side was: %s", lh_action->uuid); } return; } slist_iter( rh_action_iter, action_t, rh_actions, lpc, if(lh_action) { order_actions(lh_action, rh_action_iter, order->type); } else if(order->type & pe_order_implies_right) { rh_action_iter->runnable = FALSE; crm_warn("Unrunnable %s 0x%.6x", rh_action_iter->uuid, order->type); } else { crm_warn("neither %s 0x%.6x", rh_action_iter->uuid, order->type); } ); pe_free_shallow_adv(rh_actions, FALSE); } void native_rsc_location(resource_t *rsc, rsc_to_node_t *constraint) { GListPtr or_list; crm_debug_2("Applying %s (%s) to %s", constraint->id, role2text(constraint->role_filter), rsc->id); /* take "lifetime" into account */ if(constraint == NULL) { pe_err("Constraint is NULL"); return; } else if(rsc == NULL) { pe_err("LHS of rsc_to_node (%s) is NULL", constraint->id); return; } else if(constraint->role_filter > 0 && constraint->role_filter != rsc->next_role) { crm_debug("Constraint (%s) is not active (role : %s)", constraint->id, role2text(constraint->role_filter)); return; } else if(is_active(constraint) == FALSE) { crm_debug_2("Constraint (%s) is not active", constraint->id); return; } if(constraint->node_list_rh == NULL) { crm_debug_2("RHS of constraint %s is NULL", constraint->id); return; } or_list = node_list_or( rsc->allowed_nodes, constraint->node_list_rh, FALSE); pe_free_shallow(rsc->allowed_nodes); rsc->allowed_nodes = or_list; slist_iter(node, node_t, or_list, lpc, crm_debug_3("%s + %s : %d", rsc->id, node->details->uname, node->weight); ); } void native_expand(resource_t *rsc, pe_working_set_t *data_set) { crm_debug_3("Processing actions from %s", rsc->id); slist_iter( action, action_t, rsc->actions, lpc, crm_debug_4("processing action %d for rsc=%s", action->id, rsc->id); graph_element_from_action(action, data_set); ); slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->expand(child_rsc, data_set); ); } void create_notifications(resource_t *rsc, pe_working_set_t *data_set) { } static void register_activity(resource_t *rsc, enum action_tasks task, node_t *node, notify_data_t *n_data) { notify_entry_t *entry = NULL; CRM_CHECK(node != NULL, crm_err("%s has no node for required action %s", rsc->id, task2text(task)); return); crm_malloc0(entry, sizeof(notify_entry_t)); entry->rsc = rsc; entry->node = node; switch(task) { case start_rsc: n_data->start = g_list_append(n_data->start, entry); break; case stop_rsc: n_data->stop = g_list_append(n_data->stop, entry); break; case action_promote: n_data->promote = g_list_append(n_data->promote, entry); break; case action_demote: n_data->demote = g_list_append(n_data->demote, entry); break; default: crm_err("Unsupported notify action: %s", task2text(task)); crm_free(entry); break; } } static void register_state(resource_t *rsc, node_t *on_node, notify_data_t *n_data) { notify_entry_t *entry = NULL; crm_malloc0(entry, sizeof(notify_entry_t)); entry->rsc = rsc; entry->node = on_node; crm_debug_2("%s state: %s", rsc->id, role2text(rsc->next_role)); switch(rsc->next_role) { case RSC_ROLE_STOPPED: /* n_data->inactive = g_list_append(n_data->inactive, entry); */ crm_free(entry); break; case RSC_ROLE_STARTED: n_data->active = g_list_append(n_data->active, entry); break; case RSC_ROLE_SLAVE: n_data->slave = g_list_append(n_data->slave, entry); break; case RSC_ROLE_MASTER: n_data->master = g_list_append(n_data->master, entry); break; default: crm_err("Unsupported notify role"); crm_free(entry); break; } } void complex_create_notify_element(resource_t *rsc, action_t *op, notify_data_t *n_data, pe_working_set_t *data_set) { node_t *next_node = NULL; gboolean registered = FALSE; char *op_key = NULL; GListPtr possible_matches = NULL; enum action_tasks task = text2task(op->task); if(rsc->children) { slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->create_notify_element( child_rsc, op, n_data, data_set); ); return; } if(op->pre_notify == NULL || op->post_notify == NULL) { /* no notifications required */ crm_debug_4("No notificaitons required for %s", op->task); return; } next_node = rsc->allocated_to; op_key = generate_op_key(rsc->id, op->task, 0); possible_matches = find_actions(rsc->actions, op_key, NULL); crm_debug_2("Creating notificaitons for: %s (%s->%s)", op->uuid, role2text(rsc->role), role2text(rsc->next_role)); if(rsc->role == rsc->next_role) { register_state(rsc, next_node, n_data); } slist_iter( local_op, action_t, possible_matches, lpc, local_op->notify_keys = n_data->keys; if(local_op->optional == FALSE) { registered = TRUE; register_activity(rsc, task, local_op->node, n_data); } ); /* stop / demote */ if(rsc->role != RSC_ROLE_STOPPED) { if(task == stop_rsc || task == action_demote) { slist_iter( current_node, node_t, rsc->running_on, lpc, pe_pre_notify(rsc, current_node, op, n_data, data_set); if(task == action_demote || registered == FALSE) { pe_post_notify(rsc, current_node, op, n_data, data_set); } ); } } /* start / promote */ if(rsc->next_role != RSC_ROLE_STOPPED) { CRM_CHECK(next_node != NULL,;); if(next_node == NULL) { pe_proc_err("next role: %s", role2text(rsc->next_role)); } else if(task == start_rsc || task == action_promote) { if(task != start_rsc || registered == FALSE) { pe_pre_notify(rsc, next_node, op, n_data, data_set); } pe_post_notify(rsc, next_node, op, n_data, data_set); } } crm_free(op_key); g_list_free(possible_matches); } static void dup_attr(gpointer key, gpointer value, gpointer user_data) { char *meta_key = crm_concat(CRM_META, key, '_'); g_hash_table_replace(user_data, meta_key, crm_strdup(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) { crm_debug_2("Op=%p confirm=%p", op, confirm); return NULL; } CRM_CHECK(node != NULL, return NULL); if(node->details->online == FALSE) { crm_debug_2("Skipping notification for %s: node offline", rsc->id); return NULL; } else if(op->runnable == FALSE) { crm_debug_2("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"); crm_debug("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, op->optional, TRUE, data_set); g_hash_table_foreach(op->meta, dup_attr, trigger->extra); trigger->notify_keys = n_data->keys; /* pseudo_notify before notify */ crm_debug_3("Ordering %s before %s (%d->%d)", op->uuid, trigger->uuid, trigger->id, op->id); order_actions(op, trigger, pe_order_implies_left); value = g_hash_table_lookup(op->meta, "notify_confirm"); if(crm_is_true(value)) { /* notify before pseudo_notified */ crm_debug_3("Ordering %s before %s (%d->%d)", trigger->uuid, confirm->uuid, confirm->id, trigger->id); order_actions(trigger, confirm, pe_order_implies_left); } return trigger; } void pe_pre_notify(resource_t *rsc, node_t *node, action_t *op, notify_data_t *n_data, pe_working_set_t *data_set) { crm_debug_2("%s: %s", rsc->id, op->uuid); pe_notify(rsc, node, op->pre_notify, op->pre_notified, n_data, data_set); } void pe_post_notify(resource_t *rsc, node_t *node, action_t *op, notify_data_t *n_data, pe_working_set_t *data_set) { action_t *notify = NULL; CRM_CHECK(op != NULL, return); CRM_CHECK(rsc != NULL, return); crm_debug_2("%s: %s", rsc->id, op->uuid); notify = pe_notify(rsc, node, op->post_notify, op->post_notified, n_data, data_set); if(notify != NULL) { /* crm_err("Upgrading priority for %s to INFINITY", notify->uuid); */ notify->priority = INFINITY; } notify = op->post_notified; if(notify != NULL) { slist_iter( mon, action_t, rsc->actions, lpc, const char *interval = g_hash_table_lookup(mon->meta, "interval"); if(interval == NULL || safe_str_eq(interval, "0")) { crm_debug_3("Skipping %s: interval", mon->uuid); continue; } else if(safe_str_eq(mon->task, "cancel")) { crm_debug_3("Skipping %s: cancel", mon->uuid); continue; } order_actions(notify, mon, pe_order_optional); ); } } void NoRoleChange(resource_t *rsc, node_t *current, node_t *next, pe_working_set_t *data_set) { action_t *stop = NULL; action_t *start = NULL; GListPtr possible_matches = NULL; crm_debug_2("Executing: %s (role=%s)",rsc->id, role2text(rsc->next_role)); if(current == NULL || next == NULL) { return; } if(is_set(rsc->flags, pe_rsc_failed) || safe_str_neq(current->details->id, next->details->id)) { if(is_set(rsc->flags, pe_rsc_failed)) { crm_notice("Recover resource %s\t(%s)", rsc->id, next->details->uname); } else { crm_notice("Move resource %s\t(%s -> %s)", rsc->id, current->details->uname, next->details->uname); } if(rsc->next_role > RSC_ROLE_STARTED) { gboolean optional = TRUE; if(rsc->role == RSC_ROLE_MASTER) { optional = FALSE; } DemoteRsc(rsc, current, optional, data_set); } if(rsc->role == RSC_ROLE_MASTER) { DemoteRsc(rsc, current, FALSE, data_set); } StopRsc(rsc, current, FALSE, data_set); StartRsc(rsc, next, FALSE, data_set); if(rsc->next_role == RSC_ROLE_MASTER) { PromoteRsc(rsc, next, FALSE, data_set); } possible_matches = find_recurring_actions(rsc->actions, next); slist_iter(match, action_t, possible_matches, lpc, if(match->optional == FALSE) { crm_debug("Fixing recurring action: %s", match->uuid); match->optional = TRUE; } ); g_list_free(possible_matches); } else if(is_set(rsc->flags, pe_rsc_start_pending)) { action_t *start = start_action(rsc, next, TRUE); if(start->runnable) { /* wait for StartRsc() to be called */ rsc->role = RSC_ROLE_STOPPED; } else { /* wait for StopRsc() to be called */ rsc->next_role = RSC_ROLE_STOPPED; } } else { stop = stop_action(rsc, current, TRUE); start = start_action(rsc, next, TRUE); stop->optional = start->optional; if(rsc->next_role > RSC_ROLE_STARTED) { DemoteRsc(rsc, current, start->optional, data_set); } StopRsc(rsc, current, start->optional, data_set); StartRsc(rsc, current, start->optional, data_set); if(rsc->next_role == RSC_ROLE_MASTER) { PromoteRsc(rsc, next, start->optional, data_set); } if(start->runnable == FALSE) { rsc->next_role = RSC_ROLE_STOPPED; } else if(start->optional) { crm_notice("Leave resource %s\t(%s)", rsc->id, next->details->uname); } else { crm_notice("Restart resource %s\t(%s)", rsc->id, next->details->uname); } } } gboolean StopRsc(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { action_t *stop = NULL; const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); crm_debug_2("Executing: %s", rsc->id); if(rsc->next_role == RSC_ROLE_STOPPED && rsc->variant == pe_native && safe_str_eq(class, "stonith")) { action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); custom_action_order( NULL, crm_strdup(all_stopped->task), all_stopped, rsc, stop_key(rsc), NULL, pe_order_implies_left|pe_order_stonith_stop, data_set); } slist_iter( current, node_t, rsc->running_on, lpc, stop = stop_action(rsc, current, optional); if(stop->runnable && stop->optional == FALSE) { crm_notice(" %s\tStop %s",current->details->uname,rsc->id); } if(data_set->remove_after_stop) { DeleteRsc(rsc, current, optional, data_set); } ); return TRUE; } gboolean StartRsc(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { action_t *start = NULL; crm_debug_2("Executing: %s", rsc->id); start = start_action(rsc, next, TRUE); if(start->runnable && optional == FALSE) { crm_notice(" %s\tStart %s", next->details->uname, rsc->id); start->optional = FALSE; } return TRUE; } gboolean PromoteRsc(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { char *key = NULL; gboolean runnable = TRUE; GListPtr action_list = NULL; crm_debug_2("Executing: %s", rsc->id); CRM_CHECK(rsc->next_role == RSC_ROLE_MASTER, crm_err("Next role: %s", role2text(rsc->next_role)); return FALSE); CRM_CHECK(next != NULL, return FALSE); key = start_key(rsc); action_list = find_actions_exact(rsc->actions, key, next); crm_free(key); slist_iter(start, action_t, action_list, lpc, if(start->runnable == FALSE) { runnable = FALSE; } ); g_list_free(action_list); if(runnable) { promote_action(rsc, next, optional); if(optional == FALSE) { crm_notice("%s\tPromote %s", next->details->uname, rsc->id); } return TRUE; } crm_debug("%s\tPromote %s (canceled)", next->details->uname, rsc->id); key = promote_key(rsc); action_list = find_actions_exact(rsc->actions, key, next); crm_free(key); slist_iter(promote, action_t, action_list, lpc, promote->runnable = FALSE; ); g_list_free(action_list); return TRUE; } gboolean DemoteRsc(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { crm_debug_2("Executing: %s", rsc->id); /* CRM_CHECK(rsc->next_role == RSC_ROLE_SLAVE, return FALSE); */ slist_iter( current, node_t, rsc->running_on, lpc, crm_notice("%s\tDemote %s", current->details->uname, rsc->id); demote_action(rsc, current, optional); ); return TRUE; } gboolean RoleError(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { crm_debug("Executing: %s", rsc->id); CRM_CHECK(FALSE, return FALSE); return FALSE; } gboolean NullOp(resource_t *rsc, node_t *next, gboolean optional, pe_working_set_t *data_set) { crm_debug("Executing: %s", rsc->id); return FALSE; } gboolean DeleteRsc(resource_t *rsc, node_t *node, gboolean optional, pe_working_set_t *data_set) { action_t *delete = NULL; #if DELETE_THEN_REFRESH action_t *refresh = NULL; #endif if(is_set(rsc->flags, pe_rsc_failed)) { crm_debug_2("Resource %s not deleted from %s: failed", rsc->id, node->details->uname); return FALSE; } else if(node == NULL) { crm_debug_2("Resource %s not deleted: NULL node", rsc->id); return FALSE; } else if(node->details->unclean || node->details->online == FALSE) { crm_debug_2("Resource %s not deleted from %s: unrunnable", rsc->id, node->details->uname); return FALSE; } crm_notice("Removing %s from %s", rsc->id, node->details->uname); delete = delete_action(rsc, node, optional); custom_action_order( rsc, stop_key(rsc), NULL, rsc, delete_key(rsc), NULL, optional?pe_order_implies_right:pe_order_implies_left, data_set); #if DELETE_THEN_REFRESH refresh = custom_action( NULL, crm_strdup(CRM_OP_LRM_REFRESH), CRM_OP_LRM_REFRESH, node, FALSE, TRUE, data_set); add_hash_param(refresh->meta, XML_ATTR_TE_NOWAIT, XML_BOOLEAN_TRUE); order_actions(delete, refresh, pe_order_optional); #endif return TRUE; } gboolean native_create_probe(resource_t *rsc, node_t *node, action_t *complete, gboolean force, pe_working_set_t *data_set) { char *key = NULL; char *target_rc = NULL; action_t *probe = NULL; node_t *running = NULL; CRM_CHECK(node != NULL, return FALSE); if(rsc->children) { gboolean any_created = FALSE; slist_iter( child_rsc, resource_t, rsc->children, lpc, any_created = child_rsc->cmds->create_probe( child_rsc, node, complete, force, data_set) || any_created; ); return any_created; } if(is_set(rsc->flags, pe_rsc_orphan)) { crm_debug_2("Skipping orphan: %s", rsc->id); return FALSE; } running = pe_find_node_id(rsc->known_on, node->details->id); if(force == FALSE && running != NULL) { /* we already know the status of the resource on this node */ crm_debug_3("Skipping active: %s", rsc->id); return FALSE; } key = generate_op_key(rsc->id, CRMD_ACTION_STATUS, 0); probe = custom_action(rsc, key, CRMD_ACTION_STATUS, node, FALSE, TRUE, data_set); probe->optional = FALSE; running = pe_find_node_id(rsc->running_on, node->details->id); if(running == NULL) { target_rc = crm_itoa(EXECRA_NOT_RUNNING); } else if(rsc->role == RSC_ROLE_MASTER) { target_rc = crm_itoa(EXECRA_RUNNING_MASTER); } if(target_rc != NULL) { add_hash_param(probe->meta, XML_ATTR_TE_TARGET_RC, target_rc); crm_free(target_rc); } crm_debug_2("Probing %s on %s (%s)", rsc->id, node->details->uname, role2text(rsc->role)); - custom_action_order(rsc, NULL, probe, rsc, NULL, complete, + custom_action_order(rsc, NULL, probe, NULL, NULL, complete, pe_order_implies_right, data_set); return TRUE; } static void native_start_constraints( resource_t *rsc, action_t *stonith_op, gboolean is_stonith, pe_working_set_t *data_set) { node_t *target = stonith_op?stonith_op->node:NULL; if(is_stonith) { char *key = start_key(rsc); action_t *ready = get_pseudo_op(STONITH_UP, data_set); crm_debug_2("Ordering %s action before stonith events", key); custom_action_order( rsc, key, NULL, NULL, crm_strdup(ready->task), ready, pe_order_implies_right, data_set); } else { action_t *all_stopped = get_pseudo_op(ALL_STOPPED, data_set); slist_iter(action, action_t, rsc->actions, lpc2, if(action->needs == rsc_req_stonith) { order_actions(all_stopped, action, pe_order_implies_left); } else if(target != NULL && target->details->expected_up && safe_str_eq(action->task, CRMD_ACTION_START) && NULL == pe_find_node_id( rsc->known_on, target->details->id)) { /* if expected_up == TRUE, then we've seen * the node before and it has failed (as * opposed to just hasn't started up yet) * * if known == NULL, then we dont know if * the resource is active on the node * we're about to shoot * * in this case, regardless of action->needs, * the only safe option is to wait until * the node is shot before doing anything * to with the resource * * its analogous to waiting for all the probes * for rscX to complete before starting rscX * * the most likely explaination is that the * DC died and took its status with it */ crm_info("Ordering %s after %s recovery", action->uuid, target->details->uname); order_actions(all_stopped, action, pe_order_implies_left|pe_order_runnable_left); } ); } } static void native_stop_constraints( resource_t *rsc, action_t *stonith_op, gboolean is_stonith, pe_working_set_t *data_set) { char *key = NULL; GListPtr action_list = NULL; node_t *node = stonith_op->node; key = stop_key(rsc); action_list = find_actions(rsc->actions, key, node); crm_free(key); /* add the stonith OP as a stop pre-req and the mark the stop * as a pseudo op - since its now redundant */ slist_iter( action, action_t, action_list, lpc2, resource_t *parent = NULL; if(node->details->online && node->details->unclean == FALSE && is_set(rsc->flags, pe_rsc_failed)) { continue; } if(is_set(rsc->flags, pe_rsc_failed)) { crm_warn("Stop of failed resource %s is" " implicit after %s is fenced", rsc->id, node->details->uname); } else { crm_info("%s is implicit after %s is fenced", action->uuid, node->details->uname); } /* the stop would never complete and is * now implied by the stonith operation */ action->pseudo = TRUE; action->runnable = TRUE; action->implied_by_stonith = TRUE; if(is_stonith == FALSE) { order_actions(stonith_op, action, pe_order_optional); } /* find the top-most resource */ parent = rsc->parent; while(parent != NULL && parent->parent != NULL) { parent = parent->parent; } if(parent) { crm_info("Re-creating actions for %s", parent->id); parent->cmds->create_actions(parent, data_set); /* make sure we dont mess anything up in create_actions */ CRM_CHECK(action->pseudo, action->pseudo = TRUE); CRM_CHECK(action->runnable, action->runnable = TRUE); } /* From Bug #1601, successful fencing must be an input to a failed resources stop action. However given group(A, B) running on nodeX and B.stop has failed, A := stop healthy resource (A.stop) B := stop failed resource (pseudo operation B.stop) C := stonith nodeX A requires B, B requires C, C requires A This loop would prevent the cluster from making progress. This block creates the "C requires A" dependancy and therefore must (at least for now) be disabled. Instead, run the block above and treat all resources on nodeX as B would be (marked as a pseudo op depending on the STONITH). } else if(is_stonith == FALSE) { crm_info("Moving healthy resource %s" " off %s before fencing", rsc->id, node->details->uname); * stop healthy resources before the * stonith op * custom_action_order( rsc, stop_key(rsc), NULL, NULL,crm_strdup(CRM_OP_FENCE),stonith_op, pe_order_optional, data_set); */ ); g_list_free(action_list); key = demote_key(rsc); action_list = find_actions(rsc->actions, key, node); crm_free(key); slist_iter( action, action_t, action_list, lpc2, if(node->details->online == FALSE || is_set(rsc->flags, pe_rsc_failed)) { crm_info("Demote of failed resource %s is" " implict after %s is fenced", rsc->id, node->details->uname); /* the stop would never complete and is * now implied by the stonith operation */ action->pseudo = TRUE; action->runnable = TRUE; if(is_stonith == FALSE) { order_actions(stonith_op, action, pe_order_optional); } } ); g_list_free(action_list); } void complex_stonith_ordering( resource_t *rsc, action_t *stonith_op, pe_working_set_t *data_set) { gboolean is_stonith = FALSE; const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); if(rsc->children) { slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->stonith_ordering( child_rsc, stonith_op, data_set); ); return; } if(is_not_set(rsc->flags, pe_rsc_managed)) { crm_debug_3("Skipping fencing constraints for unmanaged resource: %s", rsc->id); return; } if(stonith_op != NULL && safe_str_eq(class, "stonith")) { is_stonith = TRUE; } /* Start constraints */ native_start_constraints(rsc, stonith_op, is_stonith, data_set); /* Stop constraints */ native_stop_constraints(rsc, stonith_op, is_stonith, data_set); } #define ALLOW_WEAK_MIGRATION 0 static gboolean check_stack_element(resource_t *rsc, resource_t *other_rsc, const char *type) { char *key = NULL; int level = LOG_DEBUG; GListPtr action_list = NULL; if(other_rsc == NULL || other_rsc == rsc) { return TRUE; } do_crm_log(level+1, "%s: processing %s (%s)", rsc->id, other_rsc->id, type); if(other_rsc->variant == pe_native) { do_crm_log(level, "%s: depends on %s (mid-stack) %s", rsc->id, other_rsc->id, type); return FALSE; } else if(other_rsc->variant == pe_group) { if(at_stack_bottom(other_rsc) == FALSE) { do_crm_log(level, "%s: depends on group %s (mid-stack) %s", rsc->id, other_rsc->id, type); return FALSE; } return TRUE; } /* is the clone also moving moved around? * * if so, then we can't yet be completely sure the * resource can safely migrate since the node we're * moving too may not have the clone instance started * yet * * in theory we can figure out if the clone instance we * will run on is already there, but there that would * involve too much knowledge of internal clone code. * maybe later... */ do_crm_log(level+1,"%s: start depends on clone %s", rsc->id, other_rsc->id); key = stop_key(other_rsc); action_list = find_actions(other_rsc->actions, key, NULL); crm_free(key); slist_iter( other_stop, action_t, action_list,lpc, if(other_stop && other_stop->optional == FALSE) { do_crm_log(level, "%s: start depends on %s", rsc->id, other_stop->uuid); g_list_free(action_list); return FALSE; } ); g_list_free(action_list); return TRUE; } gboolean at_stack_bottom(resource_t *rsc) { char *key = NULL; action_t *start = NULL; action_t *other = NULL; GListPtr action_list = NULL; key = start_key(rsc); action_list = find_actions(rsc->actions, key, NULL); crm_free(key); crm_debug_3("%s: processing", rsc->id); CRM_CHECK(action_list != NULL, return FALSE); start = action_list->data; g_list_free(action_list); slist_iter( constraint, rsc_colocation_t, rsc->rsc_cons, lpc, resource_t *target = constraint->rsc_rh; crm_debug_4("%s == %s (%d)", rsc->id, target->id, constraint->score); if(constraint->score > 0 && check_stack_element(rsc, target, "coloc") == FALSE) { return FALSE; } ); slist_iter( other_w, action_wrapper_t, start->actions_before, lpc, other = other_w->action; #if ALLOW_WEAK_MIGRATION if((other_w->type & pe_order_implies_right) == 0) { crm_debug_3("%s: depends on %s (optional ordering)", rsc->id, other->uuid); continue; } #endif if(other->optional == FALSE && check_stack_element(rsc, other->rsc, "order") == FALSE) { return FALSE; } ); return TRUE; } void complex_migrate_reload(resource_t *rsc, pe_working_set_t *data_set) { char *key = NULL; int level = LOG_DEBUG; GListPtr action_list = NULL; action_t *stop = NULL; action_t *start = NULL; action_t *other = NULL; action_t *action = NULL; const char *value = NULL; if(rsc->children) { slist_iter( child_rsc, resource_t, rsc->children, lpc, child_rsc->cmds->migrate_reload(child_rsc, data_set); ); other = NULL; return; } do_crm_log(level+1, "Processing %s", rsc->id); CRM_CHECK(rsc->variant == pe_native, return); if(is_not_set(rsc->flags, pe_rsc_managed) || is_set(rsc->flags, pe_rsc_failed) || is_set(rsc->flags, pe_rsc_start_pending) || rsc->next_role != RSC_ROLE_STARTED || g_list_length(rsc->running_on) != 1) { do_crm_log(level+1, "%s: general resource state", rsc->id); return; } key = start_key(rsc); action_list = find_actions(rsc->actions, key, NULL); crm_free(key); if(action_list == NULL) { do_crm_log(level, "%s: no start action", rsc->id); return; } start = action_list->data; g_list_free(action_list); value = g_hash_table_lookup(rsc->meta, "allow_migrate"); if(crm_is_true(value)) { set_bit(rsc->flags, pe_rsc_can_migrate); } if(is_not_set(rsc->flags, pe_rsc_can_migrate) && start->allow_reload_conversion == FALSE) { do_crm_log(level+1, "%s: no need to continue", rsc->id); return; } key = stop_key(rsc); action_list = find_actions(rsc->actions, key, NULL); crm_free(key); if(action_list == NULL) { do_crm_log(level, "%s: no stop action", rsc->id); return; } stop = action_list->data; g_list_free(action_list); action = start; if(action->pseudo || action->optional || action->node == NULL || action->runnable == FALSE) { do_crm_log(level, "%s: %s", rsc->id, action->task); return; } action = stop; if(action->pseudo || action->optional || action->node == NULL || action->runnable == FALSE) { do_crm_log(level, "%s: %s", rsc->id, action->task); return; } if(is_set(rsc->flags, pe_rsc_can_migrate)) { if(start->node == NULL || stop->node == NULL || stop->node->details == start->node->details) { clear_bit(rsc->flags, pe_rsc_can_migrate); } else if(at_stack_bottom(rsc) == FALSE) { crm_notice("Cannot migrate %s from %s to %s" " - %s is not at the bottom of the resource stack", rsc->id, stop->node->details->uname, start->node->details->uname, rsc->id); clear_bit(rsc->flags, pe_rsc_can_migrate); } } if(is_set(rsc->flags, pe_rsc_can_migrate)) { crm_notice("Migrating %s from %s to %s", rsc->id, stop->node->details->uname, start->node->details->uname); crm_free(stop->uuid); crm_free(stop->task); stop->task = crm_strdup(CRMD_ACTION_MIGRATE); stop->uuid = generate_op_key(rsc->id, stop->task, 0); add_hash_param(stop->meta, "migrate_source", stop->node->details->uname); add_hash_param(stop->meta, "migrate_target", start->node->details->uname); /* Hook up to the all_stopped and shutdown actions */ slist_iter( other_w, action_wrapper_t, stop->actions_after, lpc, other = other_w->action; if(other->optional == FALSE && other->rsc == NULL) { order_actions(start, other, other_w->type); } ); slist_iter( other_w, action_wrapper_t, start->actions_before, lpc, other = other_w->action; if(other->optional == FALSE #if ALLOW_WEAK_MIGRATION && (other_w->type & pe_order_implies_right) #endif && other->rsc != NULL && other->rsc != rsc->parent && other->rsc != rsc) { do_crm_log(level, "Ordering %s before %s", other->uuid, stop->uuid); order_actions(other, stop, other_w->type); } ); crm_free(start->uuid); crm_free(start->task); start->task = crm_strdup(CRMD_ACTION_MIGRATED); start->uuid = generate_op_key(rsc->id, start->task, 0); add_hash_param(start->meta, "migrate_source_uuid", stop->node->details->id); add_hash_param(start->meta, "migrate_source", stop->node->details->uname); add_hash_param(start->meta, "migrate_target", start->node->details->uname); } else if(start->allow_reload_conversion && stop->node->details == start->node->details) { crm_info("Rewriting restart of %s on %s as a reload", rsc->id, start->node->details->uname); crm_free(start->uuid); crm_free(start->task); start->task = crm_strdup("reload"); start->uuid = generate_op_key(rsc->id, start->task, 0); stop->pseudo = TRUE; /* easier than trying to delete it from the graph */ } else { do_crm_log(level+1, "%s nothing to do", rsc->id); } } diff --git a/pengine/pengine.h b/pengine/pengine.h index bf003f9c0a..945b73a613 100644 --- a/pengine/pengine.h +++ b/pengine/pengine.h @@ -1,177 +1,180 @@ /* * 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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PENGINE__H #define PENGINE__H #include typedef struct rsc_to_node_s rsc_to_node_t; typedef struct rsc_colocation_s rsc_colocation_t; typedef struct lrm_agent_s lrm_agent_t; typedef struct order_constraint_s order_constraint_t; #include #include #include #include #include #include #include #include enum pe_stop_fail { pesf_block, pesf_stonith, pesf_ignore }; enum pe_ordering { pe_order_none = 0x0, /* deleted */ pe_order_implies_left = 0x01, /* was: _mandatory */ pe_order_implies_right = 0x02, /* was: _recover */ pe_order_runnable_left = 0x10, /* needs the LHS side to be runnable */ pe_order_runnable_right = 0x20, /* needs the RHS side to be runnable */ pe_order_optional = 0x100, /* pure ordering, nothing implied */ pe_order_stonith_stop = 0x200, /* only applies if the action is non-pseudo */ pe_order_restart = 0x400, /* stop-start constraint */ pe_order_demote = 0x800, /* stop-start constraint */ pe_order_shutdown = 0x1000, /* combines with pe_order_restart to make a complex resource shut down */ pe_order_demote_stop = 0x2000, /* upgrades to implies_left if the resource is a master */ + + pe_order_complex_left = 0x10000, /* upgrades to implies left */ + pe_order_complex_right = 0x20000, /* upgrades to implies right */ - pe_order_test = 0x10000 /* test marker */ + pe_order_test = 0x100000 /* test marker */ }; struct rsc_colocation_s { const char *id; const char *node_attribute; resource_t *rsc_lh; resource_t *rsc_rh; int role_lh; int role_rh; int score; }; struct rsc_to_node_s { const char *id; resource_t *rsc_lh; enum rsc_role_e role_filter; GListPtr node_list_rh; /* node_t* */ }; struct order_constraint_s { int id; enum pe_ordering type; void *lh_opaque; resource_t *lh_rsc; action_t *lh_action; char *lh_action_task; void *rh_opaque; resource_t *rh_rsc; action_t *rh_action; char *rh_action_task; /* (soon to be) variant specific */ /* int lh_rsc_incarnation; */ /* int rh_rsc_incarnation; */ }; enum pe_link_state { pe_link_not_dumped, pe_link_dumped, pe_link_dup, }; typedef struct action_wrapper_s action_wrapper_t; struct action_wrapper_s { enum pe_ordering type; enum pe_link_state state; action_t *action; }; extern gboolean stage0(pe_working_set_t *data_set); extern gboolean stage1(pe_working_set_t *data_set); extern gboolean stage2(pe_working_set_t *data_set); extern gboolean stage3(pe_working_set_t *data_set); extern gboolean stage4(pe_working_set_t *data_set); extern gboolean stage5(pe_working_set_t *data_set); extern gboolean stage6(pe_working_set_t *data_set); extern gboolean stage7(pe_working_set_t *data_set); extern gboolean stage8(pe_working_set_t *data_set); extern gboolean summary(GListPtr resources); extern gboolean pe_msg_dispatch(IPC_Channel *sender, void *user_data); extern gboolean process_pe_message( HA_Message *msg, crm_data_t *xml_data, IPC_Channel *sender); extern gboolean unpack_constraints( crm_data_t *xml_constraints, pe_working_set_t *data_set); extern gboolean update_action_states(GListPtr actions); extern gboolean shutdown_constraints( node_t *node, action_t *shutdown_op, pe_working_set_t *data_set); extern gboolean stonith_constraints( node_t *node, action_t *stonith_op, pe_working_set_t *data_set); extern int custom_action_order( resource_t *lh_rsc, char *lh_task, action_t *lh_action, resource_t *rh_rsc, char *rh_task, action_t *rh_action, enum pe_ordering type, pe_working_set_t *data_set); #define order_start_start(rsc1,rsc2, type) \ custom_action_order(rsc1, start_key(rsc1), NULL, \ rsc2, start_key(rsc2) ,NULL, \ type, data_set) #define order_stop_stop(rsc1, rsc2, type) \ custom_action_order(rsc1, stop_key(rsc1), NULL, \ rsc2, stop_key(rsc2) ,NULL, \ type, data_set) #define order_stop_start(rsc1, rsc2, type) \ custom_action_order(rsc1, stop_key(rsc1), NULL, \ rsc2, start_key(rsc2) ,NULL, \ type, data_set) #define order_start_stop(rsc1, rsc2, type) \ custom_action_order(rsc1, start_key(rsc1), NULL, \ rsc2, stop_key(rsc2) ,NULL, \ type, data_set) extern void graph_element_from_action( action_t *action, pe_working_set_t *data_set); extern const char* transition_idle_timeout; #endif diff --git a/pengine/regression.sh b/pengine/regression.sh index 4ee8fe428a..32e3f63b26 100755 --- a/pengine/regression.sh +++ b/pengine/regression.sh @@ -1,275 +1,277 @@ #!/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.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # if [ -x /usr/bin/valgrind ]; then export G_SLICE=always-malloc VALGRIND_CMD="valgrind -q --show-reachable=yes --leak-check=full --trace-children=no --time-stamp=yes --num-callers=20 --suppressions=./ptest.supp" fi . regression.core.sh create_mode="true" echo Generating test outputs for these tests... # do_test echo Done. echo "" echo Performing the following tests... 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 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 novell-251689 "Resource definition change + target_role=stopped" echo "" do_test orphan-0 "Orphan ignore" do_test orphan-1 "Orphan stop" echo "" do_test target-0 "Target Role : baseline" do_test target-1 "Target Role : test" echo "" do_test date-1 "Dates" -d "2005-020" do_test date-2 "Date Spec - Pass" -d "2005-020T12:30" do_test date-3 "Date Spec - Fail" -d "2005-020T11:30" do_test probe-0 "Probe (anon clone)" do_test probe-1 "Pending Probe" do_test standby "Standby" do_test comments "Comments" 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)" 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) " 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" #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 " 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" 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)" 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-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" #echo "" #do_test complex1 "Complex " 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" echo "" 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" 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" echo "" do_test managed-0 "Managed (reference)" do_test managed-1 "Not managed - down " do_test managed-2 "Not managed - up " 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)" 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" do_test 662 "OSDL #662" do_test 696 "OSDL #696" do_test 726 "OSDL #726" do_test 735 "OSDL #735" do_test 764 "OSDL #764" do_test 797 "OSDL #797" do_test 829 "OSDL #829" do_test 994 "OSDL #994" +do_test 994-2 "OSDL #994 - with a dependant resource (potentially broken)" 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 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-12 "Recover only the failed portion of a cloned group" echo "" test_results diff --git a/pengine/testcases/994-2.dot b/pengine/testcases/994-2.dot new file mode 100644 index 0000000000..6beff41c06 --- /dev/null +++ b/pengine/testcases/994-2.dot @@ -0,0 +1,16 @@ +digraph "g" { +"all_stopped" [ style=bold color="green" fontcolor="orange" ] +"depends_start_0 paul" [ style=bold color="green" fontcolor="black" ] +"depends_stop_0 paul" -> "all_stopped" [ style = bold] +"depends_stop_0 paul" -> "depends_start_0 paul" [ style = bold] +"depends_stop_0 paul" [ style=bold color="green" fontcolor="black" ] +"group_1_running_0" -> "depends_start_0 paul" [ style = bold] +"group_1_running_0" [ style=bold color="green" fontcolor="orange" ] +"postfix_9_monitor_120000 paul" [ style=bold color="green" fontcolor="black" ] +"postfix_9_start_0 paul" -> "group_1_running_0" [ style = bold] +"postfix_9_start_0 paul" -> "postfix_9_monitor_120000 paul" [ style = bold] +"postfix_9_start_0 paul" [ style=bold color="green" fontcolor="black" ] +"postfix_9_stop_0 paul" -> "all_stopped" [ style = bold] +"postfix_9_stop_0 paul" -> "postfix_9_start_0 paul" [ style = bold] +"postfix_9_stop_0 paul" [ style=bold color="green" fontcolor="black" ] +} diff --git a/pengine/testcases/994-2.exp b/pengine/testcases/994-2.exp new file mode 100644 index 0000000000..e6ec7dd3f2 --- /dev/null +++ b/pengine/testcases/994-2.exp @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/994.xml b/pengine/testcases/994-2.xml similarity index 90% copy from pengine/testcases/994.xml copy to pengine/testcases/994-2.xml index 2c8a291435..5fa004a0e4 100644 --- a/pengine/testcases/994.xml +++ b/pengine/testcases/994-2.xml @@ -1,115 +1,122 @@ + - + + + - + - + + + + + - + - + diff --git a/pengine/testcases/994.dot b/pengine/testcases/994.dot index 52d6b6f04e..2aa3b166c4 100644 --- a/pengine/testcases/994.dot +++ b/pengine/testcases/994.dot @@ -1,36 +1,11 @@ digraph "g" { -"Filesystem_2_monitor_120000 paul" [ style=bold color="green" fontcolor="black" ] -"Filesystem_2_start_0 paul" -> "Filesystem_2_monitor_120000 paul" [ style = bold] -"Filesystem_2_start_0 paul" -> "IPaddr_5_start_0 paul" [ style = bold] -"Filesystem_2_start_0 paul" -> "group_1_running_0" [ style = bold] -"Filesystem_2_start_0 paul" [ style=bold color="green" fontcolor="black" ] -"IPaddr_5_monitor_5000 paul" [ style=bold color="green" fontcolor="black" ] -"IPaddr_5_start_0 paul" -> "IPaddr_5_monitor_5000 paul" [ style = bold] -"IPaddr_5_start_0 paul" -> "group_1_running_0" [ style = bold] -"IPaddr_5_start_0 paul" -> "postfix_9_start_0 paul" [ style = bold] -"IPaddr_5_start_0 paul" [ style=bold color="green" fontcolor="black" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] -"datadisk_1_monitor_120000 paul" [ style=bold color="green" fontcolor="black" ] -"datadisk_1_start_0 paul" -> "Filesystem_2_start_0 paul" [ style = bold] -"datadisk_1_start_0 paul" -> "datadisk_1_monitor_120000 paul" [ style = bold] -"datadisk_1_start_0 paul" -> "group_1_running_0" [ style = bold] -"datadisk_1_start_0 paul" [ style=bold color="green" fontcolor="black" ] "group_1_running_0" [ style=bold color="green" fontcolor="orange" ] -"group_1_start_0" -> "datadisk_1_start_0 paul" [ style = bold] -"group_1_start_0" -> "group_1_running_0" [ style = bold] -"group_1_start_0" [ style=bold color="green" fontcolor="orange" ] -"group_1_stop_0" -> "group_1_start_0" [ style = bold] -"group_1_stop_0" -> "group_1_stopped_0" [ style = bold] -"group_1_stop_0" -> "postfix_9_stop_0 paul" [ style = bold] -"group_1_stop_0" [ style=bold color="green" fontcolor="orange" ] -"group_1_stopped_0" -> "group_1_start_0" [ style = bold] -"group_1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "postfix_9_monitor_120000 paul" [ style=bold color="green" fontcolor="black" ] "postfix_9_start_0 paul" -> "group_1_running_0" [ style = bold] "postfix_9_start_0 paul" -> "postfix_9_monitor_120000 paul" [ style = bold] "postfix_9_start_0 paul" [ style=bold color="green" fontcolor="black" ] "postfix_9_stop_0 paul" -> "all_stopped" [ style = bold] -"postfix_9_stop_0 paul" -> "group_1_stopped_0" [ style = bold] "postfix_9_stop_0 paul" -> "postfix_9_start_0 paul" [ style = bold] "postfix_9_stop_0 paul" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/994.exp b/pengine/testcases/994.exp index 9db85642f3..42ad15a458 100644 --- a/pengine/testcases/994.exp +++ b/pengine/testcases/994.exp @@ -1,197 +1,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - + - + - - - - + diff --git a/pengine/testcases/994.xml b/pengine/testcases/994.xml index 2c8a291435..5f0272affa 100644 --- a/pengine/testcases/994.xml +++ b/pengine/testcases/994.xml @@ -1,115 +1,115 @@ - + - + - + - + diff --git a/pengine/testcases/bug-1572-1.dot b/pengine/testcases/bug-1572-1.dot index 49b17a8166..409bb5f720 100644 --- a/pengine/testcases/bug-1572-1.dot +++ b/pengine/testcases/bug-1572-1.dot @@ -1,148 +1,151 @@ digraph "g" { "IPaddr_147_81_84_133_monitor_25000 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "IPaddr_147_81_84_133_start_0 arc-tkincaidlx.wsicorp.com" -> "IPaddr_147_81_84_133_monitor_25000 arc-tkincaidlx.wsicorp.com" [ style = bold] +"IPaddr_147_81_84_133_start_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_running_0" [ style = bold] "IPaddr_147_81_84_133_start_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "IPaddr_147_81_84_133_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "do_shutdown arc-dknightlx" [ style=bold color="green" fontcolor="black" ] +"fs_mirror_start_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_running_0" [ style = bold] "fs_mirror_start_0 arc-tkincaidlx.wsicorp.com" -> "pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "fs_mirror_start_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "fs_mirror_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] -"fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_demote_0" [ style = bold] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] +"grp_pgsql_mirror_running_0" [ style=bold color="green" fontcolor="orange" ] "grp_pgsql_mirror_start_0" -> "fs_mirror_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] +"grp_pgsql_mirror_start_0" -> "grp_pgsql_mirror_running_0" [ style = bold] "grp_pgsql_mirror_start_0" [ style=bold color="green" fontcolor="orange" ] "grp_pgsql_mirror_stop_0" -> "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" -> "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" -> "grp_pgsql_mirror_start_0" [ style = bold] "grp_pgsql_mirror_stop_0" -> "grp_pgsql_mirror_stopped_0" [ style = bold] -"grp_pgsql_mirror_stop_0" -> "ms_drbd_7788_demote_0" [ style = bold] "grp_pgsql_mirror_stop_0" -> "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" [ style=bold color="green" fontcolor="orange" ] "grp_pgsql_mirror_stopped_0" -> "grp_pgsql_mirror_start_0" [ style = bold] "grp_pgsql_mirror_stopped_0" -> "ms_drbd_7788_demote_0" [ style = bold] "grp_pgsql_mirror_stopped_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_demote_0" -> "ms_drbd_7788_pre_notify_stop_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_demote_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_promote_0" -> "grp_pgsql_mirror_start_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_promote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_start_0" -> "ms_drbd_7788_pre_notify_promote_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_start_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_start_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_stop_0" -> "ms_drbd_7788_pre_notify_start_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_stop_0" -> "ms_drbd_7788_start_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_demote_0" -> "ms_drbd_7788_demote_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_promote_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_promote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_start_0" -> "ms_drbd_7788_start_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_start_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_stop_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_demote_0" -> "ms_drbd_7788_demoted_0" [ style = bold] "ms_drbd_7788_demote_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_demote_0" -> "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_post_notify_demote_0" [ style = bold] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_start_0" [ style = bold] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_demoted_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_demote_0" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "ms_drbd_7788_post_notify_demote_0" -> "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_post_notify_demote_0" -> "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_promote_0" -> "ms_drbd_7788_confirmed-post_notify_promote_0" [ style = bold] "ms_drbd_7788_post_notify_promote_0" -> "rsc_drbd_7788:1_post_notify_promote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_post_notify_promote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_start_0" -> "ms_drbd_7788_confirmed-post_notify_start_0" [ style = bold] "ms_drbd_7788_post_notify_start_0" -> "rsc_drbd_7788:1_post_notify_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_post_notify_start_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_stop_0" -> "ms_drbd_7788_confirmed-post_notify_stop_0" [ style = bold] "ms_drbd_7788_post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_demote_0" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" -> "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" -> "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_promote_0" -> "ms_drbd_7788_confirmed-pre_notify_promote_0" [ style = bold] "ms_drbd_7788_pre_notify_promote_0" -> "rsc_drbd_7788:1_pre_notify_promote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_pre_notify_promote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_start_0" -> "ms_drbd_7788_confirmed-pre_notify_start_0" [ style = bold] "ms_drbd_7788_pre_notify_start_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_stop_0" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" -> "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" -> "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_promote_0" -> "rsc_drbd_7788:1_promote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_promote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_promoted_0" -> "ms_drbd_7788_post_notify_promote_0" [ style = bold] "ms_drbd_7788_promoted_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_running_0" -> "ms_drbd_7788_post_notify_start_0" [ style = bold] "ms_drbd_7788_running_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_running_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_start_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_start_0" -> "ms_drbd_7788_running_0" [ style = bold] "ms_drbd_7788_start_0" -> "rsc_drbd_7788:1_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_start_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_stop_0" -> "ms_drbd_7788_start_0" [ style = bold] "ms_drbd_7788_stop_0" -> "ms_drbd_7788_stopped_0" [ style = bold] "ms_drbd_7788_stop_0" -> "rsc_drbd_7788:0_stop_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_stop_0" -> "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_stopped_0" -> "ms_drbd_7788_post_notify_stop_0" [ style = bold] "ms_drbd_7788_stopped_0" -> "ms_drbd_7788_promote_0" [ style = bold] "ms_drbd_7788_stopped_0" -> "ms_drbd_7788_start_0" [ style = bold] "ms_drbd_7788_stopped_0" [ style=bold color="green" fontcolor="orange" ] "pgsql_5555_monitor_30000 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" -> "IPaddr_147_81_84_133_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] +"pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_running_0" [ style = bold] "pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" -> "pgsql_5555_monitor_30000 arc-tkincaidlx.wsicorp.com" [ style = bold] "pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "pgsql_5555_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "all_stopped" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "do_shutdown arc-dknightlx" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "ms_drbd_7788_stopped_0" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_demoted_0" [ style = bold] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" -> "rsc_drbd_7788:1_promote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" -> "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_post_notify_promote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-post_notify_promote_0" [ style = bold] "rsc_drbd_7788:1_post_notify_promote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_post_notify_start_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-post_notify_start_0" [ style = bold] "rsc_drbd_7788:1_post_notify_start_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_pre_notify_promote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-pre_notify_promote_0" [ style = bold] "rsc_drbd_7788:1_pre_notify_promote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_promote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_promoted_0" [ style = bold] "rsc_drbd_7788:1_promote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_start_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_running_0" [ style = bold] "rsc_drbd_7788:1_start_0 arc-tkincaidlx.wsicorp.com" -> "rsc_drbd_7788:1_promote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "rsc_drbd_7788:1_start_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_stopped_0" [ style = bold] "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" -> "rsc_drbd_7788:1_start_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "rsc_drbd_7788:1_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/bug-1572-1.exp b/pengine/testcases/bug-1572-1.exp index 1357572198..dfe7610a4b 100644 --- a/pengine/testcases/bug-1572-1.exp +++ b/pengine/testcases/bug-1572-1.exp @@ -1,767 +1,782 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + diff --git a/pengine/testcases/bug-1572-2.dot b/pengine/testcases/bug-1572-2.dot index 9c71e78a0c..525c64e8fc 100644 --- a/pengine/testcases/bug-1572-2.dot +++ b/pengine/testcases/bug-1572-2.dot @@ -1,79 +1,77 @@ digraph "g" { "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" -> "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "do_shutdown arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] -"fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_demote_0" [ style = bold] "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "grp_pgsql_mirror_stop_0" -> "IPaddr_147_81_84_133_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" -> "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" -> "grp_pgsql_mirror_stopped_0" [ style = bold] -"grp_pgsql_mirror_stop_0" -> "ms_drbd_7788_demote_0" [ style = bold] "grp_pgsql_mirror_stop_0" -> "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "grp_pgsql_mirror_stop_0" [ style=bold color="green" fontcolor="orange" ] "grp_pgsql_mirror_stopped_0" -> "ms_drbd_7788_demote_0" [ style = bold] "grp_pgsql_mirror_stopped_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_demote_0" -> "ms_drbd_7788_pre_notify_stop_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_demote_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_confirmed-post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_demote_0" -> "ms_drbd_7788_demote_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_confirmed-pre_notify_stop_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_demote_0" -> "ms_drbd_7788_demoted_0" [ style = bold] "ms_drbd_7788_demote_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_demote_0" -> "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_post_notify_demote_0" [ style = bold] "ms_drbd_7788_demoted_0" -> "ms_drbd_7788_stop_0" [ style = bold] "ms_drbd_7788_demoted_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_demote_0" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "ms_drbd_7788_post_notify_demote_0" -> "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_post_notify_demote_0" -> "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_post_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_post_notify_stop_0" -> "ms_drbd_7788_confirmed-post_notify_stop_0" [ style = bold] "ms_drbd_7788_post_notify_stop_0" -> "rsc_drbd_7788:1_post_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_post_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_demote_0" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" -> "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" -> "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_pre_notify_demote_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_pre_notify_stop_0" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" -> "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" -> "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "ms_drbd_7788_pre_notify_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_stop_0" -> "ms_drbd_7788_stopped_0" [ style = bold] "ms_drbd_7788_stop_0" -> "rsc_drbd_7788:0_stop_0 arc-dknightlx" [ style = bold] "ms_drbd_7788_stop_0" [ style=bold color="green" fontcolor="orange" ] "ms_drbd_7788_stopped_0" -> "ms_drbd_7788_post_notify_stop_0" [ style = bold] "ms_drbd_7788_stopped_0" [ style=bold color="green" fontcolor="orange" ] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "all_stopped" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "fs_mirror_stop_0 arc-tkincaidlx.wsicorp.com" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" -> "grp_pgsql_mirror_stopped_0" [ style = bold] "pgsql_5555_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "rsc_drbd_7788:0_post_notify_demote_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "rsc_drbd_7788:0_pre_notify_demote_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "rsc_drbd_7788:0_pre_notify_stop_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "all_stopped" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "do_shutdown arc-dknightlx" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" -> "ms_drbd_7788_stopped_0" [ style = bold] "rsc_drbd_7788:0_stop_0 arc-dknightlx" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_demoted_0" [ style = bold] "rsc_drbd_7788:1_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-post_notify_demote_0" [ style = bold] "rsc_drbd_7788:1_post_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_post_notify_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-post_notify_stop_0" [ style = bold] "rsc_drbd_7788:1_post_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-pre_notify_demote_0" [ style = bold] "rsc_drbd_7788:1_pre_notify_demote_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" -> "ms_drbd_7788_confirmed-pre_notify_stop_0" [ style = bold] "rsc_drbd_7788:1_pre_notify_stop_0 arc-tkincaidlx.wsicorp.com" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/bug-1572-2.exp b/pengine/testcases/bug-1572-2.exp index 64d79cb6a1..50aa6161dd 100644 --- a/pengine/testcases/bug-1572-2.exp +++ b/pengine/testcases/bug-1572-2.exp @@ -1,412 +1,406 @@ - - - - - - diff --git a/pengine/testcases/bug-1718.dot b/pengine/testcases/bug-1718.dot index 9e660623f8..da1c07b974 100644 --- a/pengine/testcases/bug-1718.dot +++ b/pengine/testcases/bug-1718.dot @@ -1,19 +1,28 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] +"group_fUN_running_0" [ style=dashed color="red" fontcolor="orange" ] +"group_fUN_start_0" -> "group_fUN_running_0" [ style = dashed] "group_fUN_start_0" -> "resource_IP3_start_0 ops.ds9" [ style = dashed] "group_fUN_start_0" [ style=dashed color="red" fontcolor="orange" ] "group_fUN_stop_0" -> "group_fUN_start_0" [ style = dashed] +"group_fUN_stop_0" -> "group_fUN_stopped_0" [ style = bold] "group_fUN_stop_0" -> "resource_IP3_stop_0 ops.ds9" [ style = bold] "group_fUN_stop_0" -> "resource_dummy_stop_0 ops.ds9" [ style = bold] "group_fUN_stop_0" [ style=bold color="green" fontcolor="orange" ] +"group_fUN_stopped_0" -> "group_fUN_start_0" [ style = dashed] +"group_fUN_stopped_0" [ style=bold color="green" fontcolor="orange" ] +"resource_IP3_start_0 ops.ds9" -> "group_fUN_running_0" [ style = dashed] "resource_IP3_start_0 ops.ds9" -> "resource_dummy_start_0 ops.ds9" [ style = dashed] "resource_IP3_start_0 ops.ds9" [ style=dashed color="red" fontcolor="black" ] "resource_IP3_stop_0 ops.ds9" -> "all_stopped" [ style = bold] +"resource_IP3_stop_0 ops.ds9" -> "group_fUN_stopped_0" [ style = bold] "resource_IP3_stop_0 ops.ds9" -> "resource_IP3_start_0 ops.ds9" [ style = dashed] "resource_IP3_stop_0 ops.ds9" [ style=bold color="green" fontcolor="black" ] +"resource_dummy_start_0 ops.ds9" -> "group_fUN_running_0" [ style = dashed] "resource_dummy_start_0 ops.ds9" [ style=dashed color="red" fontcolor="black" ] "resource_dummy_stop_0 ops.ds9" -> "all_stopped" [ style = bold] +"resource_dummy_stop_0 ops.ds9" -> "group_fUN_stopped_0" [ style = bold] "resource_dummy_stop_0 ops.ds9" -> "resource_IP3_stop_0 ops.ds9" [ style = bold] "resource_dummy_stop_0 ops.ds9" -> "resource_dummy_start_0 ops.ds9" [ style = dashed] "resource_dummy_stop_0 ops.ds9" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/bug-1718.exp b/pengine/testcases/bug-1718.exp index 7eb6679419..6fb0e543e7 100644 --- a/pengine/testcases/bug-1718.exp +++ b/pengine/testcases/bug-1718.exp @@ -1,55 +1,73 @@ + + + + + + + + + + + + + + + + + + - + - + diff --git a/pengine/testcases/bug-1822.dot b/pengine/testcases/bug-1822.dot index 273f3ebb07..da61f205ad 100644 --- a/pengine/testcases/bug-1822.dot +++ b/pengine/testcases/bug-1822.dot @@ -1,27 +1,22 @@ digraph "g" { "all_stopped" [ style=dashed color="red" fontcolor="orange" ] "do_shutdown process1a" [ style=bold color="green" fontcolor="black" ] "master_slave_Stateful:1_demote_0 process1a" -> "master_slave_Stateful:1_stop_0 process1a" [ style = bold] "master_slave_Stateful:1_demote_0 process1a" [ style=bold color="green" fontcolor="black" ] "master_slave_Stateful:1_stop_0 process1a" -> "all_stopped" [ style = dashed] "master_slave_Stateful:1_stop_0 process1a" -> "do_shutdown process1a" [ style = bold] "master_slave_Stateful:1_stop_0 process1a" -> "ms-sf_group:1_stopped_0" [ style = bold] "master_slave_Stateful:1_stop_0 process1a" [ style=bold color="green" fontcolor="black" ] "master_slave_procdctl:0_monitor_600000 " [ style=dashed color="red" fontcolor="black" ] "master_slave_procdctl:1_demote_0 process1a" -> "master_slave_procdctl:1_stop_0 process1a" [ style = bold] "master_slave_procdctl:1_demote_0 process1a" [ style=bold color="green" fontcolor="black" ] "master_slave_procdctl:1_stop_0 process1a" -> "all_stopped" [ style = dashed] "master_slave_procdctl:1_stop_0 process1a" -> "do_shutdown process1a" [ style = bold] "master_slave_procdctl:1_stop_0 process1a" -> "ms-sf_group:1_stopped_0" [ style = bold] "master_slave_procdctl:1_stop_0 process1a" [ style=bold color="green" fontcolor="black" ] "ms-sf_group:1_stop_0" -> "master_slave_Stateful:1_stop_0 process1a" [ style = bold] "ms-sf_group:1_stop_0" -> "master_slave_procdctl:1_stop_0 process1a" [ style = bold] "ms-sf_group:1_stop_0" -> "ms-sf_group:1_stopped_0" [ style = bold] "ms-sf_group:1_stop_0" [ style=bold color="green" fontcolor="orange" ] -"ms-sf_group:1_stopped_0" -> "ms-sf_stopped_0" [ style = bold] "ms-sf_group:1_stopped_0" [ style=bold color="green" fontcolor="orange" ] -"ms-sf_stop_0" -> "ms-sf_group:1_stop_0" [ style = bold] -"ms-sf_stop_0" -> "ms-sf_stopped_0" [ style = bold] -"ms-sf_stop_0" [ style=bold color="green" fontcolor="orange" ] -"ms-sf_stopped_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/bug-1822.exp b/pengine/testcases/bug-1822.exp index 6335bc4f64..c4cc7fb372 100644 --- a/pengine/testcases/bug-1822.exp +++ b/pengine/testcases/bug-1822.exp @@ -1,121 +1,94 @@ - - - - - + - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pengine/testcases/bug-pm-12.dot b/pengine/testcases/bug-pm-12.dot new file mode 100644 index 0000000000..91740399ac --- /dev/null +++ b/pengine/testcases/bug-pm-12.dot @@ -0,0 +1,21 @@ +digraph "g" { +"all_stopped" [ style=bold color="green" fontcolor="orange" ] +"group:0_running_0" [ style=bold color="green" fontcolor="orange" ] +"group:1_running_0" [ style=bold color="green" fontcolor="orange" ] +"stateful-2:0_demote_0 node-b" -> "stateful-2:0_stop_0 node-b" [ style = bold] +"stateful-2:0_demote_0 node-b" [ style=bold color="green" fontcolor="black" ] +"stateful-2:0_start_0 node-b" -> "group:0_running_0" [ style = bold] +"stateful-2:0_start_0 node-b" [ style=bold color="green" fontcolor="black" ] +"stateful-2:0_stop_0 node-b" -> "all_stopped" [ style = bold] +"stateful-2:0_stop_0 node-b" -> "stateful-2:0_start_0 node-b" [ style = bold] +"stateful-2:0_stop_0 node-b" [ style=bold color="green" fontcolor="black" ] +"stateful-2:1_demote_0 node-a" -> "stateful-2:1_stop_0 node-a" [ style = bold] +"stateful-2:1_demote_0 node-a" [ style=bold color="green" fontcolor="black" ] +"stateful-2:1_promote_0 node-a" [ style=bold color="green" fontcolor="black" ] +"stateful-2:1_start_0 node-a" -> "group:1_running_0" [ style = bold] +"stateful-2:1_start_0 node-a" -> "stateful-2:1_promote_0 node-a" [ style = bold] +"stateful-2:1_start_0 node-a" [ style=bold color="green" fontcolor="black" ] +"stateful-2:1_stop_0 node-a" -> "all_stopped" [ style = bold] +"stateful-2:1_stop_0 node-a" -> "stateful-2:1_start_0 node-a" [ style = bold] +"stateful-2:1_stop_0 node-a" [ style=bold color="green" fontcolor="black" ] +} diff --git a/pengine/testcases/bug-pm-12.exp b/pengine/testcases/bug-pm-12.exp new file mode 100644 index 0000000000..46a51c542d --- /dev/null +++ b/pengine/testcases/bug-pm-12.exp @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/bug-pm-12.xml b/pengine/testcases/bug-pm-12.xml new file mode 100644 index 0000000000..2c09b02f1c --- /dev/null +++ b/pengine/testcases/bug-pm-12.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/cloned-group.dot b/pengine/testcases/cloned-group.dot index 426ed0ec68..0e080e0a9e 100644 --- a/pengine/testcases/cloned-group.dot +++ b/pengine/testcases/cloned-group.dot @@ -1,71 +1,60 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] "apache2:0_monitor_10000 webcluster01" [ style=bold color="green" fontcolor="black" ] "apache2:0_start_0 webcluster01" -> "apache2:0_monitor_10000 webcluster01" [ style = bold] "apache2:0_start_0 webcluster01" -> "grrr:0_running_0" [ style = bold] "apache2:0_start_0 webcluster01" -> "mysql-proxy:0_start_0 webcluster01" [ style = bold] "apache2:0_start_0 webcluster01" [ style=bold color="green" fontcolor="black" ] "apache2:0_stop_0 webcluster01" -> "all_stopped" [ style = bold] "apache2:0_stop_0 webcluster01" -> "apache2:0_start_0 webcluster01" [ style = bold] "apache2:0_stop_0 webcluster01" -> "grrr:0_stopped_0" [ style = bold] "apache2:0_stop_0 webcluster01" [ style=bold color="green" fontcolor="black" ] "apache2:1_monitor_10000 webcluster01" [ style=dashed color="red" fontcolor="black" ] "apache2:1_start_0 " -> "apache2:1_monitor_10000 webcluster01" [ style = dashed] +"apache2:1_start_0 " -> "grrr:1_running_0" [ style = dashed] "apache2:1_start_0 " -> "mysql-proxy:1_start_0 " [ style = dashed] "apache2:1_start_0 " [ style=dashed color="red" fontcolor="black" ] "apache2:1_stop_0 webcluster01" -> "all_stopped" [ style = bold] "apache2:1_stop_0 webcluster01" -> "apache2:1_start_0 " [ style = dashed] "apache2:1_stop_0 webcluster01" -> "grrr:1_stopped_0" [ style = bold] "apache2:1_stop_0 webcluster01" [ style=bold color="green" fontcolor="black" ] -"apache2_clone_running_0" [ style=bold color="green" fontcolor="orange" ] -"apache2_clone_start_0" -> "apache2_clone_running_0" [ style = bold] -"apache2_clone_start_0" -> "grrr:0_start_0" [ style = bold] -"apache2_clone_start_0" -> "grrr:1_start_0" [ style = dashed] -"apache2_clone_start_0" [ style=bold color="green" fontcolor="orange" ] -"apache2_clone_stop_0" -> "apache2_clone_start_0" [ style = bold] -"apache2_clone_stop_0" -> "apache2_clone_stopped_0" [ style = bold] -"apache2_clone_stop_0" -> "grrr:0_stop_0" [ style = bold] -"apache2_clone_stop_0" -> "grrr:1_stop_0" [ style = bold] -"apache2_clone_stop_0" [ style=bold color="green" fontcolor="orange" ] -"apache2_clone_stopped_0" -> "apache2_clone_start_0" [ style = bold] -"apache2_clone_stopped_0" [ style=bold color="green" fontcolor="orange" ] -"grrr:0_running_0" -> "apache2_clone_running_0" [ style = bold] "grrr:0_running_0" [ style=bold color="green" fontcolor="orange" ] "grrr:0_start_0" -> "apache2:0_start_0 webcluster01" [ style = bold] "grrr:0_start_0" -> "grrr:0_running_0" [ style = bold] "grrr:0_start_0" [ style=bold color="green" fontcolor="orange" ] "grrr:0_stop_0" -> "apache2:0_stop_0 webcluster01" [ style = bold] "grrr:0_stop_0" -> "grrr:0_start_0" [ style = bold] "grrr:0_stop_0" -> "grrr:0_stopped_0" [ style = bold] "grrr:0_stop_0" -> "mysql-proxy:0_stop_0 webcluster01" [ style = bold] "grrr:0_stop_0" [ style=bold color="green" fontcolor="orange" ] -"grrr:0_stopped_0" -> "apache2_clone_stopped_0" [ style = bold] "grrr:0_stopped_0" -> "grrr:0_start_0" [ style = bold] "grrr:0_stopped_0" [ style=bold color="green" fontcolor="orange" ] +"grrr:1_running_0" [ style=dashed color="red" fontcolor="orange" ] "grrr:1_start_0" -> "apache2:1_start_0 " [ style = dashed] +"grrr:1_start_0" -> "grrr:1_running_0" [ style = dashed] "grrr:1_start_0" [ style=dashed color="red" fontcolor="orange" ] "grrr:1_stop_0" -> "apache2:1_stop_0 webcluster01" [ style = bold] "grrr:1_stop_0" -> "grrr:1_start_0" [ style = dashed] "grrr:1_stop_0" -> "grrr:1_stopped_0" [ style = bold] "grrr:1_stop_0" -> "mysql-proxy:1_stop_0 webcluster01" [ style = bold] "grrr:1_stop_0" [ style=bold color="green" fontcolor="orange" ] -"grrr:1_stopped_0" -> "apache2_clone_stopped_0" [ style = bold] "grrr:1_stopped_0" -> "grrr:1_start_0" [ style = dashed] "grrr:1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "mysql-proxy:0_monitor_10000 webcluster01" [ style=bold color="green" fontcolor="black" ] "mysql-proxy:0_start_0 webcluster01" -> "grrr:0_running_0" [ style = bold] "mysql-proxy:0_start_0 webcluster01" -> "mysql-proxy:0_monitor_10000 webcluster01" [ style = bold] "mysql-proxy:0_start_0 webcluster01" [ style=bold color="green" fontcolor="black" ] "mysql-proxy:0_stop_0 webcluster01" -> "all_stopped" [ style = bold] "mysql-proxy:0_stop_0 webcluster01" -> "apache2:0_stop_0 webcluster01" [ style = bold] "mysql-proxy:0_stop_0 webcluster01" -> "grrr:0_stopped_0" [ style = bold] "mysql-proxy:0_stop_0 webcluster01" -> "mysql-proxy:0_start_0 webcluster01" [ style = bold] "mysql-proxy:0_stop_0 webcluster01" [ style=bold color="green" fontcolor="black" ] "mysql-proxy:1_monitor_10000 webcluster01" [ style=dashed color="red" fontcolor="black" ] +"mysql-proxy:1_start_0 " -> "grrr:1_running_0" [ style = dashed] "mysql-proxy:1_start_0 " -> "mysql-proxy:1_monitor_10000 webcluster01" [ style = dashed] "mysql-proxy:1_start_0 " [ style=dashed color="red" fontcolor="black" ] "mysql-proxy:1_stop_0 webcluster01" -> "all_stopped" [ style = bold] "mysql-proxy:1_stop_0 webcluster01" -> "apache2:1_stop_0 webcluster01" [ style = bold] "mysql-proxy:1_stop_0 webcluster01" -> "grrr:1_stopped_0" [ style = bold] "mysql-proxy:1_stop_0 webcluster01" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/cloned-group.exp b/pengine/testcases/cloned-group.exp index ec878aa72f..a3f8ab60ac 100644 --- a/pengine/testcases/cloned-group.exp +++ b/pengine/testcases/cloned-group.exp @@ -1,292 +1,225 @@ - - - - - - - - + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pengine/testcases/coloc-group.dot b/pengine/testcases/coloc-group.dot index 38648c3f56..e9e940a034 100644 --- a/pengine/testcases/coloc-group.dot +++ b/pengine/testcases/coloc-group.dot @@ -1,42 +1,43 @@ digraph "g" { "group1_running_0" [ style=dashed color="red" fontcolor="orange" ] "group1_start_0" -> "group1_running_0" [ style = dashed] "group1_start_0" -> "rsc2_start_0 node2" [ style = bold] "group1_start_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete node3" -> "probe_complete" [ style = bold] "probe_complete node3" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "group1_start_0" [ style = bold] "probe_complete" -> "rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "rsc2_start_0 node2" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_monitor_0 node3" -> "probe_complete node3" [ style = bold] "rsc1_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_start_0 node2" -> "group1_running_0" [ style = dashed] "rsc2_start_0 node2" -> "rsc3_start_0 " [ style = dashed] "rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node3" -> "probe_complete node3" [ style = bold] "rsc3_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "rsc3_start_0 " -> "group1_running_0" [ style = dashed] "rsc3_start_0 " -> "rsc4_start_0 " [ style = dashed] "rsc3_start_0 " [ style=dashed color="red" fontcolor="black" ] "rsc4_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc4_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node3" -> "probe_complete node3" [ style = bold] "rsc4_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "rsc4_start_0 " -> "group1_running_0" [ style = dashed] "rsc4_start_0 " [ style=dashed color="red" fontcolor="black" ] } diff --git a/pengine/testcases/coloc-group.exp b/pengine/testcases/coloc-group.exp index 30cd500122..230aa623db 100644 --- a/pengine/testcases/coloc-group.exp +++ b/pengine/testcases/coloc-group.exp @@ -1,194 +1,197 @@ + + + diff --git a/pengine/testcases/group1.dot b/pengine/testcases/group1.dot index f74b882c04..f523803962 100644 --- a/pengine/testcases/group1.dot +++ b/pengine/testcases/group1.dot @@ -1,32 +1,35 @@ digraph "g" { "child_rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node1" -> "child_rsc2_start_0 node1" [ style = bold] "child_rsc1_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node1" -> "child_rsc3_start_0 node1" [ style = bold] "child_rsc2_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc2_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node1" [ style = bold] "probe_complete" -> "rsc1_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc1_start_0" -> "child_rsc1_start_0 node1" [ style = bold] "rsc1_start_0" -> "rsc1_running_0" [ style = bold] "rsc1_start_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/group1.exp b/pengine/testcases/group1.exp index 7f82bd1f58..3fc470df23 100644 --- a/pengine/testcases/group1.exp +++ b/pengine/testcases/group1.exp @@ -1,180 +1,189 @@ + + + + + + + + + diff --git a/pengine/testcases/group11.dot b/pengine/testcases/group11.dot index 6a54911565..9cf0a5e7d0 100644 --- a/pengine/testcases/group11.dot +++ b/pengine/testcases/group11.dot @@ -1,16 +1,9 @@ digraph "g" { -"1_stop_0" -> "1_stopped_0" [ style = bold] -"1_stop_0" -> "rsc2_stop_0 node1" [ style = bold] -"1_stop_0" -> "rsc3_stop_0 node1" [ style = bold] -"1_stop_0" [ style=bold color="green" fontcolor="orange" ] -"1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] -"rsc2_stop_0 node1" -> "1_stopped_0" [ style = bold] "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="black" ] -"rsc3_stop_0 node1" -> "1_stopped_0" [ style = bold] "rsc3_stop_0 node1" -> "all_stopped" [ style = bold] "rsc3_stop_0 node1" -> "rsc2_stop_0 node1" [ style = bold] "rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/group11.exp b/pengine/testcases/group11.exp index 2a297817ff..b0ccf88f54 100644 --- a/pengine/testcases/group11.exp +++ b/pengine/testcases/group11.exp @@ -1,81 +1,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + - + - + diff --git a/pengine/testcases/group14.dot b/pengine/testcases/group14.dot index b3f30c1f6e..15f96a8e62 100644 --- a/pengine/testcases/group14.dot +++ b/pengine/testcases/group14.dot @@ -1,66 +1,77 @@ digraph "g" { "192.168.100.181_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "192.168.100.181_start_0 c001n07" -> "192.168.100.181_monitor_5000 c001n07" [ style = dashed] "192.168.100.181_start_0 c001n07" -> "192.168.100.182_start_0 c001n07" [ style = dashed] +"192.168.100.181_start_0 c001n07" -> "group-1_running_0" [ style = dashed] "192.168.100.181_start_0 c001n07" [ style=dashed color="red" fontcolor="black" ] "192.168.100.181_stop_0 c001n06" -> "192.168.100.181_start_0 c001n07" [ style = dashed] "192.168.100.181_stop_0 c001n06" -> "all_stopped" [ style = bold] "192.168.100.181_stop_0 c001n06" -> "group-1_stopped_0" [ style = bold] "192.168.100.181_stop_0 c001n06" [ style=bold color="green" fontcolor="black" ] "192.168.100.182_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "192.168.100.182_start_0 c001n07" -> "192.168.100.182_monitor_5000 c001n07" [ style = dashed] "192.168.100.182_start_0 c001n07" -> "192.168.100.183_start_0 c001n07" [ style = dashed] +"192.168.100.182_start_0 c001n07" -> "group-1_running_0" [ style = dashed] "192.168.100.182_start_0 c001n07" [ style=dashed color="red" fontcolor="black" ] +"192.168.100.182_stop_0" -> "192.168.100.181_stop_0 c001n06" [ style = bold] +"192.168.100.182_stop_0" -> "all_stopped" [ style = bold] +"192.168.100.182_stop_0" -> "group-1_stopped_0" [ style = bold] +"192.168.100.182_stop_0" [ style=bold color="green" fontcolor="orange" ] "192.168.100.183_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "192.168.100.183_start_0 c001n07" -> "192.168.100.183_monitor_5000 c001n07" [ style = dashed] +"192.168.100.183_start_0 c001n07" -> "group-1_running_0" [ style = dashed] "192.168.100.183_start_0 c001n07" [ style=dashed color="red" fontcolor="black" ] +"192.168.100.183_stop_0" -> "192.168.100.182_stop_0" [ style = bold] "192.168.100.183_stop_0" -> "all_stopped" [ style = bold] "192.168.100.183_stop_0" -> "group-1_stopped_0" [ style = bold] "192.168.100.183_stop_0" [ style=bold color="green" fontcolor="orange" ] "DcIPaddr_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "DoFencing_running_0" [ style=bold color="green" fontcolor="orange" ] "DoFencing_start_0" -> "DoFencing_running_0" [ style = bold] "DoFencing_start_0" -> "child_DoFencing:0_start_0 c001n06" [ style = bold] "DoFencing_start_0" -> "child_DoFencing:1_start_0 c001n07" [ style = bold] "DoFencing_start_0" [ style=bold color="green" fontcolor="orange" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_DoFencing:0_monitor_20000 c001n06" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:0_start_0 c001n06" -> "DoFencing_running_0" [ style = bold] "child_DoFencing:0_start_0 c001n06" -> "child_DoFencing:0_monitor_20000 c001n06" [ style = bold] "child_DoFencing:0_start_0 c001n06" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_monitor_20000 c001n07" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_start_0 c001n07" -> "DoFencing_running_0" [ style = bold] "child_DoFencing:1_start_0 c001n07" -> "child_DoFencing:1_monitor_20000 c001n07" [ style = bold] "child_DoFencing:1_start_0 c001n07" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:4_monitor_0 c001n06" -> "probe_complete c001n06" [ style = bold] "child_DoFencing:4_monitor_0 c001n06" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:4_monitor_0 c001n07" -> "probe_complete c001n07" [ style = bold] "child_DoFencing:4_monitor_0 c001n07" [ style=bold color="green" fontcolor="black" ] +"group-1_running_0" [ style=dashed color="red" fontcolor="orange" ] "group-1_start_0" -> "192.168.100.181_start_0 c001n07" [ style = dashed] +"group-1_start_0" -> "group-1_running_0" [ style = dashed] "group-1_start_0" [ style=dashed color="red" fontcolor="orange" ] "group-1_stop_0" -> "192.168.100.181_stop_0 c001n06" [ style = bold] +"group-1_stop_0" -> "192.168.100.182_stop_0" [ style = bold] "group-1_stop_0" -> "192.168.100.183_stop_0" [ style = bold] "group-1_stop_0" -> "group-1_start_0" [ style = dashed] "group-1_stop_0" -> "group-1_stopped_0" [ style = bold] "group-1_stop_0" [ style=bold color="green" fontcolor="orange" ] "group-1_stopped_0" -> "group-1_start_0" [ style = dashed] "group-1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "lsb_dummy_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "migrator_monitor_10000 c001n06" [ style=dashed color="red" fontcolor="black" ] "ocf_msdummy:0_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "ocf_msdummy:10_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "ocf_msdummy:11_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "ocf_msdummy:1_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "probe_complete c001n06" -> "probe_complete" [ style = bold] "probe_complete c001n06" [ style=bold color="green" fontcolor="black" ] "probe_complete c001n07" -> "probe_complete" [ style = bold] "probe_complete c001n07" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "DoFencing_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc_c001n02_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n03_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n04_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n05_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n06_monitor_5000 c001n06" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n07_monitor_5000 c001n07" [ style=dashed color="red" fontcolor="black" ] } diff --git a/pengine/testcases/group14.exp b/pengine/testcases/group14.exp index 7b2572856e..78032fb23d 100644 --- a/pengine/testcases/group14.exp +++ b/pengine/testcases/group14.exp @@ -1,208 +1,232 @@ + + + + + + - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + + + + diff --git a/pengine/testcases/group15.dot b/pengine/testcases/group15.dot index bf7ef82270..36a38c2dee 100644 --- a/pengine/testcases/group15.dot +++ b/pengine/testcases/group15.dot @@ -1,44 +1,47 @@ digraph "g" { "bar_running_0" [ style=bold color="green" fontcolor="orange" ] "bar_start_0" -> "bar_running_0" [ style = bold] "bar_start_0" -> "rsc6_start_0 node1" [ style = bold] "bar_start_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "bar_start_0" [ style = bold] +"probe_complete" -> "rsc6_start_0 node1" [ style = bold] +"probe_complete" -> "rsc7_start_0 node1" [ style = bold] +"probe_complete" -> "rsc8_start_0 node1" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc4_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc5_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc5_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc6_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_start_0 node1" -> "bar_running_0" [ style = bold] "rsc6_start_0 node1" -> "rsc7_start_0 node1" [ style = bold] "rsc6_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc7_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc7_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc7_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc7_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc7_start_0 node1" -> "bar_running_0" [ style = bold] "rsc7_start_0 node1" -> "rsc8_start_0 node1" [ style = bold] "rsc7_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc8_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc8_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc8_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc8_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc8_start_0 node1" -> "bar_running_0" [ style = bold] "rsc8_start_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/group15.exp b/pengine/testcases/group15.exp index 7a73a563a5..86dc2b1025 100644 --- a/pengine/testcases/group15.exp +++ b/pengine/testcases/group15.exp @@ -1,252 +1,261 @@ + + + + + + + + + diff --git a/pengine/testcases/group2.dot b/pengine/testcases/group2.dot index 5c20bdc625..e5025d36fb 100644 --- a/pengine/testcases/group2.dot +++ b/pengine/testcases/group2.dot @@ -1,46 +1,49 @@ digraph "g" { "child_rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node2" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc1_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node2" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc2_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node2" [ style = bold] "probe_complete" -> "rsc1_start_0 node1" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" -> "rsc3_start_0 node1" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node1" -> "rsc2_start_0" [ style = bold] "rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_running_0" -> "rsc3_start_0 node1" [ style = bold] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc1_start_0 node2" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/group2.exp b/pengine/testcases/group2.exp index 412170a77c..da1cc39d3e 100644 --- a/pengine/testcases/group2.exp +++ b/pengine/testcases/group2.exp @@ -1,260 +1,269 @@ + + + + + + + + + diff --git a/pengine/testcases/group3.dot b/pengine/testcases/group3.dot index 6e55de8992..0c16f3bb84 100644 --- a/pengine/testcases/group3.dot +++ b/pengine/testcases/group3.dot @@ -1,58 +1,64 @@ digraph "g" { "child_rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node1" -> "child_rsc2_start_0 node1" [ style = bold] "child_rsc1_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node1" -> "child_rsc3_start_0 node1" [ style = bold] "child_rsc2_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc2_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node1" -> "rsc1_running_0" [ style = bold] "child_rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc4_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc4_start_0 node2" -> "child_rsc5_start_0 node2" [ style = bold] "child_rsc4_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc4_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc5_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_start_0 node2" -> "child_rsc6_start_0 node2" [ style = bold] "child_rsc5_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc5_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc6_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc4_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc5_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc6_start_0 node2" [ style = bold] "probe_complete" -> "rsc1_start_0" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_running_0" -> "rsc2_start_0" [ style = bold] "rsc1_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc1_start_0" -> "child_rsc1_start_0 node1" [ style = bold] "rsc1_start_0" -> "rsc1_running_0" [ style = bold] "rsc1_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc4_start_0 node2" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/group3.exp b/pengine/testcases/group3.exp index 2608d6aed0..ab86c54fba 100644 --- a/pengine/testcases/group3.exp +++ b/pengine/testcases/group3.exp @@ -1,327 +1,345 @@ + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/group5.dot b/pengine/testcases/group5.dot index a7401517e4..9310048857 100644 --- a/pengine/testcases/group5.dot +++ b/pengine/testcases/group5.dot @@ -1,67 +1,70 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node2" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc1_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc1_stop_0 node1" -> "child_rsc1_start_0 node2" [ style = bold] "child_rsc1_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node2" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc2_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc2_stop_0 node1" -> "child_rsc1_stop_0 node1" [ style = bold] "child_rsc2_stop_0 node1" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc2_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc2_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc3_stop_0 node1" -> "child_rsc2_stop_0 node1" [ style = bold] "child_rsc3_stop_0 node1" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc3_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node2" [ style = bold] "probe_complete" -> "rsc1_start_0 node2" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" -> "rsc3_start_0 node2" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node2" -> "rsc2_start_0" [ style = bold] "rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_stop_0 node1" -> "all_stopped" [ style = bold] "rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = bold] "rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_running_0" -> "rsc3_start_0 node2" [ style = bold] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc1_start_0 node2" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_stop_0" -> "child_rsc1_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "child_rsc2_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "child_rsc3_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "rsc2_start_0" [ style = bold] "rsc2_stop_0" -> "rsc2_stopped_0" [ style = bold] "rsc2_stop_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_stopped_0" -> "rsc1_stop_0 node1" [ style = bold] "rsc2_stopped_0" -> "rsc2_start_0" [ style = bold] "rsc2_stopped_0" [ style=bold color="green" fontcolor="orange" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_stop_0 node1" -> "all_stopped" [ style = bold] "rsc3_stop_0 node1" -> "rsc2_stop_0" [ style = bold] "rsc3_stop_0 node1" -> "rsc3_start_0 node2" [ style = bold] "rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/group5.exp b/pengine/testcases/group5.exp index 18f3dd6e16..6db4781644 100644 --- a/pengine/testcases/group5.exp +++ b/pengine/testcases/group5.exp @@ -1,344 +1,353 @@ + + + + + + + + + diff --git a/pengine/testcases/group6.dot b/pengine/testcases/group6.dot index 4bee2412b7..4ba054ec19 100644 --- a/pengine/testcases/group6.dot +++ b/pengine/testcases/group6.dot @@ -1,92 +1,98 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node2" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc1_start_0 node2" -> "rsc1_running_0" [ style = bold] "child_rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc1_stop_0 node1" -> "child_rsc1_start_0 node2" [ style = bold] "child_rsc1_stop_0 node1" -> "rsc1_stopped_0" [ style = bold] "child_rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node2" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc2_start_0 node2" -> "rsc1_running_0" [ style = bold] "child_rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc2_stop_0 node1" -> "child_rsc1_stop_0 node1" [ style = bold] "child_rsc2_stop_0 node1" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc2_stop_0 node1" -> "rsc1_stopped_0" [ style = bold] "child_rsc2_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node2" -> "rsc1_running_0" [ style = bold] "child_rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc3_stop_0 node1" -> "child_rsc2_stop_0 node1" [ style = bold] "child_rsc3_stop_0 node1" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc3_stop_0 node1" -> "rsc1_stopped_0" [ style = bold] "child_rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc4_start_0 node2" -> "child_rsc5_start_0 node2" [ style = bold] "child_rsc4_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc4_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc4_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc4_stop_0 node1" -> "child_rsc4_start_0 node2" [ style = bold] "child_rsc4_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc4_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_start_0 node2" -> "child_rsc6_start_0 node2" [ style = bold] "child_rsc5_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc5_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc5_stop_0 node1" -> "child_rsc4_stop_0 node1" [ style = bold] "child_rsc5_stop_0 node1" -> "child_rsc5_start_0 node2" [ style = bold] "child_rsc5_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc5_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_stop_0 node1" -> "all_stopped" [ style = bold] "child_rsc6_stop_0 node1" -> "child_rsc5_stop_0 node1" [ style = bold] "child_rsc6_stop_0 node1" -> "child_rsc6_start_0 node2" [ style = bold] "child_rsc6_stop_0 node1" -> "rsc2_stopped_0" [ style = bold] "child_rsc6_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc4_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc5_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc6_start_0 node2" [ style = bold] "probe_complete" -> "rsc1_start_0" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_running_0" -> "rsc2_start_0" [ style = bold] "rsc1_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc1_start_0" -> "child_rsc1_start_0 node2" [ style = bold] "rsc1_start_0" -> "rsc1_running_0" [ style = bold] "rsc1_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc1_stop_0" -> "child_rsc1_stop_0 node1" [ style = bold] "rsc1_stop_0" -> "child_rsc2_stop_0 node1" [ style = bold] "rsc1_stop_0" -> "child_rsc3_stop_0 node1" [ style = bold] "rsc1_stop_0" -> "rsc1_start_0" [ style = bold] "rsc1_stop_0" -> "rsc1_stopped_0" [ style = bold] "rsc1_stop_0" [ style=bold color="green" fontcolor="orange" ] "rsc1_stopped_0" -> "rsc1_start_0" [ style = bold] "rsc1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc4_start_0 node2" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_stop_0" -> "child_rsc4_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "child_rsc5_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "child_rsc6_stop_0 node1" [ style = bold] "rsc2_stop_0" -> "rsc2_start_0" [ style = bold] "rsc2_stop_0" -> "rsc2_stopped_0" [ style = bold] "rsc2_stop_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_stopped_0" -> "rsc1_stop_0" [ style = bold] "rsc2_stopped_0" -> "rsc2_start_0" [ style = bold] "rsc2_stopped_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/group6.exp b/pengine/testcases/group6.exp index 640fbf2c6a..8d788d4028 100644 --- a/pengine/testcases/group6.exp +++ b/pengine/testcases/group6.exp @@ -1,463 +1,481 @@ + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/group7.dot b/pengine/testcases/group7.dot index 3277bfb223..f8ccc4547d 100644 --- a/pengine/testcases/group7.dot +++ b/pengine/testcases/group7.dot @@ -1,80 +1,86 @@ digraph "g" { "child_rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc1_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc1_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node2" -> "child_rsc2_start_0 node2" [ style = bold] "child_rsc1_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc2_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node2" -> "child_rsc3_start_0 node2" [ style = bold] "child_rsc2_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc3_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node2" -> "rsc2_running_0" [ style = bold] "child_rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc4_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc4_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc4_start_0 node2" -> "child_rsc5_start_0 node2" [ style = bold] "child_rsc4_start_0 node2" -> "rsc3_running_0" [ style = bold] "child_rsc4_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc5_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc5_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc5_start_0 node2" -> "child_rsc6_start_0 node2" [ style = bold] "child_rsc5_start_0 node2" -> "rsc3_running_0" [ style = bold] "child_rsc5_start_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc6_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "child_rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node3" -> "probe_complete node3" [ style = bold] "child_rsc6_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "child_rsc6_start_0 node2" -> "rsc3_running_0" [ style = bold] "child_rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete node3" -> "probe_complete" [ style = bold] "probe_complete node3" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc4_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc5_start_0 node2" [ style = bold] +"probe_complete" -> "child_rsc6_start_0 node2" [ style = bold] "probe_complete" -> "rsc1_start_0 node1" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" -> "rsc3_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_monitor_0 node3" -> "probe_complete node3" [ style = bold] "rsc1_monitor_0 node3" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_running_0" -> "rsc3_start_0" [ style = bold] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc1_start_0 node2" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] "rsc3_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc3_start_0" -> "child_rsc4_start_0 node2" [ style = bold] "rsc3_start_0" -> "rsc3_running_0" [ style = bold] "rsc3_start_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/group7.exp b/pengine/testcases/group7.exp index 4d11daf6ec..a1dbb52cbe 100644 --- a/pengine/testcases/group7.exp +++ b/pengine/testcases/group7.exp @@ -1,460 +1,478 @@ + + + + + + + + + + + + + + + + + + diff --git a/pengine/testcases/group8.dot b/pengine/testcases/group8.dot index 4869199274..d785d5c621 100644 --- a/pengine/testcases/group8.dot +++ b/pengine/testcases/group8.dot @@ -1,34 +1,37 @@ digraph "g" { "child_rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc1_start_0 node1" -> "child_rsc2_start_0 node1" [ style = bold] "child_rsc1_start_0 node1" -> "rsc2_running_0" [ style = bold] "child_rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc2_start_0 node1" -> "child_rsc3_start_0 node1" [ style = bold] "child_rsc2_start_0 node1" -> "rsc2_running_0" [ style = bold] "child_rsc2_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc3_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc3_start_0 node1" -> "rsc2_running_0" [ style = bold] "child_rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc4_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc4_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc5_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc5_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "child_rsc6_monitor_0 node1" -> "probe_complete node1" [ style = bold] "child_rsc6_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_rsc1_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc2_start_0 node1" [ style = bold] +"probe_complete" -> "child_rsc3_start_0 node1" [ style = bold] "probe_complete" -> "rsc1_start_0 node1" [ style = bold] "probe_complete" -> "rsc2_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc1_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_running_0" [ style=bold color="green" fontcolor="orange" ] "rsc2_start_0" -> "child_rsc1_start_0 node1" [ style = bold] "rsc2_start_0" -> "rsc2_running_0" [ style = bold] "rsc2_start_0" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/group8.exp b/pengine/testcases/group8.exp index af9010ccb9..b6ca75c754 100644 --- a/pengine/testcases/group8.exp +++ b/pengine/testcases/group8.exp @@ -1,193 +1,202 @@ + + + + + + + + + diff --git a/pengine/testcases/group9.dot b/pengine/testcases/group9.dot index 29af6eae6f..79a38dbae6 100644 --- a/pengine/testcases/group9.dot +++ b/pengine/testcases/group9.dot @@ -1,88 +1,77 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] "bar_running_0" [ style=bold color="green" fontcolor="orange" ] "bar_start_0" -> "bar_running_0" [ style = bold] "bar_start_0" -> "rsc6_start_0 node2" [ style = bold] "bar_start_0" [ style=bold color="green" fontcolor="orange" ] "bar_stop_0" -> "bar_start_0" [ style = bold] "bar_stop_0" -> "bar_stopped_0" [ style = bold] "bar_stop_0" -> "rsc6_stop_0 node1" [ style = bold] "bar_stop_0" -> "rsc7_stop_0 node1" [ style = bold] "bar_stop_0" -> "rsc8_stop_0 node1" [ style = bold] "bar_stop_0" [ style=bold color="green" fontcolor="orange" ] "bar_stopped_0" -> "bar_start_0" [ style = bold] "bar_stopped_0" [ style=bold color="green" fontcolor="orange" ] "foo_running_0" [ style=bold color="green" fontcolor="orange" ] -"foo_start_0" -> "foo_running_0" [ style = bold] -"foo_start_0" -> "rsc3_start_0 node1" [ style = bold] -"foo_start_0" [ style=bold color="green" fontcolor="orange" ] -"foo_stop_0" -> "foo_start_0" [ style = bold] -"foo_stop_0" -> "foo_stopped_0" [ style = bold] -"foo_stop_0" -> "rsc4_stop_0 node1" [ style = bold] -"foo_stop_0" -> "rsc5_stop_0 node1" [ style = bold] -"foo_stop_0" [ style=bold color="green" fontcolor="orange" ] -"foo_stopped_0" -> "foo_start_0" [ style = bold] -"foo_stopped_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "bar_start_0" [ style = bold] -"probe_complete" -> "foo_start_0" [ style = bold] +"probe_complete" -> "rsc4_start_0 node1" [ style = bold] +"probe_complete" -> "rsc5_start_0 node1" [ style = bold] +"probe_complete" -> "rsc6_start_0 node2" [ style = bold] +"probe_complete" -> "rsc7_start_0 node2" [ style = bold] +"probe_complete" -> "rsc8_start_0 node2" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] -"rsc3_start_0 node1" -> "foo_running_0" [ style = bold] -"rsc3_start_0 node1" -> "rsc4_start_0 node1" [ style = bold] -"rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc4_start_0 node1" -> "foo_running_0" [ style = bold] "rsc4_start_0 node1" -> "rsc5_start_0 node1" [ style = bold] "rsc4_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc4_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc4_stop_0 node1" -> "foo_stopped_0" [ style = bold] "rsc4_stop_0 node1" -> "rsc4_start_0 node1" [ style = bold] "rsc4_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc5_start_0 node1" -> "foo_running_0" [ style = bold] "rsc5_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc5_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc5_stop_0 node1" -> "foo_stopped_0" [ style = bold] "rsc5_stop_0 node1" -> "rsc4_stop_0 node1" [ style = bold] "rsc5_stop_0 node1" -> "rsc5_start_0 node1" [ style = bold] "rsc5_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_start_0 node2" -> "bar_running_0" [ style = bold] "rsc6_start_0 node2" -> "rsc7_start_0 node2" [ style = bold] "rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_stop_0 node1" -> "all_stopped" [ style = bold] "rsc6_stop_0 node1" -> "bar_stopped_0" [ style = bold] "rsc6_stop_0 node1" -> "rsc6_start_0 node2" [ style = bold] "rsc6_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc7_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc7_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc7_start_0 node2" -> "bar_running_0" [ style = bold] "rsc7_start_0 node2" -> "rsc8_start_0 node2" [ style = bold] "rsc7_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc7_stop_0 node1" -> "all_stopped" [ style = bold] "rsc7_stop_0 node1" -> "bar_stopped_0" [ style = bold] "rsc7_stop_0 node1" -> "rsc6_stop_0 node1" [ style = bold] "rsc7_stop_0 node1" -> "rsc7_start_0 node2" [ style = bold] "rsc7_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc8_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc8_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc8_start_0 node2" -> "bar_running_0" [ style = bold] "rsc8_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc8_stop_0 node1" -> "all_stopped" [ style = bold] "rsc8_stop_0 node1" -> "bar_stopped_0" [ style = bold] "rsc8_stop_0 node1" -> "rsc7_stop_0 node1" [ style = bold] "rsc8_stop_0 node1" -> "rsc8_start_0 node2" [ style = bold] "rsc8_stop_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/group9.exp b/pengine/testcases/group9.exp index ca12d6904e..2abecf45fe 100644 --- a/pengine/testcases/group9.exp +++ b/pengine/testcases/group9.exp @@ -1,455 +1,397 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - + - + - + - + - + - - - - - + - + + + + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + diff --git a/pengine/testcases/quorum-5.dot b/pengine/testcases/quorum-5.dot index 064e128003..9de664c832 100644 --- a/pengine/testcases/quorum-5.dot +++ b/pengine/testcases/quorum-5.dot @@ -1,23 +1,25 @@ digraph "g" { "child_DoFencing_1_monitor_0 hadev2" -> "probe_complete hadev2" [ style = bold] "child_DoFencing_1_monitor_0 hadev2" [ style=bold color="green" fontcolor="black" ] "child_DoFencing_1_monitor_5000 hadev2" [ style=bold color="green" fontcolor="black" ] "child_DoFencing_1_start_0 hadev2" -> "child_DoFencing_1_monitor_5000 hadev2" [ style = bold] "child_DoFencing_1_start_0 hadev2" -> "child_DoFencing_2_start_0 hadev2" [ style = bold] "child_DoFencing_1_start_0 hadev2" -> "group1_running_0" [ style = bold] "child_DoFencing_1_start_0 hadev2" [ style=bold color="green" fontcolor="black" ] "child_DoFencing_2_monitor_0 hadev2" -> "probe_complete hadev2" [ style = bold] "child_DoFencing_2_monitor_0 hadev2" [ style=bold color="green" fontcolor="black" ] "child_DoFencing_2_monitor_5000 hadev2" [ style=bold color="green" fontcolor="black" ] "child_DoFencing_2_start_0 hadev2" -> "child_DoFencing_2_monitor_5000 hadev2" [ style = bold] "child_DoFencing_2_start_0 hadev2" -> "group1_running_0" [ style = bold] "child_DoFencing_2_start_0 hadev2" [ style=bold color="green" fontcolor="black" ] "group1_running_0" [ style=bold color="green" fontcolor="orange" ] "group1_start_0" -> "child_DoFencing_1_start_0 hadev2" [ style = bold] "group1_start_0" -> "group1_running_0" [ style = bold] "group1_start_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete hadev2" -> "probe_complete" [ style = bold] "probe_complete hadev2" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_DoFencing_1_start_0 hadev2" [ style = bold] +"probe_complete" -> "child_DoFencing_2_start_0 hadev2" [ style = bold] "probe_complete" -> "group1_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/quorum-5.exp b/pengine/testcases/quorum-5.exp index 159b1f0a8e..b768c72683 100644 --- a/pengine/testcases/quorum-5.exp +++ b/pengine/testcases/quorum-5.exp @@ -1,130 +1,136 @@ + + + + + + diff --git a/pengine/testcases/rec-node-11.dot b/pengine/testcases/rec-node-11.dot index 783d4fa0a4..1353945a7c 100644 --- a/pengine/testcases/rec-node-11.dot +++ b/pengine/testcases/rec-node-11.dot @@ -1,50 +1,51 @@ digraph "g" { "all_stopped" -> "rsc3_start_0 node2" [ style = bold] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "group1_running_0" [ style=bold color="green" fontcolor="orange" ] "group1_start_0" -> "group1_running_0" [ style = bold] "group1_start_0" -> "rsc1_start_0 node2" [ style = bold] "group1_start_0" [ style=bold color="green" fontcolor="orange" ] "group1_stop_0" -> "group1_start_0" [ style = bold] "group1_stop_0" -> "group1_stopped_0" [ style = bold] "group1_stop_0" -> "rsc1_stop_0 node1" [ style = bold] "group1_stop_0" -> "rsc2_stop_0 node1" [ style = bold] -"group1_stop_0" -> "rsc3_stop_0 node2" [ style = bold] "group1_stop_0" [ style=bold color="green" fontcolor="orange" ] "group1_stopped_0" -> "group1_start_0" [ style = bold] "group1_stopped_0" -> "rsc3_stop_0 node2" [ style = bold] "group1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "group1_start_0" [ style = bold] +"probe_complete" -> "rsc1_start_0 node2" [ style = bold] +"probe_complete" -> "rsc2_start_0 node2" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node2" -> "group1_running_0" [ style = bold] "rsc1_start_0 node2" -> "rsc2_start_0 node2" [ style = bold] "rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_stop_0 node1" -> "all_stopped" [ style = bold] "rsc1_stop_0 node1" -> "group1_stopped_0" [ style = bold] "rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = bold] "rsc1_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] "rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_start_0 node2" -> "group1_running_0" [ style = bold] "rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] "rsc2_stop_0 node1" -> "group1_stopped_0" [ style = bold] "rsc2_stop_0 node1" -> "rsc1_stop_0 node1" [ style = bold] "rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="orange" ] "rsc3_start_0 node2" -> "group1_start_0" [ style = bold] "rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_stop_0 node2" -> "all_stopped" [ style = bold] "rsc3_stop_0 node2" -> "rsc3_start_0 node2" [ style = bold] "rsc3_stop_0 node2" [ style=bold color="green" fontcolor="black" ] "stonith node1" -> "all_stopped" [ style = bold] "stonith node1" -> "rsc1_stop_0 node1" [ style = bold] "stonith node1" -> "rsc2_stop_0 node1" [ style = bold] "stonith node1" [ style=bold color="green" fontcolor="black" ] "stonith_up" -> "stonith node1" [ style = bold] "stonith_up" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/rec-node-11.exp b/pengine/testcases/rec-node-11.exp index 7db3f58ce3..824157aadf 100644 --- a/pengine/testcases/rec-node-11.exp +++ b/pengine/testcases/rec-node-11.exp @@ -1,251 +1,254 @@ + + + + + + - - - diff --git a/pengine/testcases/rec-node-2.dot b/pengine/testcases/rec-node-2.dot index 5045dabaf8..6aa82afa98 100644 --- a/pengine/testcases/rec-node-2.dot +++ b/pengine/testcases/rec-node-2.dot @@ -1,48 +1,52 @@ digraph "g" { "all_stopped" -> "rsc2_start_0 node2" [ style = bold] "all_stopped" -> "rsc5_start_0 node2" [ style = bold] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "group1_running_0" [ style=bold color="green" fontcolor="orange" ] "group1_start_0" -> "group1_running_0" [ style = bold] "group1_start_0" -> "rsc3_start_0 node2" [ style = bold] "group1_start_0" [ style=bold color="green" fontcolor="orange" ] "group2_running_0" [ style=bold color="green" fontcolor="orange" ] "group2_start_0" -> "group2_running_0" [ style = bold] "group2_start_0" -> "rsc5_start_0 node2" [ style = bold] "group2_start_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "group1_start_0" [ style = bold] "probe_complete" -> "group2_start_0" [ style = bold] "probe_complete" -> "rsc1_start_0 node2" [ style = bold] "probe_complete" -> "rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "rsc3_start_0 node2" [ style = bold] +"probe_complete" -> "rsc4_start_0 node2" [ style = bold] +"probe_complete" -> "rsc5_start_0 node2" [ style = bold] +"probe_complete" -> "rsc6_start_0 node2" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc1_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc1_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc2_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc2_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc3_start_0 node2" -> "group1_running_0" [ style = bold] "rsc3_start_0 node2" -> "rsc4_start_0 node2" [ style = bold] "rsc3_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc4_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc4_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc4_start_0 node2" -> "group1_running_0" [ style = bold] "rsc4_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc5_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc5_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc5_start_0 node2" -> "group2_running_0" [ style = bold] "rsc5_start_0 node2" -> "rsc6_start_0 node2" [ style = bold] "rsc5_start_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc6_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] "rsc6_start_0 node2" -> "group2_running_0" [ style = bold] "rsc6_start_0 node2" [ style=bold color="green" fontcolor="black" ] "stonith node1" -> "all_stopped" [ style = bold] "stonith node1" [ style=bold color="green" fontcolor="black" ] "stonith_up" -> "stonith node1" [ style = bold] "stonith_up" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/rec-node-2.exp b/pengine/testcases/rec-node-2.exp index 78a4a068d7..a3b635e6f2 100644 --- a/pengine/testcases/rec-node-2.exp +++ b/pengine/testcases/rec-node-2.exp @@ -1,272 +1,284 @@ + + + + + + + + + + + + diff --git a/pengine/testcases/rec-rsc-9.dot b/pengine/testcases/rec-rsc-9.dot index 0fe72ce6cd..761dcdbd20 100644 --- a/pengine/testcases/rec-rsc-9.dot +++ b/pengine/testcases/rec-rsc-9.dot @@ -1,45 +1,44 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] "bar_running_0" -> "foo_start_0" [ style = bold] "bar_running_0" -> "rsc1_start_0 node1" [ style = bold] "bar_running_0" [ style=bold color="green" fontcolor="orange" ] "bar_start_0" -> "bar_running_0" [ style = bold] -"bar_start_0" -> "foo_start_0" [ style = bold] -"bar_start_0" -> "rsc1_start_0 node1" [ style = bold] "bar_start_0" -> "rsc3_start_0 node1" [ style = bold] "bar_start_0" [ style=bold color="green" fontcolor="orange" ] "bar_stop_0" -> "bar_start_0" [ style = bold] "bar_stop_0" -> "bar_stopped_0" [ style = bold] "bar_stop_0" -> "rsc3_stop_0 node1" [ style = bold] "bar_stop_0" [ style=bold color="green" fontcolor="orange" ] "bar_stopped_0" -> "bar_start_0" [ style = bold] "bar_stopped_0" [ style=bold color="green" fontcolor="orange" ] +"foo_running_0" [ style=bold color="green" fontcolor="orange" ] +"foo_start_0" -> "foo_running_0" [ style = bold] "foo_start_0" -> "rsc2_start_0 node1" [ style = bold] "foo_start_0" [ style=bold color="green" fontcolor="orange" ] -"foo_stop_0" -> "bar_stop_0" [ style = bold] "foo_stop_0" -> "foo_start_0" [ style = bold] "foo_stop_0" -> "foo_stopped_0" [ style = bold] "foo_stop_0" -> "rsc2_stop_0 node1" [ style = bold] "foo_stop_0" [ style=bold color="green" fontcolor="orange" ] "foo_stopped_0" -> "bar_stop_0" [ style = bold] "foo_stopped_0" -> "foo_start_0" [ style = bold] "foo_stopped_0" [ style=bold color="green" fontcolor="orange" ] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "rsc1_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc1_stop_0 node1" -> "all_stopped" [ style = bold] "rsc1_stop_0 node1" -> "bar_stop_0" [ style = bold] "rsc1_stop_0 node1" -> "rsc1_start_0 node1" [ style = bold] "rsc1_stop_0 node1" [ style=bold color="green" fontcolor="black" ] +"rsc2_start_0 node1" -> "foo_running_0" [ style = bold] "rsc2_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc2_stop_0 node1" -> "bar_stop_0" [ style = bold] "rsc2_stop_0 node1" -> "foo_stopped_0" [ style = bold] "rsc2_stop_0 node1" -> "rsc2_start_0 node1" [ style = bold] "rsc2_stop_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc3_start_0 node1" -> "bar_running_0" [ style = bold] "rsc3_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc3_stop_0 node1" -> "all_stopped" [ style = bold] "rsc3_stop_0 node1" -> "bar_stopped_0" [ style = bold] "rsc3_stop_0 node1" -> "rsc3_start_0 node1" [ style = bold] "rsc3_stop_0 node1" [ style=bold color="green" fontcolor="black" ] } diff --git a/pengine/testcases/rec-rsc-9.exp b/pengine/testcases/rec-rsc-9.exp index 0257963b0b..50f997b132 100644 --- a/pengine/testcases/rec-rsc-9.exp +++ b/pengine/testcases/rec-rsc-9.exp @@ -1,225 +1,228 @@ - - - - - - + + + + + + + + + + + + + + + - + - + - + - + - + - + - - - - - - - + - + - + - + - + diff --git a/pengine/testcases/stonith-1.dot b/pengine/testcases/stonith-1.dot index c1b8ea0c0d..954f3235b3 100644 --- a/pengine/testcases/stonith-1.dot +++ b/pengine/testcases/stonith-1.dot @@ -1,116 +1,104 @@ digraph "g" { -"192.168.100.181_monitor_5000 sles-1" [ style=bold color="green" fontcolor="black" ] -"192.168.100.181_start_0 sles-1" -> "192.168.100.181_monitor_5000 sles-1" [ style = bold] -"192.168.100.181_start_0 sles-1" -> "192.168.100.182_start_0 sles-1" [ style = bold] -"192.168.100.181_start_0 sles-1" -> "group-1_running_0" [ style = bold] -"192.168.100.181_start_0 sles-1" [ style=bold color="green" fontcolor="black" ] "192.168.100.182_monitor_5000 sles-1" [ style=bold color="green" fontcolor="black" ] -"192.168.100.182_start_0 sles-1" -> "192.168.100.182_monitor_5000 sles-1" [ style = bold] -"192.168.100.182_start_0 sles-1" -> "192.168.100.183_start_0 sles-1" [ style = bold] -"192.168.100.182_start_0 sles-1" -> "group-1_running_0" [ style = bold] -"192.168.100.182_start_0 sles-1" [ style=bold color="green" fontcolor="black" ] "192.168.100.183_monitor_5000 sles-1" [ style=bold color="green" fontcolor="black" ] "192.168.100.183_start_0 sles-1" -> "192.168.100.183_monitor_5000 sles-1" [ style = bold] "192.168.100.183_start_0 sles-1" -> "group-1_running_0" [ style = bold] "192.168.100.183_start_0 sles-1" [ style=bold color="green" fontcolor="black" ] "DoFencing_running_0" [ style=bold color="green" fontcolor="orange" ] "DoFencing_start_0" -> "DoFencing_running_0" [ style = bold] "DoFencing_start_0" -> "child_DoFencing:2_start_0 sles-4" [ style = bold] "DoFencing_start_0" [ style=bold color="green" fontcolor="orange" ] "DoFencing_stop_0" -> "DoFencing_start_0" [ style = bold] "DoFencing_stop_0" -> "DoFencing_stopped_0" [ style = bold] "DoFencing_stop_0" -> "child_DoFencing:2_stop_0 sles-3" [ style = bold] "DoFencing_stop_0" [ style=bold color="green" fontcolor="orange" ] "DoFencing_stopped_0" -> "DoFencing_start_0" [ style = bold] "DoFencing_stopped_0" [ style=bold color="green" fontcolor="orange" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_DoFencing:1_monitor_0 sles-4" -> "probe_complete sles-4" [ style = bold] "child_DoFencing:1_monitor_0 sles-4" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_monitor_60000 sles-4" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_start_0 sles-4" -> "DoFencing_running_0" [ style = bold] "child_DoFencing:2_start_0 sles-4" -> "child_DoFencing:2_monitor_60000 sles-4" [ style = bold] "child_DoFencing:2_start_0 sles-4" -> "stonith_up" [ style = bold] "child_DoFencing:2_start_0 sles-4" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_stop_0 sles-3" -> "DoFencing_stopped_0" [ style = bold] "child_DoFencing:2_stop_0 sles-3" -> "child_DoFencing:2_start_0 sles-4" [ style = bold] "child_DoFencing:2_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] "group-1_running_0" [ style=bold color="green" fontcolor="orange" ] -"group-1_start_0" -> "192.168.100.181_start_0 sles-1" [ style = bold] -"group-1_start_0" -> "group-1_running_0" [ style = bold] -"group-1_start_0" [ style=bold color="green" fontcolor="orange" ] "lsb_dummy_monitor_5000 sles-2" [ style=bold color="green" fontcolor="black" ] "master_rsc_1_running_0" [ style=bold color="green" fontcolor="orange" ] "master_rsc_1_start_0" -> "master_rsc_1_running_0" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:0_start_0 sles-4" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:1_start_0 sles-1" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:2_start_0 sles-2" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:3_start_0 sles-4" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:4_start_0 sles-1" [ style = bold] "master_rsc_1_start_0" -> "ocf_msdummy:5_start_0 sles-2" [ style = bold] "master_rsc_1_start_0" [ style=bold color="green" fontcolor="orange" ] "master_rsc_1_stop_0" -> "master_rsc_1_start_0" [ style = bold] "master_rsc_1_stop_0" -> "master_rsc_1_stopped_0" [ style = bold] "master_rsc_1_stop_0" -> "ocf_msdummy:2_stop_0 sles-3" [ style = bold] "master_rsc_1_stop_0" -> "ocf_msdummy:5_stop_0 sles-3" [ style = bold] "master_rsc_1_stop_0" [ style=bold color="green" fontcolor="orange" ] "master_rsc_1_stopped_0" -> "master_rsc_1_start_0" [ style = bold] "master_rsc_1_stopped_0" [ style=bold color="green" fontcolor="orange" ] "migrator_monitor_10000 sles-4" [ style=bold color="green" fontcolor="black" ] "migrator_start_0 sles-4" -> "migrator_monitor_10000 sles-4" [ style = bold] "migrator_start_0 sles-4" [ style=bold color="green" fontcolor="black" ] "migrator_stop_0 sles-3" -> "all_stopped" [ style = bold] "migrator_stop_0 sles-3" -> "migrator_start_0 sles-4" [ style = bold] "migrator_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] "ocf_msdummy:0_monitor_5000 sles-4" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:0_start_0 sles-4" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:0_start_0 sles-4" -> "ocf_msdummy:0_monitor_5000 sles-4" [ style = bold] "ocf_msdummy:0_start_0 sles-4" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:1_monitor_5000 sles-1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:1_start_0 sles-1" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:1_start_0 sles-1" -> "ocf_msdummy:1_monitor_5000 sles-1" [ style = bold] "ocf_msdummy:1_start_0 sles-1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:2_monitor_5000 sles-2" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:2_start_0 sles-2" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:2_start_0 sles-2" -> "ocf_msdummy:2_monitor_5000 sles-2" [ style = bold] "ocf_msdummy:2_start_0 sles-2" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:2_stop_0 sles-3" -> "all_stopped" [ style = bold] "ocf_msdummy:2_stop_0 sles-3" -> "master_rsc_1_stopped_0" [ style = bold] "ocf_msdummy:2_stop_0 sles-3" -> "ocf_msdummy:2_start_0 sles-2" [ style = bold] "ocf_msdummy:2_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] "ocf_msdummy:3_monitor_5000 sles-4" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:3_start_0 sles-4" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:3_start_0 sles-4" -> "ocf_msdummy:3_monitor_5000 sles-4" [ style = bold] "ocf_msdummy:3_start_0 sles-4" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:4_monitor_5000 sles-1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:4_start_0 sles-1" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:4_start_0 sles-1" -> "ocf_msdummy:4_monitor_5000 sles-1" [ style = bold] "ocf_msdummy:4_start_0 sles-1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:5_monitor_5000 sles-2" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:5_start_0 sles-2" -> "master_rsc_1_running_0" [ style = bold] "ocf_msdummy:5_start_0 sles-2" -> "ocf_msdummy:5_monitor_5000 sles-2" [ style = bold] "ocf_msdummy:5_start_0 sles-2" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:5_stop_0 sles-3" -> "all_stopped" [ style = bold] "ocf_msdummy:5_stop_0 sles-3" -> "master_rsc_1_stopped_0" [ style = bold] "ocf_msdummy:5_stop_0 sles-3" -> "ocf_msdummy:5_start_0 sles-2" [ style = bold] "ocf_msdummy:5_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] "probe_complete sles-4" -> "probe_complete" [ style = bold] "probe_complete sles-4" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "DoFencing_start_0" [ style = bold] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc_sles-2_monitor_5000 sles-2" [ style=bold color="green" fontcolor="black" ] "rsc_sles-3_monitor_5000 sles-4" [ style=bold color="green" fontcolor="black" ] "rsc_sles-3_start_0 sles-4" -> "rsc_sles-3_monitor_5000 sles-4" [ style = bold] "rsc_sles-3_start_0 sles-4" [ style=bold color="green" fontcolor="black" ] "rsc_sles-3_stop_0 sles-3" -> "all_stopped" [ style = bold] "rsc_sles-3_stop_0 sles-3" -> "rsc_sles-3_start_0 sles-4" [ style = bold] "rsc_sles-3_stop_0 sles-3" [ style=bold color="green" fontcolor="orange" ] "rsc_sles-4_monitor_5000 sles-4" [ style=bold color="green" fontcolor="black" ] "stonith sles-3" -> "all_stopped" [ style = bold] "stonith sles-3" -> "migrator_stop_0 sles-3" [ style = bold] "stonith sles-3" -> "ocf_msdummy:2_stop_0 sles-3" [ style = bold] "stonith sles-3" -> "ocf_msdummy:5_stop_0 sles-3" [ style = bold] "stonith sles-3" -> "rsc_sles-3_stop_0 sles-3" [ style = bold] "stonith sles-3" [ style=bold color="green" fontcolor="black" ] "stonith_up" -> "stonith sles-3" [ style = bold] "stonith_up" [ style=bold color="green" fontcolor="orange" ] } diff --git a/pengine/testcases/stonith-1.exp b/pengine/testcases/stonith-1.exp index ebd3738cbc..df7a823cda 100644 --- a/pengine/testcases/stonith-1.exp +++ b/pengine/testcases/stonith-1.exp @@ -1,654 +1,590 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/pengine/testcases/unrunnable-1.dot b/pengine/testcases/unrunnable-1.dot index 338c298899..df35f88fba 100644 --- a/pengine/testcases/unrunnable-1.dot +++ b/pengine/testcases/unrunnable-1.dot @@ -1,38 +1,57 @@ digraph "g" { "DcIPaddr_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "DcIPaddr_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "DcIPaddr_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] "all_stopped" -> "child_DoFencing:1_stop_0 c001n02" [ style = dashed] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_192.168.100.181_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_192.168.100.181_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_192.168.100.181_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] +"child_192.168.100.181_start_0 c001n03" -> "child_192.168.100.181_monitor_5000 c001n03" [ style = dashed] +"child_192.168.100.181_start_0 c001n03" -> "child_192.168.100.182_start_0 c001n03" [ style = dashed] +"child_192.168.100.181_start_0 c001n03" -> "group-1_running_0" [ style = dashed] +"child_192.168.100.181_start_0 c001n03" [ style=dashed color="red" fontcolor="black" ] "child_192.168.100.182_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_192.168.100.182_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_192.168.100.182_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] +"child_192.168.100.182_start_0 c001n03" -> "child_192.168.100.182_monitor_5000 c001n03" [ style = dashed] +"child_192.168.100.182_start_0 c001n03" -> "child_192.168.100.183_start_0 c001n03" [ style = dashed] +"child_192.168.100.182_start_0 c001n03" -> "group-1_running_0" [ style = dashed] +"child_192.168.100.182_start_0 c001n03" [ style=dashed color="red" fontcolor="black" ] "child_192.168.100.183_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_192.168.100.183_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_192.168.100.183_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] +"child_192.168.100.183_start_0 c001n03" -> "child_192.168.100.183_monitor_5000 c001n03" [ style = dashed] +"child_192.168.100.183_start_0 c001n03" -> "group-1_running_0" [ style = dashed] +"child_192.168.100.183_start_0 c001n03" [ style=dashed color="red" fontcolor="black" ] "child_DoFencing:1_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_DoFencing:1_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_stop_0 c001n02" [ style=dashed color="red" fontcolor="black" ] "child_DoFencing:2_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_DoFencing:2_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "child_DoFencing:3_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] +"group-1_running_0" [ style=dashed color="red" fontcolor="orange" ] +"group-1_start_0" -> "child_192.168.100.181_start_0 c001n03" [ style = dashed] +"group-1_start_0" -> "group-1_running_0" [ style = dashed] +"group-1_start_0" [ style=dashed color="red" fontcolor="orange" ] "probe_complete c001n03" -> "probe_complete" [ style = bold] "probe_complete c001n03" [ style=bold color="green" fontcolor="black" ] +"probe_complete" -> "child_192.168.100.181_start_0 c001n03" [ style = dashed] +"probe_complete" -> "child_192.168.100.182_start_0 c001n03" [ style = dashed] +"probe_complete" -> "child_192.168.100.183_start_0 c001n03" [ style = dashed] +"probe_complete" -> "group-1_start_0" [ style = dashed] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc_c001n01_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "rsc_c001n01_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "rsc_c001n01_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n02_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "rsc_c001n02_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "rsc_c001n02_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n03_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "rsc_c001n03_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "rsc_c001n03_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n08_monitor_0 c001n03" -> "probe_complete c001n03" [ style = bold] "rsc_c001n08_monitor_0 c001n03" [ style=bold color="green" fontcolor="black" ] "rsc_c001n08_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] }