Blame SOURCES/0035-Fix-crm_resource-Correctly-update-existing-meta-attr.patch

3d71c6
From: Andrew Beekhof <andrew@beekhof.net>
3d71c6
Date: Wed, 30 Sep 2015 17:33:00 +1000
3d71c6
Subject: [PATCH] Fix: crm_resource: Correctly update existing meta attributes
3d71c6
 regardless of their position in the heirarchy
3d71c6
3d71c6
(cherry picked from commit f367348c832c64e2dc480dc96d2e0c2aa88639ba)
3d71c6
3d71c6
Conflicts:
3d71c6
	tools/crm_resource_runtime.c
3d71c6
---
3d71c6
 tools/crm_resource_runtime.c | 44 ++++++++++++++++++++++++++++++++++++--------
3d71c6
 1 file changed, 36 insertions(+), 8 deletions(-)
3d71c6
3d71c6
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
3d71c6
index ce9db01..a04adb9 100644
3d71c6
--- a/tools/crm_resource_runtime.c
3d71c6
+++ b/tools/crm_resource_runtime.c
3d71c6
@@ -213,10 +213,11 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
3d71c6
     }
3d71c6
 
3d71c6
     if (safe_str_eq(attr_set_type, XML_TAG_ATTR_SETS)) {
3d71c6
-        rc = find_resource_attr(cib, XML_ATTR_ID, uber_parent(rsc)->id, XML_TAG_META_SETS, attr_set, attr_id,
3d71c6
-                                attr_name, &local_attr_id);
3d71c6
-        if(rc == pcmk_ok && do_force == FALSE) {
3d71c6
-            if (BE_QUIET == FALSE) {
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
@@ -224,7 +225,7 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
3d71c6
             return -ENOTUNIQ;
3d71c6
         }
3d71c6
 
3d71c6
-    } else if(rsc->parent) {
3d71c6
+    } else if(rsc->parent && do_force == FALSE) {
3d71c6
 
3d71c6
         switch(rsc->parent->variant) {
3d71c6
             case pe_group:
3d71c6
@@ -234,14 +235,41 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch
3d71c6
                 break;
3d71c6
             case pe_master:
3d71c6
             case pe_clone:
3d71c6
-                rsc = rsc->parent;
3d71c6
-                if (BE_QUIET == FALSE) {
3d71c6
-                    printf("Updating '%s' for '%s'...\n", rsc->id, rsc_id);
3d71c6
+
3d71c6
+                rc = find_resource_attr(cib, XML_ATTR_ID, rsc_id, attr_set_type, attr_set, attr_id, attr_name, &local_attr_id);
3d71c6
+                free(local_attr_id);
3d71c6
+
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
+                    }
3d71c6
                 }
3d71c6
                 break;
3d71c6
             default:
3d71c6
                 break;
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
+
3d71c6
+    } else if(rsc->parent == NULL && rsc->children) {
3d71c6
+        resource_t *child = rsc->children->data;
3d71c6
+
3d71c6
+        if(child->variant == pe_native) {
3d71c6
+            lookup_id = clone_strip(child->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, &local_attr_id);
3d71c6
+
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
+                }
3d71c6
+            }
3d71c6
+
3d71c6
+            free(local_attr_id);
3d71c6
+            free(lookup_id);
3d71c6
+        }
3d71c6
     }
3d71c6
 
3d71c6
     lookup_id = clone_strip(rsc->id); /* Could be a cloned group! */