Blame SOURCES/008-shutdown-lock.patch

ed4e54
From 736f255c18d4c99f1956fbb5ad4ac5bfc15bb841 Mon Sep 17 00:00:00 2001
ed4e54
From: Ken Gaillot <kgaillot@redhat.com>
ed4e54
Date: Tue, 14 Jan 2020 16:23:25 -0600
ed4e54
Subject: [PATCH 04/18] Low: tools: improve error checking for crm_resource
ed4e54
 cleanup/fail commands
ed4e54
ed4e54
Bail earlier for misconfigured resources, and return error (rather than hang)
ed4e54
for unknown or offline node. Also add timeout directly to controller request
ed4e54
rather than rely on the controller using the interval as default timeout.
ed4e54
---
ed4e54
 tools/crm_resource_runtime.c | 54 +++++++++++++++++++++++++++-----------------
ed4e54
 1 file changed, 33 insertions(+), 21 deletions(-)
ed4e54
ed4e54
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
ed4e54
index 61ceee7..2ea8bb3 100644
ed4e54
--- a/tools/crm_resource_runtime.c
ed4e54
+++ b/tools/crm_resource_runtime.c
ed4e54
@@ -468,8 +468,9 @@ send_lrm_rsc_op(crm_ipc_t * crmd_channel, const char *op,
ed4e54
     int rc = -ECOMM;
ed4e54
     xmlNode *cmd = NULL;
ed4e54
     xmlNode *xml_rsc = NULL;
ed4e54
-    const char *value = NULL;
ed4e54
     const char *router_node = host_uname;
ed4e54
+    const char *rsc_class = NULL;
ed4e54
+    const char *rsc_type = NULL;
ed4e54
     xmlNode *params = NULL;
ed4e54
     xmlNode *msg_data = NULL;
ed4e54
     resource_t *rsc = pe_find_resource(data_set->resources, rsc_id);
ed4e54
@@ -481,27 +482,49 @@ send_lrm_rsc_op(crm_ipc_t * crmd_channel, const char *op,
ed4e54
     } else if (rsc->variant != pe_native) {
ed4e54
         CMD_ERR("We can only process primitive resources, not %s", rsc_id);
ed4e54
         return -EINVAL;
ed4e54
+    }
ed4e54
 
ed4e54
-    } else if (host_uname == NULL) {
ed4e54
+    rsc_class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS);
ed4e54
+    rsc_type = crm_element_value(rsc->xml, XML_ATTR_TYPE);
ed4e54
+    if ((rsc_class == NULL) || (rsc_type == NULL)) {
ed4e54
+        CMD_ERR("Resource %s does not have a class and type", rsc_id);
ed4e54
+        return -EINVAL;
ed4e54
+    }
ed4e54
+
ed4e54
+    if (host_uname == NULL) {
ed4e54
         CMD_ERR("Please specify a node name");
ed4e54
         return -EINVAL;
ed4e54
+
ed4e54
     } else {
ed4e54
-        node_t *node = pe_find_node(data_set->nodes, host_uname);
ed4e54
+        pe_node_t *node = pe_find_node(data_set->nodes, host_uname);
ed4e54
 
ed4e54
+        if (node == NULL) {
ed4e54
+            CMD_ERR("Node %s not found", host_uname);
ed4e54
+            return -pcmk_err_node_unknown;
ed4e54
+        }
ed4e54
+
ed4e54
+        if (!(node->details->online)) {
ed4e54
+            CMD_ERR("Node %s is not online", host_uname);
ed4e54
+            return -ENOTCONN;
ed4e54
+        }
ed4e54
         if (pe__is_guest_or_remote_node(node)) {
ed4e54
             node = pe__current_node(node->details->remote_rsc);
ed4e54
             if (node == NULL) {
ed4e54
                 CMD_ERR("No cluster connection to Pacemaker Remote node %s detected",
ed4e54
                         host_uname);
ed4e54
-                return -ENXIO;
ed4e54
+                return -ENOTCONN;
ed4e54
             }
ed4e54
             router_node = node->details->uname;
ed4e54
         }
ed4e54
     }
ed4e54
 
ed4e54
-    key = generate_transition_key(0, getpid(), 0, "xxxxxxxx-xrsc-opxx-xcrm-resourcexxxx");
ed4e54
-
ed4e54
     msg_data = create_xml_node(NULL, XML_GRAPH_TAG_RSC_OP);
ed4e54
+
ed4e54
+    /* The controller logs the transition key from requests, so we need to have
ed4e54
+     * *something* for it.
ed4e54
+     */
ed4e54
+    key = generate_transition_key(0, getpid(), 0,
ed4e54
+                                  "xxxxxxxx-xrsc-opxx-xcrm-resourcexxxx");
ed4e54
     crm_xml_add(msg_data, XML_ATTR_TRANSITION_KEY, key);
ed4e54
     free(key);
ed4e54
 
ed4e54
@@ -519,31 +542,20 @@ send_lrm_rsc_op(crm_ipc_t * crmd_channel, const char *op,
ed4e54
         crm_xml_add(xml_rsc, XML_ATTR_ID, rsc->id);
ed4e54
     }
ed4e54
 
ed4e54
-    value = crm_copy_xml_element(rsc->xml, xml_rsc, XML_ATTR_TYPE);
ed4e54
-    if (value == NULL) {
ed4e54
-        CMD_ERR("%s has no type!  Aborting...", rsc_id);
ed4e54
-        return -ENXIO;
ed4e54
-    }
ed4e54
-
ed4e54
-    value = crm_copy_xml_element(rsc->xml, xml_rsc, XML_AGENT_ATTR_CLASS);
ed4e54
-    if (value == NULL) {
ed4e54
-        CMD_ERR("%s has no class!  Aborting...", rsc_id);
ed4e54
-        return -ENXIO;
ed4e54
-    }
ed4e54
-
ed4e54
+    crm_xml_add(xml_rsc, XML_AGENT_ATTR_CLASS, rsc_class);
ed4e54
     crm_copy_xml_element(rsc->xml, xml_rsc, XML_AGENT_ATTR_PROVIDER);
ed4e54
+    crm_xml_add(xml_rsc, XML_ATTR_TYPE, rsc_type);
ed4e54
 
ed4e54
     params = create_xml_node(msg_data, XML_TAG_ATTRS);
ed4e54
     crm_xml_add(params, XML_ATTR_CRM_VERSION, CRM_FEATURE_SET);
ed4e54
 
ed4e54
-    key = crm_meta_name(XML_LRM_ATTR_INTERVAL_MS);
ed4e54
+    // The controller parses the timeout from the request
ed4e54
+    key = crm_meta_name(XML_ATTR_TIMEOUT);
ed4e54
     crm_xml_add(params, key, "60000");  /* 1 minute */
ed4e54
     free(key);
ed4e54
 
ed4e54
     our_pid = crm_getpid_s();
ed4e54
     cmd = create_request(op, msg_data, router_node, CRM_SYSTEM_CRMD, crm_system_name, our_pid);
ed4e54
-
ed4e54
-/* 	crm_log_xml_warn(cmd, "send_lrm_rsc_op"); */
ed4e54
     free_xml(msg_data);
ed4e54
 
ed4e54
     if (crm_ipc_send(crmd_channel, cmd, 0, 0, NULL) > 0) {
ed4e54
-- 
ed4e54
1.8.3.1
ed4e54