From f296fea9e3d20bc5fd3e58725e5d536dff947ea8 Mon Sep 17 00:00:00 2001 From: Andrew Beekhof Date: Tue, 21 Mar 2017 14:44:56 +1100 Subject: [PATCH 1/2] PE: Restore ABI compatibility with pre-container code --- fencing/main.c | 2 +- include/crm/pengine/complex.h | 6 +++--- lib/pengine/clone.c | 2 +- lib/pengine/complex.c | 29 +++++++++++++++-------------- lib/pengine/unpack.c | 6 +++--- pengine/allocate.c | 32 ++++++++++++++++---------------- pengine/clone.c | 6 +++--- pengine/constraints.c | 14 +++++++------- pengine/graph.c | 4 ++-- pengine/native.c | 4 ++-- pengine/utilization.c | 13 ++++--------- tools/crm_resource_runtime.c | 21 ++++++++++----------- 12 files changed, 67 insertions(+), 72 deletions(-) diff --git a/fencing/main.c b/fencing/main.c index e6eb087..437c31f 100644 --- a/fencing/main.c +++ b/fencing/main.c @@ -620,7 +620,7 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set) GListPtr gIter = NULL; for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { cib_device_update(gIter->data, data_set); - if(rsc->variant == pe_clone || rsc->variant == pe_master) { + if(pe_rsc_is_clone(rsc)) { crm_trace("Only processing one copy of the clone %s", rsc->id); break; } diff --git a/include/crm/pengine/complex.h b/include/crm/pengine/complex.h index 92829f9..664d576 100644 --- a/include/crm/pengine/complex.h +++ b/include/crm/pengine/complex.h @@ -31,9 +31,9 @@ enum pe_obj_types { pe_unknown = -1, pe_native = 0, pe_group = 1, - pe_container = 2, - pe_clone = 3, - pe_master = 4 + pe_clone = 2, + pe_master = 3, + pe_container = 4, }; enum pe_obj_types get_resource_type(const char *name); diff --git a/lib/pengine/clone.c b/lib/pengine/clone.c index 6604a29..6652e59 100644 --- a/lib/pengine/clone.c +++ b/lib/pengine/clone.c @@ -47,7 +47,7 @@ mark_as_orphan(resource_t * rsc) void force_non_unique_clone(resource_t * rsc, const char *rid, pe_working_set_t * data_set) { - if (rsc->variant == pe_clone || rsc->variant == pe_master) { + if (pe_rsc_is_clone(rsc)) { clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c index adc8abc..c4823f4 100644 --- a/lib/pengine/complex.c +++ b/lib/pengine/complex.c @@ -46,16 +46,6 @@ resource_object_functions_t resource_class_functions[] = { group_free }, { - container_unpack, - native_find_rsc, - native_parameter, - container_print, - container_active, - container_resource_state, - native_location, - container_free - }, - { clone_unpack, native_find_rsc, native_parameter, @@ -73,7 +63,18 @@ resource_object_functions_t resource_class_functions[] = { clone_active, clone_resource_state, native_location, - clone_free} + clone_free + }, + { + container_unpack, + native_find_rsc, + native_parameter, + container_print, + container_active, + container_resource_state, + native_location, + container_free + } }; enum pe_obj_types @@ -404,7 +405,7 @@ handle_rsc_isolation(resource_t *rsc) * at the clone level. this is really the only sane thing to do in this situation. * This allows someone to clone an isolated resource without having to shuffle * around the isolation attributes to the clone parent */ - if (top == rsc->parent && top->variant >= pe_clone) { + if (top == rsc->parent && pe_rsc_is_clone(top)) { iso = top; } @@ -414,7 +415,7 @@ handle_rsc_isolation(resource_t *rsc) set_rsc_opts: clear_bit(rsc->flags, pe_rsc_allow_migrate); set_bit(rsc->flags, pe_rsc_unique); - if (top->variant >= pe_clone) { + if (pe_rsc_is_clone(top)) { add_hash_param(rsc->meta, XML_RSC_ATTR_UNIQUE, XML_BOOLEAN_TRUE); } } @@ -591,7 +592,7 @@ common_unpack(xmlNode * xml_obj, resource_t ** rsc, top = uber_parent(*rsc); value = g_hash_table_lookup((*rsc)->meta, XML_RSC_ATTR_UNIQUE); - if (crm_is_true(value) || top->variant < pe_clone) { + if (crm_is_true(value) || pe_rsc_is_clone(top) == FALSE) { set_bit((*rsc)->flags, pe_rsc_unique); } diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c index 717c23b..2f03493 100644 --- a/lib/pengine/unpack.c +++ b/lib/pengine/unpack.c @@ -1692,7 +1692,7 @@ find_anonymous_clone(pe_working_set_t * data_set, node_t * node, resource_t * pa gboolean skip_inactive = FALSE; CRM_ASSERT(parent != NULL); - CRM_ASSERT(parent->variant == pe_clone || parent->variant == pe_master); + CRM_ASSERT(pe_rsc_is_clone(parent)); CRM_ASSERT(is_not_set(parent->flags, pe_rsc_unique)); /* Find an instance active (or partially active for grouped clones) on the specified node */ @@ -1815,7 +1815,7 @@ unpack_find_resource(pe_working_set_t * data_set, node_t * node, const char *rsc if(parent && parent->parent) { rsc = find_container_child(rsc_id, rsc, node); - } else if (parent && parent->variant >= pe_clone) { + } else if (pe_rsc_is_clone(parent)) { if (is_not_set(parent->flags, pe_rsc_unique)) { char *base = clone_strip(rsc_id); @@ -2721,7 +2721,7 @@ unpack_rsc_op_failure(resource_t * rsc, node_t * node, int rc, xmlNode * xml_op, if (fail_rsc->parent) { resource_t *parent = uber_parent(fail_rsc); - if ((parent->variant == pe_clone || parent->variant == pe_master) + if (pe_rsc_is_clone(parent) && is_not_set(parent->flags, pe_rsc_unique)) { /* for clone and master resources, if a child fails on an operation * with on-fail = stop, all the resources fail. Do this by preventing diff --git a/pengine/allocate.c b/pengine/allocate.c index bfc2471..3314d77 100644 --- a/pengine/allocate.c +++ b/pengine/allocate.c @@ -69,20 +69,6 @@ resource_alloc_functions_t resource_class_alloc_functions[] = { group_append_meta, }, { - container_merge_weights, - container_color, - container_create_actions, - container_create_probe, - container_internal_constraints, - container_rsc_colocation_lh, - container_rsc_colocation_rh, - container_rsc_location, - container_action_flags, - container_update_actions, - container_expand, - container_append_meta, - }, - { clone_merge_weights, clone_color, clone_create_actions, @@ -109,6 +95,20 @@ resource_alloc_functions_t resource_class_alloc_functions[] = { clone_update_actions, clone_expand, master_append_meta, + }, + { + container_merge_weights, + container_color, + container_create_actions, + container_create_probe, + container_internal_constraints, + container_rsc_colocation_lh, + container_rsc_colocation_rh, + container_rsc_location, + container_action_flags, + container_update_actions, + container_expand, + container_append_meta, } }; @@ -389,7 +389,7 @@ check_actions_for(xmlNode * rsc_entry, resource_t * rsc, node_t * node, pe_worki if (is_set(rsc->flags, pe_rsc_orphan)) { resource_t *parent = uber_parent(rsc); if(parent == NULL - || parent->variant < pe_clone + || pe_rsc_is_clone(parent) == FALSE || is_set(parent->flags, pe_rsc_unique)) { pe_rsc_trace(rsc, "Skipping param check for %s and deleting: orphan", rsc->id); DeleteRsc(rsc, node, FALSE, data_set); @@ -2022,7 +2022,7 @@ order_probes(pe_working_set_t * data_set) crm_trace("Same parent %s for %s", first_rsc->id, start->uuid); continue; - } else if(FALSE && uber_parent(first_rsc)->variant < pe_clone) { + } else if(FALSE && pe_rsc_is_clone(uber_parent(first_rsc)) == FALSE) { crm_trace("Not a clone %s for %s", first_rsc->id, start->uuid); continue; } diff --git a/pengine/clone.c b/pengine/clone.c index 9e2835d..2b332b1 100644 --- a/pengine/clone.c +++ b/pengine/clone.c @@ -1071,7 +1071,7 @@ clone_rsc_colocation_rh(resource_t * rsc_lh, resource_t * rsc_rh, rsc_colocation pe_rsc_trace(rsc_rh, "Processing constraint %s: %s -> %s %d", constraint->id, rsc_lh->id, rsc_rh->id, constraint->score); - if (constraint->rsc_lh->variant >= pe_clone) { + if (pe_rsc_is_clone(constraint->rsc_lh)) { get_clone_variant_data(clone_data_lh, constraint->rsc_lh); if (clone_data_lh->interleave @@ -1339,8 +1339,8 @@ clone_update_actions(action_t * first, action_t * then, node_t * node, enum pe_a enum pe_graph_flags changed = pe_graph_none; if (first->rsc != then->rsc - && first->rsc && first->rsc->variant >= pe_clone - && then->rsc && then->rsc->variant >= pe_clone) { + && pe_rsc_is_clone(first->rsc) + && pe_rsc_is_clone(then->rsc)) { clone_variant_data_t *clone_data = NULL; if (crm_ends_with(then->uuid, "_stop_0") diff --git a/pengine/constraints.c b/pengine/constraints.c index 92b9dd0..501cb57 100644 --- a/pengine/constraints.c +++ b/pengine/constraints.c @@ -316,13 +316,13 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) crm_config_err("Constraint %s: no resource found for name '%s'", id, id_first); return FALSE; - } else if (instance_then && rsc_then->variant < pe_clone) { + } else if (instance_then && pe_rsc_is_clone(rsc_then) == FALSE) { crm_config_err("Invalid constraint '%s':" " Resource '%s' is not a clone but instance %s was requested", id, id_then, instance_then); return FALSE; - } else if (instance_first && rsc_first->variant < pe_clone) { + } else if (instance_first && pe_rsc_is_clone(rsc_first) == FALSE) { crm_config_err("Invalid constraint '%s':" " Resource '%s' is not a clone but instance %s was requested", id, id_first, instance_first); @@ -350,11 +350,11 @@ unpack_simple_rsc_order(xmlNode * xml_obj, pe_working_set_t * data_set) require_all_s = crm_element_value(xml_obj, "require-all"); if (require_all_s && crm_is_true(require_all_s) == FALSE - && rsc_first->variant >= pe_clone) { + && pe_rsc_is_clone(rsc_first)) { /* require-all=false means only one instance of the clone is required */ min_required_before = 1; - } else if (rsc_first->variant >= pe_clone) { + } else if (pe_rsc_is_clone(rsc_first)) { const char *min_clones_s = g_hash_table_lookup(rsc_first->meta, XML_RSC_ATTR_INCARNATION_MIN); if (min_clones_s) { /* if clone min is set, we require at a minimum X number of instances @@ -2343,13 +2343,13 @@ unpack_simple_colocation(xmlNode * xml_obj, pe_working_set_t * data_set) crm_config_err("Invalid constraint '%s': No resource named '%s'", id, id_rh); return FALSE; - } else if (instance_lh && rsc_lh->variant < pe_clone) { + } else if (instance_lh && pe_rsc_is_clone(rsc_lh) == FALSE) { crm_config_err ("Invalid constraint '%s': Resource '%s' is not a clone but instance %s was requested", id, id_lh, instance_lh); return FALSE; - } else if (instance_rh && rsc_rh->variant < pe_clone) { + } else if (instance_rh && pe_rsc_is_clone(rsc_rh) == FALSE) { crm_config_err ("Invalid constraint '%s': Resource '%s' is not a clone but instance %s was requested", id, id_rh, instance_rh); @@ -2721,7 +2721,7 @@ unpack_simple_rsc_ticket(xmlNode * xml_obj, pe_working_set_t * data_set) crm_config_err("Invalid constraint '%s': No resource named '%s'", id, id_lh); return FALSE; - } else if (instance_lh && rsc_lh->variant < pe_clone) { + } else if (instance_lh && pe_rsc_is_clone(rsc_lh) == FALSE) { crm_config_err ("Invalid constraint '%s': Resource '%s' is not a clone but instance %s was requested", id, id_lh, instance_lh); diff --git a/pengine/graph.c b/pengine/graph.c index 07fc60a..2dba08e 100644 --- a/pengine/graph.c +++ b/pengine/graph.c @@ -40,7 +40,7 @@ get_action_flags(action_t * action, node_t * node) if (action->rsc) { flags = action->rsc->cmds->action_flags(action, NULL); - if (action->rsc->variant >= pe_clone && node) { + if (pe_rsc_is_clone(action->rsc) && node) { /* We only care about activity on $node */ enum pe_action_flags clone_flags = action->rsc->cmds->action_flags(action, node); @@ -1426,7 +1426,7 @@ check_dump_input(int last_action, action_t * action, action_wrapper_t * wrapper) && is_set(wrapper->action->rsc->flags, pe_rsc_failed) && is_not_set(wrapper->action->rsc->flags, pe_rsc_managed) && crm_ends_with(wrapper->action->uuid, "_stop_0") - && action->rsc && action->rsc->variant >= pe_clone) { + && action->rsc && pe_rsc_is_clone(action->rsc)) { crm_warn("Ignoring requirement that %s complete before %s:" " unmanaged failed resources cannot prevent clone shutdown", wrapper->action->uuid, action->uuid); diff --git a/pengine/native.c b/pengine/native.c index 4d91c00..d0cebb3 100644 --- a/pengine/native.c +++ b/pengine/native.c @@ -2827,7 +2827,7 @@ native_create_probe(resource_t * rsc, node_t * node, action_t * complete, if(is_set(rsc->flags, pe_rsc_fence_device) && is_set(data_set->flags, pe_flag_enable_unfencing)) { top = rsc; - } else if (top->variant < pe_clone) { + } else if (pe_rsc_is_clone(top) == FALSE) { top = rsc; } else { @@ -3221,7 +3221,7 @@ native_append_meta(resource_t * rsc, xmlNode * xml) /* instance name for isolated environment */ name = crm_meta_name(XML_RSC_ATTR_ISOLATION_INSTANCE); - if (iso_parent->variant >= pe_clone) { + if (pe_rsc_is_clone(iso_parent)) { /* if isolation is set at the clone/master level, we have to * give this resource the unique isolation instance associated * with the clone child (last_parent)*/ diff --git a/pengine/utilization.c b/pengine/utilization.c index e3996e2..5219fb8 100644 --- a/pengine/utilization.c +++ b/pengine/utilization.c @@ -201,8 +201,7 @@ add_unallocated_utilization(GHashTable * all_utilization, resource_t * rsc, orig_rsc->id, rsc->id); group_add_unallocated_utilization(all_utilization, rsc, all_rscs); - } else if (rsc->variant == pe_clone || - rsc->variant == pe_master) { + } else if (pe_rsc_is_clone(rsc)) { GListPtr gIter1 = NULL; gboolean existing = FALSE; @@ -317,7 +316,7 @@ find_colocated_rscs(GListPtr colocated_rscs, resource_t * rsc, resource_t * orig continue; } - if (rsc_lh->variant <= pe_group && rsc->variant >= pe_clone) { + if (pe_rsc_is_clone(rsc_lh) == FALSE && pe_rsc_is_clone(rsc)) { /* We do not know if rsc_lh will be colocated with orig_rsc in this case */ continue; } @@ -427,9 +426,7 @@ group_find_colocated_rscs(GListPtr colocated_rscs, resource_t * rsc, resource_t group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); - if (group_data->colocated || - (rsc->parent && - (rsc->parent->variant == pe_clone || rsc->parent->variant == pe_master))) { + if (group_data->colocated || pe_rsc_is_clone(rsc->parent)) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { @@ -456,9 +453,7 @@ group_add_unallocated_utilization(GHashTable * all_utilization, resource_t * rsc group_variant_data_t *group_data = NULL; get_group_variant_data(group_data, rsc); - if (group_data->colocated || - (rsc->parent && - (rsc->parent->variant == pe_clone || rsc->parent->variant == pe_master))) { + if (group_data->colocated || pe_rsc_is_clone(rsc->parent)) { GListPtr gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index 9c201a0..af96909 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -40,7 +40,7 @@ do_find_resource(const char *rsc, resource_t * the_rsc, pe_working_set_t * data_ } else { const char *state = ""; - if (the_rsc->variant < pe_clone && the_rsc->fns->state(the_rsc, TRUE) == RSC_ROLE_MASTER) { + if (!pe_rsc_is_clone(the_rsc) && the_rsc->fns->state(the_rsc, TRUE) == RSC_ROLE_MASTER) { state = "Master"; } fprintf(stdout, "resource %s is running on: %s %s\n", rsc, node->details->uname, state); @@ -71,7 +71,7 @@ cli_resource_search(const char *rsc, pe_working_set_t * data_set) return -ENXIO; } - if (the_rsc->variant >= pe_clone) { + if (pe_rsc_is_clone(the_rsc)) { GListPtr gIter = the_rsc->children; for (; gIter != NULL; gIter = gIter->next) { @@ -80,7 +80,7 @@ cli_resource_search(const char *rsc, pe_working_set_t * data_set) /* The anonymous clone children's common ID is supplied */ } else if ((parent = uber_parent(the_rsc)) != NULL - && parent->variant >= pe_clone + && pe_rsc_is_clone(parent) && is_not_set(the_rsc->flags, pe_rsc_unique) && the_rsc->clone_name && safe_str_eq(rsc, the_rsc->clone_name) @@ -618,8 +618,7 @@ cli_resource_delete(cib_t *cib_conn, crm_ipc_t *crmd_channel, const char *host_uname, resource_t *child = (resource_t *) lpc->data; rc = cli_resource_delete(cib_conn, crmd_channel, host_uname, child, data_set); - if(rc != pcmk_ok - || (rsc->variant >= pe_clone && is_not_set(rsc->flags, pe_rsc_unique))) { + if(rc != pcmk_ok || (pe_rsc_is_clone(rsc) && is_not_set(rsc->flags, pe_rsc_unique))) { return rc; } } @@ -711,7 +710,7 @@ cli_resource_check(cib_t * cib_conn, resource_t *rsc) printf("\n * The configuration specifies that '%s' should remain stopped\n", parent->id); need_nl++; - } else if(parent->variant > pe_clone && role == RSC_ROLE_SLAVE) { + } else if(parent->variant == pe_master && role == RSC_ROLE_SLAVE) { printf("\n * The configuration specifies that '%s' should not be promoted\n", parent->id); need_nl++; } @@ -1117,7 +1116,7 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * attr_set_type = XML_TAG_META_SETS; rsc_id = strdup(rsc->id); - if(rsc->variant >= pe_clone) { + if(pe_rsc_is_clone(rsc)) { is_clone = TRUE; } @@ -1489,7 +1488,7 @@ cli_resource_execute(const char *rsc_id, const char *rsc_action, GHashTable *ove || safe_str_eq(rsc_action, "force-promote")) { action = rsc_action+6; - if(rsc->variant >= pe_clone) { + if(pe_rsc_is_clone(rsc)) { rc = cli_resource_search(rsc_id, data_set); if(rc > 0 && do_force == FALSE) { CMD_ERR("It is not safe to %s %s here: the cluster claims it is already active", action, rsc_id); @@ -1499,7 +1498,7 @@ cli_resource_execute(const char *rsc_id, const char *rsc_action, GHashTable *ove } } - if(rsc->variant == pe_clone || rsc->variant == pe_master) { + if(pe_rsc_is_clone(rsc)) { /* Grab the first child resource in the hope it's not a group */ rsc = rsc->children->data; } @@ -1613,7 +1612,7 @@ cli_resource_move(const char *rsc_id, const char *host_name, cib_t * cib, pe_wor CMD_ERR("Resource '%s' not moved: not found", rsc_id); return -ENXIO; - } else if (scope_master && rsc->variant < pe_master) { + } else if (scope_master && rsc->variant != pe_master) { resource_t *p = uber_parent(rsc); if(p->variant == pe_master) { CMD_ERR("Using parent '%s' for --move command instead of '%s'.", rsc->id, rsc_id); @@ -1644,7 +1643,7 @@ cli_resource_move(const char *rsc_id, const char *host_name, cib_t * cib, pe_wor count = g_list_length(rsc->running_on); } - } else if (rsc->variant >= pe_clone) { + } else if (pe_rsc_is_clone(rsc)) { count = g_list_length(rsc->running_on); } else if (g_list_length(rsc->running_on) > 1) { -- 1.8.3.1 From 41e08386cb3671c19a5045b5a3084c9c8c4799c1 Mon Sep 17 00:00:00 2001 From: Andrew Beekhof Date: Tue, 21 Mar 2017 14:47:16 +1100 Subject: [PATCH 2/2] PE: Rename 'bucket' to 'bundle' for public consumption --- include/crm/msg_xml.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h index 7f8ee7e..7198fe5 100644 --- a/include/crm/msg_xml.h +++ b/include/crm/msg_xml.h @@ -186,7 +186,7 @@ # define XML_CIB_TAG_GROUP "group" # define XML_CIB_TAG_INCARNATION "clone" # define XML_CIB_TAG_MASTER "master" -# define XML_CIB_TAG_CONTAINER "bucket" +# define XML_CIB_TAG_CONTAINER "bundle" # define XML_CIB_TAG_RSC_TEMPLATE "template" -- 1.8.3.1