|
|
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 |
|