109fe2
From c2d5c19a863f407a034a63f2877eb5faf7036d59 Mon Sep 17 00:00:00 2001
109fe2
From: "Gao,Yan" <ygao@suse.com>
109fe2
Date: Fri, 8 Dec 2017 14:47:40 +0100
109fe2
Subject: [PATCH 1/2] Refactor: tools: crm_resource - Functionize cleaning up
109fe2
 resource failures
109fe2
109fe2
---
109fe2
 tools/crm_resource.c         | 26 ++------------------------
109fe2
 tools/crm_resource.h         |  3 +++
109fe2
 tools/crm_resource_runtime.c | 36 ++++++++++++++++++++++++++++++++++++
109fe2
 3 files changed, 41 insertions(+), 24 deletions(-)
109fe2
109fe2
diff --git a/tools/crm_resource.c b/tools/crm_resource.c
109fe2
index f93f688..4ddcef4 100644
109fe2
--- a/tools/crm_resource.c
109fe2
+++ b/tools/crm_resource.c
109fe2
@@ -1094,31 +1094,9 @@ main(int argc, char **argv)
109fe2
 
109fe2
     } else if (rsc_cmd == 'C' && just_errors) {
109fe2
         crmd_replies_needed = 0;
109fe2
-        for (xmlNode *xml_op = __xml_first_child(data_set.failed); xml_op != NULL;
109fe2
-             xml_op = __xml_next(xml_op)) {
109fe2
-
109fe2
-            const char *node = crm_element_value(xml_op, XML_ATTR_UNAME);
109fe2
-            const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK);
109fe2
-            const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL);
109fe2
-            const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID);
109fe2
-
109fe2
-            if(resource_name == NULL) {
109fe2
-                continue;
109fe2
-            } else if(host_uname && safe_str_neq(host_uname, node)) {
109fe2
-                continue;
109fe2
-            } else if(rsc_id && safe_str_neq(rsc_id, resource_name)) {
109fe2
-                continue;
109fe2
-            } else if(operation && safe_str_neq(operation, task)) {
109fe2
-                continue;
109fe2
-            } else if(interval && safe_str_neq(interval, task_interval)) {
109fe2
-                continue;
109fe2
-            }
109fe2
 
109fe2
-            crm_debug("Erasing %s failure for %s (%s detected) on %s",
109fe2
-                      task, rsc->id, resource_name, node);
109fe2
-            rc = cli_resource_delete(crmd_channel, node, rsc, task,
109fe2
-                                     task_interval, &data_set);
109fe2
-        }
109fe2
+        rc = cli_resource_delete_failures(crmd_channel, host_uname, rsc, operation,
109fe2
+                                          interval, &data_set);
109fe2
 
109fe2
         if(rsc && (rc == pcmk_ok) && (BE_QUIET == FALSE)) {
109fe2
             /* Now check XML_RSC_ATTR_TARGET_ROLE and XML_RSC_ATTR_MANAGED */
109fe2
diff --git a/tools/crm_resource.h b/tools/crm_resource.h
109fe2
index 0b8dd2a..e28c9ef 100644
109fe2
--- a/tools/crm_resource.h
109fe2
+++ b/tools/crm_resource.h
109fe2
@@ -76,6 +76,9 @@ int cli_resource_search(resource_t *rsc, const char *requested_name,
109fe2
 int cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname,
109fe2
                         resource_t *rsc, const char *operation,
109fe2
                         const char *interval, pe_working_set_t *data_set);
109fe2
+int cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname,
109fe2
+                                 resource_t *rsc, const char *operation,
109fe2
+                                 const char *interval, pe_working_set_t *data_set);
109fe2
 int cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib);
109fe2
 int cli_resource_move(resource_t *rsc, const char *rsc_id,
109fe2
                       const char *host_name, cib_t *cib,
109fe2
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
109fe2
index ffe4e5d..d250a07 100644
109fe2
--- a/tools/crm_resource_runtime.c
109fe2
+++ b/tools/crm_resource_runtime.c
109fe2
@@ -655,6 +655,42 @@ cli_resource_delete(crm_ipc_t *crmd_channel, const char *host_uname,
109fe2
     return rc;
109fe2
 }
109fe2
 
109fe2
+int
109fe2
+cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname,
109fe2
+                    resource_t *rsc, const char *operation,
109fe2
+                    const char *interval, pe_working_set_t *data_set)
109fe2
+{
109fe2
+    int rc = pcmk_ok;
109fe2
+
109fe2
+    for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL;
109fe2
+         xml_op = __xml_next(xml_op)) {
109fe2
+
109fe2
+        const char *node = crm_element_value(xml_op, XML_ATTR_UNAME);
109fe2
+        const char *task = crm_element_value(xml_op, XML_LRM_ATTR_TASK);
109fe2
+        const char *task_interval = crm_element_value(xml_op, XML_LRM_ATTR_INTERVAL);
109fe2
+        const char *resource_name = crm_element_value(xml_op, XML_LRM_ATTR_RSCID);
109fe2
+
109fe2
+        if(resource_name == NULL) {
109fe2
+            continue;
109fe2
+        } else if(host_uname && safe_str_neq(host_uname, node)) {
109fe2
+            continue;
109fe2
+        } else if(rsc->id && safe_str_neq(rsc->id, resource_name)) {
109fe2
+            continue;
109fe2
+        } else if(operation && safe_str_neq(operation, task)) {
109fe2
+            continue;
109fe2
+        } else if(interval && safe_str_neq(interval, task_interval)) {
109fe2
+            continue;
109fe2
+        }
109fe2
+
109fe2
+        crm_debug("Erasing %s failure for %s (%s detected) on %s",
109fe2
+                  task, rsc->id, resource_name, node);
109fe2
+        rc = cli_resource_delete(crmd_channel, node, rsc, task,
109fe2
+                                 task_interval, data_set);
109fe2
+    }
109fe2
+
109fe2
+    return rc;
109fe2
+}
109fe2
+
109fe2
 void
109fe2
 cli_resource_check(cib_t * cib_conn, resource_t *rsc)
109fe2
 {
109fe2
-- 
109fe2
1.8.3.1
109fe2
109fe2
109fe2
From 170ec0afcddb01fcfb8c2e8c86bc0e53594a42f9 Mon Sep 17 00:00:00 2001
109fe2
From: "Gao,Yan" <ygao@suse.com>
109fe2
Date: Fri, 8 Dec 2017 16:22:54 +0100
109fe2
Subject: [PATCH 2/2] Fix: tools: crm_resource --cleanup for non-primitive
109fe2
 resources
109fe2
109fe2
---
109fe2
 tools/crm_resource_runtime.c | 18 ++++++++++++++++++
109fe2
 1 file changed, 18 insertions(+)
109fe2
109fe2
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
109fe2
index d250a07..1048636 100644
109fe2
--- a/tools/crm_resource_runtime.c
109fe2
+++ b/tools/crm_resource_runtime.c
109fe2
@@ -662,6 +662,24 @@ cli_resource_delete_failures(crm_ipc_t *crmd_channel, const char *host_uname,
109fe2
 {
109fe2
     int rc = pcmk_ok;
109fe2
 
109fe2
+    if (rsc == NULL) {
109fe2
+        return -ENXIO;
109fe2
+
109fe2
+    } else if (rsc->children) {
109fe2
+        GListPtr lpc = NULL;
109fe2
+
109fe2
+        for (lpc = rsc->children; lpc != NULL; lpc = lpc->next) {
109fe2
+            resource_t *child = (resource_t *) lpc->data;
109fe2
+
109fe2
+            rc = cli_resource_delete_failures(crmd_channel, host_uname, child, operation,
109fe2
+                                              interval, data_set);
109fe2
+            if(rc != pcmk_ok) {
109fe2
+                return rc;
109fe2
+            }
109fe2
+        }
109fe2
+        return pcmk_ok;
109fe2
+    }
109fe2
+
109fe2
     for (xmlNode *xml_op = __xml_first_child(data_set->failed); xml_op != NULL;
109fe2
          xml_op = __xml_next(xml_op)) {
109fe2
 
109fe2
-- 
109fe2
1.8.3.1
109fe2