diff --git a/crm/pengine/graph.c b/crm/pengine/graph.c index c77a077e0c..a073f01046 100644 --- a/crm/pengine/graph.c +++ b/crm/pengine/graph.c @@ -1,539 +1,557 @@ /* * 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", action->uuid, action->optional?"optional":"required"); slist_iter( other, action_wrapper_t, action->actions_before, lpc, gboolean other_changed = FALSE; do_crm_log(log_level, " Checking action %s: %s 0x%.6x", other->action->uuid, other->action->optional?"optional":"required", other->type); local_type = other->type; /* local_type |= pe_order_optional; */ /* local_type ^= pe_order_optional; */ if((local_type & pe_order_runnable_left) && other->action->runnable == FALSE) { if(other->action->pseudo) { do_crm_log(log_level, "Ignoring un-runnable - pseudo"); } 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(other->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->action->rsc->fns->state( other->action->rsc, TRUE) == RSC_ROLE_STOPPED) { do_crm_log(log_level-1, " Ignoring implies left - %s already stopped", other->action->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(other->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); ); } ); 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); ); } 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(rsc->is_managed == FALSE) { 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 && action->rsc->is_managed == FALSE) { /* 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; + } + 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_copy(set, xml_action); free_xml(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(last_action == wrapper->action->id) { - crm_debug_2("Input (%d) %s duplicated", - wrapper->action->id, - wrapper->action->uuid); - continue; - - } else if(wrapper->action->optional == TRUE) { - crm_debug_2("Input (%d) %s optional", - wrapper->action->id, - wrapper->action->uuid); - continue; - - } 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); - continue; + 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_copy(input, xml_action); free_xml(xml_action); ); } diff --git a/crm/pengine/pengine.h b/crm/pengine/pengine.h index 7836867e31..1c6f99dc92 100644 --- a/crm/pengine/pengine.h +++ b/crm/pengine/pengine.h @@ -1,162 +1,170 @@ /* * 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_implies_left = 0x01, /* was: _mandatory */ - pe_order_implies_right = 0x02, /* was: _recover */ + 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_optional = 0x100, /* pure ordering, nothing implied */ - pe_order_test = 0x1000 /* test marker */ + pe_order_test = 0x1000 /* 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/crm/pengine/ptest.c b/crm/pengine/ptest.c index dbd7a199e6..213c49ab6a 100644 --- a/crm/pengine/ptest.c +++ b/crm/pengine/ptest.c @@ -1,489 +1,486 @@ /* * 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 #define OPTARGS "V?X:D:G:I:Lwxd:aS" #ifdef HAVE_GETOPT_H # include #endif #include #include #include #include #if HAVE_LIBXML2 # include #endif gboolean use_stdin = FALSE; gboolean do_simulation = FALSE; gboolean inhibit_exit = FALSE; gboolean all_actions = FALSE; extern crm_data_t * do_calculations( pe_working_set_t *data_set, crm_data_t *xml_input, ha_time_t *now); extern void cleanup_calculations(pe_working_set_t *data_set); char *use_date = NULL; FILE *dot_strm = NULL; #define DOT_PREFIX "PE_DOT: " /* #define DOT_PREFIX "" */ #define dot_write(fmt...) if(dot_strm != NULL) { \ fprintf(dot_strm, fmt); \ fprintf(dot_strm, "\n"); \ } else { \ crm_debug(DOT_PREFIX""fmt); \ } static void init_dotfile(void) { dot_write(" digraph \"g\" {"); /* dot_write(" size = \"30,30\""); */ /* dot_write(" graph ["); */ /* dot_write(" fontsize = \"12\""); */ /* dot_write(" fontname = \"Times-Roman\""); */ /* dot_write(" fontcolor = \"black\""); */ /* dot_write(" bb = \"0,0,398.922306,478.927856\""); */ /* dot_write(" color = \"black\""); */ /* dot_write(" ]"); */ /* dot_write(" node ["); */ /* dot_write(" fontsize = \"12\""); */ /* dot_write(" fontname = \"Times-Roman\""); */ /* dot_write(" fontcolor = \"black\""); */ /* dot_write(" shape = \"ellipse\""); */ /* dot_write(" color = \"black\""); */ /* dot_write(" ]"); */ /* dot_write(" edge ["); */ /* dot_write(" fontsize = \"12\""); */ /* dot_write(" fontname = \"Times-Roman\""); */ /* dot_write(" fontcolor = \"black\""); */ /* dot_write(" color = \"black\""); */ /* dot_write(" ]"); */ } static void usage(const char *cli, int exitcode) { FILE *out = exitcode?stderr:stdout; fprintf(out, "Usage: %s -(?|L|X|x) [-V] [-D] [-G] [-I]\n", cli); fprintf(out, " --%s (-%c): This text\n\n", "help", '?'); fprintf(out, " --%s (-%c): Increase verbosity (can be supplied multiple times)\n\n", "verbose", 'V'); fprintf(out, " --%s (-%c): Connect to the CIB and use the current contents as input\n", "live-check", 'L'); fprintf(out, " --%s (-%c): Look for xml on stdin\n", "xml-stream", 'x'); fprintf(out, " --%s (-%c)\t : Look for xml in the named file\n\n", "xml-file", 'X'); fprintf(out, " --%s (-%c)\t : Save the transition graph to the named file\n", "save-graph", 'G'); fprintf(out, " --%s (-%c)\t : Save the DOT formatted transition graph to the named file\n", "save-dotfile", 'D'); fprintf(out, " --%s (-%c)\t : Save the input to the named file\n", "save-input", 'I'); exit(exitcode); } static char * create_action_name(action_t *action) { char *action_name = NULL; const char *action_host = NULL; if(action->node) { action_host = action->node->details->uname; action_name = crm_concat(action->uuid, action_host, ' '); } else if(action->pseudo) { action_name = crm_strdup(action->uuid); } else { action_host = ""; action_name = crm_concat(action->uuid, action_host, ' '); } return action_name; } gboolean USE_LIVE_CIB = FALSE; int main(int argc, char **argv) { gboolean all_good = TRUE; enum transition_status graph_rc = -1; crm_graph_t *transition = NULL; ha_time_t *a_date = NULL; cib_t * cib_conn = NULL; crm_data_t * cib_object = NULL; int argerr = 0; int flag; char *msg_buffer = NULL; gboolean optional = FALSE; pe_working_set_t data_set; const char *xml_file = NULL; const char *dot_file = NULL; const char *graph_file = NULL; const char *input_file = NULL; cl_log_set_entity("ptest"); cl_log_set_facility(LOG_USER); set_crm_log_level(LOG_CRIT-1); while (1) { #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { /* Top-level Options */ {"help", 0, 0, '?'}, {"verbose", 0, 0, 'V'}, {"live-check", 0, 0, 'L'}, {"xml-stream", 0, 0, 'x'}, {"xml-file", 1, 0, 'X'}, {"simulate", 0, 0, 'S'}, {"save-graph", 1, 0, 'G'}, {"save-dotfile",1, 0, 'D'}, {"save-input", 1, 0, 'I'}, {0, 0, 0, 0} }; #endif #ifdef HAVE_GETOPT_H flag = getopt_long(argc, argv, OPTARGS, long_options, &option_index); #else flag = getopt(argc, argv, OPTARGS); #endif if (flag == -1) break; switch(flag) { #ifdef HAVE_GETOPT_H case 0: printf("option %s", long_options[option_index].name); if (optarg) printf(" with arg %s", optarg); printf("\n"); break; #endif case 'S': do_simulation = TRUE; break; case 'a': all_actions = TRUE; break; case 'w': inhibit_exit = TRUE; break; case 'x': use_stdin = TRUE; break; case 'X': xml_file = optarg; break; case 'd': use_date = optarg; break; case 'D': dot_file = optarg; break; case 'G': graph_file = optarg; break; case 'I': input_file = optarg; break; case 'V': cl_log_enable_stderr(TRUE); alter_debug(DEBUG_INC); break; case 'L': USE_LIVE_CIB = TRUE; break; case '?': usage("ptest", 0); break; default: printf("?? getopt returned character code 0%o ??\n", flag); ++argerr; break; } } if (optind < argc) { printf("non-option ARGV-elements: "); while (optind < argc) { printf("%s ", argv[optind++]); } printf("\n"); } if (optind > argc) { ++argerr; } if (argerr) { crm_err("%d errors in option parsing", argerr); usage("ptest", 1); } crm_info("=#=#=#=#= Getting XML =#=#=#=#="); if(USE_LIVE_CIB) { int rc = cib_ok; cib_conn = cib_new(); rc = cib_conn->cmds->signon( cib_conn, "ptest", cib_command_synchronous); if(rc == cib_ok) { crm_info("Reading XML from: live cluster"); cib_object = get_cib_copy(cib_conn); } else { fprintf(stderr, "Live CIB query failed: %s\n", cib_error2string(rc)); return 3; } if(cib_object == NULL) { fprintf(stderr, "Live CIB query failed: empty result\n"); return 3; } } else if(xml_file != NULL) { FILE *xml_strm = fopen(xml_file, "r"); if(xml_strm == NULL) { cl_perror("Could not open %s for reading", xml_file); } else { if(strstr(xml_file, ".bz2") != NULL) { cib_object = file2xml(xml_strm, TRUE); } else { cib_object = file2xml(xml_strm, FALSE); } fclose(xml_strm); } } else if(use_stdin) { cib_object = stdin2xml(); } else { usage("ptest", 1); } CRM_CHECK(cib_object != NULL, return 4); crm_notice("Required feature set: %s", feature_set(cib_object)); do_id_check(cib_object, NULL, FALSE, FALSE); if(!validate_with_dtd(cib_object,FALSE,HA_NOARCHDATAHBDIR"/crm.dtd")) { crm_crit("%s does not contain a valid configuration", xml_file?xml_file:""); all_good = FALSE; } if(input_file != NULL) { FILE *input_strm = fopen(input_file, "w"); if(input_strm == NULL) { cl_perror("Could not open %s for writing", input_file); } else { msg_buffer = dump_xml_formatted(cib_object); if(fprintf(input_strm, "%s\n", msg_buffer) < 0) { cl_perror("Write to %s failed", input_file); } fflush(input_strm); fclose(input_strm); crm_free(msg_buffer); } } if(use_date != NULL) { a_date = parse_date(&use_date); log_date(LOG_WARNING, "Set fake 'now' to", a_date, ha_log_date|ha_log_time); log_date(LOG_WARNING, "Set fake 'now' to (localtime)", a_date, ha_log_date|ha_log_time|ha_log_local); } do_calculations(&data_set, cib_object, a_date); msg_buffer = dump_xml_formatted(data_set.graph); if(safe_str_eq(graph_file, "-")) { fprintf(stdout, "%s\n", msg_buffer); fflush(stdout); } else if(graph_file != NULL) { FILE *graph_strm = fopen(graph_file, "w"); if(graph_strm == NULL) { cl_perror("Could not open %s for writing", graph_file); } else { if(fprintf(graph_strm, "%s\n", msg_buffer) < 0) { cl_perror("Write to %s failed", graph_file); } fflush(graph_strm); fclose(graph_strm); } } crm_free(msg_buffer); if(dot_file != NULL) { dot_strm = fopen(dot_file, "w"); if(dot_strm == NULL) { cl_perror("Could not open %s for writing", dot_file); } } if(dot_strm == NULL) { goto simulate; } init_dotfile(); slist_iter( action, action_t, data_set.actions, lpc, const char *style = "filled"; const char *font = "black"; const char *color = "black"; const char *fill = NULL; char *action_name = create_action_name(action); crm_debug_3("Action %d: %p", action->id, action); if(action->pseudo) { font = "orange"; } + style = "dashed"; if(action->dumped) { style = "bold"; color = "green"; } else if(action->rsc != NULL && action->rsc->is_managed == FALSE) { - fill = "purple"; + color = "purple"; if(all_actions == FALSE) { goto dont_write; } } else if(action->optional) { - style = "dashed"; color = "blue"; if(all_actions == FALSE) { goto dont_write; } } else { - fill = "red"; + color = "red"; CRM_CHECK(action->runnable == FALSE, ;); } - + + action->dumped = TRUE; dot_write("\"%s\" [ style=%s color=\"%s\" fontcolor=\"%s\" %s%s]", action_name, style, color, font, fill?"fillcolor=":"", fill?fill:""); dont_write: crm_free(action_name); ); slist_iter( action, action_t, data_set.actions, lpc, - int last_action = -1; slist_iter( before, action_wrapper_t, action->actions_before, lpc2, char *before_name = NULL; char *after_name = NULL; - optional = FALSE; - if(last_action == before->action->id) { - continue; + const char *style = "dashed"; + optional = TRUE; + if(before->state == pe_link_dumped) { + optional = FALSE; + style = "bold"; + } else if(before->state == pe_link_dup) { + continue; + } else if(action->dumped && before->action->dumped) { + optional = FALSE; } - last_action = before->action->id; - if(action->dumped && before->action->dumped) { - } else if(action->optional || before->action->optional) { - optional = TRUE; - } else if(before->action->runnable == FALSE - && before->action->pseudo == FALSE - && before->type == pe_order_optional) { - optional = TRUE; - } - before_name = create_action_name(before->action); - after_name = create_action_name(action); + if(all_actions || optional == FALSE) { - dot_write("\"%s\" -> \"%s\" [ style = %s]", - before_name, after_name, - optional?"dashed":"bold"); + before_name = create_action_name(before->action); + after_name = create_action_name(action); + dot_write("\"%s\" -> \"%s\" [ style = %s]", + before_name, after_name, style); + crm_free(before_name); + crm_free(after_name); } - crm_free(before_name); - crm_free(after_name); ); ); dot_write("}"); if(dot_strm != NULL) { fflush(dot_strm); fclose(dot_strm); } simulate: if(do_simulation == FALSE) { goto cleanup; } transition = unpack_graph(data_set.graph); print_graph(LOG_DEBUG, transition); do { graph_rc = run_graph(transition); } while(graph_rc == transition_active); if(graph_rc != transition_complete) { crm_crit("Transition failed: %s", transition_status(graph_rc)); print_graph(LOG_ERR, transition); } destroy_graph(transition); CRM_CHECK(graph_rc == transition_complete, all_good = FALSE; crm_err("An invalid transition was produced")); cleanup: cleanup_alloc_calculations(&data_set); #if HAVE_LIBXML2 xmlCleanupParser(); #endif /* required for MallocDebug.app */ if(inhibit_exit) { GMainLoop* mainloop = g_main_new(FALSE); g_main_run(mainloop); } if(all_good) { return 0; } return 5; } diff --git a/crm/pengine/testcases/1484.dot b/crm/pengine/testcases/1484.dot index 09d6795f06..57bb0d85c7 100644 --- a/crm/pengine/testcases/1484.dot +++ b/crm/pengine/testcases/1484.dot @@ -1,7 +1,7 @@ digraph "g" { "all_stopped" [ style=bold color="green" fontcolor="orange" ] -"the-future-of-vaj_start_0 " [ style=filled color="black" fontcolor="black" fillcolor=red] +"the-future-of-vaj_start_0 " [ style=dashed color="red" fontcolor="black" ] "the-future-of-vaj_stop_0 hb2" -> "all_stopped" [ style = bold] -"the-future-of-vaj_stop_0 hb2" -> "the-future-of-vaj_start_0 " [ style = bold] +"the-future-of-vaj_stop_0 hb2" -> "the-future-of-vaj_start_0 " [ style = dashed] "the-future-of-vaj_stop_0 hb2" [ style=bold color="green" fontcolor="black" ] } diff --git a/crm/pengine/testcases/764.dot b/crm/pengine/testcases/764.dot index 5bb7f3ed53..adb524ff4a 100644 --- a/crm/pengine/testcases/764.dot +++ b/crm/pengine/testcases/764.dot @@ -1,51 +1,51 @@ digraph "g" { "DcIPaddr_monitor_0 posic041" -> "probe_complete posic041" [ style = bold] "DcIPaddr_monitor_0 posic041" [ style=bold color="green" fontcolor="black" ] -"DcIPaddr_start_0 posic043" [ style=filled color="black" fontcolor="black" fillcolor=red] -"DcIPaddr_stop_0 posic043" -> "DcIPaddr_start_0 posic043" [ style = bold] +"DcIPaddr_start_0 posic043" [ style=dashed color="red" fontcolor="black" ] +"DcIPaddr_stop_0 posic043" -> "DcIPaddr_start_0 posic043" [ style = dashed] "DcIPaddr_stop_0 posic043" -> "all_stopped" [ style = bold] "DcIPaddr_stop_0 posic043" [ style=bold color="green" fontcolor="black" ] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_DoFencing:0_monitor_5000 posic043" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_monitor_0 posic043" -> "probe_complete posic043" [ style = bold] "child_DoFencing:1_monitor_0 posic043" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_monitor_5000 posic041" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_monitor_0 posic041" -> "probe_complete posic041" [ style = bold] "child_DoFencing:2_monitor_0 posic041" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 posic041" -> "probe_complete posic041" [ style = bold] "child_DoFencing:3_monitor_0 posic041" [ style=bold color="green" fontcolor="black" ] "probe_complete posic041" -> "probe_complete" [ style = bold] "probe_complete posic041" [ style=bold color="green" fontcolor="black" ] "probe_complete posic043" -> "probe_complete" [ style = bold] "probe_complete posic043" [ style=bold color="green" fontcolor="black" ] -"probe_complete" -> "DcIPaddr_start_0 posic043" [ style = bold] -"probe_complete" -> "rsc_posic041_start_0 posic041" [ style = bold] -"probe_complete" -> "rsc_posic042_start_0 posic041" [ style = bold] -"probe_complete" -> "rsc_posic043_start_0 posic043" [ style = bold] -"probe_complete" -> "rsc_posic044_start_0 posic041" [ style = bold] +"probe_complete" -> "DcIPaddr_start_0 posic043" [ style = dashed] +"probe_complete" -> "rsc_posic041_start_0 posic041" [ style = dashed] +"probe_complete" -> "rsc_posic042_start_0 posic041" [ style = dashed] +"probe_complete" -> "rsc_posic043_start_0 posic043" [ style = dashed] +"probe_complete" -> "rsc_posic044_start_0 posic041" [ style = dashed] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc_posic041_monitor_0 posic043" -> "probe_complete posic043" [ style = bold] "rsc_posic041_monitor_0 posic043" [ style=bold color="green" fontcolor="black" ] -"rsc_posic041_start_0 posic041" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_posic041_start_0 posic041" [ style=dashed color="red" fontcolor="black" ] "rsc_posic041_stop_0 posic041" -> "all_stopped" [ style = bold] -"rsc_posic041_stop_0 posic041" -> "rsc_posic041_start_0 posic041" [ style = bold] +"rsc_posic041_stop_0 posic041" -> "rsc_posic041_start_0 posic041" [ style = dashed] "rsc_posic041_stop_0 posic041" [ style=bold color="green" fontcolor="black" ] "rsc_posic042_monitor_0 posic043" -> "probe_complete posic043" [ style = bold] "rsc_posic042_monitor_0 posic043" [ style=bold color="green" fontcolor="black" ] -"rsc_posic042_start_0 posic041" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_posic042_start_0 posic041" [ style=dashed color="red" fontcolor="black" ] "rsc_posic042_stop_0 posic041" -> "all_stopped" [ style = bold] -"rsc_posic042_stop_0 posic041" -> "rsc_posic042_start_0 posic041" [ style = bold] +"rsc_posic042_stop_0 posic041" -> "rsc_posic042_start_0 posic041" [ style = dashed] "rsc_posic042_stop_0 posic041" [ style=bold color="green" fontcolor="black" ] "rsc_posic043_monitor_0 posic041" -> "probe_complete posic041" [ style = bold] "rsc_posic043_monitor_0 posic041" [ style=bold color="green" fontcolor="black" ] -"rsc_posic043_start_0 posic043" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_posic043_start_0 posic043" [ style=dashed color="red" fontcolor="black" ] "rsc_posic043_stop_0 posic043" -> "all_stopped" [ style = bold] -"rsc_posic043_stop_0 posic043" -> "rsc_posic043_start_0 posic043" [ style = bold] +"rsc_posic043_stop_0 posic043" -> "rsc_posic043_start_0 posic043" [ style = dashed] "rsc_posic043_stop_0 posic043" [ style=bold color="green" fontcolor="black" ] "rsc_posic044_monitor_0 posic043" -> "probe_complete posic043" [ style = bold] "rsc_posic044_monitor_0 posic043" [ style=bold color="green" fontcolor="black" ] -"rsc_posic044_start_0 posic041" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_posic044_start_0 posic041" [ style=dashed color="red" fontcolor="black" ] "rsc_posic044_stop_0 posic041" -> "all_stopped" [ style = bold] -"rsc_posic044_stop_0 posic041" -> "rsc_posic044_start_0 posic041" [ style = bold] +"rsc_posic044_stop_0 posic041" -> "rsc_posic044_start_0 posic041" [ style = dashed] "rsc_posic044_stop_0 posic041" [ style=bold color="green" fontcolor="black" ] } diff --git a/crm/pengine/testcases/797.dot b/crm/pengine/testcases/797.dot index ba7c3fe870..74a0979f48 100644 --- a/crm/pengine/testcases/797.dot +++ b/crm/pengine/testcases/797.dot @@ -1,101 +1,101 @@ digraph "g" { -"DcIPaddr_delete_0 c001n03" -> "DcIPaddr_start_0 c001n03" [ style = bold] +"DcIPaddr_delete_0 c001n03" -> "DcIPaddr_start_0 c001n03" [ style = dashed] "DcIPaddr_delete_0 c001n03" -> "lrm_refresh c001n03" [ style = bold] "DcIPaddr_delete_0 c001n03" [ style=bold color="green" fontcolor="black" ] "DcIPaddr_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "DcIPaddr_monitor_0 c001n01" [ style=bold color="green" fontcolor="black" ] "DcIPaddr_monitor_0 c001n02" -> "probe_complete c001n02" [ style = bold] "DcIPaddr_monitor_0 c001n02" [ style=bold color="green" fontcolor="black" ] -"DcIPaddr_start_0 c001n03" [ style=filled color="black" fontcolor="black" fillcolor=red] +"DcIPaddr_start_0 c001n03" [ style=dashed color="red" fontcolor="black" ] "DcIPaddr_stop_0 c001n03" -> "DcIPaddr_delete_0 c001n03" [ style = bold] -"DcIPaddr_stop_0 c001n03" -> "DcIPaddr_start_0 c001n03" [ style = bold] +"DcIPaddr_stop_0 c001n03" -> "DcIPaddr_start_0 c001n03" [ style = dashed] "DcIPaddr_stop_0 c001n03" -> "all_stopped" [ style = bold] "DcIPaddr_stop_0 c001n03" [ 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:1_start_0 c001n01" [ 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:0_stop_0 c001n01" [ style = bold] "DoFencing_stop_0" -> "child_DoFencing:0_stop_0 c001n03" [ style = bold] "DoFencing_stop_0" -> "child_DoFencing:1_stop_0 c001n02" [ 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" -> "child_DoFencing:0_stop_0 c001n01" [ style = bold] "all_stopped" -> "child_DoFencing:0_stop_0 c001n03" [ style = bold] "all_stopped" -> "child_DoFencing:1_stop_0 c001n02" [ style = bold] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_DoFencing:0_stop_0 c001n01" -> "DoFencing_stopped_0" [ style = bold] "child_DoFencing:0_stop_0 c001n01" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:0_stop_0 c001n03" -> "DoFencing_stopped_0" [ style = bold] "child_DoFencing:0_stop_0 c001n03" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_monitor_5000 c001n01" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_start_0 c001n01" -> "DoFencing_running_0" [ style = bold] "child_DoFencing:1_start_0 c001n01" -> "child_DoFencing:1_monitor_5000 c001n01" [ style = bold] "child_DoFencing:1_start_0 c001n01" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_stop_0 c001n02" -> "DoFencing_stopped_0" [ style = bold] "child_DoFencing:1_stop_0 c001n02" -> "child_DoFencing:1_start_0 c001n01" [ style = bold] "child_DoFencing:1_stop_0 c001n02" -> "do_shutdown c001n02" [ style = bold] "child_DoFencing:1_stop_0 c001n02" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "child_DoFencing:2_monitor_0 c001n01" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "child_DoFencing:3_monitor_0 c001n01" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 c001n02" -> "probe_complete c001n02" [ style = bold] "child_DoFencing:3_monitor_0 c001n02" [ 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" ] "do_shutdown c001n02" [ style=bold color="green" fontcolor="black" ] "lrm_refresh c001n03" [ style=bold color="green" fontcolor="black" ] "probe_complete c001n01" -> "probe_complete" [ style = bold] "probe_complete c001n01" [ style=bold color="green" fontcolor="black" ] "probe_complete c001n02" -> "probe_complete" [ style = bold] "probe_complete c001n02" [ style=bold color="green" fontcolor="black" ] "probe_complete c001n03" -> "probe_complete" [ style = bold] "probe_complete c001n03" [ style=bold color="green" fontcolor="black" ] -"probe_complete" -> "DcIPaddr_start_0 c001n03" [ style = bold] +"probe_complete" -> "DcIPaddr_start_0 c001n03" [ style = dashed] "probe_complete" -> "DoFencing_start_0" [ style = bold] -"probe_complete" -> "rsc_c001n01_start_0 c001n01" [ style = bold] -"probe_complete" -> "rsc_c001n02_start_0 c001n01" [ style = bold] -"probe_complete" -> "rsc_c001n03_start_0 c001n03" [ style = bold] -"probe_complete" -> "rsc_c001n08_start_0 c001n01" [ style = bold] +"probe_complete" -> "rsc_c001n01_start_0 c001n01" [ style = dashed] +"probe_complete" -> "rsc_c001n02_start_0 c001n01" [ style = dashed] +"probe_complete" -> "rsc_c001n03_start_0 c001n03" [ style = dashed] +"probe_complete" -> "rsc_c001n08_start_0 c001n01" [ 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_start_0 c001n01" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_c001n01_start_0 c001n01" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n01_stop_0 c001n01" -> "all_stopped" [ style = bold] -"rsc_c001n01_stop_0 c001n01" -> "rsc_c001n01_start_0 c001n01" [ style = bold] +"rsc_c001n01_stop_0 c001n01" -> "rsc_c001n01_start_0 c001n01" [ style = dashed] "rsc_c001n01_stop_0 c001n01" [ style=bold color="green" fontcolor="black" ] "rsc_c001n02_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "rsc_c001n02_monitor_0 c001n01" [ style=bold color="green" 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 c001n01" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n02_start_0 c001n01" -> "rsc_c001n02_monitor_5000 c001n01" [ style = bold] -"rsc_c001n02_start_0 c001n01" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_c001n02_monitor_5000 c001n01" [ style=dashed color="red" fontcolor="black" ] +"rsc_c001n02_start_0 c001n01" -> "rsc_c001n02_monitor_5000 c001n01" [ style = dashed] +"rsc_c001n02_start_0 c001n01" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n02_stop_0 c001n02" -> "all_stopped" [ style = bold] "rsc_c001n02_stop_0 c001n02" -> "do_shutdown c001n02" [ style = bold] -"rsc_c001n02_stop_0 c001n02" -> "rsc_c001n02_start_0 c001n01" [ style = bold] +"rsc_c001n02_stop_0 c001n02" -> "rsc_c001n02_start_0 c001n01" [ style = dashed] "rsc_c001n02_stop_0 c001n02" [ style=bold color="green" fontcolor="black" ] "rsc_c001n03_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "rsc_c001n03_monitor_0 c001n01" [ style=bold color="green" fontcolor="black" ] "rsc_c001n03_monitor_0 c001n02" -> "probe_complete c001n02" [ style = bold] "rsc_c001n03_monitor_0 c001n02" [ style=bold color="green" fontcolor="black" ] -"rsc_c001n03_start_0 c001n03" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_c001n03_start_0 c001n03" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n03_stop_0 c001n03" -> "all_stopped" [ style = bold] -"rsc_c001n03_stop_0 c001n03" -> "rsc_c001n03_start_0 c001n03" [ style = bold] +"rsc_c001n03_stop_0 c001n03" -> "rsc_c001n03_start_0 c001n03" [ style = dashed] "rsc_c001n03_stop_0 c001n03" [ style=bold color="green" fontcolor="black" ] "rsc_c001n08_monitor_0 c001n01" -> "probe_complete c001n01" [ style = bold] "rsc_c001n08_monitor_0 c001n01" [ style=bold color="green" 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 c001n01" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n08_start_0 c001n01" -> "rsc_c001n08_monitor_5000 c001n01" [ style = bold] -"rsc_c001n08_start_0 c001n01" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_c001n08_monitor_5000 c001n01" [ style=dashed color="red" fontcolor="black" ] +"rsc_c001n08_start_0 c001n01" -> "rsc_c001n08_monitor_5000 c001n01" [ style = dashed] +"rsc_c001n08_start_0 c001n01" [ style=dashed color="red" fontcolor="black" ] "rsc_c001n08_stop_0 c001n02" -> "all_stopped" [ style = bold] "rsc_c001n08_stop_0 c001n02" -> "do_shutdown c001n02" [ style = bold] -"rsc_c001n08_stop_0 c001n02" -> "rsc_c001n08_start_0 c001n01" [ style = bold] +"rsc_c001n08_stop_0 c001n02" -> "rsc_c001n08_start_0 c001n01" [ style = dashed] "rsc_c001n08_stop_0 c001n02" [ style=bold color="green" fontcolor="black" ] } diff --git a/crm/pengine/testcases/group14.dot b/crm/pengine/testcases/group14.dot index bd6df4c73d..b3f30c1f6e 100644 --- a/crm/pengine/testcases/group14.dot +++ b/crm/pengine/testcases/group14.dot @@ -1,66 +1,66 @@ digraph "g" { -"192.168.100.181_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"192.168.100.181_start_0 c001n07" -> "192.168.100.181_monitor_5000 c001n07" [ style = bold] -"192.168.100.181_start_0 c001n07" -> "192.168.100.182_start_0 c001n07" [ style = bold] -"192.168.100.181_start_0 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"192.168.100.181_stop_0 c001n06" -> "192.168.100.181_start_0 c001n07" [ style = bold] +"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" [ 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=filled color="black" fontcolor="black" fillcolor=red] -"192.168.100.182_start_0 c001n07" -> "192.168.100.182_monitor_5000 c001n07" [ style = bold] -"192.168.100.182_start_0 c001n07" -> "192.168.100.183_start_0 c001n07" [ style = bold] -"192.168.100.182_start_0 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"192.168.100.183_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"192.168.100.183_start_0 c001n07" -> "192.168.100.183_monitor_5000 c001n07" [ style = bold] -"192.168.100.183_start_0 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] +"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" [ style=dashed color="red" fontcolor="black" ] +"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" [ style=dashed color="red" fontcolor="black" ] "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=filled color="black" fontcolor="black" fillcolor=red] +"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_start_0" -> "192.168.100.181_start_0 c001n07" [ style = bold] -"group-1_start_0" [ style=filled color="black" fontcolor="orange" fillcolor=red] +"group-1_start_0" -> "192.168.100.181_start_0 c001n07" [ 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.183_stop_0" [ style = bold] -"group-1_stop_0" -> "group-1_start_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 = bold] +"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=filled color="black" fontcolor="black" fillcolor=red] -"migrator_monitor_10000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:0_monitor_5000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:10_monitor_5000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:11_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:1_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] +"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=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n03_monitor_5000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n04_monitor_5000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n05_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n06_monitor_5000 c001n06" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_c001n07_monitor_5000 c001n07" [ style=filled color="black" fontcolor="black" fillcolor=red] +"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/crm/pengine/testcases/master-9.dot b/crm/pengine/testcases/master-9.dot index 9d1bc53853..c3b43dfc11 100644 --- a/crm/pengine/testcases/master-9.dot +++ b/crm/pengine/testcases/master-9.dot @@ -1,62 +1,62 @@ digraph "g" { -"DcIPaddr_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"DcIPaddr_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] "DoFencing_stop_0" -> "DoFencing_stopped_0" [ style = bold] "DoFencing_stop_0" -> "child_DoFencing:1_stop_0 ibm1" [ style = bold] "DoFencing_stop_0" [ style=bold color="green" fontcolor="orange" ] "DoFencing_stopped_0" [ style=bold color="green" fontcolor="orange" ] "all_stopped" -> "child_DoFencing:1_stop_0 ibm1" [ style = bold] "all_stopped" [ style=bold color="green" fontcolor="orange" ] "child_DoFencing:1_monitor_0 va1" -> "probe_complete va1" [ style = bold] "child_DoFencing:1_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:1_stop_0 ibm1" -> "DoFencing_stopped_0" [ style = bold] "child_DoFencing:1_stop_0 ibm1" -> "do_shutdown ibm1" [ style = bold] "child_DoFencing:1_stop_0 ibm1" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "child_DoFencing:2_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:2_monitor_0 va1" -> "probe_complete va1" [ style = bold] "child_DoFencing:2_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "child_DoFencing:3_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "child_DoFencing:3_monitor_0 va1" -> "probe_complete va1" [ style = bold] "child_DoFencing:3_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "do_shutdown ibm1" [ style=bold color="green" fontcolor="black" ] -"heartbeat_127.0.0.12_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"lsb_dummy_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_127.0.0.11_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_127.0.0.13_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:0_monitor_6000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"ocf_msdummy:1_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"heartbeat_127.0.0.12_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"lsb_dummy_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"ocf_127.0.0.11_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"ocf_127.0.0.13_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"ocf_msdummy:0_monitor_6000 va1" [ style=dashed color="red" fontcolor="black" ] +"ocf_msdummy:1_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] "ocf_msdummy:2_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:2_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:2_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:2_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:3_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:3_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:3_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:3_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:4_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:4_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:4_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:4_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:5_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:5_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:5_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:5_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:6_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:6_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:6_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:6_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:7_monitor_0 ibm1" -> "probe_complete ibm1" [ style = bold] "ocf_msdummy:7_monitor_0 ibm1" [ style=bold color="green" fontcolor="black" ] "ocf_msdummy:7_monitor_0 va1" -> "probe_complete va1" [ style = bold] "ocf_msdummy:7_monitor_0 va1" [ style=bold color="green" fontcolor="black" ] "probe_complete ibm1" -> "probe_complete" [ style = bold] "probe_complete ibm1" [ style=bold color="green" fontcolor="black" ] "probe_complete va1" -> "probe_complete" [ style = bold] "probe_complete va1" [ style=bold color="green" fontcolor="black" ] "probe_complete" [ style=bold color="green" fontcolor="orange" ] -"rsc_ibm1_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_sgi2_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_test02_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] -"rsc_va1_monitor_5000 va1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc_ibm1_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"rsc_sgi2_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"rsc_test02_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] +"rsc_va1_monitor_5000 va1" [ style=dashed color="red" fontcolor="black" ] } diff --git a/crm/pengine/testcases/order7.dot b/crm/pengine/testcases/order7.dot index 1988cacf42..32f7cd79d2 100644 --- a/crm/pengine/testcases/order7.dot +++ b/crm/pengine/testcases/order7.dot @@ -1,21 +1,21 @@ digraph "g" { "probe_complete node1" -> "probe_complete" [ style = bold] "probe_complete node1" [ style=bold color="green" fontcolor="black" ] "probe_complete" -> "rsc2_start_0 node1" [ style = bold] "probe_complete" -> "rsc3_start_0 node1" [ style = bold] "probe_complete" -> "rscB_start_0 node1" [ style = bold] -"probe_complete" -> "rscC_start_0 node1" [ style = bold] +"probe_complete" -> "rscC_start_0 node1" [ style = dashed] "probe_complete" [ style=bold color="green" fontcolor="orange" ] "rsc2_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rsc2_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rsc2_start_0 node1" [ 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_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rscB_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rscB_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] "rscB_start_0 node1" [ style=bold color="green" fontcolor="black" ] "rscC_monitor_0 node1" -> "probe_complete node1" [ style = bold] "rscC_monitor_0 node1" [ style=bold color="green" fontcolor="black" ] -"rscC_start_0 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rscC_start_0 node1" [ style=dashed color="red" fontcolor="black" ] } diff --git a/crm/pengine/testcases/quorum-3.dot b/crm/pengine/testcases/quorum-3.dot index 9c2ad506ee..94ea882354 100644 --- a/crm/pengine/testcases/quorum-3.dot +++ b/crm/pengine/testcases/quorum-3.dot @@ -1,26 +1,26 @@ digraph "g" { "all_stopped" [ 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" -> "rsc1_start_0 node1" [ style = bold] -"probe_complete" -> "rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "rsc1_start_0 node1" [ style = dashed] +"probe_complete" -> "rsc2_start_0 node2" [ style = dashed] "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 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc1_start_0 node1" [ style=dashed color="red" fontcolor="black" ] "rsc1_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc1_stop_0 node1" -> "rsc1_start_0 node1" [ style = bold] +"rsc1_stop_0 node1" -> "rsc1_start_0 node1" [ style = dashed] "rsc1_stop_0 node1" [ 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=filled color="black" fontcolor="black" fillcolor=red] +"rsc2_start_0 node2" [ style=dashed color="red" fontcolor="black" ] "rsc2_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] +"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = dashed] "rsc2_stop_0 node1" [ 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 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] } diff --git a/crm/pengine/testcases/rec-node-10.dot b/crm/pengine/testcases/rec-node-10.dot index 34ff99a415..1ce75ceae6 100644 --- a/crm/pengine/testcases/rec-node-10.dot +++ b/crm/pengine/testcases/rec-node-10.dot @@ -1,20 +1,20 @@ digraph "g" { -"all_stopped" [ style=filled color="black" fontcolor="orange" fillcolor=red] +"all_stopped" [ style=dashed color="red" fontcolor="orange" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] -"probe_complete" -> "rsc1_start_0 node2" [ style = bold] -"probe_complete" -> "rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "rsc1_start_0 node2" [ style = dashed] +"probe_complete" -> "rsc2_start_0 node2" [ style = dashed] "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=filled color="black" fontcolor="black" fillcolor=red] -"rsc1_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = bold] -"rsc1_stop_0 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc1_start_0 node2" [ style=dashed color="red" fontcolor="black" ] +"rsc1_stop_0 node1" -> "all_stopped" [ style = dashed] +"rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = dashed] +"rsc1_stop_0 node1" [ style=dashed color="red" 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=filled color="black" fontcolor="black" fillcolor=red] -"rsc2_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] -"rsc2_stop_0 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc2_start_0 node2" [ style=dashed color="red" fontcolor="black" ] +"rsc2_stop_0 node1" -> "all_stopped" [ style = dashed] +"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = dashed] +"rsc2_stop_0 node1" [ style=dashed color="red" fontcolor="black" ] } diff --git a/crm/pengine/testcases/rec-node-8.dot b/crm/pengine/testcases/rec-node-8.dot index 2d837f1103..0f591c7f01 100644 --- a/crm/pengine/testcases/rec-node-8.dot +++ b/crm/pengine/testcases/rec-node-8.dot @@ -1,22 +1,22 @@ digraph "g" { -"all_stopped" [ style=filled color="black" fontcolor="orange" fillcolor=red] +"all_stopped" [ style=dashed color="red" fontcolor="orange" ] "probe_complete node2" -> "probe_complete" [ style = bold] "probe_complete node2" [ style=bold color="green" fontcolor="black" ] -"probe_complete" -> "rsc1_start_0 node2" [ style = bold] -"probe_complete" -> "rsc2_start_0 node2" [ style = bold] +"probe_complete" -> "rsc1_start_0 node2" [ style = dashed] +"probe_complete" -> "rsc2_start_0 node2" [ style = dashed] "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=filled color="black" fontcolor="black" fillcolor=red] -"rsc1_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = bold] -"rsc1_stop_0 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc1_start_0 node2" [ style=dashed color="red" fontcolor="black" ] +"rsc1_stop_0 node1" -> "all_stopped" [ style = dashed] +"rsc1_stop_0 node1" -> "rsc1_start_0 node2" [ style = dashed] +"rsc1_stop_0 node1" [ style=dashed color="red" 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=filled color="black" fontcolor="black" fillcolor=red] -"rsc2_stop_0 node1" -> "all_stopped" [ style = bold] -"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = bold] -"rsc2_stop_0 node1" [ style=filled color="black" fontcolor="black" fillcolor=red] +"rsc2_start_0 node2" [ style=dashed color="red" fontcolor="black" ] +"rsc2_stop_0 node1" -> "all_stopped" [ style = dashed] +"rsc2_stop_0 node1" -> "rsc2_start_0 node2" [ style = dashed] +"rsc2_stop_0 node1" [ style=dashed color="red" fontcolor="black" ] "rsc3_monitor_0 node2" -> "probe_complete node2" [ style = bold] "rsc3_monitor_0 node2" [ style=bold color="green" fontcolor="black" ] } diff --git a/crm/pengine/testcases/rec-rsc-4.dot b/crm/pengine/testcases/rec-rsc-4.dot index 00cc56d0e3..980d6ba839 100644 --- a/crm/pengine/testcases/rec-rsc-4.dot +++ b/crm/pengine/testcases/rec-rsc-4.dot @@ -1,10 +1,9 @@ digraph "g" { "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" -> "rsc1_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" ] } diff --git a/crm/pengine/testcases/unrunnable-1.dot b/crm/pengine/testcases/unrunnable-1.dot index de2ded1879..338c298899 100644 --- a/crm/pengine/testcases/unrunnable-1.dot +++ b/crm/pengine/testcases/unrunnable-1.dot @@ -1,38 +1,38 @@ 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=filled color="black" fontcolor="black" fillcolor=red] -"all_stopped" -> "child_DoFencing:1_stop_0 c001n02" [ style = bold] +"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=filled color="black" fontcolor="black" fillcolor=red] +"child_192.168.100.181_monitor_5000 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=filled color="black" fontcolor="black" fillcolor=red] +"child_192.168.100.182_monitor_5000 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=filled color="black" fontcolor="black" fillcolor=red] +"child_192.168.100.183_monitor_5000 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=filled color="black" fontcolor="black" fillcolor=red] +"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" ] "probe_complete c001n03" -> "probe_complete" [ style = bold] "probe_complete c001n03" [ style=bold color="green" fontcolor="black" ] "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=filled color="black" fontcolor="black" fillcolor=red] +"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=filled color="black" fontcolor="black" fillcolor=red] +"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=filled color="black" fontcolor="black" fillcolor=red] +"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=filled color="black" fontcolor="black" fillcolor=red] +"rsc_c001n08_monitor_5000 c001n03" [ style=dashed color="red" fontcolor="black" ] }