From: Andrew Beekhof Date: Thu, 8 Oct 2015 13:38:07 +1100 Subject: [PATCH] Fix: crm_resource: Correctly observe --force when deleting and updating attributes (cherry picked from commit bd232e36403ea807635cabd336d8bb3101710891) --- tools/crm_resource_runtime.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index 2d51e88..c3f5275 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -123,8 +123,9 @@ find_resource_attr(cib_t * the_cib, const char *attr, const char *rsc, const cha xmlNode *xml_search = NULL; char *xpath_string = NULL; - CRM_ASSERT(value != NULL); - *value = NULL; + if(value) { + *value = NULL; + } if(the_cib == NULL) { return -ENOTCONN; @@ -176,7 +177,7 @@ find_resource_attr(cib_t * the_cib, const char *attr, const char *rsc, const cha crm_element_value(child, XML_NVPAIR_ATTR_VALUE), ID(child)); } - } else { + } else if(value) { const char *tmp = crm_element_value(xml_search, attr); if (tmp) { @@ -198,8 +199,10 @@ find_matching_attr_resource(resource_t * rsc, const char * rsc_id, const char * char *lookup_id = NULL; char *local_attr_id = NULL; - if(rsc->parent && do_force == FALSE) { + if(do_force == TRUE) { + return rsc; + } else if(rsc->parent) { switch(rsc->parent->variant) { case pe_group: if (BE_QUIET == FALSE) { @@ -270,6 +273,13 @@ cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const ch return -ENXIO; } + if(attr_id == NULL + && do_force == FALSE + && pcmk_ok != find_resource_attr( + cib, XML_ATTR_ID, uber_parent(rsc)->id, NULL, NULL, NULL, attr_name, NULL)) { + printf("\n"); + } + if (safe_str_eq(attr_set_type, XML_TAG_ATTR_SETS)) { if (do_force == FALSE) { rc = find_resource_attr(cib, XML_ATTR_ID, uber_parent(rsc)->id, @@ -419,6 +429,13 @@ cli_resource_delete_attribute(const char *rsc_id, const char *attr_set, const ch return -ENXIO; } + if(attr_id == NULL + && do_force == FALSE + && find_resource_attr( + cib, XML_ATTR_ID, uber_parent(rsc)->id, NULL, NULL, NULL, attr_name, NULL) != pcmk_ok) { + printf("\n"); + } + if(safe_str_eq(attr_set_type, XML_TAG_META_SETS)) { rsc = find_matching_attr_resource(rsc, rsc_id, attr_set, attr_id, attr_name, cib, "delete"); }