Blame SOURCES/012-feature-set.patch

a216ed
From a2b8e75abf42b28ba0a02de4e67da531556543ab Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Tue, 17 Nov 2020 13:53:57 -0500
a216ed
Subject: [PATCH 1/6] Refactor: libs: Add a function to set properties on an
a216ed
 xmlNode.
a216ed
a216ed
This takes a va_list so it can be used by other future functions that
a216ed
will take arguments directly.  It then just walks the list of pairs and
a216ed
sets them as properties on an xmlNode, until a NULL is found.
a216ed
a216ed
Interally, it just uses crm_xml_add so it's useful across the whole
a216ed
pacemaker code base.
a216ed
---
a216ed
 include/crm/common/xml_internal.h |  3 +++
a216ed
 lib/common/xml.c                  | 20 ++++++++++++++++++++
a216ed
 2 files changed, 23 insertions(+)
a216ed
a216ed
diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h
a216ed
index 5643be6..c60fa51 100644
a216ed
--- a/include/crm/common/xml_internal.h
a216ed
+++ b/include/crm/common/xml_internal.h
a216ed
@@ -235,4 +235,7 @@ pcmk__xe_next(const xmlNode *child)
a216ed
     return next;
a216ed
 }
a216ed
 
a216ed
+void
a216ed
+pcmk__xe_set_propv(xmlNodePtr node, va_list pairs);
a216ed
+
a216ed
 #endif // PCMK__XML_INTERNAL__H
a216ed
diff --git a/lib/common/xml.c b/lib/common/xml.c
a216ed
index bed6854..61cac9f 100644
a216ed
--- a/lib/common/xml.c
a216ed
+++ b/lib/common/xml.c
a216ed
@@ -2935,6 +2935,26 @@ pcmk__xml_artefact_path(enum pcmk__xml_artefact_ns ns, const char *filespec)
a216ed
     return ret;
a216ed
 }
a216ed
 
a216ed
+void
a216ed
+pcmk__xe_set_propv(xmlNodePtr node, va_list pairs)
a216ed
+{
a216ed
+    while (true) {
a216ed
+        const char *name, *value;
a216ed
+
a216ed
+        name = va_arg(pairs, const char *);
a216ed
+        if (name == NULL) {
a216ed
+            return;
a216ed
+        }
a216ed
+
a216ed
+        value = va_arg(pairs, const char *);
a216ed
+        if (value == NULL) {
a216ed
+            return;
a216ed
+        }
a216ed
+
a216ed
+        crm_xml_add(node, name, value);
a216ed
+    }
a216ed
+}
a216ed
+
a216ed
 // Deprecated functions kept only for backward API compatibility
a216ed
 
a216ed
 xmlNode *find_entity(xmlNode *parent, const char *node_name, const char *id);
a216ed
-- 
a216ed
1.8.3.1
a216ed
a216ed
a216ed
From b16b24ed049b1a646195e8d8b9bb309c2fa8fe49 Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Tue, 17 Nov 2020 13:00:44 -0500
a216ed
Subject: [PATCH 2/6] Refactor: libs: Set XML properties when creating a node.
a216ed
a216ed
pcmk__output_create_xml_node can take a NULL-terminated list of
a216ed
properties that should be set on the node at the same time it's created.
a216ed
This saves a bunch of calls to xmlSetProp and gets rid of some variables
a216ed
that are otherwise not needed.
a216ed
a216ed
Unfortunately, this can't be used everywhere I'd like but it's a good
a216ed
start.
a216ed
---
a216ed
 include/crm/common/output_internal.h |   4 +-
a216ed
 lib/common/output_html.c             |   2 +-
a216ed
 lib/common/output_xml.c              |  32 ++++---
a216ed
 lib/fencing/st_output.c              |  34 ++++---
a216ed
 lib/pacemaker/pcmk_output.c          |  77 ++++++++--------
a216ed
 lib/pengine/bundle.c                 |   4 +-
a216ed
 lib/pengine/pe_output.c              | 174 +++++++++++++++++------------------
a216ed
 tools/crm_resource_print.c           |   6 +-
a216ed
 8 files changed, 173 insertions(+), 160 deletions(-)
a216ed
a216ed
diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
a216ed
index e1bd295..1923c1a 100644
a216ed
--- a/include/crm/common/output_internal.h
a216ed
+++ b/include/crm/common/output_internal.h
a216ed
@@ -648,9 +648,11 @@ pcmk__output_xml_add_node(pcmk__output_t *out, xmlNodePtr node);
a216ed
  *
a216ed
  * \param[in,out] out  The output functions structure.
a216ed
  * \param[in]     name The name of the node to be created.
a216ed
+ * \param[in]     ...     Name/value pairs to set as XML properties.
a216ed
  */
a216ed
 xmlNodePtr
a216ed
-pcmk__output_create_xml_node(pcmk__output_t *out, const char *name);
a216ed
+pcmk__output_create_xml_node(pcmk__output_t *out, const char *name, ...)
a216ed
+G_GNUC_NULL_TERMINATED;
a216ed
 
a216ed
 /*!
a216ed
  * \internal
a216ed
diff --git a/lib/common/output_html.c b/lib/common/output_html.c
a216ed
index e354b5d..77a5410 100644
a216ed
--- a/lib/common/output_html.c
a216ed
+++ b/lib/common/output_html.c
a216ed
@@ -370,7 +370,7 @@ html_is_quiet(pcmk__output_t *out) {
a216ed
 
a216ed
 static void
a216ed
 html_spacer(pcmk__output_t *out) {
a216ed
-    pcmk__output_create_xml_node(out, "br");
a216ed
+    pcmk__output_create_xml_node(out, "br", NULL);
a216ed
 }
a216ed
 
a216ed
 pcmk__output_t *
a216ed
diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c
a216ed
index 716d10f..80ee2de 100644
a216ed
--- a/lib/common/output_xml.c
a216ed
+++ b/lib/common/output_xml.c
a216ed
@@ -24,6 +24,7 @@
a216ed
 
a216ed
 #include <crm/crm.h>
a216ed
 #include <crm/common/xml.h>
a216ed
+#include <crm/common/xml_internal.h>
a216ed
 #include <crm/common/output_internal.h>
a216ed
 
a216ed
 static gboolean legacy_xml = FALSE;
a216ed
@@ -234,16 +235,16 @@ xml_subprocess_output(pcmk__output_t *out, int exit_status,
a216ed
 
a216ed
 static void
a216ed
 xml_version(pcmk__output_t *out, bool extended) {
a216ed
-    xmlNodePtr node;
a216ed
     private_data_t *priv = out->priv;
a216ed
     CRM_ASSERT(priv != NULL);
a216ed
 
a216ed
-    node = pcmk__output_create_xml_node(out, "version");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "program", (pcmkXmlStr) "Pacemaker");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "version", (pcmkXmlStr) PACEMAKER_VERSION);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "author", (pcmkXmlStr) "Andrew Beekhof");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "build", (pcmkXmlStr) BUILD_VERSION);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "features", (pcmkXmlStr) CRM_FEATURES);
a216ed
+    pcmk__output_create_xml_node(out, "version",
a216ed
+                                 "program", "Pacemaker",
a216ed
+                                 "version", PACEMAKER_VERSION,
a216ed
+                                 "author", "Andrew Beekhof",
a216ed
+                                 "build", BUILD_VERSION,
a216ed
+                                 "features", CRM_FEATURES,
a216ed
+                                 NULL);
a216ed
 }
a216ed
 
a216ed
 G_GNUC_PRINTF(2, 3)
a216ed
@@ -277,7 +278,7 @@ xml_output_xml(pcmk__output_t *out, const char *name, const char *buf) {
a216ed
 
a216ed
     CRM_ASSERT(priv != NULL);
a216ed
 
a216ed
-    parent = pcmk__output_create_xml_node(out, name);
a216ed
+    parent = pcmk__output_create_xml_node(out, name, NULL);
a216ed
     cdata_node = xmlNewCDataBlock(getDocPtr(parent), (pcmkXmlStr) buf, strlen(buf));
a216ed
     xmlAddChild(parent, cdata_node);
a216ed
 }
a216ed
@@ -419,7 +420,7 @@ pcmk__mk_xml_output(char **argv) {
a216ed
 
a216ed
 xmlNodePtr
a216ed
 pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, name);
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, name, NULL);
a216ed
     pcmk__output_xml_push_parent(out, node);
a216ed
     return node;
a216ed
 }
a216ed
@@ -435,17 +436,24 @@ pcmk__output_xml_add_node(pcmk__output_t *out, xmlNodePtr node) {
a216ed
 }
a216ed
 
a216ed
 xmlNodePtr
a216ed
-pcmk__output_create_xml_node(pcmk__output_t *out, const char *name) {
a216ed
+pcmk__output_create_xml_node(pcmk__output_t *out, const char *name, ...) {
a216ed
+    xmlNodePtr node = NULL;
a216ed
     private_data_t *priv = out->priv;
a216ed
+    va_list args;
a216ed
 
a216ed
     CRM_ASSERT(priv != NULL);
a216ed
 
a216ed
-    return create_xml_node(g_queue_peek_tail(priv->parent_q), name);
a216ed
+    node = create_xml_node(g_queue_peek_tail(priv->parent_q), name);
a216ed
+    va_start(args, name);
a216ed
+    pcmk__xe_set_propv(node, args);
a216ed
+    va_end(args);
a216ed
+
a216ed
+    return node;
a216ed
 }
a216ed
 
a216ed
 xmlNodePtr
a216ed
 pcmk__output_create_xml_text_node(pcmk__output_t *out, const char *name, const char *content) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, name);
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, name, NULL);
a216ed
     xmlNodeSetContent(node, (pcmkXmlStr) content);
a216ed
     return node;
a216ed
 }
a216ed
diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c
a216ed
index c3b6b41..82520ee 100644
a216ed
--- a/lib/fencing/st_output.c
a216ed
+++ b/lib/fencing/st_output.c
a216ed
@@ -132,10 +132,11 @@ stonith__full_history_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         PCMK__OUTPUT_LIST_FOOTER(out, rc);
a216ed
     } else {
a216ed
-        xmlNodePtr node = pcmk__output_create_xml_node(out, "fence_history");
a216ed
         char *rc_s = crm_itoa(history_rc);
a216ed
 
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) rc_s);
a216ed
+        pcmk__output_create_xml_node(out, "fence_history",
a216ed
+                                     "status", rc_s,
a216ed
+                                     NULL);
a216ed
         free(rc_s);
a216ed
 
a216ed
         rc = pcmk_rc_ok;
a216ed
@@ -182,11 +183,12 @@ stonith__last_fenced_xml(pcmk__output_t *out, va_list args) {
a216ed
     time_t when = va_arg(args, time_t);
a216ed
 
a216ed
     if (when) {
a216ed
-        xmlNodePtr node = pcmk__output_create_xml_node(out, "last-fenced");
a216ed
         char *buf = time_t_string(when);
a216ed
 
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "target", (pcmkXmlStr) target);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "when", (pcmkXmlStr) buf);
a216ed
+        pcmk__output_create_xml_node(out, "last-fenced",
a216ed
+                                     "target", target,
a216ed
+                                     "when", buf,
a216ed
+                                     NULL);
a216ed
 
a216ed
         free(buf);
a216ed
         return pcmk_rc_ok;
a216ed
@@ -313,13 +315,19 @@ stonith__event_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("stonith-event", "stonith_history_t *", "gboolean", "gboolean")
a216ed
 int
a216ed
 stonith__event_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "fence_event");
a216ed
     stonith_history_t *event = va_arg(args, stonith_history_t *);
a216ed
     gboolean full_history G_GNUC_UNUSED = va_arg(args, gboolean);
a216ed
     gboolean later_succeeded G_GNUC_UNUSED = va_arg(args, gboolean);
a216ed
 
a216ed
     char *buf = NULL;
a216ed
 
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "fence_event",
a216ed
+                                                   "action", event->action,
a216ed
+                                                   "target", event->target,
a216ed
+                                                   "client", event->client,
a216ed
+                                                   "origin", event->origin,
a216ed
+                                                   NULL);
a216ed
+
a216ed
     switch (event->state) {
a216ed
         case st_failed:
a216ed
             xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) "failed");
a216ed
@@ -342,11 +350,6 @@ stonith__event_xml(pcmk__output_t *out, va_list args) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "delegate", (pcmkXmlStr) event->delegate);
a216ed
     }
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "action", (pcmkXmlStr) event->action);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "target", (pcmkXmlStr) event->target);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "client", (pcmkXmlStr) event->client);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "origin", (pcmkXmlStr) event->origin);
a216ed
-
a216ed
     if (event->state == st_failed || event->state == st_done) {
a216ed
         buf = time_t_string(event->completed);
a216ed
         xmlSetProp(node, (pcmkXmlStr) "completed", (pcmkXmlStr) buf);
a216ed
@@ -412,19 +415,20 @@ stonith__validate_agent_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("validate", "const char *", "const char *", "char *", "char *", "int")
a216ed
 int
a216ed
 stonith__validate_agent_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "validate");
a216ed
-
a216ed
     const char *agent = va_arg(args, const char *);
a216ed
     const char *device = va_arg(args, const char *);
a216ed
     char *output = va_arg(args, char *);
a216ed
     char *error_output = va_arg(args, char *);
a216ed
     int rc = va_arg(args, int);
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent);
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "validate",
a216ed
+                                                   "agent", agent,
a216ed
+                                                   "valid", pcmk__btoa(rc),
a216ed
+                                                   NULL);
a216ed
+
a216ed
     if (device != NULL) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "device", (pcmkXmlStr) device);
a216ed
     }
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "valid", (pcmkXmlStr) pcmk__btoa(rc));
a216ed
 
a216ed
     pcmk__output_xml_push_parent(out, node);
a216ed
     out->subprocess_output(out, rc, output, error_output);
a216ed
diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c
a216ed
index fd577c6..08753fb 100644
a216ed
--- a/lib/pacemaker/pcmk_output.c
a216ed
+++ b/lib/pacemaker/pcmk_output.c
a216ed
@@ -157,16 +157,15 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         if (pcmk_is_set(peer->flags, pe_rsc_allocating)) {
a216ed
             if (dependents == FALSE) {
a216ed
-                xmlNodePtr node;
a216ed
-
a216ed
                 if (!printed_header) {
a216ed
                     pcmk__output_xml_create_parent(out, "colocations");
a216ed
                     printed_header = true;
a216ed
                 }
a216ed
 
a216ed
-                node = pcmk__output_create_xml_node(out, "colocation");
a216ed
-                xmlSetProp(node, (pcmkXmlStr) "peer", (pcmkXmlStr) peer->id);
a216ed
-                xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) cons->id);
a216ed
+                pcmk__output_create_xml_node(out, "colocation",
a216ed
+                                             "peer", peer->id,
a216ed
+                                             "id", cons->id,
a216ed
+                                             NULL);
a216ed
             }
a216ed
             continue;
a216ed
         }
a216ed
@@ -187,18 +186,19 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         score = score2char(cons->score);
a216ed
         if (cons->role_rh > RSC_ROLE_STARTED) {
a216ed
-            xmlNodePtr node = pcmk__output_create_xml_node(out, "colocation");
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "peer", (pcmkXmlStr) peer->id);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) cons->id);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "score", (pcmkXmlStr) score);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "dependents",
a216ed
-                       (pcmkXmlStr) (dependents ? "needs" : "with"));
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "role", (pcmkXmlStr) role2text(cons->role_rh));
a216ed
+            pcmk__output_create_xml_node(out, "colocation",
a216ed
+                                         "peer", peer->id,
a216ed
+                                         "id", cons->id,
a216ed
+                                         "score", score,
a216ed
+                                         "dependents", dependents ? "needs" : "with",
a216ed
+                                         "role", role2text(cons->role_rh),
a216ed
+                                         NULL);
a216ed
         } else {
a216ed
-            xmlNodePtr node = pcmk__output_create_xml_node(out, "colocation");
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "peer", (pcmkXmlStr) peer->id);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) cons->id);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "score", (pcmkXmlStr) score);
a216ed
+            pcmk__output_create_xml_node(out, "colocation",
a216ed
+                                         "peer", peer->id,
a216ed
+                                         "id", cons->id,
a216ed
+                                         "score", score,
a216ed
+                                         NULL);
a216ed
         }
a216ed
 
a216ed
         free(score);
a216ed
@@ -263,11 +263,11 @@ static int locations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
             pe_node_t *node = (pe_node_t *) lpc2->data;
a216ed
             char *score = score2char(node->weight);
a216ed
 
a216ed
-            xmlNodePtr xml_node = pcmk__output_create_xml_node(out, "location");
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr) "host", (pcmkXmlStr) node->details->uname);
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr) "id", (pcmkXmlStr) cons->id);
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr) "score", (pcmkXmlStr) score);
a216ed
-
a216ed
+            pcmk__output_create_xml_node(out, "location",
a216ed
+                                         "host", node->details->uname,
a216ed
+                                         "id", cons->id,
a216ed
+                                         "score", score,
a216ed
+                                         NULL);
a216ed
             free(score);
a216ed
         }
a216ed
     }
a216ed
@@ -385,11 +385,11 @@ health_xml(pcmk__output_t *out, va_list args)
a216ed
     char *fsa_state = va_arg(args, char *);
a216ed
     char *result = va_arg(args, char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, crm_str(sys_from));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "node_name", (pcmkXmlStr) crm_str(host_from));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "state", (pcmkXmlStr) crm_str(fsa_state));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "result", (pcmkXmlStr) crm_str(result));
a216ed
-
a216ed
+    pcmk__output_create_xml_node(out, crm_str(sys_from),
a216ed
+                                 "node_name", crm_str(host_from),
a216ed
+                                 "state", crm_str(fsa_state),
a216ed
+                                 "result", crm_str(result),
a216ed
+                                 NULL);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
@@ -420,11 +420,10 @@ pacemakerd_health_xml(pcmk__output_t *out, va_list args)
a216ed
     char *state = va_arg(args, char *);
a216ed
     char *last_updated = va_arg(args, char *);
a216ed
 
a216ed
-
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, crm_str(sys_from));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "state", (pcmkXmlStr) crm_str(state));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "last_updated", (pcmkXmlStr) crm_str(last_updated));
a216ed
-
a216ed
+    pcmk__output_create_xml_node(out, crm_str(sys_from),
a216ed
+                                 "state", crm_str(state),
a216ed
+                                 "last_updated", crm_str(last_updated),
a216ed
+                                 NULL);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
@@ -449,9 +448,9 @@ dc_xml(pcmk__output_t *out, va_list args)
a216ed
 {
a216ed
     char *dc = va_arg(args, char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "dc");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "node_name", (pcmkXmlStr) crm_str(dc));
a216ed
-
a216ed
+    pcmk__output_create_xml_node(out, "dc",
a216ed
+                                 "node_name", crm_str(dc),
a216ed
+                                 NULL);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
@@ -517,11 +516,11 @@ crmadmin_node_xml(pcmk__output_t *out, va_list args)
a216ed
     char *name = va_arg(args, char *);
a216ed
     char *id = va_arg(args, char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "node");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "type", (pcmkXmlStr) (type ? type : "member"));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "name", (pcmkXmlStr) crm_str(name));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) crm_str(id));
a216ed
-
a216ed
+    pcmk__output_create_xml_node(out, "node",
a216ed
+                                 "type", type ? type : "member",
a216ed
+                                 "name", crm_str(name),
a216ed
+                                 "id", crm_str(id),
a216ed
+                                 NULL);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
diff --git a/lib/pengine/bundle.c b/lib/pengine/bundle.c
a216ed
index 4f6eac3..8a17aad 100644
a216ed
--- a/lib/pengine/bundle.c
a216ed
+++ b/lib/pengine/bundle.c
a216ed
@@ -1663,7 +1663,7 @@ pe__bundle_html(pcmk__output_t *out, va_list args)
a216ed
             }
a216ed
 
a216ed
             if (rc == pcmk_rc_no_output) {
a216ed
-                pcmk__output_create_xml_node(out, "br");
a216ed
+                pcmk__output_create_xml_node(out, "br", NULL);
a216ed
             }
a216ed
 
a216ed
             PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Container bundle%s: %s [%s]%s%s",
a216ed
@@ -1678,7 +1678,7 @@ pe__bundle_html(pcmk__output_t *out, va_list args)
a216ed
                 snprintf(buffer, LINE_MAX, " Replica[%d]", replica->offset);
a216ed
                 xmlNodeSetContent(pcmk__output_xml_peek_parent(out), (pcmkXmlStr) buffer);
a216ed
             }
a216ed
-            pcmk__output_create_xml_node(out, "br");
a216ed
+            pcmk__output_create_xml_node(out, "br", NULL);
a216ed
             out->begin_list(out, NULL, NULL, NULL);
a216ed
 
a216ed
             if (print_ip) {
a216ed
diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c
a216ed
index b91348f..a6f5970 100644
a216ed
--- a/lib/pengine/pe_output.c
a216ed
+++ b/lib/pengine/pe_output.c
a216ed
@@ -465,19 +465,19 @@ pe__ban_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("ban", "pe_node_t *", "pe__location_t *", "gboolean")
a216ed
 int
a216ed
 pe__ban_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "ban");
a216ed
     pe_node_t *pe_node = va_arg(args, pe_node_t *);
a216ed
     pe__location_t *location = va_arg(args, pe__location_t *);
a216ed
     gboolean print_clone_detail G_GNUC_UNUSED = va_arg(args, gboolean);
a216ed
 
a216ed
     char *weight_s = crm_itoa(pe_node->weight);
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) location->id);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "resource", (pcmkXmlStr) location->rsc_lh->id);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "node", (pcmkXmlStr) pe_node->details->uname);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "weight", (pcmkXmlStr) weight_s);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "master_only",
a216ed
-               (pcmkXmlStr) pcmk__btoa(location->role_filter == RSC_ROLE_MASTER));
a216ed
+    pcmk__output_create_xml_node(out, "ban",
a216ed
+                                 "id", location->id,
a216ed
+                                 "resource", location->rsc_lh->id,
a216ed
+                                 "node", pe_node->details->uname,
a216ed
+                                 "weight", weight_s,
a216ed
+                                 "master_only", pcmk__btoa(location->role_filter == RSC_ROLE_MASTER),
a216ed
+                                 NULL);
a216ed
 
a216ed
     free(weight_s);
a216ed
     return pcmk_rc_ok;
a216ed
@@ -486,8 +486,8 @@ pe__ban_xml(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-counts", "unsigned int", "int", "int", "int")
a216ed
 int
a216ed
 pe__cluster_counts_html(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "li");
a216ed
-    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "li");
a216ed
+    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
+    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
     unsigned int nnodes = va_arg(args, unsigned int);
a216ed
     int nresources = va_arg(args, int);
a216ed
@@ -582,8 +582,8 @@ pe__cluster_counts_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-counts", "unsigned int", "int", "int", "int")
a216ed
 int
a216ed
 pe__cluster_counts_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "nodes_configured");
a216ed
-    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "resources_configured");
a216ed
+    xmlNodePtr nodes_node = pcmk__output_create_xml_node(out, "nodes_configured", NULL);
a216ed
+    xmlNodePtr resources_node = pcmk__output_create_xml_node(out, "resources_configured", NULL);
a216ed
 
a216ed
     unsigned int nnodes = va_arg(args, unsigned int);
a216ed
     int nresources = va_arg(args, int);
a216ed
@@ -612,7 +612,7 @@ pe__cluster_counts_xml(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-dc", "pe_node_t *", "const char *", "const char *", "char *")
a216ed
 int
a216ed
 pe__cluster_dc_html(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
     pe_node_t *dc = va_arg(args, pe_node_t *);
a216ed
     const char *quorum = va_arg(args, const char *);
a216ed
@@ -665,22 +665,23 @@ pe__cluster_dc_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-dc", "pe_node_t *", "const char *", "const char *", "char *")
a216ed
 int
a216ed
 pe__cluster_dc_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "current_dc");
a216ed
-
a216ed
     pe_node_t *dc = va_arg(args, pe_node_t *);
a216ed
     const char *quorum = va_arg(args, const char *);
a216ed
     const char *dc_version_s = va_arg(args, const char *);
a216ed
     char *dc_name G_GNUC_UNUSED = va_arg(args, char *);
a216ed
 
a216ed
     if (dc) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "present", (pcmkXmlStr) "true");
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "version", (pcmkXmlStr) (dc_version_s ? dc_version_s : ""));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "name", (pcmkXmlStr) dc->details->uname);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) dc->details->id);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "with_quorum",
a216ed
-                   (pcmkXmlStr) pcmk__btoa(crm_is_true(quorum)));
a216ed
+        pcmk__output_create_xml_node(out, "current_dc",
a216ed
+                                     "present", "true",
a216ed
+                                     "version", dc_version_s ? dc_version_s : "",
a216ed
+                                     "name", dc->details->uname,
a216ed
+                                     "id", dc->details->id,
a216ed
+                                     "with_quorum", pcmk__btoa(crm_is_true(quorum)),
a216ed
+                                     NULL);
a216ed
     } else {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "present", (pcmkXmlStr) "false");
a216ed
+        pcmk__output_create_xml_node(out, "current_dc",
a216ed
+                                     "present", "false",
a216ed
+                                     NULL);
a216ed
     }
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
@@ -741,14 +742,14 @@ pe__cluster_options_html(pcmk__output_t *out, va_list args) {
a216ed
     }
a216ed
 
a216ed
     if (pcmk_is_set(data_set->flags, pe_flag_maintenance_mode)) {
a216ed
-        xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
a216ed
+        xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
         pcmk_create_html_node(node, "span", NULL, NULL, "Resource management: ");
a216ed
         pcmk_create_html_node(node, "span", NULL, "bold", "DISABLED");
a216ed
         pcmk_create_html_node(node, "span", NULL, NULL,
a216ed
                               " (the cluster will not attempt to start, stop, or recover services)");
a216ed
     } else if (pcmk_is_set(data_set->flags, pe_flag_stop_everything)) {
a216ed
-        xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
a216ed
+        xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
         pcmk_create_html_node(node, "span", NULL, NULL, "Resource management: ");
a216ed
         pcmk_create_html_node(node, "span", NULL, "bold", "STOPPED");
a216ed
@@ -817,48 +818,45 @@ pe__cluster_options_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-options", "pe_working_set_t *")
a216ed
 int
a216ed
 pe__cluster_options_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "cluster_options");
a216ed
     pe_working_set_t *data_set = va_arg(args, pe_working_set_t *);
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "stonith-enabled",
a216ed
-               (pcmkXmlStr) pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_stonith_enabled)));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "symmetric-cluster",
a216ed
-               (pcmkXmlStr) pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_symmetric_cluster)));
a216ed
+    const char *no_quorum_policy = NULL;
a216ed
 
a216ed
     switch (data_set->no_quorum_policy) {
a216ed
         case no_quorum_freeze:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "freeze");
a216ed
+            no_quorum_policy = "freeze";
a216ed
             break;
a216ed
 
a216ed
         case no_quorum_stop:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "stop");
a216ed
+            no_quorum_policy = "stop";
a216ed
             break;
a216ed
 
a216ed
         case no_quorum_demote:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "demote");
a216ed
+            no_quorum_policy = "demote";
a216ed
             break;
a216ed
 
a216ed
         case no_quorum_ignore:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "ignore");
a216ed
+            no_quorum_policy = "ignore";
a216ed
             break;
a216ed
 
a216ed
         case no_quorum_suicide:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "no-quorum-policy", (pcmkXmlStr) "suicide");
a216ed
+            no_quorum_policy = "suicide";
a216ed
             break;
a216ed
     }
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "maintenance-mode",
a216ed
-               (pcmkXmlStr) pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_maintenance_mode)));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "stop-all-resources",
a216ed
-               (pcmkXmlStr) pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_stop_everything)));
a216ed
-
a216ed
+    pcmk__output_create_xml_node(out, "cluster_options",
a216ed
+                                 "stonith-enabled", pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_stonith_enabled)),
a216ed
+                                 "symmetric-cluster", pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_symmetric_cluster)),
a216ed
+                                 "no-quorum-policy", no_quorum_policy,
a216ed
+                                 "maintenance-mode", pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_maintenance_mode)),
a216ed
+                                 "stop-all-resources", pcmk__btoa(pcmk_is_set(data_set->flags, pe_flag_stop_everything)),
a216ed
+                                 NULL);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
 PCMK__OUTPUT_ARGS("cluster-stack", "const char *")
a216ed
 int
a216ed
 pe__cluster_stack_html(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "li");
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
     const char *stack_s = va_arg(args, const char *);
a216ed
 
a216ed
     pcmk_create_html_node(node, "span", NULL, "bold", "Stack: ");
a216ed
@@ -878,10 +876,11 @@ pe__cluster_stack_text(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-stack", "const char *")
a216ed
 int
a216ed
 pe__cluster_stack_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "stack");
a216ed
     const char *stack_s = va_arg(args, const char *);
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "type", (pcmkXmlStr) stack_s);
a216ed
+    pcmk__output_create_xml_node(out, "stack",
a216ed
+                                 "type", stack_s,
a216ed
+                                 NULL);
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
@@ -889,8 +888,8 @@ pe__cluster_stack_xml(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-times", "const char *", "const char *", "const char *", "const char *")
a216ed
 int
a216ed
 pe__cluster_times_html(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr updated_node = pcmk__output_create_xml_node(out, "li");
a216ed
-    xmlNodePtr changed_node = pcmk__output_create_xml_node(out, "li");
a216ed
+    xmlNodePtr updated_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
+    xmlNodePtr changed_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
     const char *last_written = va_arg(args, const char *);
a216ed
     const char *user = va_arg(args, const char *);
a216ed
@@ -913,20 +912,20 @@ pe__cluster_times_html(pcmk__output_t *out, va_list args) {
a216ed
 PCMK__OUTPUT_ARGS("cluster-times", "const char *", "const char *", "const char *", "const char *")
a216ed
 int
a216ed
 pe__cluster_times_xml(pcmk__output_t *out, va_list args) {
a216ed
-    xmlNodePtr updated_node = pcmk__output_create_xml_node(out, "last_update");
a216ed
-    xmlNodePtr changed_node = pcmk__output_create_xml_node(out, "last_change");
a216ed
-
a216ed
     const char *last_written = va_arg(args, const char *);
a216ed
     const char *user = va_arg(args, const char *);
a216ed
     const char *client = va_arg(args, const char *);
a216ed
     const char *origin = va_arg(args, const char *);
a216ed
 
a216ed
-    xmlSetProp(updated_node, (pcmkXmlStr) "time",
a216ed
-               (pcmkXmlStr) pcmk__epoch2str(NULL));
a216ed
-    xmlSetProp(changed_node, (pcmkXmlStr) "time", (pcmkXmlStr) (last_written ? last_written : ""));
a216ed
-    xmlSetProp(changed_node, (pcmkXmlStr) "user", (pcmkXmlStr) (user ? user : ""));
a216ed
-    xmlSetProp(changed_node, (pcmkXmlStr) "client", (pcmkXmlStr) (client ? client : ""));
a216ed
-    xmlSetProp(changed_node, (pcmkXmlStr) "origin", (pcmkXmlStr) (origin ? origin : ""));
a216ed
+    pcmk__output_create_xml_node(out, "last_update",
a216ed
+                                 "time", pcmk__epoch2str(NULL),
a216ed
+                                 NULL);
a216ed
+    pcmk__output_create_xml_node(out, "last_change",
a216ed
+                                 "time", last_written ? last_written : "",
a216ed
+                                 "user", user ? user : "",
a216ed
+                                 "client", client ? client : "",
a216ed
+                                 "origin", origin ? origin : "",
a216ed
+                                 NULL);
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
@@ -972,20 +971,15 @@ pe__failed_action_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
     char *rc_s = crm_itoa(rc);
a216ed
     char *reason_s = crm_xml_escape(exit_reason ? exit_reason : "none");
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "failure");
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) (op_key ? "op_key" : "id"),
a216ed
-               (pcmkXmlStr) (op_key ? op_key : ID(xml_op)));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "node",
a216ed
-               (pcmkXmlStr) crm_element_value(xml_op, XML_ATTR_UNAME));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "exitstatus",
a216ed
-               (pcmkXmlStr) services_ocf_exitcode_str(rc));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "exitreason", (pcmkXmlStr) reason_s);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "exitcode", (pcmkXmlStr) rc_s);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "call",
a216ed
-               (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "status",
a216ed
-               (pcmkXmlStr) services_lrm_status_str(status));
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "failure",
a216ed
+                                                   op_key ? "op_key" : "id", op_key ? op_key : ID(xml_op),
a216ed
+                                                   "node", crm_element_value(xml_op, XML_ATTR_UNAME),
a216ed
+                                                   "exitstatus", services_ocf_exitcode_str(rc),
a216ed
+                                                   "exitreason", reason_s,
a216ed
+                                                   "exitcode", rc_s,
a216ed
+                                                   "call", crm_element_value(xml_op, XML_LRM_ATTR_CALLID),
a216ed
+                                                   "status", services_lrm_status_str(status),
a216ed
+                                                   NULL);
a216ed
 
a216ed
     if (last) {
a216ed
         guint interval_ms = 0;
a216ed
@@ -1037,7 +1031,7 @@ pe__node_html(pcmk__output_t *out, va_list args) {
a216ed
     char *buf = crm_strdup_printf("Node: %s", node_name);
a216ed
 
a216ed
     if (full) {
a216ed
-        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li");
a216ed
+        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
         pcmk_create_html_node(item_node, "span", NULL, NULL, buf);
a216ed
 
a216ed
@@ -1265,7 +1259,7 @@ pe__node_attribute_html(pcmk__output_t *out, va_list args) {
a216ed
     if (add_extra) {
a216ed
         int v = crm_parse_int(value, "0");
a216ed
         char *s = crm_strdup_printf("%s: %s", name, value);
a216ed
-        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li");
a216ed
+        xmlNodePtr item_node = pcmk__output_create_xml_node(out, "li", NULL);
a216ed
 
a216ed
         pcmk_create_html_node(item_node, "span", NULL, NULL, s);
a216ed
         free(s);
a216ed
@@ -1351,7 +1345,13 @@ pe__node_and_op_xml(pcmk__output_t *out, va_list args) {
a216ed
     int status = crm_parse_int(status_s, "0");
a216ed
     time_t last_change = 0;
a216ed
 
a216ed
-    xmlNode *node = pcmk__output_create_xml_node(out, "operation");
a216ed
+    xmlNode *node = pcmk__output_create_xml_node(out, "operation",
a216ed
+                                                 "op", op_key ? op_key : ID(xml_op),
a216ed
+                                                 "node", crm_element_value(xml_op, XML_ATTR_UNAME),
a216ed
+                                                 "call", crm_element_value(xml_op, XML_LRM_ATTR_CALLID),
a216ed
+                                                 "rc", crm_element_value(xml_op, XML_LRM_ATTR_RC),
a216ed
+                                                 "status", services_lrm_status_str(status),
a216ed
+                                                 NULL);
a216ed
 
a216ed
     rsc = pe_find_resource(data_set->resources, op_rsc);
a216ed
 
a216ed
@@ -1382,8 +1382,6 @@ pe__node_and_op_xml(pcmk__output_t *out, va_list args) {
a216ed
                    (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC));
a216ed
     }
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) services_lrm_status_str(status));
a216ed
-
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
@@ -1395,9 +1393,10 @@ pe__node_attribute_xml(pcmk__output_t *out, va_list args) {
a216ed
     gboolean add_extra = va_arg(args, gboolean);
a216ed
     int expected_score = va_arg(args, int);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "attribute");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "name", (pcmkXmlStr) name);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "value", (pcmkXmlStr) value);
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "attribute",
a216ed
+                                                   "name", name,
a216ed
+                                                   "value", value,
a216ed
+                                                   NULL);
a216ed
 
a216ed
     if (add_extra) {
a216ed
         char *buf = crm_itoa(expected_score);
a216ed
@@ -1630,13 +1629,14 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) {
a216ed
     int rc = va_arg(args, int);
a216ed
     gboolean print_timing = va_arg(args, gboolean);
a216ed
 
a216ed
-    char *rc_s = NULL;
a216ed
-
a216ed
-    xmlNodePtr node = pcmk__output_create_xml_node(out, "operation_history");
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "call",
a216ed
-               (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "task", (pcmkXmlStr) task);
a216ed
+    char *rc_s = crm_itoa(rc);
a216ed
+    xmlNodePtr node = pcmk__output_create_xml_node(out, "operation_history",
a216ed
+                                                   "call", crm_element_value(xml_op, XML_LRM_ATTR_CALLID),
a216ed
+                                                   "task", task,
a216ed
+                                                   "rc", rc_s,
a216ed
+                                                   "rc_text", services_ocf_exitcode_str(rc),
a216ed
+                                                   NULL);
a216ed
+    free(rc_s);
a216ed
 
a216ed
     if (interval_ms_s && !pcmk__str_eq(interval_ms_s, "0", pcmk__str_casei)) {
a216ed
         char *s = crm_strdup_printf("%sms", interval_ms_s);
a216ed
@@ -1921,11 +1921,11 @@ pe__ticket_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
     pe_ticket_t *ticket = va_arg(args, pe_ticket_t *);
a216ed
 
a216ed
-    node = pcmk__output_create_xml_node(out, "ticket");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) ticket->id);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) (ticket->granted ? "granted" : "revoked"));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "standby",
a216ed
-               (pcmkXmlStr) pcmk__btoa(ticket->standby));
a216ed
+    node = pcmk__output_create_xml_node(out, "ticket",
a216ed
+                                        "id", ticket->id,
a216ed
+                                        "status", ticket->granted ? "granted" : "revoked",
a216ed
+                                        "standby", pcmk__btoa(ticket->standby),
a216ed
+                                        NULL);
a216ed
 
a216ed
     if (ticket->last_granted > -1) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "last-granted",
a216ed
diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
a216ed
index 6303863..ca8bee2 100644
a216ed
--- a/tools/crm_resource_print.c
a216ed
+++ b/tools/crm_resource_print.c
a216ed
@@ -247,9 +247,9 @@ resource_check_xml(pcmk__output_t *out, va_list args) {
a216ed
     pe_resource_t *parent = uber_parent(checks->rsc);
a216ed
     int rc = pcmk_rc_no_output;
a216ed
 
a216ed
-    xmlNode *node = pcmk__output_create_xml_node(out, "check");
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) parent->id);
a216ed
+    xmlNode *node = pcmk__output_create_xml_node(out, "check",
a216ed
+                                                 "id", parent->id,
a216ed
+                                                 NULL);
a216ed
 
a216ed
     if (pcmk_is_set(checks->flags, rsc_remain_stopped)) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "remain_stopped", (pcmkXmlStr) "true");
a216ed
-- 
a216ed
1.8.3.1
a216ed
a216ed
a216ed
From 859b7f6daaddbbbfc102b968c4076dc03e03c100 Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Wed, 18 Nov 2020 13:42:40 -0500
a216ed
Subject: [PATCH 3/6] Refactor: libs: Set multiple XML properties at once.
a216ed
a216ed
This just wraps pcmk__xe_set_propv with another function that takes
a216ed
arguments directly, and then uses that function throughout the libraries
a216ed
wherever multiple properties are set at once.
a216ed
---
a216ed
 include/crm/common/xml_internal.h | 17 ++++++++++++++++
a216ed
 lib/common/output_html.c          |  6 ++++--
a216ed
 lib/common/output_xml.c           |  5 +++--
a216ed
 lib/common/xml.c                  |  9 +++++++++
a216ed
 lib/fencing/st_output.c           |  6 ++++--
a216ed
 lib/pengine/pe_output.c           | 42 +++++++++++++++------------------------
a216ed
 6 files changed, 53 insertions(+), 32 deletions(-)
a216ed
a216ed
diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h
a216ed
index c60fa51..13157c6 100644
a216ed
--- a/include/crm/common/xml_internal.h
a216ed
+++ b/include/crm/common/xml_internal.h
a216ed
@@ -235,7 +235,24 @@ pcmk__xe_next(const xmlNode *child)
a216ed
     return next;
a216ed
 }
a216ed
 
a216ed
+/*!
a216ed
+ * \internal
a216ed
+ * \brief Like pcmk__xe_set_props, but takes a va_list instead of
a216ed
+ *        arguments directly.
a216ed
+ */
a216ed
 void
a216ed
 pcmk__xe_set_propv(xmlNodePtr node, va_list pairs);
a216ed
 
a216ed
+/*!
a216ed
+ * \internal
a216ed
+ * \brief Add a NULL-terminated list of name/value pairs to the given
a216ed
+ *        XML node as properties.
a216ed
+ *
a216ed
+ * \param[in,out] node XML node to add properties to
a216ed
+ * \param[in]     ...  NULL-terminated list of name/value pairs
a216ed
+ */
a216ed
+void
a216ed
+pcmk__xe_set_props(xmlNodePtr node, ...)
a216ed
+G_GNUC_NULL_TERMINATED;
a216ed
+
a216ed
 #endif // PCMK__XML_INTERNAL__H
a216ed
diff --git a/lib/common/output_html.c b/lib/common/output_html.c
a216ed
index 77a5410..5daf831 100644
a216ed
--- a/lib/common/output_html.c
a216ed
+++ b/lib/common/output_html.c
a216ed
@@ -20,6 +20,7 @@
a216ed
 #include <crm/crm.h>
a216ed
 #include <crm/common/output_internal.h>
a216ed
 #include <crm/common/xml.h>
a216ed
+#include <crm/common/xml_internal.h>
a216ed
 
a216ed
 static const char *stylesheet_default =
a216ed
     ".bold { font-weight: bold }\n"
a216ed
@@ -153,8 +154,9 @@ finish_reset_common(pcmk__output_t *out, crm_exit_t exit_status, bool print) {
a216ed
 
a216ed
     if (stylesheet_link != NULL) {
a216ed
         htmlNodePtr link_node = create_xml_node(head_node, "link");
a216ed
-        xmlSetProp(link_node, (pcmkXmlStr) "rel", (pcmkXmlStr) "stylesheet");
a216ed
-        xmlSetProp(link_node, (pcmkXmlStr) "href", (pcmkXmlStr) stylesheet_link);
a216ed
+        pcmk__xe_set_props(link_node, "rel", "stylesheet",
a216ed
+                           "href", stylesheet_link,
a216ed
+                           NULL);
a216ed
     }
a216ed
 
a216ed
     xmlAddPrevSibling(priv->root->children, head_node);
a216ed
diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c
a216ed
index 80ee2de..133b892 100644
a216ed
--- a/lib/common/output_xml.c
a216ed
+++ b/lib/common/output_xml.c
a216ed
@@ -157,8 +157,9 @@ finish_reset_common(pcmk__output_t *out, crm_exit_t exit_status, bool print) {
a216ed
         char *rc_as_str = crm_itoa(exit_status);
a216ed
 
a216ed
         node = create_xml_node(priv->root, "status");
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "message", (pcmkXmlStr) crm_exit_str(exit_status));
a216ed
+        pcmk__xe_set_props(node, "code", rc_as_str,
a216ed
+                           "message", crm_exit_str(exit_status),
a216ed
+                           NULL);
a216ed
 
a216ed
         if (g_slist_length(priv->errors) > 0) {
a216ed
             xmlNodePtr errors_node = create_xml_node(node, "errors");
a216ed
diff --git a/lib/common/xml.c b/lib/common/xml.c
a216ed
index 61cac9f..e5de0d4 100644
a216ed
--- a/lib/common/xml.c
a216ed
+++ b/lib/common/xml.c
a216ed
@@ -2955,6 +2955,15 @@ pcmk__xe_set_propv(xmlNodePtr node, va_list pairs)
a216ed
     }
a216ed
 }
a216ed
 
a216ed
+void
a216ed
+pcmk__xe_set_props(xmlNodePtr node, ...)
a216ed
+{
a216ed
+    va_list pairs;
a216ed
+    va_start(pairs, node);
a216ed
+    pcmk__xe_set_propv(node, pairs);
a216ed
+    va_end(pairs);
a216ed
+}
a216ed
+
a216ed
 // Deprecated functions kept only for backward API compatibility
a216ed
 
a216ed
 xmlNode *find_entity(xmlNode *parent, const char *node_name, const char *id);
a216ed
diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c
a216ed
index 82520ee..65f8ec9 100644
a216ed
--- a/lib/fencing/st_output.c
a216ed
+++ b/lib/fencing/st_output.c
a216ed
@@ -15,6 +15,7 @@
a216ed
 #include <crm/common/util.h>
a216ed
 #include <crm/common/xml.h>
a216ed
 #include <crm/common/output_internal.h>
a216ed
+#include <crm/common/xml_internal.h>
a216ed
 #include <crm/fencing/internal.h>
a216ed
 #include <crm/pengine/internal.h>
a216ed
 
a216ed
@@ -339,8 +340,9 @@ stonith__event_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         default: {
a216ed
             char *state = crm_itoa(event->state);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) "pending");
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "extended-status", (pcmkXmlStr) state);
a216ed
+            pcmk__xe_set_props(node, "status", "pending",
a216ed
+                               "extended-status", state,
a216ed
+                               NULL);
a216ed
             free(state);
a216ed
             break;
a216ed
         }
a216ed
diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c
a216ed
index a6f5970..294f6e1 100644
a216ed
--- a/lib/pengine/pe_output.c
a216ed
+++ b/lib/pengine/pe_output.c
a216ed
@@ -9,6 +9,7 @@
a216ed
 
a216ed
 #include <crm_internal.h>
a216ed
 #include <crm/common/iso8601_internal.h>
a216ed
+#include <crm/common/xml_internal.h>
a216ed
 #include <crm/msg_xml.h>
a216ed
 #include <crm/pengine/internal.h>
a216ed
 
a216ed
@@ -994,14 +995,12 @@ pe__failed_action_xml(pcmk__output_t *out, va_list args) {
a216ed
         crm_time_set_timet(crm_when, &when);
a216ed
         rc_change = crm_time_as_string(crm_when, crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone);
a216ed
 
a216ed
-        xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE, (pcmkXmlStr) rc_change);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "queued",
a216ed
-                   (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_QUEUE));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "exec",
a216ed
-                   (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "interval", (pcmkXmlStr) s);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "task",
a216ed
-                   (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_TASK));
a216ed
+        pcmk__xe_set_props(node, XML_RSC_OP_LAST_CHANGE, rc_change,
a216ed
+                           "queued", crm_element_value(xml_op, XML_RSC_OP_T_QUEUE),
a216ed
+                           "exec", crm_element_value(xml_op, XML_RSC_OP_T_EXEC),
a216ed
+                           "interval", s,
a216ed
+                           "task", crm_element_value(xml_op, XML_LRM_ATTR_TASK),
a216ed
+                           NULL);
a216ed
 
a216ed
         free(s);
a216ed
         free(rc_change);
a216ed
@@ -1364,22 +1363,17 @@ pe__node_and_op_xml(pcmk__output_t *out, va_list args) {
a216ed
                                         pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) ? crm_element_value(rsc->xml, XML_AGENT_ATTR_PROVIDER) : "",
a216ed
                                         kind);
a216ed
 
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "rsc", (pcmkXmlStr) rsc_printable_id(rsc));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent_tuple);
a216ed
+        pcmk__xe_set_props(node, "rsc", rsc_printable_id(rsc),
a216ed
+                           "agent", agent_tuple,
a216ed
+                           NULL);
a216ed
         free(agent_tuple);
a216ed
     }
a216ed
 
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "op", (pcmkXmlStr) (op_key ? op_key : ID(xml_op)));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "node", (pcmkXmlStr) crm_element_value(xml_op, XML_ATTR_UNAME));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "call", (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_CALLID));
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "rc", (pcmkXmlStr) crm_element_value(xml_op, XML_LRM_ATTR_RC));
a216ed
-
a216ed
     if (crm_element_value_epoch(xml_op, XML_RSC_OP_LAST_CHANGE,
a216ed
                                 &last_change) == pcmk_ok) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE,
a216ed
-                   (pcmkXmlStr) crm_strip_trailing_newline(ctime(&last_change)));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_EXEC,
a216ed
-                   (pcmkXmlStr) crm_element_value(xml_op, XML_RSC_OP_T_EXEC));
a216ed
+        pcmk__xe_set_props(node, XML_RSC_OP_LAST_CHANGE, crm_strip_trailing_newline(ctime(&last_change)),
a216ed
+                           XML_RSC_OP_T_EXEC, crm_element_value(xml_op, XML_RSC_OP_T_EXEC),
a216ed
+                           NULL);
a216ed
     }
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
@@ -1679,10 +1673,6 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) {
a216ed
         }
a216ed
     }
a216ed
 
a216ed
-    rc_s = crm_itoa(rc);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "rc", (pcmkXmlStr) rc_s);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "rc_text", (pcmkXmlStr) services_ocf_exitcode_str(rc));
a216ed
-    free(rc_s);
a216ed
     return pcmk_rc_ok;
a216ed
 }
a216ed
 
a216ed
@@ -1746,9 +1736,9 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) {
a216ed
     } else if (all || failcount || last_failure > 0) {
a216ed
         char *migration_s = crm_itoa(rsc->migration_threshold);
a216ed
 
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "false");
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "migration-threshold",
a216ed
-                   (pcmkXmlStr) migration_s);
a216ed
+        pcmk__xe_set_props(node, "orphan", "false",
a216ed
+                           "migration-threshold", migration_s,
a216ed
+                           NULL);
a216ed
         free(migration_s);
a216ed
 
a216ed
         if (failcount > 0) {
a216ed
-- 
a216ed
1.8.3.1
a216ed
a216ed
a216ed
From 1c9b4af53445091c211a48e6027c102133498fbb Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Tue, 17 Nov 2020 14:26:33 -0500
a216ed
Subject: [PATCH 4/6] Refactor: libs: Set XML properties when creating a parent
a216ed
 node.
a216ed
a216ed
This is just like what's going on with pcmk__output_create_xml_node,
a216ed
except for pcmk__output_create_parent.
a216ed
---
a216ed
 include/crm/common/output_internal.h |  4 +++-
a216ed
 lib/common/output_html.c             |  6 +++---
a216ed
 lib/common/output_xml.c              | 22 ++++++++++++-------
a216ed
 lib/lrmd/lrmd_output.c               | 17 ++++++++-------
a216ed
 lib/pacemaker/pcmk_output.c          | 16 +++++++-------
a216ed
 lib/pengine/bundle.c                 |  2 +-
a216ed
 lib/pengine/pe_output.c              | 10 +++++----
a216ed
 tools/crm_resource_print.c           | 41 ++++++++++++++++++------------------
a216ed
 8 files changed, 64 insertions(+), 54 deletions(-)
a216ed
a216ed
diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
a216ed
index 1923c1a..4bf6b3d 100644
a216ed
--- a/include/crm/common/output_internal.h
a216ed
+++ b/include/crm/common/output_internal.h
a216ed
@@ -626,9 +626,11 @@ pcmk__indented_vprintf(pcmk__output_t *out, const char *format, va_list args) G_
a216ed
  *
a216ed
  * \param[in,out] out  The output functions structure.
a216ed
  * \param[in]     name The name of the node to be created.
a216ed
+ * \param[in]     ...     Name/value pairs to set as XML properties.
a216ed
  */
a216ed
 xmlNodePtr
a216ed
-pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name);
a216ed
+pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...)
a216ed
+G_GNUC_NULL_TERMINATED;
a216ed
 
a216ed
 /*!
a216ed
  * \internal
a216ed
diff --git a/lib/common/output_html.c b/lib/common/output_html.c
a216ed
index 5daf831..cf51af4 100644
a216ed
--- a/lib/common/output_html.c
a216ed
+++ b/lib/common/output_html.c
a216ed
@@ -102,7 +102,7 @@ html_init(pcmk__output_t *out) {
a216ed
     g_queue_push_tail(priv->parent_q, priv->root);
a216ed
     priv->errors = NULL;
a216ed
 
a216ed
-    pcmk__output_xml_create_parent(out, "body");
a216ed
+    pcmk__output_xml_create_parent(out, "body", NULL);
a216ed
 
a216ed
     return true;
a216ed
 }
a216ed
@@ -294,7 +294,7 @@ html_begin_list(pcmk__output_t *out, const char *singular_noun,
a216ed
      */
a216ed
     q_len = g_queue_get_length(priv->parent_q);
a216ed
     if (q_len > 2) {
a216ed
-        pcmk__output_xml_create_parent(out, "li");
a216ed
+        pcmk__output_xml_create_parent(out, "li", NULL);
a216ed
     }
a216ed
 
a216ed
     if (format != NULL) {
a216ed
@@ -316,7 +316,7 @@ html_begin_list(pcmk__output_t *out, const char *singular_noun,
a216ed
         free(buf);
a216ed
     }
a216ed
 
a216ed
-    node = pcmk__output_xml_create_parent(out, "ul");
a216ed
+    node = pcmk__output_xml_create_parent(out, "ul", NULL);
a216ed
     g_queue_push_tail(priv->parent_q, node);
a216ed
 }
a216ed
 
a216ed
diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c
a216ed
index 133b892..6d92625 100644
a216ed
--- a/lib/common/output_xml.c
a216ed
+++ b/lib/common/output_xml.c
a216ed
@@ -217,8 +217,9 @@ xml_subprocess_output(pcmk__output_t *out, int exit_status,
a216ed
 
a216ed
     rc_as_str = crm_itoa(exit_status);
a216ed
 
a216ed
-    node = pcmk__output_xml_create_parent(out, "command");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "code", (pcmkXmlStr) rc_as_str);
a216ed
+    node = pcmk__output_xml_create_parent(out, "command",
a216ed
+                                          "code", rc_as_str,
a216ed
+                                          NULL);
a216ed
 
a216ed
     if (proc_stdout != NULL) {
a216ed
         child_node = pcmk_create_xml_text_node(node, "output", proc_stdout);
a216ed
@@ -312,12 +313,11 @@ xml_begin_list(pcmk__output_t *out, const char *singular_noun, const char *plura
a216ed
     }
a216ed
 
a216ed
     if (legacy_xml || simple_list) {
a216ed
-        pcmk__output_xml_create_parent(out, name);
a216ed
+        pcmk__output_xml_create_parent(out, name, NULL);
a216ed
     } else {
a216ed
-        xmlNodePtr list_node = NULL;
a216ed
-
a216ed
-        list_node = pcmk__output_xml_create_parent(out, "list");
a216ed
-        xmlSetProp(list_node, (pcmkXmlStr) "name", (pcmkXmlStr) name);
a216ed
+        pcmk__output_xml_create_parent(out, "list",
a216ed
+                                       "name", name,
a216ed
+                                       NULL);
a216ed
     }
a216ed
 
a216ed
     g_free(name);
a216ed
@@ -420,8 +420,14 @@ pcmk__mk_xml_output(char **argv) {
a216ed
 }
a216ed
 
a216ed
 xmlNodePtr
a216ed
-pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name) {
a216ed
+pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...) {
a216ed
+    va_list args;
a216ed
     xmlNodePtr node = pcmk__output_create_xml_node(out, name, NULL);
a216ed
+
a216ed
+    va_start(args, name);
a216ed
+    pcmk__xe_set_propv(node, args);
a216ed
+    va_end(args);
a216ed
+
a216ed
     pcmk__output_xml_push_parent(out, node);
a216ed
     return node;
a216ed
 }
a216ed
diff --git a/lib/lrmd/lrmd_output.c b/lib/lrmd/lrmd_output.c
a216ed
index 7dc0709..c01cc5e 100644
a216ed
--- a/lib/lrmd/lrmd_output.c
a216ed
+++ b/lib/lrmd/lrmd_output.c
a216ed
@@ -46,9 +46,9 @@ lrmd__alternatives_list_xml(pcmk__output_t *out, va_list args) {
a216ed
     lrmd_list_t *list = va_arg(args, lrmd_list_t *);
a216ed
     const char *agent_spec = va_arg(args, const char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers");
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "for", (pcmkXmlStr) agent_spec);
a216ed
+    pcmk__output_xml_create_parent(out, "providers",
a216ed
+                                   "for", agent_spec,
a216ed
+                                   NULL);
a216ed
     return xml_list(out, list, "provider");
a216ed
 }
a216ed
 
a216ed
@@ -68,8 +68,9 @@ lrmd__agents_list_xml(pcmk__output_t *out, va_list args) {
a216ed
     const char *agent_spec = va_arg(args, const char *);
a216ed
     char *provider = va_arg(args, char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_xml_create_parent(out, "agents");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "standard", (pcmkXmlStr) agent_spec);
a216ed
+    xmlNodePtr node = pcmk__output_xml_create_parent(out, "agents",
a216ed
+                                                     "standard", agent_spec,
a216ed
+                                                     NULL);
a216ed
 
a216ed
     if (!pcmk__str_empty(provider)) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "provider", (pcmkXmlStr) provider);
a216ed
@@ -99,9 +100,9 @@ lrmd__providers_list_xml(pcmk__output_t *out, va_list args) {
a216ed
     lrmd_list_t *list = va_arg(args, lrmd_list_t *);
a216ed
     const char *agent_spec = va_arg(args, const char *);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers");
a216ed
-
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "standard", (pcmkXmlStr) "ocf");
a216ed
+    xmlNodePtr node = pcmk__output_xml_create_parent(out, "providers",
a216ed
+                                                     "standard", "ocf",
a216ed
+                                                     NULL);
a216ed
 
a216ed
     if (agent_spec != NULL) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent_spec);
a216ed
diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c
a216ed
index 08753fb..74a7c59 100644
a216ed
--- a/lib/pacemaker/pcmk_output.c
a216ed
+++ b/lib/pacemaker/pcmk_output.c
a216ed
@@ -158,7 +158,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
         if (pcmk_is_set(peer->flags, pe_rsc_allocating)) {
a216ed
             if (dependents == FALSE) {
a216ed
                 if (!printed_header) {
a216ed
-                    pcmk__output_xml_create_parent(out, "colocations");
a216ed
+                    pcmk__output_xml_create_parent(out, "colocations", NULL);
a216ed
                     printed_header = true;
a216ed
                 }
a216ed
 
a216ed
@@ -172,7 +172,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         if (dependents && recursive) {
a216ed
             if (!printed_header) {
a216ed
-                pcmk__output_xml_create_parent(out, "colocations");
a216ed
+                pcmk__output_xml_create_parent(out, "colocations", NULL);
a216ed
                 printed_header = true;
a216ed
             }
a216ed
 
a216ed
@@ -180,7 +180,7 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
         }
a216ed
 
a216ed
         if (!printed_header) {
a216ed
-            pcmk__output_xml_create_parent(out, "colocations");
a216ed
+            pcmk__output_xml_create_parent(out, "colocations", NULL);
a216ed
             printed_header = true;
a216ed
         }
a216ed
 
a216ed
@@ -252,7 +252,7 @@ static int locations_list_xml(pcmk__output_t *out, va_list args) {
a216ed
     GListPtr lpc = NULL;
a216ed
     GListPtr list = rsc->rsc_location;
a216ed
 
a216ed
-    pcmk__output_xml_create_parent(out, "locations");
a216ed
+    pcmk__output_xml_create_parent(out, "locations", NULL);
a216ed
 
a216ed
     for (lpc = list; lpc != NULL; lpc = lpc->next) {
a216ed
         pe__location_t *cons = lpc->data;
a216ed
@@ -323,7 +323,6 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) {
a216ed
     gboolean recursive = va_arg(args, gboolean);
a216ed
 
a216ed
     GListPtr lpc = NULL;
a216ed
-    xmlNodePtr node = NULL;
a216ed
     xmlNode *cib_constraints = get_object_root(XML_CIB_TAG_CONSTRAINTS,
a216ed
                                                data_set->input);
a216ed
 
a216ed
@@ -338,12 +337,13 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) {
a216ed
         pe__clear_resource_flags(r, pe_rsc_allocating);
a216ed
     }
a216ed
 
a216ed
-    pcmk__output_xml_create_parent(out, "constraints");
a216ed
+    pcmk__output_xml_create_parent(out, "constraints", NULL);
a216ed
 
a216ed
     out->message(out, "colocations-list", rsc, TRUE, recursive);
a216ed
 
a216ed
-    node = pcmk__output_xml_create_parent(out, "resource");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id);
a216ed
+    pcmk__output_xml_create_parent(out, "resource",
a216ed
+                                   "id", rsc->id,
a216ed
+                                   NULL);
a216ed
     out->message(out, "locations-list", rsc);
a216ed
     pcmk__output_xml_pop_parent(out);
a216ed
 
a216ed
diff --git a/lib/pengine/bundle.c b/lib/pengine/bundle.c
a216ed
index 8a17aad..543f5dc 100644
a216ed
--- a/lib/pengine/bundle.c
a216ed
+++ b/lib/pengine/bundle.c
a216ed
@@ -1672,7 +1672,7 @@ pe__bundle_html(pcmk__output_t *out, va_list args)
a216ed
                                      pcmk_is_set(rsc->flags, pe_rsc_unique) ? " (unique)" : "",
a216ed
                                      pcmk_is_set(rsc->flags, pe_rsc_managed) ? "" : " (unmanaged)");
a216ed
 
a216ed
-            pcmk__output_xml_create_parent(out, "li");
a216ed
+            pcmk__output_xml_create_parent(out, "li", NULL);
a216ed
 
a216ed
             if (pcmk__list_of_multiple(bundle_data->replicas)) {
a216ed
                 snprintf(buffer, LINE_MAX, " Replica[%d]", replica->offset);
a216ed
diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c
a216ed
index 294f6e1..470b025 100644
a216ed
--- a/lib/pengine/pe_output.c
a216ed
+++ b/lib/pengine/pe_output.c
a216ed
@@ -1214,8 +1214,9 @@ pe__node_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         out->end_list(out);
a216ed
     } else {
a216ed
-        xmlNodePtr parent = pcmk__output_xml_create_parent(out, "node");
a216ed
-        xmlSetProp(parent, (pcmkXmlStr) "name", (pcmkXmlStr) node->details->uname);
a216ed
+        pcmk__output_xml_create_parent(out, "node",
a216ed
+                                       "name", node->details->uname,
a216ed
+                                       NULL);
a216ed
     }
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
@@ -1728,8 +1729,9 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) {
a216ed
     time_t last_failure = va_arg(args, int);
a216ed
     gboolean as_header = va_arg(args, gboolean);
a216ed
 
a216ed
-    xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource_history");
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc_id);
a216ed
+    xmlNodePtr node = pcmk__output_xml_create_parent(out, "resource_history",
a216ed
+                                                     "id", rsc_id,
a216ed
+                                                     NULL);
a216ed
 
a216ed
     if (rsc == NULL) {
a216ed
         xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "true");
a216ed
diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
a216ed
index ca8bee2..a33356f 100644
a216ed
--- a/tools/crm_resource_print.c
a216ed
+++ b/tools/crm_resource_print.c
a216ed
@@ -324,9 +324,9 @@ resource_search_xml(pcmk__output_t *out, va_list args)
a216ed
     pe_resource_t *rsc = va_arg(args, pe_resource_t *);
a216ed
     gchar *requested_name = va_arg(args, gchar *);
a216ed
 
a216ed
-    xmlNode *xml_node = pcmk__output_xml_create_parent(out, "nodes");
a216ed
-
a216ed
-    xmlSetProp(xml_node, (pcmkXmlStr) "resource", (pcmkXmlStr) requested_name);
a216ed
+    pcmk__output_xml_create_parent(out, "nodes",
a216ed
+                                   "resource", requested_name,
a216ed
+                                   NULL);
a216ed
 
a216ed
     for (GListPtr lpc = nodes; lpc != NULL; lpc = lpc->next) {
a216ed
         pe_node_t *node = (pe_node_t *) lpc->data;
a216ed
@@ -435,24 +435,23 @@ resource_why_xml(pcmk__output_t *out, va_list args)
a216ed
 
a216ed
     const char *host_uname = (node == NULL)? NULL : node->details->uname;
a216ed
 
a216ed
-    xmlNode *xml_node = pcmk__output_xml_create_parent(out, "reason");
a216ed
+    xmlNode *xml_node = pcmk__output_xml_create_parent(out, "reason", NULL);
a216ed
 
a216ed
     if ((rsc == NULL) && (host_uname == NULL)) {
a216ed
         GListPtr lpc = NULL;
a216ed
         GListPtr hosts = NULL;
a216ed
 
a216ed
-        pcmk__output_xml_create_parent(out, "resources");
a216ed
+        pcmk__output_xml_create_parent(out, "resources", NULL);
a216ed
 
a216ed
         for (lpc = resources; lpc != NULL; lpc = lpc->next) {
a216ed
             pe_resource_t *rsc = (pe_resource_t *) lpc->data;
a216ed
-            xmlNode *rsc_node = NULL;
a216ed
 
a216ed
             rsc->fns->location(rsc, &hosts, TRUE);
a216ed
 
a216ed
-            rsc_node = pcmk__output_xml_create_parent(out, "resource");
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id);
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "running",
a216ed
-                       (pcmkXmlStr) pcmk__btoa(hosts != NULL));
a216ed
+            pcmk__output_xml_create_parent(out, "resource",
a216ed
+                                           "id", rsc->id,
a216ed
+                                           "running", pcmk__btoa(hosts != NULL),
a216ed
+                                           NULL);
a216ed
 
a216ed
             cli_resource_check(out, cib_conn, rsc);
a216ed
             pcmk__output_xml_pop_parent(out);
a216ed
@@ -476,16 +475,16 @@ resource_why_xml(pcmk__output_t *out, va_list args)
a216ed
         GListPtr unactiveResources = pcmk__subtract_lists(allResources, activeResources, (GCompareFunc) strcmp);
a216ed
         GListPtr lpc = NULL;
a216ed
 
a216ed
-        pcmk__output_xml_create_parent(out, "resources");
a216ed
+        pcmk__output_xml_create_parent(out, "resources", NULL);
a216ed
 
a216ed
         for (lpc = activeResources; lpc != NULL; lpc = lpc->next) {
a216ed
             pe_resource_t *rsc = (pe_resource_t *) lpc->data;
a216ed
-            xmlNode *rsc_node = NULL;
a216ed
 
a216ed
-            rsc_node = pcmk__output_xml_create_parent(out, "resource");
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id);
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "running", (pcmkXmlStr) "true");
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "host", (pcmkXmlStr) host_uname);
a216ed
+            pcmk__output_xml_create_parent(out, "resource",
a216ed
+                                           "id", rsc->id,
a216ed
+                                           "running", "true",
a216ed
+                                           "host", host_uname,
a216ed
+                                           NULL);
a216ed
 
a216ed
             cli_resource_check(out, cib_conn, rsc);
a216ed
             pcmk__output_xml_pop_parent(out);
a216ed
@@ -493,12 +492,12 @@ resource_why_xml(pcmk__output_t *out, va_list args)
a216ed
 
a216ed
         for(lpc = unactiveResources; lpc != NULL; lpc = lpc->next) {
a216ed
             pe_resource_t *rsc = (pe_resource_t *) lpc->data;
a216ed
-            xmlNode *rsc_node = NULL;
a216ed
 
a216ed
-            rsc_node = pcmk__output_xml_create_parent(out, "resource");
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "id", (pcmkXmlStr) rsc->id);
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "running", (pcmkXmlStr) "false");
a216ed
-            xmlSetProp(rsc_node, (pcmkXmlStr) "host", (pcmkXmlStr) host_uname);
a216ed
+            pcmk__output_xml_create_parent(out, "resource",
a216ed
+                                           "id", rsc->id,
a216ed
+                                           "running", "false",
a216ed
+                                           "host", host_uname,
a216ed
+                                           NULL);
a216ed
 
a216ed
             cli_resource_check(out, cib_conn, rsc);
a216ed
             pcmk__output_xml_pop_parent(out);
a216ed
-- 
a216ed
1.8.3.1
a216ed
a216ed
a216ed
From 29cd349a15dff8975499e650d070934aa4c68e3f Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Wed, 18 Nov 2020 14:21:11 -0500
a216ed
Subject: [PATCH 5/6] Refactor: libs: Remove most uses of xmlSetProp.
a216ed
a216ed
We can use crm_xml_add to do this instead, and that function will take
a216ed
ACLs in account too (though, none of these call sites actually care
a216ed
about ACLs).  I've left calls in most of the various XML manipulating
a216ed
functions because those seem more intentional.
a216ed
---
a216ed
 lib/common/output_html.c   | 14 +++++++-------
a216ed
 lib/common/output_xml.c    | 14 +++++++-------
a216ed
 lib/common/xml.c           |  4 ++--
a216ed
 lib/fencing/st_output.c    | 10 +++++-----
a216ed
 lib/lrmd/lrmd_output.c     |  4 ++--
a216ed
 lib/pengine/pe_output.c    | 38 ++++++++++++++++----------------------
a216ed
 tools/crm_resource_print.c | 15 +++++++--------
a216ed
 7 files changed, 46 insertions(+), 53 deletions(-)
a216ed
a216ed
diff --git a/lib/common/output_html.c b/lib/common/output_html.c
a216ed
index cf51af4..542d863 100644
a216ed
--- a/lib/common/output_html.c
a216ed
+++ b/lib/common/output_html.c
a216ed
@@ -98,7 +98,7 @@ html_init(pcmk__output_t *out) {
a216ed
     priv->root = create_xml_node(NULL, "html");
a216ed
     xmlCreateIntSubset(priv->root->doc, (pcmkXmlStr) "html", NULL, NULL);
a216ed
 
a216ed
-    xmlSetProp(priv->root, (pcmkXmlStr) "lang", (pcmkXmlStr) "en");
a216ed
+    crm_xml_add(priv->root, "lang", "en");
a216ed
     g_queue_push_tail(priv->parent_q, priv->root);
a216ed
     priv->errors = NULL;
a216ed
 
a216ed
@@ -137,7 +137,7 @@ finish_reset_common(pcmk__output_t *out, crm_exit_t exit_status, bool print) {
a216ed
     }
a216ed
 
a216ed
     charset_node = create_xml_node(head_node, "meta");
a216ed
-    xmlSetProp(charset_node, (pcmkXmlStr) "charset", (pcmkXmlStr) "utf-8");
a216ed
+    crm_xml_add(charset_node, "charset", "utf-8");
a216ed
 
a216ed
     /* Add any extra header nodes the caller might have created. */
a216ed
     for (int i = 0; i < g_slist_length(extra_headers); i++) {
a216ed
@@ -275,7 +275,7 @@ html_output_xml(pcmk__output_t *out, const char *name, const char *buf) {
a216ed
     CRM_ASSERT(priv != NULL);
a216ed
 
a216ed
     node = pcmk__output_create_html_node(out, "pre", NULL, NULL, buf);
a216ed
-    xmlSetProp(node, (pcmkXmlStr) "lang", (pcmkXmlStr) "xml");
a216ed
+    crm_xml_add(node, "lang", "xml");
a216ed
 }
a216ed
 
a216ed
 G_GNUC_PRINTF(4, 5)
a216ed
@@ -340,7 +340,7 @@ html_list_item(pcmk__output_t *out, const char *name, const char *format, ...) {
a216ed
     free(buf);
a216ed
 
a216ed
     if (name != NULL) {
a216ed
-        xmlSetProp(item_node, (pcmkXmlStr) "class", (pcmkXmlStr) name);
a216ed
+        crm_xml_add(item_node, "class", name);
a216ed
     }
a216ed
 }
a216ed
 
a216ed
@@ -417,11 +417,11 @@ pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, con
a216ed
     htmlNodePtr node = pcmk__output_create_xml_text_node(out, element_name, text);
a216ed
 
a216ed
     if (class_name != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "class", (pcmkXmlStr) class_name);
a216ed
+        crm_xml_add(node, "class", class_name);
a216ed
     }
a216ed
 
a216ed
     if (id != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) id);
a216ed
+        crm_xml_add(node, "id", id);
a216ed
     }
a216ed
 
a216ed
     return node;
a216ed
@@ -444,7 +444,7 @@ pcmk__html_add_header(const char *name, ...) {
a216ed
         }
a216ed
 
a216ed
         value = va_arg(ap, char *);
a216ed
-        xmlSetProp(header_node, (pcmkXmlStr) key, (pcmkXmlStr) value);
a216ed
+        crm_xml_add(header_node, key, value);
a216ed
     }
a216ed
 
a216ed
     extra_headers = g_slist_append(extra_headers, header_node);
a216ed
diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c
a216ed
index 6d92625..0053979 100644
a216ed
--- a/lib/common/output_xml.c
a216ed
+++ b/lib/common/output_xml.c
a216ed
@@ -107,13 +107,13 @@ xml_init(pcmk__output_t *out) {
a216ed
 
a216ed
     if (legacy_xml) {
a216ed
         priv->root = create_xml_node(NULL, "crm_mon");
a216ed
-        xmlSetProp(priv->root, (pcmkXmlStr) "version", (pcmkXmlStr) VERSION);
a216ed
+        crm_xml_add(priv->root, "version", VERSION);
a216ed
     } else {
a216ed
         priv->root = create_xml_node(NULL, "pacemaker-result");
a216ed
-        xmlSetProp(priv->root, (pcmkXmlStr) "api-version", (pcmkXmlStr) PCMK__API_VERSION);
a216ed
+        crm_xml_add(priv->root, "api-version", PCMK__API_VERSION);
a216ed
 
a216ed
         if (out->request != NULL) {
a216ed
-            xmlSetProp(priv->root, (pcmkXmlStr) "request", (pcmkXmlStr) out->request);
a216ed
+            crm_xml_add(priv->root, "request", out->request);
a216ed
         }
a216ed
     }
a216ed
 
a216ed
@@ -223,12 +223,12 @@ xml_subprocess_output(pcmk__output_t *out, int exit_status,
a216ed
 
a216ed
     if (proc_stdout != NULL) {
a216ed
         child_node = pcmk_create_xml_text_node(node, "output", proc_stdout);
a216ed
-        xmlSetProp(child_node, (pcmkXmlStr) "source", (pcmkXmlStr) "stdout");
a216ed
+        crm_xml_add(child_node, "source", "stdout");
a216ed
     }
a216ed
 
a216ed
     if (proc_stderr != NULL) {
a216ed
         child_node = pcmk_create_xml_text_node(node, "output", proc_stderr);
a216ed
-        xmlSetProp(child_node, (pcmkXmlStr) "source", (pcmkXmlStr) "stderr");
a216ed
+        crm_xml_add(child_node, "source", "stderr");
a216ed
     }
a216ed
 
a216ed
     pcmk__output_xml_add_node(out, node);
a216ed
@@ -343,7 +343,7 @@ xml_list_item(pcmk__output_t *out, const char *name, const char *format, ...) {
a216ed
     item_node = pcmk__output_create_xml_text_node(out, "item", buf);
a216ed
 
a216ed
     if (name != NULL) {
a216ed
-        xmlSetProp(item_node, (pcmkXmlStr) "name", (pcmkXmlStr) name);
a216ed
+        crm_xml_add(item_node, "name", name);
a216ed
     }
a216ed
 
a216ed
     free(buf);
a216ed
@@ -368,7 +368,7 @@ xml_end_list(pcmk__output_t *out) {
a216ed
 
a216ed
         node = g_queue_pop_tail(priv->parent_q);
a216ed
         buf = crm_strdup_printf("%lu", xmlChildElementCount(node));
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "count", (pcmkXmlStr) buf);
a216ed
+        crm_xml_add(node, "count", buf);
a216ed
         free(buf);
a216ed
     }
a216ed
 }
a216ed
diff --git a/lib/common/xml.c b/lib/common/xml.c
a216ed
index e5de0d4..abb120c 100644
a216ed
--- a/lib/common/xml.c
a216ed
+++ b/lib/common/xml.c
a216ed
@@ -703,11 +703,11 @@ pcmk_create_html_node(xmlNode * parent, const char *element_name, const char *id
a216ed
     xmlNode *node = pcmk_create_xml_text_node(parent, element_name, text);
a216ed
 
a216ed
     if (class_name != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "class", (pcmkXmlStr) class_name);
a216ed
+        crm_xml_add(node, "class", class_name);
a216ed
     }
a216ed
 
a216ed
     if (id != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) id);
a216ed
+        crm_xml_add(node, "id", id);
a216ed
     }
a216ed
 
a216ed
     return node;
a216ed
diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c
a216ed
index 65f8ec9..04f4b83 100644
a216ed
--- a/lib/fencing/st_output.c
a216ed
+++ b/lib/fencing/st_output.c
a216ed
@@ -331,11 +331,11 @@ stonith__event_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
     switch (event->state) {
a216ed
         case st_failed:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) "failed");
a216ed
+            crm_xml_add(node, "status", "failed");
a216ed
             break;
a216ed
 
a216ed
         case st_done:
a216ed
-            xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) "success");
a216ed
+            crm_xml_add(node, "status", "success");
a216ed
             break;
a216ed
 
a216ed
         default: {
a216ed
@@ -349,12 +349,12 @@ stonith__event_xml(pcmk__output_t *out, va_list args) {
a216ed
     }
a216ed
 
a216ed
     if (event->delegate != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "delegate", (pcmkXmlStr) event->delegate);
a216ed
+        crm_xml_add(node, "delegate", event->delegate);
a216ed
     }
a216ed
 
a216ed
     if (event->state == st_failed || event->state == st_done) {
a216ed
         buf = time_t_string(event->completed);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "completed", (pcmkXmlStr) buf);
a216ed
+        crm_xml_add(node, "completed", buf);
a216ed
         free(buf);
a216ed
     }
a216ed
 
a216ed
@@ -429,7 +429,7 @@ stonith__validate_agent_xml(pcmk__output_t *out, va_list args) {
a216ed
                                                    NULL);
a216ed
 
a216ed
     if (device != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "device", (pcmkXmlStr) device);
a216ed
+        crm_xml_add(node, "device", device);
a216ed
     }
a216ed
 
a216ed
     pcmk__output_xml_push_parent(out, node);
a216ed
diff --git a/lib/lrmd/lrmd_output.c b/lib/lrmd/lrmd_output.c
a216ed
index c01cc5e..dfcf3fa 100644
a216ed
--- a/lib/lrmd/lrmd_output.c
a216ed
+++ b/lib/lrmd/lrmd_output.c
a216ed
@@ -73,7 +73,7 @@ lrmd__agents_list_xml(pcmk__output_t *out, va_list args) {
a216ed
                                                      NULL);
a216ed
 
a216ed
     if (!pcmk__str_empty(provider)) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "provider", (pcmkXmlStr) provider);
a216ed
+        crm_xml_add(node, "provider", provider);
a216ed
     }
a216ed
 
a216ed
     return xml_list(out, list, "agent");
a216ed
@@ -105,7 +105,7 @@ lrmd__providers_list_xml(pcmk__output_t *out, va_list args) {
a216ed
                                                      NULL);
a216ed
 
a216ed
     if (agent_spec != NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "agent", (pcmkXmlStr) agent_spec);
a216ed
+        crm_xml_add(node, "agent", agent_spec);
a216ed
     }
a216ed
 
a216ed
     return xml_list(out, list, "provider");
a216ed
diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c
a216ed
index 470b025..ecb5c2c 100644
a216ed
--- a/lib/pengine/pe_output.c
a216ed
+++ b/lib/pengine/pe_output.c
a216ed
@@ -415,7 +415,7 @@ pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name
a216ed
         const char *param_name = va_arg(args, const char *);
a216ed
         const char *param_value = va_arg(args, const char *);
a216ed
         if (param_name && param_value) {
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr)param_name, (pcmkXmlStr)param_value);
a216ed
+            crm_xml_add(xml_node, param_name, param_value);
a216ed
         }
a216ed
     };
a216ed
     va_end(args);
a216ed
@@ -592,19 +592,19 @@ pe__cluster_counts_xml(pcmk__output_t *out, va_list args) {
a216ed
     int nblocked = va_arg(args, int);
a216ed
 
a216ed
     char *s = crm_itoa(nnodes);
a216ed
-    xmlSetProp(nodes_node, (pcmkXmlStr) "number", (pcmkXmlStr) s);
a216ed
+    crm_xml_add(nodes_node, "number", s);
a216ed
     free(s);
a216ed
 
a216ed
     s = crm_itoa(nresources);
a216ed
-    xmlSetProp(resources_node, (pcmkXmlStr) "number", (pcmkXmlStr) s);
a216ed
+    crm_xml_add(resources_node, "number", s);
a216ed
     free(s);
a216ed
 
a216ed
     s = crm_itoa(ndisabled);
a216ed
-    xmlSetProp(resources_node, (pcmkXmlStr) "disabled", (pcmkXmlStr) s);
a216ed
+    crm_xml_add(resources_node, "disabled", s);
a216ed
     free(s);
a216ed
 
a216ed
     s = crm_itoa(nblocked);
a216ed
-    xmlSetProp(resources_node, (pcmkXmlStr) "blocked", (pcmkXmlStr) s);
a216ed
+    crm_xml_add(resources_node, "blocked", s);
a216ed
     free(s);
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
@@ -1196,8 +1196,7 @@ pe__node_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
         if (pe__is_guest_node(node)) {
a216ed
             xmlNodePtr xml_node = pcmk__output_xml_peek_parent(out);
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr) "id_as_resource",
a216ed
-                                 (pcmkXmlStr) node->details->remote_rsc->container->id);
a216ed
+            crm_xml_add(xml_node, "id_as_resource", node->details->remote_rsc->container->id);
a216ed
         }
a216ed
 
a216ed
         if (group_by_node) {
a216ed
@@ -1395,7 +1394,7 @@ pe__node_attribute_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
     if (add_extra) {
a216ed
         char *buf = crm_itoa(expected_score);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "expected", (pcmkXmlStr) buf);
a216ed
+        crm_xml_add(node, "expected", buf);
a216ed
         free(buf);
a216ed
     }
a216ed
 
a216ed
@@ -1635,7 +1634,7 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) {
a216ed
 
a216ed
     if (interval_ms_s && !pcmk__str_eq(interval_ms_s, "0", pcmk__str_casei)) {
a216ed
         char *s = crm_strdup_printf("%sms", interval_ms_s);
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "interval", (pcmkXmlStr) s);
a216ed
+        crm_xml_add(node, "interval", s);
a216ed
         free(s);
a216ed
     }
a216ed
 
a216ed
@@ -1646,8 +1645,7 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) {
a216ed
         if (value) {
a216ed
             time_t int_value = (time_t) crm_parse_int(value, NULL);
a216ed
             if (int_value > 0) {
a216ed
-                xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_CHANGE,
a216ed
-                           (pcmkXmlStr) pcmk__epoch2str(&int_value));
a216ed
+                crm_xml_add(node, XML_RSC_OP_LAST_CHANGE, pcmk__epoch2str(&int_value));
a216ed
             }
a216ed
         }
a216ed
 
a216ed
@@ -1655,21 +1653,20 @@ pe__op_history_xml(pcmk__output_t *out, va_list args) {
a216ed
         if (value) {
a216ed
             time_t int_value = (time_t) crm_parse_int(value, NULL);
a216ed
             if (int_value > 0) {
a216ed
-                xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_LAST_RUN,
a216ed
-                           (pcmkXmlStr) pcmk__epoch2str(&int_value));
a216ed
+                crm_xml_add(node, XML_RSC_OP_LAST_RUN, pcmk__epoch2str(&int_value));
a216ed
             }
a216ed
         }
a216ed
 
a216ed
         value = crm_element_value(xml_op, XML_RSC_OP_T_EXEC);
a216ed
         if (value) {
a216ed
             char *s = crm_strdup_printf("%sms", value);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_EXEC, (pcmkXmlStr) s);
a216ed
+            crm_xml_add(node, XML_RSC_OP_T_EXEC, s);
a216ed
             free(s);
a216ed
         }
a216ed
         value = crm_element_value(xml_op, XML_RSC_OP_T_QUEUE);
a216ed
         if (value) {
a216ed
             char *s = crm_strdup_printf("%sms", value);
a216ed
-            xmlSetProp(node, (pcmkXmlStr) XML_RSC_OP_T_QUEUE, (pcmkXmlStr) s);
a216ed
+            crm_xml_add(node, XML_RSC_OP_T_QUEUE, s);
a216ed
             free(s);
a216ed
         }
a216ed
     }
a216ed
@@ -1734,7 +1731,7 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) {
a216ed
                                                      NULL);
a216ed
 
a216ed
     if (rsc == NULL) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "orphan", (pcmkXmlStr) "true");
a216ed
+        crm_xml_add(node, "orphan", "true");
a216ed
     } else if (all || failcount || last_failure > 0) {
a216ed
         char *migration_s = crm_itoa(rsc->migration_threshold);
a216ed
 
a216ed
@@ -1746,14 +1743,12 @@ pe__resource_history_xml(pcmk__output_t *out, va_list args) {
a216ed
         if (failcount > 0) {
a216ed
             char *s = crm_itoa(failcount);
a216ed
 
a216ed
-            xmlSetProp(node, (pcmkXmlStr) PCMK__FAIL_COUNT_PREFIX,
a216ed
-                       (pcmkXmlStr) s);
a216ed
+            crm_xml_add(node, PCMK__FAIL_COUNT_PREFIX, s);
a216ed
             free(s);
a216ed
         }
a216ed
 
a216ed
         if (last_failure > 0) {
a216ed
-            xmlSetProp(node, (pcmkXmlStr) PCMK__LAST_FAILURE_PREFIX,
a216ed
-                       (pcmkXmlStr) pcmk__epoch2str(&last_failure));
a216ed
+            crm_xml_add(node, PCMK__LAST_FAILURE_PREFIX, pcmk__epoch2str(&last_failure));
a216ed
         }
a216ed
     }
a216ed
 
a216ed
@@ -1920,8 +1915,7 @@ pe__ticket_xml(pcmk__output_t *out, va_list args) {
a216ed
                                         NULL);
a216ed
 
a216ed
     if (ticket->last_granted > -1) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "last-granted",
a216ed
-                   (pcmkXmlStr) pcmk__epoch2str(&ticket->last_granted));
a216ed
+        crm_xml_add(node, "last-granted", pcmk__epoch2str(&ticket->last_granted));
a216ed
     }
a216ed
 
a216ed
     return pcmk_rc_ok;
a216ed
diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c
a216ed
index a33356f..cb06879 100644
a216ed
--- a/tools/crm_resource_print.c
a216ed
+++ b/tools/crm_resource_print.c
a216ed
@@ -252,19 +252,19 @@ resource_check_xml(pcmk__output_t *out, va_list args) {
a216ed
                                                  NULL);
a216ed
 
a216ed
     if (pcmk_is_set(checks->flags, rsc_remain_stopped)) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "remain_stopped", (pcmkXmlStr) "true");
a216ed
+        crm_xml_add(node, "remain_stopped", "true");
a216ed
     }
a216ed
 
a216ed
     if (pcmk_is_set(checks->flags, rsc_unpromotable)) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "promotable", (pcmkXmlStr) "false");
a216ed
+        crm_xml_add(node, "promotable", "false");
a216ed
     }
a216ed
 
a216ed
     if (pcmk_is_set(checks->flags, rsc_unmanaged)) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "unmanaged", (pcmkXmlStr) "true");
a216ed
+        crm_xml_add(node, "unmanaged", "true");
a216ed
     }
a216ed
 
a216ed
     if (checks->lock_node) {
a216ed
-        xmlSetProp(node, (pcmkXmlStr) "locked-to", (pcmkXmlStr) checks->lock_node);
a216ed
+        crm_xml_add(node, "locked-to", checks->lock_node);
a216ed
     }
a216ed
 
a216ed
     return rc;
a216ed
@@ -333,7 +333,7 @@ resource_search_xml(pcmk__output_t *out, va_list args)
a216ed
         xmlNode *sub_node = pcmk__output_create_xml_text_node(out, "node", node->details->uname);
a216ed
 
a216ed
         if (!pe_rsc_is_clone(rsc) && rsc->fns->state(rsc, TRUE) == RSC_ROLE_MASTER) {
a216ed
-            xmlSetProp(sub_node, (pcmkXmlStr) "state", (pcmkXmlStr) "promoted");
a216ed
+            crm_xml_add(sub_node, "state", "promoted");
a216ed
         }
a216ed
     }
a216ed
 
a216ed
@@ -463,7 +463,7 @@ resource_why_xml(pcmk__output_t *out, va_list args)
a216ed
 
a216ed
     } else if ((rsc != NULL) && (host_uname != NULL)) {
a216ed
         if (resource_is_running_on(rsc, host_uname)) {
a216ed
-            xmlSetProp(xml_node, (pcmkXmlStr) "running_on", (pcmkXmlStr) host_uname);
a216ed
+            crm_xml_add(xml_node, "running_on", host_uname);
a216ed
         }
a216ed
 
a216ed
         cli_resource_check(out, cib_conn, rsc);
a216ed
@@ -512,8 +512,7 @@ resource_why_xml(pcmk__output_t *out, va_list args)
a216ed
         GListPtr hosts = NULL;
a216ed
 
a216ed
         rsc->fns->location(rsc, &hosts, TRUE);
a216ed
-        xmlSetProp(xml_node, (pcmkXmlStr) "running",
a216ed
-                   (pcmkXmlStr) pcmk__btoa(hosts != NULL));
a216ed
+        crm_xml_add(xml_node, "running", pcmk__btoa(hosts != NULL));
a216ed
         cli_resource_check(out, cib_conn, rsc);
a216ed
         g_list_free(hosts);
a216ed
     }
a216ed
-- 
a216ed
1.8.3.1
a216ed
a216ed
a216ed
From 55b4f7a17001280fcf1b8dc7bc4c1afd3a6a46d1 Mon Sep 17 00:00:00 2001
a216ed
From: Chris Lumens <clumens@redhat.com>
a216ed
Date: Wed, 18 Nov 2020 14:31:31 -0500
a216ed
Subject: [PATCH 6/6] Test: cts: Update order of attributes in crm_mon output.
a216ed
a216ed
This has changed due to some of the code reorganization as a result of
a216ed
trying to set as many attributes as possible when an xmlNode is created.
a216ed
The resulting crm_mon output should still validate, however, since
a216ed
attribute order should not be enforced by the schema.
a216ed
---
a216ed
 cts/cli/regression.crm_mon.exp | 254 ++++++++++++++++++++---------------------
a216ed
 1 file changed, 127 insertions(+), 127 deletions(-)
a216ed
a216ed
diff --git a/cts/cli/regression.crm_mon.exp b/cts/cli/regression.crm_mon.exp
a216ed
index edcdda6..e9f36ad 100644
a216ed
--- a/cts/cli/regression.crm_mon.exp
a216ed
+++ b/cts/cli/regression.crm_mon.exp
a216ed
@@ -125,39 +125,39 @@ Active Resources:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="18" task="start" exec-time="6020ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="6015ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="18" task="start" rc="0" rc_text="ok" exec-time="6020ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="6015ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Public-IP" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="16" task="stop" exec-time="6048ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="16" task="stop" rc="0" rc_text="ok" exec-time="6048ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -285,39 +285,39 @@ Active Resources:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="18" task="start" exec-time="6020ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="6015ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="18" task="start" rc="0" rc_text="ok" exec-time="6020ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="6015ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Public-IP" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="16" task="stop" exec-time="6048ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="16" task="stop" rc="0" rc_text="ok" exec-time="6048ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -766,39 +766,39 @@ Negative Location Constraints:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="18" task="start" exec-time="6020ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="6015ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="18" task="start" rc="0" rc_text="ok" exec-time="6020ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="6015ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Public-IP" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="16" task="stop" exec-time="6048ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="16" task="stop" rc="0" rc_text="ok" exec-time="6048ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -928,19 +928,19 @@ Negative Location Constraints:
a216ed
   <node_history>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="16" task="stop" exec-time="6048ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="16" task="stop" rc="0" rc_text="ok" exec-time="6048ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1081,22 +1081,22 @@ Negative Location Constraints:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="18" task="start" exec-time="6020ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="6015ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="18" task="start" rc="0" rc_text="ok" exec-time="6020ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="6015ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Public-IP" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1171,8 +1171,8 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1371,8 +1371,8 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="19" task="monitor" interval="60000ms" exec-time="24ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="19" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="24ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1452,10 +1452,10 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="Public-IP" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1529,7 +1529,7 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="Email" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1611,14 +1611,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1700,14 +1700,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -1786,14 +1786,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="11" task="start" exec-time="2044ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="12" task="monitor" interval="10000ms" exec-time="2031ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="11" task="start" rc="0" rc_text="ok" exec-time="2044ms" queue-time="0ms"/>
a216ed
+        <operation_history call="12" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2031ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="17" task="start" exec-time="2038ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="18" task="monitor" interval="10000ms" exec-time="2034ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="17" task="start" rc="0" rc_text="ok" exec-time="2038ms" queue-time="0ms"/>
a216ed
+        <operation_history call="18" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="2034ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2257,14 +2257,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2368,14 +2368,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2457,14 +2457,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2568,14 +2568,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2657,14 +2657,14 @@ Operations:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="mysql-proxy" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -2770,46 +2770,46 @@ Active Resources:
a216ed
   <node_history>
a216ed
     <node name="cluster02">
a216ed
       <resource_history id="httpd-bundle-ip-192.168.122.131" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-docker-0" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-0" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="30000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="30000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="dummy-1" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="20" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="20" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-ip-192.168.122.132" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-docker-1" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-1" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="30000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="30000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
     <node name="httpd-bundle-0">
a216ed
       <resource_history id="httpd" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="1" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="1" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
@@ -3051,24 +3051,24 @@ Full List of Resources:
a216ed
   <node_history>
a216ed
     <node name="cluster01">
a216ed
       <resource_history id="Fencing" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="15" task="start" exec-time="36ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="20" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="15" task="start" rc="0" rc_text="ok" exec-time="36ms" queue-time="0ms"/>
a216ed
+        <operation_history call="20" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="ping" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="10000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="10000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-ip-192.168.122.132" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-docker-1" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="60000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="60000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
       <resource_history id="httpd-bundle-1" orphan="false" migration-threshold="1000000">
a216ed
-        <operation_history call="2" task="start" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
-        <operation_history call="3" task="monitor" interval="30000ms" exec-time="0ms" queue-time="0ms" rc="0" rc_text="ok"/>
a216ed
+        <operation_history call="2" task="start" rc="0" rc_text="ok" exec-time="0ms" queue-time="0ms"/>
a216ed
+        <operation_history call="3" task="monitor" rc="0" rc_text="ok" interval="30000ms" exec-time="0ms" queue-time="0ms"/>
a216ed
       </resource_history>
a216ed
     </node>
a216ed
   </node_history>
a216ed
-- 
a216ed
1.8.3.1
a216ed