|
 |
3d71c6 |
From: "Gao,Yan" <ygao@suse.com>
|
|
 |
3d71c6 |
Date: Wed, 30 Sep 2015 16:59:43 +0200
|
|
 |
3d71c6 |
Subject: [PATCH] Fix: crm_resource: Correctly delete existing meta attributes
|
|
 |
3d71c6 |
regardless of their position in the heirarchy
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
Use the same logics as "--set-parameter" for "--delete-parameter".
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
(cherry picked from commit cdee10c7310ab433b006126bc087f6b8dff3843e)
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
Conflicts:
|
|
 |
3d71c6 |
tools/crm_resource_runtime.c
|
|
 |
3d71c6 |
---
|
|
 |
3d71c6 |
tools/crm_resource_runtime.c | 109 ++++++++++++++++++++++---------------------
|
|
 |
3d71c6 |
1 file changed, 55 insertions(+), 54 deletions(-)
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
|
|
 |
3d71c6 |
index 878fd0b..2d51e88 100644
|
|
 |
3d71c6 |
--- a/tools/crm_resource_runtime.c
|
|
 |
3d71c6 |
+++ b/tools/crm_resource_runtime.c
|
|
 |
3d71c6 |
@@ -190,47 +190,20 @@ find_resource_attr(cib_t * the_cib, const char *attr, const char *rsc, const cha
|
|
 |
3d71c6 |
return rc;
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
-int
|
|
 |
3d71c6 |
-cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const char *attr_id,
|
|
 |
3d71c6 |
- const char *attr_name, const char *attr_value, bool recursive,
|
|
 |
3d71c6 |
- cib_t * cib, pe_working_set_t * data_set)
|
|
 |
3d71c6 |
+static resource_t *
|
|
 |
3d71c6 |
+find_matching_attr_resource(resource_t * rsc, const char * rsc_id, const char * attr_set, const char * attr_id,
|
|
 |
3d71c6 |
+ const char * attr_name, cib_t * cib, const char * cmd)
|
|
 |
3d71c6 |
{
|
|
 |
3d71c6 |
int rc = pcmk_ok;
|
|
 |
3d71c6 |
- static bool need_init = TRUE;
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
char *lookup_id = NULL;
|
|
 |
3d71c6 |
char *local_attr_id = NULL;
|
|
 |
3d71c6 |
- char *local_attr_set = NULL;
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
- xmlNode *xml_top = NULL;
|
|
 |
3d71c6 |
- xmlNode *xml_obj = NULL;
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
- bool use_attributes_tag = FALSE;
|
|
 |
3d71c6 |
- resource_t *rsc = find_rsc_or_clone(rsc_id, data_set);
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
- if (rsc == NULL) {
|
|
 |
3d71c6 |
- return -ENXIO;
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
- if (safe_str_eq(attr_set_type, XML_TAG_ATTR_SETS)) {
|
|
 |
3d71c6 |
- if (do_force == FALSE) {
|
|
 |
3d71c6 |
- rc = find_resource_attr(cib, XML_ATTR_ID, uber_parent(rsc)->id,
|
|
 |
3d71c6 |
- XML_TAG_META_SETS, attr_set, attr_id,
|
|
 |
3d71c6 |
- attr_name, &local_attr_id);
|
|
 |
3d71c6 |
- if (rc == pcmk_ok && BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("WARNING: There is already a meta attribute for '%s' called '%s' (id=%s)\n",
|
|
 |
3d71c6 |
- uber_parent(rsc)->id, attr_name, local_attr_id);
|
|
 |
3d71c6 |
- printf(" Delete '%s' first or use --force to override\n", local_attr_id);
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
- return -ENOTUNIQ;
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
- } else if(rsc->parent && do_force == FALSE) {
|
|
 |
3d71c6 |
+ if(rsc->parent && do_force == FALSE) {
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
switch(rsc->parent->variant) {
|
|
 |
3d71c6 |
case pe_group:
|
|
 |
3d71c6 |
if (BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("Updating '%s' for '%s' will not apply to its peers in '%s'\n", attr_name, rsc_id, rsc->parent->id);
|
|
 |
3d71c6 |
+ printf("Performing %s of '%s' for '%s' will not apply to its peers in '%s'\n", cmd, attr_name, rsc_id, rsc->parent->id);
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
break;
|
|
 |
3d71c6 |
case pe_master:
|
|
 |
3d71c6 |
@@ -242,7 +215,7 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
|
|
 |
3d71c6 |
if(rc != pcmk_ok) {
|
|
 |
3d71c6 |
rsc = rsc->parent;
|
|
 |
3d71c6 |
if (BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("Updating '%s' on '%s', the parent of '%s'\n", attr_name, rsc->id, rsc_id);
|
|
 |
3d71c6 |
+ printf("Performing %s of '%s' on '%s', the parent of '%s'\n", cmd, attr_name, rsc->id, rsc_id);
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
break;
|
|
 |
3d71c6 |
@@ -251,7 +224,7 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
} else if (rsc->parent && BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("Forcing update of '%s' for '%s' instead of '%s'\n", attr_name, rsc_id, rsc->parent->id);
|
|
 |
3d71c6 |
+ printf("Forcing %s of '%s' for '%s' instead of '%s'\n", cmd, attr_name, rsc_id, rsc->parent->id);
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
} else if(rsc->parent == NULL && rsc->children) {
|
|
 |
3d71c6 |
resource_t *child = rsc->children->data;
|
|
 |
3d71c6 |
@@ -263,7 +236,7 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
|
|
 |
3d71c6 |
if(rc == pcmk_ok) {
|
|
 |
3d71c6 |
rsc = child;
|
|
 |
3d71c6 |
if (BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("A value for '%s' already exists in child '%s', updating that instead of '%s'\n", attr_name, lookup_id, rsc_id);
|
|
 |
3d71c6 |
+ printf("A value for '%s' already exists in child '%s', performing %s on that instead of '%s'\n", attr_name, lookup_id, cmd, rsc_id);
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
@@ -272,6 +245,51 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
+ return rsc;
|
|
 |
3d71c6 |
+}
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+int
|
|
 |
3d71c6 |
+cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const char *attr_id,
|
|
 |
3d71c6 |
+ const char *attr_name, const char *attr_value, bool recursive,
|
|
 |
3d71c6 |
+ cib_t * cib, pe_working_set_t * data_set)
|
|
 |
3d71c6 |
+{
|
|
 |
3d71c6 |
+ int rc = pcmk_ok;
|
|
 |
3d71c6 |
+ static bool need_init = TRUE;
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ char *lookup_id = NULL;
|
|
 |
3d71c6 |
+ char *local_attr_id = NULL;
|
|
 |
3d71c6 |
+ char *local_attr_set = NULL;
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ xmlNode *xml_top = NULL;
|
|
 |
3d71c6 |
+ xmlNode *xml_obj = NULL;
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ bool use_attributes_tag = FALSE;
|
|
 |
3d71c6 |
+ resource_t *rsc = find_rsc_or_clone(rsc_id, data_set);
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ if (rsc == NULL) {
|
|
 |
3d71c6 |
+ return -ENXIO;
|
|
 |
3d71c6 |
+ }
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ if (safe_str_eq(attr_set_type, XML_TAG_ATTR_SETS)) {
|
|
 |
3d71c6 |
+ if (do_force == FALSE) {
|
|
 |
3d71c6 |
+ rc = find_resource_attr(cib, XML_ATTR_ID, uber_parent(rsc)->id,
|
|
 |
3d71c6 |
+ XML_TAG_META_SETS, attr_set, attr_id,
|
|
 |
3d71c6 |
+ attr_name, &local_attr_id);
|
|
 |
3d71c6 |
+ if (rc == pcmk_ok && BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
+ printf("WARNING: There is already a meta attribute for '%s' called '%s' (id=%s)\n",
|
|
 |
3d71c6 |
+ uber_parent(rsc)->id, attr_name, local_attr_id);
|
|
 |
3d71c6 |
+ printf(" Delete '%s' first or use --force to override\n", local_attr_id);
|
|
 |
3d71c6 |
+ }
|
|
 |
3d71c6 |
+ free(local_attr_id);
|
|
 |
3d71c6 |
+ if (rc == pcmk_ok) {
|
|
 |
3d71c6 |
+ return -ENOTUNIQ;
|
|
 |
3d71c6 |
+ }
|
|
 |
3d71c6 |
+ }
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
+ } else {
|
|
 |
3d71c6 |
+ rsc = find_matching_attr_resource(rsc, rsc_id, attr_set, attr_id, attr_name, cib, "update");
|
|
 |
3d71c6 |
+ }
|
|
 |
3d71c6 |
+
|
|
 |
3d71c6 |
lookup_id = clone_strip(rsc->id); /* Could be a cloned group! */
|
|
 |
3d71c6 |
rc = find_resource_attr(cib, XML_ATTR_ID, lookup_id, attr_set_type, attr_set, attr_id, attr_name,
|
|
 |
3d71c6 |
&local_attr_id);
|
|
 |
3d71c6 |
@@ -401,25 +419,8 @@ cli_resource_delete_attribute(const char *rsc_id, const char *attr_set, const ch
|
|
 |
3d71c6 |
return -ENXIO;
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
- if(rsc->parent && safe_str_eq(attr_set_type, XML_TAG_META_SETS)) {
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
- switch(rsc->parent->variant) {
|
|
 |
3d71c6 |
- case pe_group:
|
|
 |
3d71c6 |
- if (BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("Removing '%s' for '%s' will not apply to its peers in '%s'\n", attr_name, rsc_id, rsc->parent->id);
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
- break;
|
|
 |
3d71c6 |
- case pe_master:
|
|
 |
3d71c6 |
- case pe_clone:
|
|
 |
3d71c6 |
- rsc = rsc->parent;
|
|
 |
3d71c6 |
- if (BE_QUIET == FALSE) {
|
|
 |
3d71c6 |
- printf("Removing '%s' from '%s' for '%s'...\n", attr_name, rsc->id, rsc_id);
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
- break;
|
|
 |
3d71c6 |
- default:
|
|
 |
3d71c6 |
- break;
|
|
 |
3d71c6 |
- }
|
|
 |
3d71c6 |
-
|
|
 |
3d71c6 |
+ if(safe_str_eq(attr_set_type, XML_TAG_META_SETS)) {
|
|
 |
3d71c6 |
+ rsc = find_matching_attr_resource(rsc, rsc_id, attr_set, attr_id, attr_name, cib, "delete");
|
|
 |
3d71c6 |
}
|
|
 |
3d71c6 |
|
|
 |
3d71c6 |
lookup_id = clone_strip(rsc->id);
|