Page MenuHomeClusterLabs Projects

No OneTemporary

diff --git a/crm/pengine/allocate.c b/crm/pengine/allocate.c
index 44944f0e1d..b9654f3879 100644
--- a/crm/pengine/allocate.c
+++ b/crm/pengine/allocate.c
@@ -1,1422 +1,1417 @@
/*
* Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
*
* 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 <lha_internal.h>
#include <sys/param.h>
#include <crm/crm.h>
#include <crm/cib.h>
#include <crm/msg_xml.h>
#include <crm/common/xml.h>
#include <crm/common/msg.h>
#include <clplumbing/cl_misc.h>
#include <glib.h>
#include <crm/pengine/status.h>
#include <pengine.h>
#include <allocate.h>
#include <utils.h>
#include <lib/crm/pengine/utils.h>
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_set_cmds,
native_num_allowed_nodes,
native_color,
native_create_actions,
native_create_probe,
native_internal_constraints,
native_agent_constraints,
native_rsc_colocation_lh,
native_rsc_colocation_rh,
native_rsc_order_lh,
native_rsc_order_rh,
native_rsc_location,
native_expand,
native_migrate_reload,
native_stonith_ordering,
native_create_notify_element,
},
{
group_set_cmds,
group_num_allowed_nodes,
group_color,
group_create_actions,
group_create_probe,
group_internal_constraints,
group_agent_constraints,
group_rsc_colocation_lh,
group_rsc_colocation_rh,
group_rsc_order_lh,
group_rsc_order_rh,
group_rsc_location,
group_expand,
group_migrate_reload,
group_stonith_ordering,
group_create_notify_element,
},
{
clone_set_cmds,
clone_num_allowed_nodes,
clone_color,
clone_create_actions,
clone_create_probe,
clone_internal_constraints,
clone_agent_constraints,
clone_rsc_colocation_lh,
clone_rsc_colocation_rh,
clone_rsc_order_lh,
clone_rsc_order_rh,
clone_rsc_location,
clone_expand,
clone_migrate_reload,
clone_stonith_ordering,
clone_create_notify_element,
},
{
clone_set_cmds,
clone_num_allowed_nodes,
master_color,
master_create_actions,
clone_create_probe,
master_internal_constraints,
clone_agent_constraints,
clone_rsc_colocation_lh,
master_rsc_colocation_rh,
clone_rsc_order_lh,
clone_rsc_order_rh,
clone_rsc_location,
clone_expand,
clone_migrate_reload,
clone_stonith_ordering,
clone_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);
rsc->start_pending = TRUE;
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);
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);
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);
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)",
key, active_node->details->uname,
crm_str(digest_restart), digest_restart_calc,
op_version);
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)",
key, active_node->details->uname,
crm_str(digest_all), digest_all_calc, op_version);
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(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;
}
void
set_alloc_actions(pe_working_set_t *data_set)
{
slist_iter(
rsc, resource_t, data_set->resources, lpc,
rsc->cmds = &resource_class_alloc_functions[rsc->variant];
rsc->cmds->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;
}
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);
value = pe_pref(data_set->config_hash, "cluster-delay");
crm_debug_2("Creating transition graph %d.", transition_id);
data_set->graph = create_xml_node(NULL, XML_TAG_GRAPH);
crm_xml_add(data_set->graph, "cluster-delay", 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;
cleanup_calculations(data_set);
}
gboolean
unpack_constraints(crm_data_t * xml_constraints, pe_working_set_t *data_set)
{
crm_data_t *lifetime = NULL;
xml_child_iter(
xml_constraints, xml_obj,
const char *id = crm_element_value(xml_obj, XML_ATTR_ID);
if(id == NULL) {
crm_config_err("Constraint <%s...> must have an id",
crm_element_name(xml_obj));
continue;
}
crm_debug_3("Processing constraint %s %s",
crm_element_name(xml_obj),id);
lifetime = cl_get_struct(xml_obj, "lifetime");
if(test_ruleset(lifetime, NULL, data_set->now) == FALSE) {
crm_info("Constraint %s %s is not active",
crm_element_name(xml_obj), id);
} else if(safe_str_eq(XML_CONS_TAG_RSC_ORDER,
crm_element_name(xml_obj))) {
unpack_rsc_order(xml_obj, data_set);
} else if(safe_str_eq(XML_CONS_TAG_RSC_DEPEND,
crm_element_name(xml_obj))) {
unpack_rsc_colocation(xml_obj, data_set);
} else if(safe_str_eq(XML_CONS_TAG_RSC_LOCATION,
crm_element_name(xml_obj))) {
unpack_rsc_location(xml_obj, data_set);
} else {
pe_err("Unsupported constraint type: %s",
crm_element_name(xml_obj));
}
);
return TRUE;
}
static const char *
invert_action(const char *action)
{
if(safe_str_eq(action, CRMD_ACTION_START)) {
return CRMD_ACTION_STOP;
} else if(safe_str_eq(action, CRMD_ACTION_STOP)) {
return CRMD_ACTION_START;
} else if(safe_str_eq(action, CRMD_ACTION_PROMOTE)) {
return CRMD_ACTION_DEMOTE;
} else if(safe_str_eq(action, CRMD_ACTION_DEMOTE)) {
return CRMD_ACTION_PROMOTE;
} else if(safe_str_eq(action, CRMD_ACTION_PROMOTED)) {
return CRMD_ACTION_DEMOTED;
} else if(safe_str_eq(action, CRMD_ACTION_DEMOTED)) {
return CRMD_ACTION_PROMOTED;
} else if(safe_str_eq(action, CRMD_ACTION_STARTED)) {
return CRMD_ACTION_STOPPED;
} else if(safe_str_eq(action, CRMD_ACTION_STOPPED)) {
return CRMD_ACTION_STARTED;
}
crm_config_warn("Unknown action: %s", action);
return NULL;
}
gboolean
unpack_rsc_order(crm_data_t * xml_obj, pe_working_set_t *data_set)
{
int score_i = 0;
int order_id = 0;
resource_t *rsc_lh = NULL;
resource_t *rsc_rh = NULL;
gboolean symmetrical_bool = TRUE;
enum pe_ordering cons_weight = pe_order_optional;
const char *id_rh = NULL;
const char *id_lh = NULL;
const char *action = NULL;
const char *action_rh = NULL;
const char *id = crm_element_value(xml_obj, XML_ATTR_ID);
const char *type = crm_element_value(xml_obj, XML_ATTR_TYPE);
const char *score = crm_element_value(xml_obj, XML_RULE_ATTR_SCORE);
const char *symmetrical = crm_element_value(
xml_obj, XML_CONS_ATTR_SYMMETRICAL);
cl_str_to_boolean(symmetrical, &symmetrical_bool);
if(xml_obj == NULL) {
crm_config_err("No constraint object to process.");
return FALSE;
} else if(id == NULL) {
crm_config_err("%s constraint must have an id",
crm_element_name(xml_obj));
return FALSE;
}
- if(safe_str_eq(type, "before")) {
- id_lh = crm_element_value(xml_obj, XML_CONS_ATTR_TO);
- id_rh = crm_element_value(xml_obj, XML_CONS_ATTR_FROM);
- action = crm_element_value(xml_obj, XML_CONS_ATTR_ACTION);
- action_rh = crm_element_value(xml_obj, XML_CONS_ATTR_TOACTION);
-
- } else {
- type="before";
- id_rh = crm_element_value(xml_obj, XML_CONS_ATTR_TO);
- id_lh = crm_element_value(xml_obj, XML_CONS_ATTR_FROM);
- action = crm_element_value(xml_obj, XML_CONS_ATTR_TOACTION);
- action_rh = crm_element_value(xml_obj, XML_CONS_ATTR_ACTION);
- if(action == NULL) {
- action = action_rh;
- }
+ id_lh = crm_element_value(xml_obj, XML_CONS_ATTR_TO);
+ id_rh = crm_element_value(xml_obj, XML_CONS_ATTR_FROM);
+ action = crm_element_value(xml_obj, XML_CONS_ATTR_ACTION);
+ action_rh = crm_element_value(xml_obj, XML_CONS_ATTR_TOACTION);
+ if(action == NULL) {
+ action = CRMD_ACTION_START;
+ }
+ if(action_rh == NULL) {
+ action_rh = action;
+ }
+
+ if(safe_str_neq(type, "before")) {
+ /* normalize the input - swap everything over */
+ const char *tmp = NULL;
+ type = "before";
+ tmp = id_rh; id_rh = id_lh; id_lh = tmp;
+ tmp = action_rh; action_rh = action; action = tmp;
}
if(id_lh == NULL || id_rh == NULL) {
crm_config_err("Constraint %s needs two sides lh: %s rh: %s",
id, crm_str(id_lh), crm_str(id_rh));
return FALSE;
- }
-
- if(action == NULL) {
- action = CRMD_ACTION_START;
- }
- if(action_rh == NULL) {
- action_rh = action;
- }
+ }
rsc_lh = pe_find_resource(data_set->resources, id_rh);
rsc_rh = pe_find_resource(data_set->resources, id_lh);
if(rsc_lh == NULL) {
crm_config_err("Constraint %s: no resource found for LHS (%s)", id, id_rh);
return FALSE;
} else if(rsc_rh == NULL) {
crm_config_err("Constraint %s: no resource found for RHS of (%s)", id, id_lh);
return FALSE;
}
score_i = char2score(score);
cons_weight = pe_order_optional;
if(score == 0 && rsc_rh->restart_type == pe_restart_restart) {
crm_debug_2("Upgrade : recovery - implies right");
cons_weight |= pe_order_implies_right;
}
if(score_i < 0) {
crm_debug_2("Upgrade : implies left");
cons_weight |= pe_order_implies_left;
} else if(score_i > 0) {
crm_debug_2("Upgrade : implies right");
cons_weight |= pe_order_implies_right;
if(safe_str_eq(action, CRMD_ACTION_START)
|| safe_str_eq(action, CRMD_ACTION_PROMOTE)) {
crm_debug_2("Upgrade : runnable");
cons_weight |= pe_order_runnable_left;
}
}
order_id = custom_action_order(
rsc_lh, generate_op_key(rsc_lh->id, action, 0), NULL,
rsc_rh, generate_op_key(rsc_rh->id, action_rh, 0), NULL,
cons_weight, data_set);
crm_debug("order-%d (%s): %s_%s %s %s_%s flags=0x%.6x",
order_id, id, rsc_lh->id, action, type, rsc_rh->id, action_rh,
cons_weight);
if(symmetrical_bool == FALSE) {
return TRUE;
}
action = invert_action(action);
action_rh = invert_action(action_rh);
cons_weight = pe_order_optional;
if(score == 0 && rsc_rh->restart_type == pe_restart_restart) {
crm_debug_2("Upgrade : recovery - implies left");
cons_weight |= pe_order_implies_left;
}
score_i *= -1;
if(score_i < 0) {
crm_debug_2("Upgrade : implies left");
cons_weight |= pe_order_implies_left;
} else if(score_i > 0) {
crm_debug_2("Upgrade : implies right");
cons_weight |= pe_order_implies_right;
if(safe_str_eq(action, CRMD_ACTION_START)
|| safe_str_eq(action, CRMD_ACTION_PROMOTE)) {
crm_debug_2("Upgrade : runnable");
cons_weight |= pe_order_runnable_left;
}
}
if(action == NULL || action_rh == NULL) {
crm_config_err("Cannot invert rsc_order constraint %s."
" Please specify the inverse manually.", id);
return TRUE;
}
order_id = custom_action_order(
rsc_rh, generate_op_key(rsc_rh->id, action_rh, 0), NULL,
rsc_lh, generate_op_key(rsc_lh->id, action, 0), NULL,
cons_weight, data_set);
crm_debug("order-%d (%s): %s_%s %s %s_%s flags=0x%.6x",
order_id, id, rsc_rh->id, action_rh, type, rsc_lh->id, action,
cons_weight);
return TRUE;
}
gboolean
unpack_rsc_location(crm_data_t * xml_obj, pe_working_set_t *data_set)
{
gboolean empty = TRUE;
const char *id_lh = crm_element_value(xml_obj, "rsc");
const char *id = crm_element_value(xml_obj, XML_ATTR_ID);
resource_t *rsc_lh = pe_find_resource(data_set->resources, id_lh);
if(rsc_lh == NULL) {
/* only a warn as BSC adds the constraint then the resource */
crm_config_warn("No resource (con=%s, rsc=%s)", id, id_lh);
return FALSE;
} else if(rsc_lh->is_managed == FALSE) {
crm_debug_2("Ignoring constraint %s: resource %s not managed",
id, id_lh);
return FALSE;
}
xml_child_iter_filter(
xml_obj, rule_xml, XML_TAG_RULE,
empty = FALSE;
crm_debug_2("Unpacking %s/%s", id, ID(rule_xml));
generate_location_rule(rsc_lh, rule_xml, data_set);
);
if(empty) {
crm_config_err("Invalid location constraint %s:"
" rsc_location must contain at least one rule",
ID(xml_obj));
}
return TRUE;
}
static int
get_node_score(const char *rule, const char *score, gboolean raw, node_t *node)
{
int score_f = 0;
if(score == NULL) {
pe_err("Rule %s: no score specified. Assuming 0.", rule);
} else if(raw) {
score_f = char2score(score);
} else {
const char *attr_score = g_hash_table_lookup(
node->details->attrs, score);
if(attr_score == NULL) {
crm_debug("Rule %s: node %s did not have a value for %s",
rule, node->details->uname, score);
score_f = -INFINITY;
} else {
crm_debug("Rule %s: node %s had value %s for %s",
rule, node->details->uname, attr_score, score);
score_f = char2score(attr_score);
}
}
return score_f;
}
rsc_to_node_t *
generate_location_rule(
resource_t *rsc, crm_data_t *rule_xml, pe_working_set_t *data_set)
{
const char *rule_id = NULL;
const char *score = NULL;
const char *boolean = NULL;
const char *role = NULL;
GListPtr match_L = NULL;
int score_f = 0;
gboolean do_and = TRUE;
gboolean accept = TRUE;
gboolean raw_score = TRUE;
rsc_to_node_t *location_rule = NULL;
rule_id = crm_element_value(rule_xml, XML_ATTR_ID);
boolean = crm_element_value(rule_xml, XML_RULE_ATTR_BOOLEAN_OP);
role = crm_element_value(rule_xml, XML_RULE_ATTR_ROLE);
crm_debug_2("Processing rule: %s", rule_id);
if(role != NULL && text2role(role) == RSC_ROLE_UNKNOWN) {
pe_err("Bad role specified for %s: %s", rule_id, role);
return NULL;
}
score = crm_element_value(rule_xml, XML_RULE_ATTR_SCORE);
if(score != NULL) {
score_f = char2score(score);
} else {
score = crm_element_value(
rule_xml, XML_RULE_ATTR_SCORE_ATTRIBUTE);
if(score == NULL) {
score = crm_element_value(
rule_xml, XML_RULE_ATTR_SCORE_MANGLED);
}
if(score != NULL) {
raw_score = FALSE;
}
}
if(safe_str_eq(boolean, "or")) {
do_and = FALSE;
}
location_rule = rsc2node_new(rule_id, rsc, 0, NULL, data_set);
if(location_rule == NULL) {
return NULL;
}
if(role != NULL) {
crm_debug_2("Setting role filter: %s", role);
location_rule->role_filter = text2role(role);
}
if(do_and) {
match_L = node_list_dup(data_set->nodes, TRUE, FALSE);
slist_iter(
node, node_t, match_L, lpc,
node->weight = get_node_score(rule_id, score, raw_score, node);
);
}
xml_child_iter(
rule_xml, expr,
enum expression_type type = find_expression_type(expr);
crm_debug_2("Processing expression: %s", ID(expr));
if(type == not_expr) {
pe_err("Expression <%s id=%s...> is not valid",
crm_element_name(expr), crm_str(ID(expr)));
continue;
}
slist_iter(
node, node_t, data_set->nodes, lpc,
if(type == nested_rule) {
accept = test_rule(
expr, node->details->attrs,
RSC_ROLE_UNKNOWN, data_set->now);
} else {
accept = test_expression(
expr, node->details->attrs,
RSC_ROLE_UNKNOWN, data_set->now);
}
score_f = get_node_score(rule_id, score, raw_score, node);
/* if(accept && score_f == -INFINITY) { */
/* accept = FALSE; */
/* } */
if(accept) {
node_t *local = pe_find_node_id(
match_L, node->details->id);
if(local == NULL && do_and) {
continue;
} else if(local == NULL) {
local = node_copy(node);
match_L = g_list_append(match_L, local);
}
if(do_and == FALSE) {
local->weight = merge_weights(
local->weight, score_f);
}
crm_debug_2("node %s now has weight %d",
node->details->uname, local->weight);
} else if(do_and && !accept) {
/* remove it */
node_t *delete = pe_find_node_id(
match_L, node->details->id);
if(delete != NULL) {
match_L = g_list_remove(match_L,delete);
crm_debug_5("node %s did not match",
node->details->uname);
}
crm_free(delete);
}
);
);
location_rule->node_list_rh = match_L;
if(location_rule->node_list_rh == NULL) {
crm_debug_2("No matching nodes for rule %s", rule_id);
return NULL;
}
crm_debug_3("%s: %d nodes matched",
rule_id, g_list_length(location_rule->node_list_rh));
return location_rule;
}
gboolean
rsc_colocation_new(const char *id, const char *node_attr, int score,
resource_t *rsc_lh, resource_t *rsc_rh,
const char *state_lh, const char *state_rh)
{
rsc_colocation_t *new_con = NULL;
if(rsc_lh == NULL){
crm_config_err("No resource found for LHS %s", id);
return FALSE;
} else if(rsc_rh == NULL){
crm_config_err("No resource found for RHS of %s", id);
return FALSE;
}
crm_malloc0(new_con, sizeof(rsc_colocation_t));
if(new_con == NULL) {
return FALSE;
}
if(state_lh == NULL
|| safe_str_eq(state_lh, RSC_ROLE_STARTED_S)) {
state_lh = RSC_ROLE_UNKNOWN_S;
}
if(state_rh == NULL
|| safe_str_eq(state_rh, RSC_ROLE_STARTED_S)) {
state_rh = RSC_ROLE_UNKNOWN_S;
}
new_con->id = id;
new_con->rsc_lh = rsc_lh;
new_con->rsc_rh = rsc_rh;
new_con->score = score;
new_con->role_lh = text2role(state_lh);
new_con->role_rh = text2role(state_rh);
new_con->node_attribute = node_attr;
crm_debug_4("Adding constraint %s (%p) to %s",
new_con->id, new_con, rsc_lh->id);
rsc_lh->rsc_cons = g_list_insert_sorted(
rsc_lh->rsc_cons, new_con, sort_cons_strength);
return TRUE;
}
/* LHS before RHS */
int
custom_action_order(
resource_t *lh_rsc, char *lh_action_task, action_t *lh_action,
resource_t *rh_rsc, char *rh_action_task, action_t *rh_action,
enum pe_ordering type, pe_working_set_t *data_set)
{
order_constraint_t *order = NULL;
if(lh_rsc == NULL && lh_action) {
lh_rsc = lh_action->rsc;
}
if(rh_rsc == NULL && rh_action) {
rh_rsc = rh_action->rsc;
}
if((lh_action == NULL && lh_rsc == NULL)
|| (rh_action == NULL && rh_rsc == NULL)){
crm_config_err("Invalid inputs %p.%p %p.%p",
lh_rsc, lh_action, rh_rsc, rh_action);
crm_free(lh_action_task);
crm_free(rh_action_task);
return -1;
}
crm_malloc0(order, sizeof(order_constraint_t));
crm_debug_3("Creating ordering constraint %d",
data_set->order_id);
order->id = data_set->order_id++;
order->type = type;
order->lh_rsc = lh_rsc;
order->rh_rsc = rh_rsc;
order->lh_action = lh_action;
order->rh_action = rh_action;
order->lh_action_task = lh_action_task;
order->rh_action_task = rh_action_task;
data_set->ordering_constraints = g_list_append(
data_set->ordering_constraints, order);
if(lh_rsc != NULL && rh_rsc != NULL) {
crm_debug_4("Created ordering constraint %d (%s):"
" %s/%s before %s/%s",
order->id, ordering_type2text(order->type),
lh_rsc->id, lh_action_task,
rh_rsc->id, rh_action_task);
} else if(lh_rsc != NULL) {
crm_debug_4("Created ordering constraint %d (%s):"
" %s/%s before action %d (%s)",
order->id, ordering_type2text(order->type),
lh_rsc->id, lh_action_task,
rh_action->id, rh_action_task);
} else if(rh_rsc != NULL) {
crm_debug_4("Created ordering constraint %d (%s):"
" action %d (%s) before %s/%s",
order->id, ordering_type2text(order->type),
lh_action->id, lh_action_task,
rh_rsc->id, rh_action_task);
} else {
crm_debug_4("Created ordering constraint %d (%s):"
" action %d (%s) before action %d (%s)",
order->id, ordering_type2text(order->type),
lh_action->id, lh_action_task,
rh_action->id, rh_action_task);
}
return order->id;
}
gboolean
unpack_rsc_colocation(crm_data_t * xml_obj, pe_working_set_t *data_set)
{
int score_i = 0;
const char *id = crm_element_value(xml_obj, XML_ATTR_ID);
const char *id_rh = crm_element_value(xml_obj, XML_CONS_ATTR_TO);
const char *id_lh = crm_element_value(xml_obj, XML_CONS_ATTR_FROM);
const char *score = crm_element_value(xml_obj, XML_RULE_ATTR_SCORE);
const char *state_lh = crm_element_value(xml_obj, XML_RULE_ATTR_FROMSTATE);
const char *state_rh = crm_element_value(xml_obj, XML_RULE_ATTR_TOSTATE);
const char *attr = crm_element_value(xml_obj, "node_attribute");
const char *symmetrical = crm_element_value(xml_obj, XML_CONS_ATTR_SYMMETRICAL);
resource_t *rsc_lh = pe_find_resource(data_set->resources, id_lh);
resource_t *rsc_rh = pe_find_resource(data_set->resources, id_rh);
if(rsc_lh == NULL) {
crm_config_err("No resource (con=%s, rsc=%s)", id, id_lh);
return FALSE;
} else if(rsc_rh == NULL) {
crm_config_err("No resource (con=%s, rsc=%s)", id, id_rh);
return FALSE;
}
if(score) {
score_i = char2score(score);
}
rsc_colocation_new(
id, attr, score_i, rsc_lh, rsc_rh, state_lh, state_rh);
if(crm_is_true(symmetrical)) {
rsc_colocation_new(
id, attr, score_i, rsc_rh, rsc_lh, state_rh, state_lh);
}
return TRUE;
}
gboolean is_active(rsc_to_node_t *cons)
{
return TRUE;
}
diff --git a/crm/pengine/regression.sh b/crm/pengine/regression.sh
index 64b78a6ba0..7fdb900ddf 100755
--- a/crm/pengine/regression.sh
+++ b/crm/pengine/regression.sh
@@ -1,252 +1,253 @@
#!/bin/bash
# Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
#
# 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...
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) "
#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"
#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"
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"
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"
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 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 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"
echo ""
test_results
diff --git a/crm/pengine/testcases/bug-1685.dot b/crm/pengine/testcases/bug-1685.dot
new file mode 100644
index 0000000000..f4bd823f79
--- /dev/null
+++ b/crm/pengine/testcases/bug-1685.dot
@@ -0,0 +1,33 @@
+digraph "g" {
+"prim_shared_storage:0_post_notify_promote_0 redun2" -> "shared_storage_confirmed-post_notify_promote_0" [ style = bold]
+"prim_shared_storage:0_post_notify_promote_0 redun2" [ style=bold color="green" fontcolor="black" ]
+"prim_shared_storage:0_pre_notify_promote_0 redun2" -> "shared_storage_confirmed-pre_notify_promote_0" [ style = bold]
+"prim_shared_storage:0_pre_notify_promote_0 redun2" [ style=bold color="green" fontcolor="black" ]
+"prim_shared_storage:0_promote_0 redun2" -> "shared_storage_promoted_0" [ style = bold]
+"prim_shared_storage:0_promote_0 redun2" [ style=bold color="green" fontcolor="black" ]
+"prim_shared_storage:1_monitor_120000 redun1" [ style=bold color="green" fontcolor="black" ]
+"prim_shared_storage:1_post_notify_promote_0 redun1" -> "shared_storage_confirmed-post_notify_promote_0" [ style = bold]
+"prim_shared_storage:1_post_notify_promote_0 redun1" [ style=bold color="green" fontcolor="black" ]
+"prim_shared_storage:1_pre_notify_promote_0 redun1" -> "shared_storage_confirmed-pre_notify_promote_0" [ style = bold]
+"prim_shared_storage:1_pre_notify_promote_0 redun1" [ style=bold color="green" fontcolor="black" ]
+"shared_filesystem_monitor_120000 redun2" [ style=bold color="green" fontcolor="black" ]
+"shared_filesystem_start_0 redun2" -> "shared_filesystem_monitor_120000 redun2" [ style = bold]
+"shared_filesystem_start_0 redun2" [ style=bold color="green" fontcolor="black" ]
+"shared_storage_confirmed-post_notify_promote_0" -> "prim_shared_storage:1_monitor_120000 redun1" [ style = bold]
+"shared_storage_confirmed-post_notify_promote_0" -> "shared_filesystem_start_0 redun2" [ style = bold]
+"shared_storage_confirmed-post_notify_promote_0" [ style=bold color="green" fontcolor="orange" ]
+"shared_storage_confirmed-pre_notify_promote_0" -> "shared_storage_promote_0" [ style = bold]
+"shared_storage_confirmed-pre_notify_promote_0" [ style=bold color="green" fontcolor="orange" ]
+"shared_storage_post_notify_promote_0" -> "prim_shared_storage:0_post_notify_promote_0 redun2" [ style = bold]
+"shared_storage_post_notify_promote_0" -> "prim_shared_storage:1_post_notify_promote_0 redun1" [ style = bold]
+"shared_storage_post_notify_promote_0" -> "shared_storage_confirmed-post_notify_promote_0" [ style = bold]
+"shared_storage_post_notify_promote_0" [ style=bold color="green" fontcolor="orange" ]
+"shared_storage_pre_notify_promote_0" -> "prim_shared_storage:0_pre_notify_promote_0 redun2" [ style = bold]
+"shared_storage_pre_notify_promote_0" -> "prim_shared_storage:1_pre_notify_promote_0 redun1" [ style = bold]
+"shared_storage_pre_notify_promote_0" -> "shared_storage_confirmed-pre_notify_promote_0" [ style = bold]
+"shared_storage_pre_notify_promote_0" [ style=bold color="green" fontcolor="orange" ]
+"shared_storage_promote_0" -> "prim_shared_storage:0_promote_0 redun2" [ style = bold]
+"shared_storage_promote_0" [ style=bold color="green" fontcolor="orange" ]
+"shared_storage_promoted_0" -> "shared_storage_post_notify_promote_0" [ style = bold]
+"shared_storage_promoted_0" [ style=bold color="green" fontcolor="orange" ]
+}
diff --git a/crm/pengine/testcases/bug-1685.exp b/crm/pengine/testcases/bug-1685.exp
new file mode 100644
index 0000000000..31be7ed650
--- /dev/null
+++ b/crm/pengine/testcases/bug-1685.exp
@@ -0,0 +1,187 @@
+ <transition_graph cluster-delay="60s" transition_id="0">
+ <synapse id="0" priority="75">
+ <action_set>
+ <rsc_op id="7" operation="promote" operation_key="prim_shared_storage:0_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <primitive id="prim_shared_storage:0" long-id="shared_storage:prim_shared_storage:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" CRM_meta_role="Master" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_notify_slave_uname="redun1 " CRM_meta_timeout="20000" CRM_meta_notify_promote_resource="prim_shared_storage:0 " CRM_meta_notify_promote_uname="redun2 " CRM_meta_notify_slave_resource="prim_shared_storage:1 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="23" operation="promote" operation_key="shared_storage_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="1" priority="75">
+ <action_set>
+ <rsc_op id="46" operation="notify" operation_key="prim_shared_storage:0_pre_notify_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <primitive id="prim_shared_storage:0" long-id="shared_storage:prim_shared_storage:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" CRM_meta_notify_operation="promote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" CRM_meta_role="Master" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_notify_slave_uname="redun1 " CRM_meta_notify_promote_resource="prim_shared_storage:0 " CRM_meta_notify_promote_uname="redun2 " CRM_meta_notify_slave_resource="prim_shared_storage:1 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="25" operation="notify" operation_key="shared_storage_pre_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="2" priority="1000000">
+ <action_set>
+ <rsc_op id="47" operation="notify" operation_key="prim_shared_storage:0_post_notify_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <primitive id="prim_shared_storage:0" long-id="shared_storage:prim_shared_storage:0" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" CRM_meta_notify_operation="promote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" CRM_meta_role="Master" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_notify_slave_uname="redun1 " CRM_meta_notify_promote_resource="prim_shared_storage:0 " CRM_meta_notify_promote_uname="redun2 " CRM_meta_notify_slave_resource="prim_shared_storage:1 " CRM_meta_globally_unique="false" CRM_meta_clone="0" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="27" operation="notify" operation_key="shared_storage_post_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="3">
+ <action_set>
+ <rsc_op id="10" operation="monitor" operation_key="prim_shared_storage:1_monitor_120000" on_node="redun1" on_node_uuid="cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <primitive id="prim_shared_storage:1" long-id="shared_storage:prim_shared_storage:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_id="shared_storage_op_monitor" CRM_meta_timeout="60000" CRM_meta_name="monitor" CRM_meta_interval="120000" CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="28" operation="notified" operation_key="shared_storage_confirmed-post_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="4">
+ <action_set>
+ <rsc_op id="54" operation="notify" operation_key="prim_shared_storage:1_pre_notify_promote_0" on_node="redun1" on_node_uuid="cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <primitive id="prim_shared_storage:1" long-id="shared_storage:prim_shared_storage:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" CRM_meta_notify_operation="promote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_notify_slave_uname="redun1 " CRM_meta_notify_promote_resource="prim_shared_storage:0 " CRM_meta_notify_promote_uname="redun2 " CRM_meta_notify_slave_resource="prim_shared_storage:1 " CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="25" operation="notify" operation_key="shared_storage_pre_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="5" priority="1000000">
+ <action_set>
+ <rsc_op id="55" operation="notify" operation_key="prim_shared_storage:1_post_notify_promote_0" on_node="redun1" on_node_uuid="cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <primitive id="prim_shared_storage:1" long-id="shared_storage:prim_shared_storage:1" class="ocf" provider="heartbeat" type="drbd"/>
+ <attributes crm_feature_set="2.0" CRM_meta_notify_operation="promote" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" drbd_resource="sip-shared" CRM_meta_stateful="true" CRM_meta_notify_slave_uname="redun1 " CRM_meta_notify_promote_resource="prim_shared_storage:0 " CRM_meta_notify_promote_uname="redun2 " CRM_meta_notify_slave_resource="prim_shared_storage:1 " CRM_meta_globally_unique="false" CRM_meta_clone="1" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="27" operation="notify" operation_key="shared_storage_post_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="6">
+ <action_set>
+ <pseudo_event id="23" operation="promote" operation_key="shared_storage_promote_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="26" operation="notified" operation_key="shared_storage_confirmed-pre_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="7" priority="1000000">
+ <action_set>
+ <pseudo_event id="24" operation="promoted" operation_key="shared_storage_promoted_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="7" operation="promote" operation_key="prim_shared_storage:0_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="8">
+ <action_set>
+ <pseudo_event id="25" operation="notify" operation_key="shared_storage_pre_notify_promote_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="pre" CRM_meta_notify_operation="promote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs/>
+ </synapse>
+ <synapse id="9">
+ <action_set>
+ <pseudo_event id="26" operation="notified" operation_key="shared_storage_confirmed-pre_notify_promote_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="promote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="25" operation="notify" operation_key="shared_storage_pre_notify_promote_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="46" operation="notify" operation_key="prim_shared_storage:0_pre_notify_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="54" operation="notify" operation_key="prim_shared_storage:1_pre_notify_promote_0" on_node="redun1" on_node_uuid="cd34ed93-fa5d-4092-a618-ac6349351d13"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="10" priority="1000000">
+ <action_set>
+ <pseudo_event id="27" operation="notify" operation_key="shared_storage_post_notify_promote_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_confirm="yes" CRM_meta_notify_type="post" CRM_meta_notify_operation="promote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="24" operation="promoted" operation_key="shared_storage_promoted_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="11" priority="1000000">
+ <action_set>
+ <pseudo_event id="28" operation="notified" operation_key="shared_storage_confirmed-post_notify_promote_0">
+ <attributes crm_feature_set="2.0" CRM_meta_stateful="true" CRM_meta_timeout="20000" CRM_meta_notify_type="pre" CRM_meta_notify_operation="promote" CRM_meta_globally_unique="false" CRM_meta_clone_max="2" CRM_meta_clone_node_max="1" CRM_meta_master_max="1" CRM_meta_master_node_max="1"/>
+ </pseudo_event>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="27" operation="notify" operation_key="shared_storage_post_notify_promote_0"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="47" operation="notify" operation_key="prim_shared_storage:0_post_notify_promote_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1"/>
+ </trigger>
+ <trigger>
+ <rsc_op id="55" operation="notify" operation_key="prim_shared_storage:1_post_notify_promote_0" on_node="redun1" on_node_uuid="cd34ed93-fa5d-4092-a618-ac6349351d13"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="12">
+ <action_set>
+ <rsc_op id="35" operation="start" operation_key="shared_filesystem_start_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <primitive id="shared_filesystem" long-id="shared_filesystem" class="ocf" provider="heartbeat" type="Filesystem"/>
+ <attributes crm_feature_set="2.0" directory="/shared" fstype="reiserfs" device="/dev/drbd0" CRM_meta_timeout="20000"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <pseudo_event id="28" operation="notified" operation_key="shared_storage_confirmed-post_notify_promote_0"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ <synapse id="13">
+ <action_set>
+ <rsc_op id="36" operation="monitor" operation_key="shared_filesystem_monitor_120000" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <primitive id="shared_filesystem" long-id="shared_filesystem" class="ocf" provider="heartbeat" type="Filesystem"/>
+ <attributes crm_feature_set="2.0" directory="/shared" fstype="reiserfs" device="/dev/drbd0" CRM_meta_id="shared_filesystem_op_monitor" CRM_meta_timeout="60000" CRM_meta_name="monitor" CRM_meta_interval="120000"/>
+ </rsc_op>
+ </action_set>
+ <inputs>
+ <trigger>
+ <rsc_op id="35" operation="start" operation_key="shared_filesystem_start_0" on_node="redun2" on_node_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1"/>
+ </trigger>
+ </inputs>
+ </synapse>
+ </transition_graph>
+
diff --git a/crm/pengine/testcases/bug-1685.xml b/crm/pengine/testcases/bug-1685.xml
new file mode 100644
index 0000000000..9d0a709861
--- /dev/null
+++ b/crm/pengine/testcases/bug-1685.xml
@@ -0,0 +1,127 @@
+ <cib generated="true" admin_epoch="0" have_quorum="true" ignore_dtd="false" num_peers="2" cib_feature_revision="1.3" epoch="13" num_updates="24" cib-last-written="Tue Aug 14 10:11:13 2007" ccm_transition="2" dc_uuid="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <configuration>
+ <crm_config>
+ <cluster_property_set id="cib-bootstrap-options">
+ <attributes>
+ <nvpair id="cib-bootstrap-options-short-resource-names" name="short-resource-names" value="true"/>
+ <nvpair id="cib-bootstrap-options-startup-fencing" name="startup-fencing" value="true"/>
+ <nvpair id="cib-bootstrap-options-stonith-enabled" name="stonith-enabled" value="false"/>
+ <nvpair id="cib-bootstrap-options-symmetric-cluster" name="symmetric-cluster" value="true"/>
+ <nvpair id="cib-bootstrap-options-stop-orphan-actions" name="stop-orphan-actions" value="true"/>
+ <nvpair id="cib-bootstrap-options-stonith-action" name="stonith-action" value="reboot"/>
+ <nvpair id="cib-bootstrap-options-is-managed-default" name="is-managed-default" value="true"/>
+ <nvpair id="cib-bootstrap-options-stop-orphan-resources" name="stop-orphan-resources" value="true"/>
+ <nvpair id="cib-bootstrap-options-no-quorum-policy" name="no-quorum-policy" value="stop"/>
+ <nvpair id="cib-bootstrap-options-default-resource-failure-stickiness" name="default-resource-failure-stickiness" value="-100"/>
+ <nvpair id="cib-bootstrap-options-probe_complete" name="probe_complete" value="true"/>
+ <nvpair id="cib-bootstrap-options-transition-idle-timeout" name="transition-idle-timeout" value="60s"/>
+ <nvpair id="cib-bootstrap-options-default-resource-stickiness" name="default-resource-stickiness" value="800"/>
+ </attributes>
+ </cluster_property_set>
+ </crm_config>
+ <nodes>
+ <node id="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1" uname="redun2" type="normal"/>
+ <node id="cd34ed93-fa5d-4092-a618-ac6349351d13" uname="redun1" type="normal"/>
+ </nodes>
+ <resources>
+ <master_slave id="shared_storage">
+ <meta_attributes id="ma_shared_storage">
+ <attributes>
+ <nvpair id="shared_storage_ma_master_node_max" name="master_node_max" value="1"/>
+ <nvpair id="shared_storage_ma_master_max" name="master_max" value="1"/>
+ <nvpair id="shared_storage_ma_notify" name="notify" value="yes"/>
+ <nvpair id="shared_storage_ma_clone_max" name="clone_max" value="2"/>
+ <nvpair id="shared_storage_ma_clone_node_max" name="clone_node_max" value="1"/>
+ <nvpair id="shared_storage_ma_globally_unique" name="globally_unique" value="false"/>
+ </attributes>
+ </meta_attributes>
+ <primitive class="ocf" id="prim_shared_storage" provider="heartbeat" type="drbd">
+ <operations>
+ <op id="shared_storage_op_monitor" interval="120s" name="monitor" timeout="60s"/>
+ </operations>
+ <instance_attributes id="ias_prim_shared_storage">
+ <attributes>
+ <nvpair id="shared_storage_attr_drbd_resource" name="drbd_resource" value="sip-shared"/>
+ </attributes>
+ </instance_attributes>
+ </primitive>
+ </master_slave>
+ <primitive class="ocf" id="shared_filesystem" provider="heartbeat" type="Filesystem">
+ <operations>
+ <op id="shared_filesystem_op_monitor" interval="120s" name="monitor" timeout="60s"/>
+ </operations>
+ <instance_attributes id="ias_shared_filesystem">
+ <attributes>
+ <nvpair id="shared_filesystem_attr_device" name="device" value="/dev/drbd0"/>
+ <nvpair id="shared_filesystem_attr_directory" name="directory" value="/shared"/>
+ <nvpair id="shared_filesystem_attr_fstype" name="fstype" value="reiserfs"/>
+ </attributes>
+ </instance_attributes>
+ </primitive>
+ </resources>
+ <constraints>
+ <rsc_colocation from="shared_filesystem" id="colocation_shared_filesystem_shared_storage:master" score="INFINITY" to="shared_storage" to_role="master"/>
+ <rsc_order from="shared_filesystem" id="order_shared_filesystem_after_shared_storage:promote" to="shared_storage" to_action="promote" score="INFINITY"/>
+ </constraints>
+ </configuration>
+ <status>
+ <node_state id="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1" uname="redun2" crmd="online" crm-debug-origin="do_update_resource" shutdown="0" in_ccm="true" ha="active" join="member" expected="member">
+ <lrm id="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <lrm_resources>
+ <lrm_resource id="prim_shared_storage:0" type="drbd" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="prim_shared_storage:0_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="3:0:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;3:0:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="2" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ <lrm_rsc_op id="prim_shared_storage:0_start_0" operation="start" crm-debug-origin="do_update_resource" transition_key="4:2:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:0;4:2:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="5" crm_feature_set="1.0.9" rc_code="0" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ <lrm_rsc_op id="prim_shared_storage:0_post_notify_start_0" operation="notify" crm-debug-origin="do_update_resource" transition_key="39:2:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:0;39:2:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="6" crm_feature_set="1.0.9" rc_code="0" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ </lrm_resource>
+ <lrm_resource id="shared_filesystem" type="Filesystem" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="shared_filesystem_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="4:0:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;4:0:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="3" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="5858fd8b1fcc9107c71c24186f95f937"/>
+ </lrm_resource>
+ <lrm_resource id="prim_shared_storage:1" type="drbd" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="prim_shared_storage:1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="3:1:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;3:1:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="4" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <instance_attributes id="status-1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <attributes>
+ <nvpair id="status-1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1-probe_complete" name="probe_complete" value="true"/>
+ </attributes>
+ </instance_attributes>
+ <instance_attributes id="master-1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1">
+ <attributes>
+ <nvpair id="status-master-prim_shared_storage:0-1f7cf7cc-7d90-43fb-a7bd-f13fb5c203c1" name="master-prim_shared_storage:0" value="75"/>
+ </attributes>
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ <node_state id="cd34ed93-fa5d-4092-a618-ac6349351d13" uname="redun1" crmd="online" crm-debug-origin="do_update_resource" shutdown="0" in_ccm="true" ha="active" join="member" expected="member">
+ <lrm id="cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <lrm_resources>
+ <lrm_resource id="prim_shared_storage:0" type="drbd" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="prim_shared_storage:0_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="6:0:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;6:0:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="2" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ </lrm_resource>
+ <lrm_resource id="shared_filesystem" type="Filesystem" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="shared_filesystem_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="7:0:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;7:0:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="3" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="5858fd8b1fcc9107c71c24186f95f937"/>
+ </lrm_resource>
+ <lrm_resource id="prim_shared_storage:1" type="drbd" class="ocf" provider="heartbeat">
+ <lrm_rsc_op id="prim_shared_storage:1_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" transition_key="5:1:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:7;5:1:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="4" crm_feature_set="1.0.9" rc_code="7" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ <lrm_rsc_op id="prim_shared_storage:1_start_0" operation="start" crm-debug-origin="do_update_resource" transition_key="6:2:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:0;6:2:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="5" crm_feature_set="1.0.9" rc_code="0" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ <lrm_rsc_op id="prim_shared_storage:1_post_notify_start_0" operation="notify" crm-debug-origin="do_update_resource" transition_key="42:2:65315fa6-aeaf-48f4-88b1-441ca298582a" transition_magic="0:0;42:2:65315fa6-aeaf-48f4-88b1-441ca298582a" call_id="6" crm_feature_set="1.0.9" rc_code="0" op_status="0" interval="0" op_digest="f05e197b6b37f94c2a3977cc41e66556"/>
+ </lrm_resource>
+ </lrm_resources>
+ </lrm>
+ <transient_attributes id="cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <instance_attributes id="status-cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <attributes>
+ <nvpair id="status-cd34ed93-fa5d-4092-a618-ac6349351d13-probe_complete" name="probe_complete" value="true"/>
+ </attributes>
+ </instance_attributes>
+ <instance_attributes id="master-cd34ed93-fa5d-4092-a618-ac6349351d13">
+ <attributes>
+ <nvpair id="status-master-prim_shared_storage:1-cd34ed93-fa5d-4092-a618-ac6349351d13" name="master-prim_shared_storage:1" value="75"/>
+ </attributes>
+ </instance_attributes>
+ </transient_attributes>
+ </node_state>
+ </status>
+ </cib>

File Metadata

Mime Type
text/x-diff
Expires
Thu, Jul 10, 1:45 AM (1 d, 4 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2009573
Default Alt Text
(75 KB)

Event Timeline