summaryrefslogtreecommitdiffstats
path: root/daemons/controld/controld_te_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--daemons/controld/controld_te_callbacks.c367
1 files changed, 195 insertions, 172 deletions
diff --git a/daemons/controld/controld_te_callbacks.c b/daemons/controld/controld_te_callbacks.c
index c26e757..901d44d 100644
--- a/daemons/controld/controld_te_callbacks.c
+++ b/daemons/controld/controld_te_callbacks.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2023 the Pacemaker project contributors
+ * Copyright 2004-2024 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
@@ -14,23 +14,21 @@
#include <crm/crm.h>
#include <crm/common/xml.h>
#include <crm/common/xml_internal.h>
-#include <crm/msg_xml.h>
-#include <crm/cluster.h> /* For ONLINESTATUS etc */
#include <pacemaker-controld.h>
void te_update_confirm(const char *event, xmlNode * msg);
-#define RSC_OP_PREFIX "//" XML_TAG_DIFF_ADDED "//" XML_TAG_CIB \
- "//" XML_LRM_TAG_RSC_OP "[@" XML_ATTR_ID "='"
+#define RSC_OP_PREFIX "//" PCMK__XE_DIFF_ADDED "//" PCMK_XE_CIB \
+ "//" PCMK__XE_LRM_RSC_OP "[@" PCMK_XA_ID "='"
-// An explicit shutdown-lock of 0 means the lock has been cleared
+// An explicit PCMK_OPT_SHUTDOWN_LOCK of 0 means the lock has been cleared
static bool
shutdown_lock_cleared(xmlNode *lrm_resource)
{
time_t shutdown_lock = 0;
- return (crm_element_value_epoch(lrm_resource, XML_CONFIG_ATTR_SHUTDOWN_LOCK,
+ return (crm_element_value_epoch(lrm_resource, PCMK_OPT_SHUTDOWN_LOCK,
&shutdown_lock) == pcmk_ok)
&& (shutdown_lock == 0);
}
@@ -49,19 +47,21 @@ te_update_diff_v1(const char *event, xmlNode *diff)
"xml-patchset", diff);
if (cib__config_changed_v1(NULL, NULL, &diff)) {
- abort_transition(INFINITY, pcmk__graph_restart, "Non-status change",
- diff);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "Non-status change", diff);
goto bail; /* configuration changed */
}
/* Tickets Attributes - Added/Updated */
xpathObj =
xpath_search(diff,
- "//" F_CIB_UPDATE_RESULT "//" XML_TAG_DIFF_ADDED "//" XML_CIB_TAG_TICKETS);
+ "//" PCMK__XE_CIB_UPDATE_RESULT
+ "//" PCMK__XE_DIFF_ADDED
+ "//" PCMK_XE_TICKETS);
if (numXpathResults(xpathObj) > 0) {
xmlNode *aborted = getXpathResult(xpathObj, 0);
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Ticket attribute: update", aborted);
goto bail;
@@ -71,11 +71,13 @@ te_update_diff_v1(const char *event, xmlNode *diff)
/* Tickets Attributes - Removed */
xpathObj =
xpath_search(diff,
- "//" F_CIB_UPDATE_RESULT "//" XML_TAG_DIFF_REMOVED "//" XML_CIB_TAG_TICKETS);
+ "//" PCMK__XE_CIB_UPDATE_RESULT
+ "//" PCMK__XE_DIFF_REMOVED
+ "//" PCMK_XE_TICKETS);
if (numXpathResults(xpathObj) > 0) {
xmlNode *aborted = getXpathResult(xpathObj, 0);
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Ticket attribute: removal", aborted);
goto bail;
}
@@ -84,23 +86,24 @@ te_update_diff_v1(const char *event, xmlNode *diff)
/* Transient Attributes - Removed */
xpathObj =
xpath_search(diff,
- "//" F_CIB_UPDATE_RESULT "//" XML_TAG_DIFF_REMOVED "//"
- XML_TAG_TRANSIENT_NODEATTRS);
+ "//" PCMK__XE_CIB_UPDATE_RESULT
+ "//" PCMK__XE_DIFF_REMOVED
+ "//" PCMK__XE_TRANSIENT_ATTRIBUTES);
if (numXpathResults(xpathObj) > 0) {
xmlNode *aborted = getXpathResult(xpathObj, 0);
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Transient attribute: removal", aborted);
goto bail;
}
freeXpathObject(xpathObj);
- // Check for lrm_resource entries
+ // Check for PCMK__XE_LRM_RESOURCE entries
xpathObj = xpath_search(diff,
- "//" F_CIB_UPDATE_RESULT
- "//" XML_TAG_DIFF_ADDED
- "//" XML_LRM_TAG_RESOURCE);
+ "//" PCMK__XE_CIB_UPDATE_RESULT
+ "//" PCMK__XE_DIFF_ADDED
+ "//" PCMK__XE_LRM_RESOURCE);
max = numXpathResults(xpathObj);
/*
@@ -117,8 +120,8 @@ te_update_diff_v1(const char *event, xmlNode *diff)
crm_debug("Ignoring resource operation updates due to history refresh of %d resources",
max);
crm_log_xml_trace(diff, "lrm-refresh");
- abort_transition(INFINITY, pcmk__graph_restart, "History refresh",
- NULL);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "History refresh", NULL);
goto bail;
}
@@ -127,7 +130,7 @@ te_update_diff_v1(const char *event, xmlNode *diff)
if (shutdown_lock_cleared(lrm_resource)) {
// @TODO would be more efficient to abort once after transition done
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Shutdown lock cleared", lrm_resource);
// Still process results, so we stop timers and update failcounts
}
@@ -137,7 +140,9 @@ te_update_diff_v1(const char *event, xmlNode *diff)
/* Process operation updates */
xpathObj =
xpath_search(diff,
- "//" F_CIB_UPDATE_RESULT "//" XML_TAG_DIFF_ADDED "//" XML_LRM_TAG_RSC_OP);
+ "//" PCMK__XE_CIB_UPDATE_RESULT
+ "//" PCMK__XE_DIFF_ADDED
+ "//" PCMK__XE_LRM_RSC_OP);
max = numXpathResults(xpathObj);
if (max > 0) {
int lpc = 0;
@@ -152,7 +157,9 @@ te_update_diff_v1(const char *event, xmlNode *diff)
freeXpathObject(xpathObj);
/* Detect deleted (as opposed to replaced or added) actions - eg. crm_resource -C */
- xpathObj = xpath_search(diff, "//" XML_TAG_DIFF_REMOVED "//" XML_LRM_TAG_RSC_OP);
+ xpathObj = xpath_search(diff,
+ "//" PCMK__XE_DIFF_REMOVED
+ "//" PCMK__XE_LRM_RSC_OP);
max = numXpathResults(xpathObj);
for (lpc = 0; lpc < max; lpc++) {
const char *op_id = NULL;
@@ -162,7 +169,7 @@ te_update_diff_v1(const char *event, xmlNode *diff)
CRM_LOG_ASSERT(match != NULL);
if(match == NULL) { continue; };
- op_id = ID(match);
+ op_id = pcmk__xe_id(match);
if (rsc_op_xpath == NULL) {
rsc_op_xpath = g_string_new(RSC_OP_PREFIX);
@@ -180,13 +187,14 @@ te_update_diff_v1(const char *event, xmlNode *diff)
if (cancelled == NULL) {
crm_debug("No match for deleted action %s (%s on %s)",
(const char *) rsc_op_xpath->str, op_id, node);
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Resource op removal", match);
freeXpathObject(op_match);
goto bail;
} else {
- crm_debug("Deleted lrm_rsc_op %s on %s was for graph event %d",
+ crm_debug("Deleted " PCMK__XE_LRM_RSC_OP " %s on %s was for "
+ "graph event %d",
op_id, node, cancelled->id);
}
}
@@ -204,14 +212,14 @@ te_update_diff_v1(const char *event, xmlNode *diff)
static void
process_lrm_resource_diff(xmlNode *lrm_resource, const char *node)
{
- for (xmlNode *rsc_op = pcmk__xml_first_child(lrm_resource); rsc_op != NULL;
- rsc_op = pcmk__xml_next(rsc_op)) {
+ for (xmlNode *rsc_op = pcmk__xe_first_child(lrm_resource, NULL, NULL, NULL);
+ rsc_op != NULL; rsc_op = pcmk__xe_next(rsc_op)) {
process_graph_event(rsc_op, node);
}
if (shutdown_lock_cleared(lrm_resource)) {
// @TODO would be more efficient to abort once after transition done
- abort_transition(INFINITY, pcmk__graph_restart, "Shutdown lock cleared",
- lrm_resource);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "Shutdown lock cleared", lrm_resource);
}
}
@@ -225,12 +233,12 @@ process_resource_updates(const char *node, xmlNode *xml, xmlNode *change,
return;
}
- if (pcmk__xe_is(xml, XML_CIB_TAG_LRM)) {
- xml = first_named_child(xml, XML_LRM_TAG_RESOURCES);
+ if (pcmk__xe_is(xml, PCMK__XE_LRM)) {
+ xml = pcmk__xe_first_child(xml, PCMK__XE_LRM_RESOURCES, NULL, NULL);
CRM_CHECK(xml != NULL, return);
}
- CRM_CHECK(pcmk__xe_is(xml, XML_LRM_TAG_RESOURCES), return);
+ CRM_CHECK(pcmk__xe_is(xml, PCMK__XE_LRM_RESOURCES), return);
/*
* Updates by, or in response to, TE actions will never contain updates
@@ -248,31 +256,31 @@ process_resource_updates(const char *node, xmlNode *xml, xmlNode *change,
&& (xml->children != NULL) && (xml->children->next != NULL)) {
crm_log_xml_trace(change, "lrm-refresh");
- abort_transition(INFINITY, pcmk__graph_restart, "History refresh",
- NULL);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "History refresh", NULL);
return;
}
- for (rsc = pcmk__xml_first_child(xml); rsc != NULL;
- rsc = pcmk__xml_next(rsc)) {
- crm_trace("Processing %s", ID(rsc));
+ for (rsc = pcmk__xe_first_child(xml, NULL, NULL, NULL); rsc != NULL;
+ rsc = pcmk__xe_next(rsc)) {
+ crm_trace("Processing %s", pcmk__xe_id(rsc));
process_lrm_resource_diff(rsc, node);
}
}
static char *extract_node_uuid(const char *xpath)
{
- char *mutable_path = strdup(xpath);
+ char *mutable_path = pcmk__str_copy(xpath);
char *node_uuid = NULL;
char *search = NULL;
char *match = NULL;
- match = strstr(mutable_path, "node_state[@" XML_ATTR_ID "=\'");
+ match = strstr(mutable_path, PCMK__XE_NODE_STATE "[@" PCMK_XA_ID "=\'");
if (match == NULL) {
free(mutable_path);
return NULL;
}
- match += strlen("node_state[@" XML_ATTR_ID "=\'");
+ match += strlen(PCMK__XE_NODE_STATE "[@" PCMK_XA_ID "=\'");
search = strchr(match, '\'');
if (search == NULL) {
@@ -281,7 +289,7 @@ static char *extract_node_uuid(const char *xpath)
}
search[0] = 0;
- node_uuid = strdup(match);
+ node_uuid = pcmk__str_copy(match);
free(mutable_path);
return node_uuid;
}
@@ -293,22 +301,25 @@ abort_unless_down(const char *xpath, const char *op, xmlNode *change,
char *node_uuid = NULL;
pcmk__graph_action_t *down = NULL;
- if(!pcmk__str_eq(op, "delete", pcmk__str_casei)) {
- abort_transition(INFINITY, pcmk__graph_restart, reason, change);
+ if (!pcmk__str_eq(op, PCMK_VALUE_DELETE, pcmk__str_none)) {
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, reason,
+ change);
return;
}
node_uuid = extract_node_uuid(xpath);
if(node_uuid == NULL) {
crm_err("Could not extract node ID from %s", xpath);
- abort_transition(INFINITY, pcmk__graph_restart, reason, change);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, reason,
+ change);
return;
}
down = match_down_event(node_uuid);
if (down == NULL) {
crm_trace("Not expecting %s to be down (%s)", node_uuid, xpath);
- abort_transition(INFINITY, pcmk__graph_restart, reason, change);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, reason,
+ change);
} else {
crm_trace("Expecting changes to %s (%s)", node_uuid, xpath);
}
@@ -318,7 +329,7 @@ abort_unless_down(const char *xpath, const char *op, xmlNode *change,
static void
process_op_deletion(const char *xpath, xmlNode *change)
{
- char *mutable_key = strdup(xpath);
+ char *mutable_key = pcmk__str_copy(xpath);
char *key;
char *node_uuid;
@@ -338,7 +349,7 @@ process_op_deletion(const char *xpath, xmlNode *change)
node_uuid = extract_node_uuid(xpath);
if (confirm_cancel_action(key, node_uuid) == FALSE) {
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Resource operation removal", change);
}
free(mutable_key);
@@ -348,13 +359,13 @@ process_op_deletion(const char *xpath, xmlNode *change)
static void
process_delete_diff(const char *xpath, const char *op, xmlNode *change)
{
- if (strstr(xpath, "/" XML_LRM_TAG_RSC_OP "[")) {
+ if (strstr(xpath, "/" PCMK__XE_LRM_RSC_OP "[")) {
process_op_deletion(xpath, change);
- } else if (strstr(xpath, "/" XML_CIB_TAG_LRM "[")) {
+ } else if (strstr(xpath, "/" PCMK__XE_LRM "[")) {
abort_unless_down(xpath, op, change, "Resource state removal");
- } else if (strstr(xpath, "/" XML_CIB_TAG_STATE "[")) {
+ } else if (strstr(xpath, "/" PCMK__XE_NODE_STATE "[")) {
abort_unless_down(xpath, op, change, "Node state removal");
} else {
@@ -366,17 +377,18 @@ static void
process_node_state_diff(xmlNode *state, xmlNode *change, const char *op,
const char *xpath)
{
- xmlNode *lrm = first_named_child(state, XML_CIB_TAG_LRM);
+ xmlNode *lrm = pcmk__xe_first_child(state, PCMK__XE_LRM, NULL, NULL);
- process_resource_updates(ID(state), lrm, change, op, xpath);
+ process_resource_updates(pcmk__xe_id(state), lrm, change, op, xpath);
}
static void
process_status_diff(xmlNode *status, xmlNode *change, const char *op,
const char *xpath)
{
- for (xmlNode *state = pcmk__xml_first_child(status); state != NULL;
- state = pcmk__xml_next(state)) {
+ for (xmlNode *state = pcmk__xe_first_child(status, NULL, NULL, NULL);
+ state != NULL; state = pcmk__xe_next(state)) {
+
process_node_state_diff(state, change, op, xpath);
}
}
@@ -385,144 +397,152 @@ static void
process_cib_diff(xmlNode *cib, xmlNode *change, const char *op,
const char *xpath)
{
- xmlNode *status = first_named_child(cib, XML_CIB_TAG_STATUS);
- xmlNode *config = first_named_child(cib, XML_CIB_TAG_CONFIGURATION);
+ xmlNode *status = pcmk__xe_first_child(cib, PCMK_XE_STATUS, NULL, NULL);
+ xmlNode *config = pcmk__xe_first_child(cib, PCMK_XE_CONFIGURATION, NULL,
+ NULL);
if (status) {
process_status_diff(status, change, op, xpath);
}
if (config) {
- abort_transition(INFINITY, pcmk__graph_restart,
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
"Non-status-only change", change);
}
}
-static void
-te_update_diff_v2(xmlNode *diff)
+static int
+te_update_diff_element_v2(xmlNode *change, void *userdata)
{
- crm_log_xml_trace(diff, "Patch:Raw");
-
- for (xmlNode *change = pcmk__xml_first_child(diff); change != NULL;
- change = pcmk__xml_next(change)) {
-
- xmlNode *match = NULL;
- const char *name = NULL;
- const char *xpath = crm_element_value(change, XML_DIFF_PATH);
-
- // Possible ops: create, modify, delete, move
- const char *op = crm_element_value(change, XML_DIFF_OP);
-
- // Ignore uninteresting updates
- if (op == NULL) {
- continue;
-
- } else if (xpath == NULL) {
- crm_trace("Ignoring %s change for version field", op);
- continue;
-
- } else if ((strcmp(op, "move") == 0)
- && (strstr(xpath,
- "/" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION
- "/" XML_CIB_TAG_RESOURCES) == NULL)) {
- /* We still need to consider moves within the resources section,
- * since they affect placement order.
- */
- crm_trace("Ignoring move change at %s", xpath);
- continue;
+ xmlNode *match = NULL;
+ const char *name = NULL;
+ const char *xpath = crm_element_value(change, PCMK_XA_PATH);
+
+ // Possible ops: create, modify, delete, move
+ const char *op = crm_element_value(change, PCMK_XA_OPERATION);
+
+ // Ignore uninteresting updates
+ if (op == NULL) {
+ return pcmk_rc_ok;
+
+ } else if (xpath == NULL) {
+ crm_trace("Ignoring %s change for version field", op);
+ return pcmk_rc_ok;
+
+ } else if ((strcmp(op, PCMK_VALUE_MOVE) == 0)
+ && (strstr(xpath,
+ "/" PCMK_XE_CIB "/" PCMK_XE_CONFIGURATION
+ "/" PCMK_XE_RESOURCES) == NULL)) {
+ /* We still need to consider moves within the resources section,
+ * since they affect placement order.
+ */
+ crm_trace("Ignoring move change at %s", xpath);
+ return pcmk_rc_ok;
+ }
+
+ // Find the result of create/modify ops
+ if (strcmp(op, PCMK_VALUE_CREATE) == 0) {
+ match = change->children;
+
+ } else if (strcmp(op, PCMK_VALUE_MODIFY) == 0) {
+ match = pcmk__xe_first_child(change, PCMK_XE_CHANGE_RESULT, NULL, NULL);
+ if(match) {
+ match = match->children;
}
- // Find the result of create/modify ops
- if (strcmp(op, "create") == 0) {
- match = change->children;
-
- } else if (strcmp(op, "modify") == 0) {
- match = first_named_child(change, XML_DIFF_RESULT);
- if(match) {
- match = match->children;
- }
-
- } else if (!pcmk__str_any_of(op, "delete", "move", NULL)) {
- crm_warn("Ignoring malformed CIB update (%s operation on %s is unrecognized)",
- op, xpath);
- continue;
- }
+ } else if (!pcmk__str_any_of(op,
+ PCMK_VALUE_DELETE, PCMK_VALUE_MOVE,
+ NULL)) {
+ crm_warn("Ignoring malformed CIB update (%s operation on %s is unrecognized)",
+ op, xpath);
+ return pcmk_rc_ok;
+ }
- if (match) {
- if (match->type == XML_COMMENT_NODE) {
- crm_trace("Ignoring %s operation for comment at %s", op, xpath);
- continue;
- }
- name = (const char *)match->name;
+ if (match) {
+ if (match->type == XML_COMMENT_NODE) {
+ crm_trace("Ignoring %s operation for comment at %s", op, xpath);
+ return pcmk_rc_ok;
}
+ name = (const char *)match->name;
+ }
- crm_trace("Handling %s operation for %s%s%s",
- op, (xpath? xpath : "CIB"),
- (name? " matched by " : ""), (name? name : ""));
+ crm_trace("Handling %s operation for %s%s%s",
+ op, (xpath? xpath : "CIB"),
+ (name? " matched by " : ""), (name? name : ""));
- if (strstr(xpath, "/" XML_TAG_CIB "/" XML_CIB_TAG_CONFIGURATION)) {
- abort_transition(INFINITY, pcmk__graph_restart,
- "Configuration change", change);
- break; // Won't be packaged with operation results we may be waiting for
+ if (strstr(xpath, "/" PCMK_XE_CIB "/" PCMK_XE_CONFIGURATION)) {
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "Configuration change", change);
+ return pcmk_rc_cib_modified; // Won't be packaged with operation results we may be waiting for
- } else if (strstr(xpath, "/" XML_CIB_TAG_TICKETS)
- || pcmk__str_eq(name, XML_CIB_TAG_TICKETS, pcmk__str_none)) {
- abort_transition(INFINITY, pcmk__graph_restart,
- "Ticket attribute change", change);
- break; // Won't be packaged with operation results we may be waiting for
+ } else if (strstr(xpath, "/" PCMK_XE_TICKETS)
+ || pcmk__str_eq(name, PCMK_XE_TICKETS, pcmk__str_none)) {
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "Ticket attribute change", change);
+ return pcmk_rc_cib_modified; // Won't be packaged with operation results we may be waiting for
- } else if (strstr(xpath, "/" XML_TAG_TRANSIENT_NODEATTRS "[")
- || pcmk__str_eq(name, XML_TAG_TRANSIENT_NODEATTRS,
- pcmk__str_none)) {
- abort_unless_down(xpath, op, change, "Transient attribute change");
- break; // Won't be packaged with operation results we may be waiting for
+ } else if (strstr(xpath, "/" PCMK__XE_TRANSIENT_ATTRIBUTES "[")
+ || pcmk__str_eq(name, PCMK__XE_TRANSIENT_ATTRIBUTES,
+ pcmk__str_none)) {
+ abort_unless_down(xpath, op, change, "Transient attribute change");
+ return pcmk_rc_cib_modified; // Won't be packaged with operation results we may be waiting for
- } else if (strcmp(op, "delete") == 0) {
- process_delete_diff(xpath, op, change);
+ } else if (strcmp(op, PCMK_VALUE_DELETE) == 0) {
+ process_delete_diff(xpath, op, change);
- } else if (name == NULL) {
- crm_warn("Ignoring malformed CIB update (%s at %s has no result)",
- op, xpath);
+ } else if (name == NULL) {
+ crm_warn("Ignoring malformed CIB update (%s at %s has no result)",
+ op, xpath);
- } else if (strcmp(name, XML_TAG_CIB) == 0) {
- process_cib_diff(match, change, op, xpath);
+ } else if (strcmp(name, PCMK_XE_CIB) == 0) {
+ process_cib_diff(match, change, op, xpath);
- } else if (strcmp(name, XML_CIB_TAG_STATUS) == 0) {
- process_status_diff(match, change, op, xpath);
+ } else if (strcmp(name, PCMK_XE_STATUS) == 0) {
+ process_status_diff(match, change, op, xpath);
- } else if (strcmp(name, XML_CIB_TAG_STATE) == 0) {
- process_node_state_diff(match, change, op, xpath);
+ } else if (strcmp(name, PCMK__XE_NODE_STATE) == 0) {
+ process_node_state_diff(match, change, op, xpath);
- } else if (strcmp(name, XML_CIB_TAG_LRM) == 0) {
- process_resource_updates(ID(match), match, change, op, xpath);
+ } else if (strcmp(name, PCMK__XE_LRM) == 0) {
+ process_resource_updates(pcmk__xe_id(match), match, change, op,
+ xpath);
- } else if (strcmp(name, XML_LRM_TAG_RESOURCES) == 0) {
- char *local_node = pcmk__xpath_node_id(xpath, "lrm");
+ } else if (strcmp(name, PCMK__XE_LRM_RESOURCES) == 0) {
+ char *local_node = pcmk__xpath_node_id(xpath, PCMK__XE_LRM);
- process_resource_updates(local_node, match, change, op, xpath);
- free(local_node);
+ process_resource_updates(local_node, match, change, op, xpath);
+ free(local_node);
- } else if (strcmp(name, XML_LRM_TAG_RESOURCE) == 0) {
- char *local_node = pcmk__xpath_node_id(xpath, "lrm");
+ } else if (strcmp(name, PCMK__XE_LRM_RESOURCE) == 0) {
+ char *local_node = pcmk__xpath_node_id(xpath, PCMK__XE_LRM);
- process_lrm_resource_diff(match, local_node);
- free(local_node);
+ process_lrm_resource_diff(match, local_node);
+ free(local_node);
- } else if (strcmp(name, XML_LRM_TAG_RSC_OP) == 0) {
- char *local_node = pcmk__xpath_node_id(xpath, "lrm");
+ } else if (strcmp(name, PCMK__XE_LRM_RSC_OP) == 0) {
+ char *local_node = pcmk__xpath_node_id(xpath, PCMK__XE_LRM);
- process_graph_event(match, local_node);
- free(local_node);
+ process_graph_event(match, local_node);
+ free(local_node);
- } else {
- crm_warn("Ignoring malformed CIB update (%s at %s has unrecognized result %s)",
- op, xpath, name);
- }
+ } else {
+ crm_warn("Ignoring malformed CIB update (%s at %s has unrecognized result %s)",
+ op, xpath, name);
}
+
+ return pcmk_rc_ok;
+}
+
+static void
+te_update_diff_v2(xmlNode *diff)
+{
+ crm_log_xml_trace(diff, "Patch:Raw");
+ pcmk__xe_foreach_child(diff, NULL, te_update_diff_element_v2, NULL);
}
void
te_update_diff(const char *event, xmlNode * msg)
{
+ xmlNode *wrapper = NULL;
xmlNode *diff = NULL;
const char *op = NULL;
int rc = -EINVAL;
@@ -531,7 +551,7 @@ te_update_diff(const char *event, xmlNode * msg)
int p_del[] = { 0, 0, 0 };
CRM_CHECK(msg != NULL, return);
- crm_element_value_int(msg, F_CIB_RC, &rc);
+ crm_element_value_int(msg, PCMK__XA_CIB_RC, &rc);
if (controld_globals.transition_graph == NULL) {
crm_trace("No graph");
@@ -550,8 +570,10 @@ te_update_diff(const char *event, xmlNode * msg)
return;
}
- op = crm_element_value(msg, F_CIB_OPERATION);
- diff = get_message_xml(msg, F_CIB_UPDATE_RESULT);
+ op = crm_element_value(msg, PCMK__XA_CIB_OP);
+
+ wrapper = pcmk__xe_first_child(msg, PCMK__XE_CIB_UPDATE_RESULT, NULL, NULL);
+ diff = pcmk__xe_first_child(wrapper, NULL, NULL, NULL);
xml_patch_versions(diff, p_add, p_del);
crm_debug("Processing (%s) diff: %d.%d.%d -> %d.%d.%d (%s)", op,
@@ -583,7 +605,7 @@ process_te_message(xmlNode * msg, xmlNode * xml_data)
CRM_CHECK(msg != NULL, return);
// Transition requests must specify transition engine as subsystem
- value = crm_element_value(msg, F_CRM_SYS_TO);
+ value = crm_element_value(msg, PCMK__XA_CRM_SYS_TO);
if (pcmk__str_empty(value)
|| !pcmk__str_eq(value, CRM_SYSTEM_TENGINE, pcmk__str_none)) {
crm_info("Received invalid transition request: subsystem '%s' not '"
@@ -592,7 +614,7 @@ process_te_message(xmlNode * msg, xmlNode * xml_data)
}
// Only the lrm_invoke command is supported as a transition request
- value = crm_element_value(msg, F_CRM_TASK);
+ value = crm_element_value(msg, PCMK__XA_CRM_TASK);
if (!pcmk__str_eq(value, CRM_OP_INVOKE_LRM, pcmk__str_none)) {
crm_info("Received invalid transition request: command '%s' not '"
CRM_OP_INVOKE_LRM "'", pcmk__s(value, ""));
@@ -600,7 +622,7 @@ process_te_message(xmlNode * msg, xmlNode * xml_data)
}
// Transition requests must be marked as coming from the executor
- value = crm_element_value(msg, F_CRM_SYS_FROM);
+ value = crm_element_value(msg, PCMK__XA_CRM_SYS_FROM);
if (!pcmk__str_eq(value, CRM_SYSTEM_LRMD, pcmk__str_none)) {
crm_info("Received invalid transition request: from '%s' not '"
CRM_SYSTEM_LRMD "'", pcmk__s(value, ""));
@@ -608,10 +630,10 @@ process_te_message(xmlNode * msg, xmlNode * xml_data)
}
crm_debug("Processing transition request with ref='%s' origin='%s'",
- pcmk__s(crm_element_value(msg, F_CRM_REFERENCE), ""),
- pcmk__s(crm_element_value(msg, F_ORIG), ""));
+ pcmk__s(crm_element_value(msg, PCMK_XA_REFERENCE), ""),
+ pcmk__s(crm_element_value(msg, PCMK__XA_SRC), ""));
- xpathObj = xpath_search(xml_data, "//" XML_LRM_TAG_RSC_OP);
+ xpathObj = xpath_search(xml_data, "//" PCMK__XE_LRM_RSC_OP);
nmatches = numXpathResults(xpathObj);
if (nmatches == 0) {
crm_err("Received transition request with no results (bug?)");
@@ -653,9 +675,9 @@ action_timer_callback(gpointer data)
stop_te_timer(action);
- task = crm_element_value(action->xml, XML_LRM_ATTR_TASK);
- on_node = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
- via_node = crm_element_value(action->xml, XML_LRM_ATTR_ROUTER_NODE);
+ task = crm_element_value(action->xml, PCMK_XA_OPERATION);
+ on_node = crm_element_value(action->xml, PCMK__META_ON_NODE);
+ via_node = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE);
if (controld_globals.transition_graph->complete) {
crm_notice("Node %s did not send %s result (via %s) within %dms "
@@ -666,7 +688,7 @@ action_timer_callback(gpointer data)
/* fail the action */
crm_err("Node %s did not send %s result (via %s) within %dms "
- "(action timeout plus cluster-delay)",
+ "(action timeout plus " PCMK_OPT_CLUSTER_DELAY ")",
(on_node? on_node : ""), (task? task : "unknown action"),
(via_node? via_node : "controller"),
(action->timeout
@@ -676,7 +698,8 @@ action_timer_callback(gpointer data)
pcmk__set_graph_action_flags(action, pcmk__graph_action_failed);
te_action_confirmed(action, controld_globals.transition_graph);
- abort_transition(INFINITY, pcmk__graph_restart, "Action lost", NULL);
+ abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart,
+ "Action lost", NULL);
// Record timeout in the CIB if appropriate
if ((action->type == pcmk__rsc_graph_action)