Blame SOURCES/037-clone-detection.patch

60de42
From 2c91b4a54d5b70204409ea2f7e92fbc7748e4257 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Fri, 17 Mar 2017 16:32:45 -0500
60de42
Subject: [PATCH 1/5] Log: various: minor improvements
60de42
60de42
add missing newline, reword to avoid singular/plural issue,
60de42
and correct misspellings (in log messages and comments)
60de42
---
60de42
 configure.ac                 | 2 +-
60de42
 crmd/join_dc.c               | 2 +-
60de42
 crmd/lrm.c                   | 4 ++--
60de42
 fencing/remote.c             | 4 ++--
60de42
 include/crm/pengine/status.h | 8 ++++----
60de42
 lib/cluster/election.c       | 2 +-
60de42
 lib/common/xml.c             | 2 +-
60de42
 lib/pengine/utils.c          | 4 ++--
60de42
 lrmd/lrmd.c                  | 5 +++--
60de42
 pengine/graph.c              | 2 +-
60de42
 pengine/native.c             | 2 +-
60de42
 tools/fake_transition.c      | 4 ++--
60de42
 12 files changed, 21 insertions(+), 20 deletions(-)
60de42
60de42
diff --git a/configure.ac b/configure.ac
60de42
index b1465a3..687d3fe 100644
60de42
--- a/configure.ac
60de42
+++ b/configure.ac
60de42
@@ -1759,7 +1759,7 @@ if test "$GCC" != yes; then
60de42
 else
60de42
         CFLAGS="$CFLAGS -ggdb"
60de42
 
60de42
-dnl when we don't have diagnostic push / pull we can't explicitely disable
60de42
+dnl When we don't have diagnostic push / pull, we can't explicitly disable
60de42
 dnl checking for nonliteral formats in the places where they occur on purpose
60de42
 dnl thus we disable nonliteral format checking globally as we are aborting
60de42
 dnl on warnings. 
60de42
diff --git a/crmd/join_dc.c b/crmd/join_dc.c
60de42
index 6af0884..d5ecc55 100644
60de42
--- a/crmd/join_dc.c
60de42
+++ b/crmd/join_dc.c
60de42
@@ -385,7 +385,7 @@ do_dc_join_finalize(long long action,
60de42
     /* This we can do straight away and avoid clients timing us out
60de42
      *  while we compute the latest CIB
60de42
      */
60de42
-    crm_debug("Finializing join-%d for %d clients",
60de42
+    crm_debug("Finalizing join-%d for %d clients",
60de42
               current_join_id, crmd_join_phase_count(crm_join_integrated));
60de42
 
60de42
     crmd_join_phase_log(LOG_INFO);
60de42
diff --git a/crmd/lrm.c b/crmd/lrm.c
60de42
index 2d553cd..f7aefbf 100644
60de42
--- a/crmd/lrm.c
60de42
+++ b/crmd/lrm.c
60de42
@@ -231,8 +231,8 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_
60de42
         }
60de42
 
60de42
     } else if (did_rsc_op_fail(op, target_rc)) {
60de42
-        /* We must store failed monitors here
60de42
-         * - otherwise the block below will cause them to be forgetten them when a stop happens
60de42
+        /* Store failed monitors here, otherwise the block below will cause them
60de42
+         * to be forgotten when a stop happens.
60de42
          */
60de42
         if (entry->failed) {
60de42
             lrmd_free_event(entry->failed);
60de42
diff --git a/fencing/remote.c b/fencing/remote.c
60de42
index 6c47f65..4a47d49 100644
60de42
--- a/fencing/remote.c
60de42
+++ b/fencing/remote.c
60de42
@@ -1558,13 +1558,13 @@ call_remote_stonith(remote_fencing_op_t * op, st_query_result_t * peer)
60de42
         }
60de42
 
60de42
         if (op->state == st_query) {
60de42
-           crm_info("None of the %d peers have devices capable of fencing (%s) %s for %s (%d)",
60de42
+           crm_info("No peers (out of %d) have devices capable of fencing (%s) %s for %s (%d)",
60de42
                    op->replies, op->action, op->target, op->client_name,
60de42
                    op->state);
60de42
 
60de42
             rc = -ENODEV;
60de42
         } else {
60de42
-           crm_info("None of the %d peers are capable of fencing (%s) %s for %s (%d)",
60de42
+           crm_info("No peers (out of %d) are capable of fencing (%s) %s for %s (%d)",
60de42
                    op->replies, op->action, op->target, op->client_name,
60de42
                    op->state);
60de42
         }
60de42
diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h
60de42
index 79e4572..e748792 100644
60de42
--- a/include/crm/pengine/status.h
60de42
+++ b/include/crm/pengine/status.h
60de42
@@ -343,8 +343,8 @@ struct pe_action_s {
60de42
      * requires at minimum X number of cloned instances to be running
60de42
      * before an order dependency can run. Another option that uses
60de42
      * this is 'require-all=false' in ordering constrants. This option
60de42
-     * says "only required one instance of a resource to start before
60de42
-     * allowing dependencies to start" basicall require-all=false is
60de42
+     * says "only require one instance of a resource to start before
60de42
+     * allowing dependencies to start" -- basically, require-all=false is
60de42
      * the same as clone-min=1.
60de42
      */
60de42
 
60de42
@@ -354,8 +354,8 @@ struct pe_action_s {
60de42
      * to be considered runnable */ 
60de42
     int required_runnable_before;
60de42
 
60de42
-    GListPtr actions_before;    /* action_warpper_t* */
60de42
-    GListPtr actions_after;     /* action_warpper_t* */
60de42
+    GListPtr actions_before;    /* action_wrapper_t* */
60de42
+    GListPtr actions_after;     /* action_wrapper_t* */
60de42
 };
60de42
 
60de42
 struct ticket_s {
60de42
diff --git a/lib/cluster/election.c b/lib/cluster/election.c
60de42
index a8902d3..a5bb1da 100644
60de42
--- a/lib/cluster/election.c
60de42
+++ b/lib/cluster/election.c
60de42
@@ -461,7 +461,7 @@ election_count_vote(election_t *e, xmlNode *vote, bool can_win)
60de42
         int peers = 1 + g_hash_table_size(crm_peer_cache);
60de42
 
60de42
         /* If every node has to vote down every other node, thats N*(N-1) total elections
60de42
-         * Allow some leway before _really_ complaining
60de42
+         * Allow some leeway before _really_ complaining
60de42
          */
60de42
         election_wins++;
60de42
         if (election_wins > (peers * peers)) {
60de42
diff --git a/lib/common/xml.c b/lib/common/xml.c
60de42
index 6dce4cb..c566956 100644
60de42
--- a/lib/common/xml.c
60de42
+++ b/lib/common/xml.c
60de42
@@ -3190,7 +3190,7 @@ crm_xml_escape(const char *text)
60de42
      * converted back to their escape sequences.
60de42
      *
60de42
      * However xmlNodeDump() is randomly dog slow, even with the same
60de42
-     * input. So we need to replicate the escapeing in our custom
60de42
+     * input. So we need to replicate the escaping in our custom
60de42
      * version so that the result can be re-parsed by xmlCtxtReadDoc()
60de42
      * when necessary.
60de42
      */
60de42
diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
60de42
index 2b53999..74856fe 100644
60de42
--- a/lib/pengine/utils.c
60de42
+++ b/lib/pengine/utils.c
60de42
@@ -1099,8 +1099,8 @@ pe_free_action(action_t * action)
60de42
     if (action == NULL) {
60de42
         return;
60de42
     }
60de42
-    g_list_free_full(action->actions_before, free);     /* action_warpper_t* */
60de42
-    g_list_free_full(action->actions_after, free);      /* action_warpper_t* */
60de42
+    g_list_free_full(action->actions_before, free);     /* action_wrapper_t* */
60de42
+    g_list_free_full(action->actions_after, free);      /* action_wrapper_t* */
60de42
     if (action->extra) {
60de42
         g_hash_table_destroy(action->extra);
60de42
     }
60de42
diff --git a/lrmd/lrmd.c b/lrmd/lrmd.c
60de42
index 5669d34..c874aa5 100644
60de42
--- a/lrmd/lrmd.c
60de42
+++ b/lrmd/lrmd.c
60de42
@@ -1464,9 +1464,10 @@ free_rsc(gpointer data)
60de42
 
60de42
         if (is_stonith) {
60de42
             cmd->lrmd_op_status = PCMK_LRM_OP_CANCELLED;
60de42
-            /* if a stonith cmd is in-flight, mark just mark it as cancelled,
60de42
+            /* If a stonith command is in-flight, just mark it as cancelled;
60de42
              * it is not safe to finalize/free the cmd until the stonith api
60de42
-             * says it has either completed or timed out.*/ 
60de42
+             * says it has either completed or timed out.
60de42
+             */
60de42
             if (rsc->active != cmd) {
60de42
                 cmd_finalize(cmd, NULL);
60de42
             }
60de42
diff --git a/pengine/graph.c b/pengine/graph.c
60de42
index 81d8355..8098f9e 100644
60de42
--- a/pengine/graph.c
60de42
+++ b/pengine/graph.c
60de42
@@ -1005,7 +1005,7 @@ action2xml(action_t * action, gboolean as_input, pe_working_set_t *data_set)
60de42
                  *
60de42
                  * If anyone toggles the unique flag to 'on', the
60de42
                  * 'instance free' name will correspond to an orphan
60de42
-                 * and fall into the claus above instead
60de42
+                 * and fall into the clause above instead
60de42
                  */
60de42
                 crm_xml_add(rsc_xml, XML_ATTR_ID, xml_id);
60de42
                 if (action->rsc->clone_name && safe_str_neq(xml_id, action->rsc->clone_name)) {
60de42
diff --git a/pengine/native.c b/pengine/native.c
60de42
index 52eba4f..a968fc7 100644
60de42
--- a/pengine/native.c
60de42
+++ b/pengine/native.c
60de42
@@ -1647,7 +1647,7 @@ colocation_match(resource_t * rsc_lh, resource_t * rsc_rh, rsc_colocation_t * co
60de42
 
60de42
     } else if (constraint->score < 0) {
60de42
         /* nothing to do:
60de42
-         *   anti-colocation with something thats not running
60de42
+         *   anti-colocation with something that is not running
60de42
          */
60de42
         return;
60de42
     }
60de42
diff --git a/tools/fake_transition.c b/tools/fake_transition.c
60de42
index 251f9bb..26f55a2 100644
60de42
--- a/tools/fake_transition.c
60de42
+++ b/tools/fake_transition.c
60de42
@@ -70,8 +70,8 @@ inject_transient_attr(xmlNode * cib_node, const char *name, const char *value)
60de42
     char *nvp_id = crm_concat(name, node_uuid, '-');
60de42
 
60de42
     node_path = xmlGetNodePath(cib_node);
60de42
-    quiet_log("Injecting attribute %s=%s into %s '%s'", name, value, node_path,
60de42
-             ID(cib_node));
60de42
+    quiet_log(" + Injecting attribute %s=%s into %s '%s'\n",
60de42
+              name, value, node_path, ID(cib_node));
60de42
     free(node_path);
60de42
 
60de42
     attrs = first_named_child(cib_node, XML_TAG_TRANSIENT_NODEATTRS);
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From 9251c17d97250103679aada63729d54a9537874f Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Fri, 17 Mar 2017 16:58:48 -0500
60de42
Subject: [PATCH 2/5] Log: libcrmcluster,crmd: log join phase as text rather
60de42
 than integer
60de42
60de42
---
60de42
 crmd/join_dc.c        | 51 +++++++++++++++------------------------------------
60de42
 include/crm/cluster.h | 14 ++++++++++++++
60de42
 2 files changed, 29 insertions(+), 36 deletions(-)
60de42
60de42
diff --git a/crmd/join_dc.c b/crmd/join_dc.c
60de42
index d5ecc55..71311de 100644
60de42
--- a/crmd/join_dc.c
60de42
+++ b/crmd/join_dc.c
60de42
@@ -45,8 +45,9 @@ crm_update_peer_join(const char *source, crm_node_t * node, enum crm_join_phase
60de42
     enum crm_join_phase last = 0;
60de42
 
60de42
     if(node == NULL) {
60de42
-        crm_err("Could not update join because node not specified" CRM_XS
60de42
-                " join-%u source=%s phase=%d", source, current_join_id, phase);
60de42
+        crm_err("Could not update join because node not specified"
60de42
+                CRM_XS " join-%u source=%s phase=%s",
60de42
+                current_join_id, source, crm_join_phase_str(phase));
60de42
         return;
60de42
     }
60de42
 
60de42
@@ -58,23 +59,21 @@ crm_update_peer_join(const char *source, crm_node_t * node, enum crm_join_phase
60de42
     last = node->join;
60de42
 
60de42
     if(phase == last) {
60de42
-        crm_trace("%s: Node %s[%u] - join-%u phase still %u",
60de42
-                  source, node->uname, node->id, current_join_id, last);
60de42
+        crm_trace("%s: Node %s[%u] - join-%u phase still %s",
60de42
+                  source, node->uname, node->id, current_join_id,
60de42
+                  crm_join_phase_str(last));
60de42
 
60de42
-    } else if (phase <= crm_join_none) {
60de42
+    } else if ((phase <= crm_join_none) || (phase == (last + 1))) {
60de42
         node->join = phase;
60de42
-        crm_info("%s: Node %s[%u] - join-%u phase %u -> %u",
60de42
-                 source, node->uname, node->id, current_join_id, last, phase);
60de42
+        crm_info("%s: Node %s[%u] - join-%u phase %s -> %s",
60de42
+                 source, node->uname, node->id, current_join_id,
60de42
+                 crm_join_phase_str(last), crm_join_phase_str(phase));
60de42
 
60de42
-    } else if(phase == last + 1) {
60de42
-        node->join = phase;
60de42
-        crm_info("%s: Node %s[%u] - join-%u phase %u -> %u",
60de42
-                 source, node->uname, node->id, current_join_id, last, phase);
60de42
     } else {
60de42
         crm_err("Could not update join for node %s because phase transition invalid "
60de42
-                CRM_XS " join-%u source=%s node_id=%u last=%u new=%u",
60de42
-                node->uname, current_join_id, source, node->id, last, phase);
60de42
-
60de42
+                CRM_XS " join-%u source=%s node_id=%u last=%s new=%s",
60de42
+                node->uname, current_join_id, source, node->id,
60de42
+                crm_join_phase_str(last), crm_join_phase_str(phase));
60de42
     }
60de42
 }
60de42
 
60de42
@@ -691,27 +690,7 @@ void crmd_join_phase_log(int level)
60de42
 
60de42
     g_hash_table_iter_init(&iter, crm_peer_cache);
60de42
     while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &peer)) {
60de42
-        const char *state = "unknown";
60de42
-        switch(peer->join) {
60de42
-            case crm_join_nack:
60de42
-                state = "nack";
60de42
-                break;
60de42
-            case crm_join_none:
60de42
-                state = "none";
60de42
-                break;
60de42
-            case crm_join_welcomed:
60de42
-                state = "welcomed";
60de42
-                break;
60de42
-            case crm_join_integrated:
60de42
-                state = "integrated";
60de42
-                break;
60de42
-            case crm_join_finalized:
60de42
-                state = "finalized";
60de42
-                break;
60de42
-            case crm_join_confirmed:
60de42
-                state = "confirmed";
60de42
-                break;
60de42
-        }
60de42
-        do_crm_log(level, "join-%d: %s=%s", current_join_id, peer->uname, state);
60de42
+        do_crm_log(level, "join-%d: %s=%s", current_join_id, peer->uname,
60de42
+                   crm_join_phase_str(peer->join));
60de42
     }
60de42
 }
60de42
diff --git a/include/crm/cluster.h b/include/crm/cluster.h
60de42
index 27ee9eb..343ce08 100644
60de42
--- a/include/crm/cluster.h
60de42
+++ b/include/crm/cluster.h
60de42
@@ -235,4 +235,18 @@ char *pcmk_message_common_cs(cpg_handle_t handle, uint32_t nodeid, uint32_t pid,
60de42
                         uint32_t *kind, const char **from);
60de42
 #  endif
60de42
 
60de42
+static inline const char *
60de42
+crm_join_phase_str(enum crm_join_phase phase)
60de42
+{
60de42
+    switch (phase) {
60de42
+        case crm_join_nack:         return "nack";
60de42
+        case crm_join_none:         return "none";
60de42
+        case crm_join_welcomed:     return "welcomed";
60de42
+        case crm_join_integrated:   return "integrated";
60de42
+        case crm_join_finalized:    return "finalized";
60de42
+        case crm_join_confirmed:    return "confirmed";
60de42
+    }
60de42
+    return "invalid";
60de42
+}
60de42
+
60de42
 #endif
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From dc977b614de9ce4018fa44c4f00c2b6b43c65c75 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Fri, 17 Mar 2017 17:23:22 -0500
60de42
Subject: [PATCH 3/5] Feature: libcrmcommon: add convenience functions for
60de42
 managing XML IDs
60de42
60de42
These handle ID sanitization and memory management for callers,
60de42
reducing the chance for mistakes.
60de42
---
60de42
 include/crm/common/xml.h |  4 ++++
60de42
 lib/common/xml.c         | 45 +++++++++++++++++++++++++++++++++++++++++++++
60de42
 2 files changed, 49 insertions(+)
60de42
60de42
diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h
60de42
index a948915..f896464 100644
60de42
--- a/include/crm/common/xml.h
60de42
+++ b/include/crm/common/xml.h
60de42
@@ -373,4 +373,8 @@ void save_xml_to_file(xmlNode * xml, const char *desc, const char *filename);
60de42
 char *xml_get_path(xmlNode *xml);
60de42
 
60de42
 char * crm_xml_escape(const char *text);
60de42
+void crm_xml_sanitize_id(char *id);
60de42
+void crm_xml_set_id(xmlNode *xml, const char *format, ...)
60de42
+    __attribute__ ((__format__ (__printf__, 2, 3)));
60de42
+
60de42
 #endif
60de42
diff --git a/lib/common/xml.c b/lib/common/xml.c
60de42
index c566956..0ea33d9 100644
60de42
--- a/lib/common/xml.c
60de42
+++ b/lib/common/xml.c
60de42
@@ -3036,6 +3036,51 @@ crm_xml_add_last_written(xmlNode *xml_node)
60de42
     return crm_xml_add(xml_node, XML_CIB_ATTR_WRITTEN, now_str);
60de42
 }
60de42
 
60de42
+/*!
60de42
+ * \brief Sanitize a string so it is usable as an XML ID
60de42
+ *
60de42
+ * \param[in,out] id  String to sanitize
60de42
+ */
60de42
+void
60de42
+crm_xml_sanitize_id(char *id)
60de42
+{
60de42
+    char *c;
60de42
+
60de42
+    for (c = id; *c; ++c) {
60de42
+        /* @TODO Sanitize more comprehensively */
60de42
+        switch (*c) {
60de42
+            case ':':
60de42
+            case '#':
60de42
+                *c = '.';
60de42
+        }
60de42
+    }
60de42
+}
60de42
+
60de42
+/*!
60de42
+ * \brief Set the ID of an XML element using a format
60de42
+ *
60de42
+ * \param[in,out] xml  XML element
60de42
+ * \param[in]     fmt  printf-style format
60de42
+ * \param[in]     ...  any arguments required by format
60de42
+ */
60de42
+void
60de42
+crm_xml_set_id(xmlNode *xml, const char *format, ...)
60de42
+{
60de42
+    va_list ap;
60de42
+    int len = 0;
60de42
+    char *id = NULL;
60de42
+
60de42
+    /* equivalent to crm_strdup_printf() */
60de42
+    va_start(ap, format);
60de42
+    len = vasprintf(&id, format, ap);
60de42
+    va_end(ap);
60de42
+    CRM_ASSERT(len > 0);
60de42
+
60de42
+    crm_xml_sanitize_id(id);
60de42
+    crm_xml_add(xml, XML_ATTR_ID, id);
60de42
+    free(id);
60de42
+}
60de42
+
60de42
 static int
60de42
 write_xml_stream(xmlNode * xml_node, const char *filename, FILE * stream, gboolean compress)
60de42
 {
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From bf39184154405621a07ce05a201fded861db2357 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Fri, 17 Mar 2017 18:21:05 -0500
60de42
Subject: [PATCH 4/5] Refactor: various: use new convenience functions for
60de42
 generating XML IDs
60de42
60de42
---
60de42
 attrd/commands.c         | 41 +++++++++++-------------------------
60de42
 crmd/pengine.c           |  8 +++----
60de42
 lib/cluster/corosync.c   |  5 +----
60de42
 lib/pengine/unpack.c     | 37 ++++++++-------------------------
60de42
 tools/crm_node.c         | 12 +++--------
60de42
 tools/crm_resource_ban.c | 54 +++++++++++-------------------------------------
60de42
 tools/fake_transition.c  |  5 +----
60de42
 7 files changed, 41 insertions(+), 121 deletions(-)
60de42
60de42
diff --git a/attrd/commands.c b/attrd/commands.c
60de42
index 486efb6..98b4215 100644
60de42
--- a/attrd/commands.c
60de42
+++ b/attrd/commands.c
60de42
@@ -928,31 +928,9 @@ write_attributes(bool all, bool peer_discovered)
60de42
 static void
60de42
 build_update_element(xmlNode *parent, attribute_t *a, const char *nodeid, const char *value)
60de42
 {
60de42
-    char *set = NULL;
60de42
-    char *uuid = NULL;
60de42
+    const char *set = NULL;
60de42
     xmlNode *xml_obj = NULL;
60de42
 
60de42
-    if(a->set) {
60de42
-        set = strdup(a->set);
60de42
-    } else {
60de42
-        set = crm_strdup_printf("%s-%s", XML_CIB_TAG_STATUS, nodeid);
60de42
-    }
60de42
-
60de42
-    if(a->uuid) {
60de42
-        uuid = strdup(a->uuid);
60de42
-    } else {
60de42
-        int lpc;
60de42
-        uuid = crm_strdup_printf("%s-%s", set, a->id);
60de42
-
60de42
-        /* Minimal attempt at sanitizing automatic IDs */
60de42
-        for (lpc = 0; uuid[lpc] != 0; lpc++) {
60de42
-            switch (uuid[lpc]) {
60de42
-                case ':':
60de42
-                    uuid[lpc] = '.';
60de42
-            }
60de42
-        }
60de42
-    }
60de42
-
60de42
     xml_obj = create_xml_node(parent, XML_CIB_TAG_STATE);
60de42
     crm_xml_add(xml_obj, XML_ATTR_ID, nodeid);
60de42
 
60de42
@@ -960,10 +938,19 @@ build_update_element(xmlNode *parent, attribute_t *a, const char *nodeid, const
60de42
     crm_xml_add(xml_obj, XML_ATTR_ID, nodeid);
60de42
 
60de42
     xml_obj = create_xml_node(xml_obj, XML_TAG_ATTR_SETS);
60de42
-    crm_xml_add(xml_obj, XML_ATTR_ID, set);
60de42
+    if (a->set) {
60de42
+        crm_xml_set_id(xml_obj, "%s", a->set);
60de42
+    } else {
60de42
+        crm_xml_set_id(xml_obj, "%s-%s", XML_CIB_TAG_STATUS, nodeid);
60de42
+    }
60de42
+    set = ID(xml_obj);
60de42
 
60de42
     xml_obj = create_xml_node(xml_obj, XML_CIB_TAG_NVPAIR);
60de42
-    crm_xml_add(xml_obj, XML_ATTR_ID, uuid);
60de42
+    if (a->uuid) {
60de42
+        crm_xml_set_id(xml_obj, "%s", a->uuid);
60de42
+    } else {
60de42
+        crm_xml_set_id(xml_obj, "%s-%s", set, a->id);
60de42
+    }
60de42
     crm_xml_add(xml_obj, XML_NVPAIR_ATTR_NAME, a->id);
60de42
 
60de42
     if(value) {
60de42
@@ -973,9 +960,6 @@ build_update_element(xmlNode *parent, attribute_t *a, const char *nodeid, const
60de42
         crm_xml_add(xml_obj, XML_NVPAIR_ATTR_VALUE, "");
60de42
         crm_xml_add(xml_obj, "__delete__", XML_NVPAIR_ATTR_VALUE);
60de42
     }
60de42
-
60de42
-    free(uuid);
60de42
-    free(set);
60de42
 }
60de42
 
60de42
 void
60de42
diff --git a/crmd/pengine.c b/crmd/pengine.c
60de42
index 5a301c5..17613cf 100644
60de42
--- a/crmd/pengine.c
60de42
+++ b/crmd/pengine.c
60de42
@@ -264,12 +264,12 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value)
60de42
     }
60de42
 
60de42
     if(max == 0) {
60de42
-        char *attr_id = crm_concat(CIB_OPTIONS_FIRST, attr_name, '-');
60de42
         xmlNode *configuration = NULL;
60de42
         xmlNode *crm_config = NULL;
60de42
         xmlNode *cluster_property_set = NULL;
60de42
 
60de42
-        crm_trace("Creating %s/%s = %s", attr_id, attr_name, attr_value);
60de42
+        crm_trace("Creating %s-%s for %s=%s",
60de42
+                  CIB_OPTIONS_FIRST, attr_name, attr_name, attr_value);
60de42
 
60de42
         configuration = find_entity(xml, XML_CIB_TAG_CONFIGURATION, NULL);
60de42
         if (configuration == NULL) {
60de42
@@ -289,11 +289,9 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value)
60de42
 
60de42
         xml = create_xml_node(cluster_property_set, XML_CIB_TAG_NVPAIR);
60de42
 
60de42
-        crm_xml_add(xml, XML_ATTR_ID, attr_id);
60de42
+        crm_xml_set_id(xml, "%s-%s", CIB_OPTIONS_FIRST, attr_name);
60de42
         crm_xml_add(xml, XML_NVPAIR_ATTR_NAME, attr_name);
60de42
         crm_xml_add(xml, XML_NVPAIR_ATTR_VALUE, attr_value);
60de42
-
60de42
-        free(attr_id);
60de42
     }
60de42
     freeXpathObject(xpathObj);
60de42
 }
60de42
diff --git a/lib/cluster/corosync.c b/lib/cluster/corosync.c
60de42
index b02ae73..dfc781c 100644
60de42
--- a/lib/cluster/corosync.c
60de42
+++ b/lib/cluster/corosync.c
60de42
@@ -548,12 +548,9 @@ corosync_initialize_nodelist(void *cluster, gboolean force_member, xmlNode * xml
60de42
             any = TRUE;
60de42
 
60de42
             if (xml_parent) {
60de42
-                char buffer[64];
60de42
                 xmlNode *node = create_xml_node(xml_parent, XML_CIB_TAG_NODE);
60de42
 
60de42
-                if(snprintf(buffer, 63, "%u", nodeid) > 0) {
60de42
-                    crm_xml_add(node, XML_ATTR_ID, buffer);
60de42
-                }
60de42
+                crm_xml_set_id(node, "%u", nodeid);
60de42
                 crm_xml_add(node, XML_ATTR_UNAME, name);
60de42
                 if (force_member) {
60de42
                     crm_xml_add(node, XML_ATTR_TYPE, CRM_NODE_MEMBER);
60de42
diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c
60de42
index e6a8f58..57aa5f2 100644
60de42
--- a/lib/pengine/unpack.c
60de42
+++ b/lib/pengine/unpack.c
60de42
@@ -373,7 +373,6 @@ expand_remote_rsc_meta(xmlNode *xml_obj, xmlNode *parent, GHashTable **rsc_name_
60de42
     const char *remote_port = NULL;
60de42
     const char *connect_timeout = "60s";
60de42
     const char *remote_allow_migrate=NULL;
60de42
-    char *tmp_id = NULL;
60de42
 
60de42
     for (attr_set = __xml_first_child(xml_obj); attr_set != NULL; attr_set = __xml_next_element(attr_set)) {
60de42
         if (safe_str_neq((const char *)attr_set->name, XML_TAG_META_SETS)) {
60de42
@@ -427,73 +426,55 @@ expand_remote_rsc_meta(xmlNode *xml_obj, xmlNode *parent, GHashTable **rsc_name_
60de42
     crm_xml_add(xml_rsc, XML_ATTR_TYPE, "remote");
60de42
 
60de42
     xml_tmp = create_xml_node(xml_rsc, XML_TAG_META_SETS);
60de42
-    tmp_id = crm_concat(remote_name, XML_TAG_META_SETS, '_');
60de42
-    crm_xml_add(xml_tmp, XML_ATTR_ID, tmp_id);
60de42
-    free(tmp_id);
60de42
+    crm_xml_set_id(xml_tmp, "%s_%s", remote_name, XML_TAG_META_SETS);
60de42
 
60de42
     attr = create_xml_node(xml_tmp, XML_CIB_TAG_NVPAIR);
60de42
-    tmp_id = crm_concat(remote_name, "meta-attributes-container", '_');
60de42
-    crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+    crm_xml_set_id(attr, "%s_%s", remote_name, "meta-attributes-container");
60de42
     crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, XML_RSC_ATTR_CONTAINER);
60de42
     crm_xml_add(attr, XML_NVPAIR_ATTR_VALUE, container_id);
60de42
-    free(tmp_id);
60de42
 
60de42
     attr = create_xml_node(xml_tmp, XML_CIB_TAG_NVPAIR);
60de42
-    tmp_id = crm_concat(remote_name, "meta-attributes-internal", '_');
60de42
-    crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+    crm_xml_set_id(attr, "%s_%s", remote_name, "meta-attributes-internal");
60de42
     crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, XML_RSC_ATTR_INTERNAL_RSC);
60de42
     crm_xml_add(attr, XML_NVPAIR_ATTR_VALUE, "true");
60de42
-    free(tmp_id);
60de42
 
60de42
     if (remote_allow_migrate) {
60de42
         attr = create_xml_node(xml_tmp, XML_CIB_TAG_NVPAIR);
60de42
-        tmp_id = crm_concat(remote_name, "meta-attributes-container", '_');
60de42
-        crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+        crm_xml_set_id(attr, "%s_%s", remote_name, "meta-attributes-container");
60de42
         crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, XML_OP_ATTR_ALLOW_MIGRATE);
60de42
         crm_xml_add(attr, XML_NVPAIR_ATTR_VALUE, remote_allow_migrate);
60de42
-        free(tmp_id);
60de42
     }
60de42
 
60de42
     xml_tmp = create_xml_node(xml_rsc, "operations");
60de42
     attr = create_xml_node(xml_tmp, XML_ATTR_OP);
60de42
-    tmp_id = crm_concat(remote_name, "monitor-interval-30s", '_');
60de42
-    crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+    crm_xml_set_id(attr, "%s_%s", remote_name, "monitor-interval-30s");
60de42
     crm_xml_add(attr, XML_ATTR_TIMEOUT, "30s");
60de42
     crm_xml_add(attr, XML_LRM_ATTR_INTERVAL, "30s");
60de42
     crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, "monitor");
60de42
-    free(tmp_id);
60de42
 
60de42
     if (connect_timeout) {
60de42
         attr = create_xml_node(xml_tmp, XML_ATTR_OP);
60de42
-        tmp_id = crm_concat(remote_name, "start-interval-0", '_');
60de42
-        crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+        crm_xml_set_id(attr, "%s_%s", remote_name, "start-interval-0");
60de42
         crm_xml_add(attr, XML_ATTR_TIMEOUT, connect_timeout);
60de42
         crm_xml_add(attr, XML_LRM_ATTR_INTERVAL, "0");
60de42
         crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, "start");
60de42
-        free(tmp_id);
60de42
     }
60de42
 
60de42
     if (remote_port || remote_server) {
60de42
         xml_tmp = create_xml_node(xml_rsc, XML_TAG_ATTR_SETS);
60de42
-        tmp_id = crm_concat(remote_name, XML_TAG_ATTR_SETS, '_');
60de42
-        crm_xml_add(xml_tmp, XML_ATTR_ID, tmp_id);
60de42
-        free(tmp_id);
60de42
+        crm_xml_set_id(xml_tmp, "%s_%s", remote_name, XML_TAG_ATTR_SETS);
60de42
 
60de42
         if (remote_server) {
60de42
             attr = create_xml_node(xml_tmp, XML_CIB_TAG_NVPAIR);
60de42
-            tmp_id = crm_concat(remote_name, "instance-attributes-addr", '_');
60de42
-            crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+            crm_xml_set_id(attr, "%s_%s", remote_name, "instance-attributes-addr");
60de42
             crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, "addr");
60de42
             crm_xml_add(attr, XML_NVPAIR_ATTR_VALUE, remote_server);
60de42
-            free(tmp_id);
60de42
         }
60de42
         if (remote_port) {
60de42
             attr = create_xml_node(xml_tmp, XML_CIB_TAG_NVPAIR);
60de42
-            tmp_id = crm_concat(remote_name, "instance-attributes-port", '_');
60de42
-            crm_xml_add(attr, XML_ATTR_ID, tmp_id);
60de42
+            crm_xml_set_id(attr, "%s_%s", remote_name, "instance-attributes-port");
60de42
             crm_xml_add(attr, XML_NVPAIR_ATTR_NAME, "port");
60de42
             crm_xml_add(attr, XML_NVPAIR_ATTR_VALUE, remote_port);
60de42
-            free(tmp_id);
60de42
         }
60de42
     }
60de42
 
60de42
diff --git a/tools/crm_node.c b/tools/crm_node.c
60de42
index 7092db4..9b60c55 100644
60de42
--- a/tools/crm_node.c
60de42
+++ b/tools/crm_node.c
60de42
@@ -105,11 +105,8 @@ cib_remove_node(uint32_t id, const char *name)
60de42
     crm_xml_add(node, XML_ATTR_UNAME, name);
60de42
     crm_xml_add(node_state, XML_ATTR_UNAME, name);
60de42
     if(id) {
60de42
-        char buffer[64];
60de42
-        if(snprintf(buffer, 63, "%u", id) > 0) {
60de42
-            crm_xml_add(node, XML_ATTR_ID, buffer);
60de42
-            crm_xml_add(node_state, XML_ATTR_ID, buffer);
60de42
-        }
60de42
+        crm_xml_set_id(node, "%u", id);
60de42
+        crm_xml_add(node_state, XML_ATTR_ID, ID(node));
60de42
     }
60de42
 
60de42
     cib = cib_new();
60de42
@@ -200,10 +197,7 @@ int tools_remove_node_cache(const char *node, const char *target)
60de42
         cmd = create_request(CRM_OP_RM_NODE_CACHE,
60de42
                              NULL, NULL, target, crm_system_name, admin_uuid);
60de42
         if (n) {
60de42
-            char buffer[64];
60de42
-            if(snprintf(buffer, 63, "%u", n) > 0) {
60de42
-                crm_xml_add(cmd, XML_ATTR_ID, buffer);
60de42
-            }
60de42
+            crm_xml_set_id(cmd, "%u", n);
60de42
         }
60de42
         crm_xml_add(cmd, XML_ATTR_UNAME, name);
60de42
     }
60de42
diff --git a/tools/crm_resource_ban.c b/tools/crm_resource_ban.c
60de42
index 2f7b366..69b49bf 100644
60de42
--- a/tools/crm_resource_ban.c
60de42
+++ b/tools/crm_resource_ban.c
60de42
@@ -62,7 +62,6 @@ cli_resource_ban(const char *rsc_id, const char *host, GListPtr allnodes, cib_t
60de42
 {
60de42
     char *later_s = NULL;
60de42
     int rc = pcmk_ok;
60de42
-    char *id = NULL;
60de42
     xmlNode *fragment = NULL;
60de42
     xmlNode *location = NULL;
60de42
 
60de42
@@ -83,10 +82,8 @@ cli_resource_ban(const char *rsc_id, const char *host, GListPtr allnodes, cib_t
60de42
 
60de42
     fragment = create_xml_node(NULL, XML_CIB_TAG_CONSTRAINTS);
60de42
 
60de42
-    id = crm_strdup_printf("cli-ban-%s-on-%s", rsc_id, host);
60de42
     location = create_xml_node(fragment, XML_CONS_TAG_RSC_LOCATION);
60de42
-    crm_xml_add(location, XML_ATTR_ID, id);
60de42
-    free(id);
60de42
+    crm_xml_set_id(location, "cli-ban-%s-on-%s", rsc_id, host);
60de42
 
60de42
     if (BE_QUIET == FALSE) {
60de42
         CMD_ERR("WARNING: Creating rsc_location constraint '%s'"
60de42
@@ -117,27 +114,18 @@ cli_resource_ban(const char *rsc_id, const char *host, GListPtr allnodes, cib_t
60de42
         xmlNode *rule = create_xml_node(location, XML_TAG_RULE);
60de42
         xmlNode *expr = create_xml_node(rule, XML_TAG_EXPRESSION);
60de42
 
60de42
-        id = crm_strdup_printf("cli-ban-%s-on-%s-rule", rsc_id, host);
60de42
-        crm_xml_add(rule, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(rule, "cli-ban-%s-on-%s-rule", rsc_id, host);
60de42
         crm_xml_add(rule, XML_RULE_ATTR_SCORE, MINUS_INFINITY_S);
60de42
         crm_xml_add(rule, XML_RULE_ATTR_BOOLEAN_OP, "and");
60de42
 
60de42
-        id = crm_strdup_printf("cli-ban-%s-on-%s-expr", rsc_id, host);
60de42
-        crm_xml_add(expr, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(expr, "cli-ban-%s-on-%s-expr", rsc_id, host);
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_ATTRIBUTE, "#uname");
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_OPERATION, "eq");
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_VALUE, host);
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_TYPE, "string");
60de42
 
60de42
         expr = create_xml_node(rule, "date_expression");
60de42
-        id = crm_strdup_printf("cli-ban-%s-on-%s-lifetime", rsc_id, host);
60de42
-        crm_xml_add(expr, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(expr, "cli-ban-%s-on-%s-lifetime", rsc_id, host);
60de42
         crm_xml_add(expr, "operation", "lt");
60de42
         crm_xml_add(expr, "end", later_s);
60de42
     }
60de42
@@ -156,7 +144,6 @@ cli_resource_prefer(const char *rsc_id, const char *host, cib_t * cib_conn)
60de42
 {
60de42
     char *later_s = parse_cli_lifetime(move_lifetime);
60de42
     int rc = pcmk_ok;
60de42
-    char *id = NULL;
60de42
     xmlNode *location = NULL;
60de42
     xmlNode *fragment = NULL;
60de42
 
60de42
@@ -171,10 +158,8 @@ cli_resource_prefer(const char *rsc_id, const char *host, cib_t * cib_conn)
60de42
 
60de42
     fragment = create_xml_node(NULL, XML_CIB_TAG_CONSTRAINTS);
60de42
 
60de42
-    id = crm_strdup_printf("cli-prefer-%s", rsc_id);
60de42
     location = create_xml_node(fragment, XML_CONS_TAG_RSC_LOCATION);
60de42
-    crm_xml_add(location, XML_ATTR_ID, id);
60de42
-    free(id);
60de42
+    crm_xml_set_id(location, "cli-prefer-%s", rsc_id);
60de42
 
60de42
     crm_xml_add(location, XML_LOC_ATTR_SOURCE, rsc_id);
60de42
     if(scope_master) {
60de42
@@ -192,27 +177,18 @@ cli_resource_prefer(const char *rsc_id, const char *host, cib_t * cib_conn)
60de42
         xmlNode *rule = create_xml_node(location, XML_TAG_RULE);
60de42
         xmlNode *expr = create_xml_node(rule, XML_TAG_EXPRESSION);
60de42
 
60de42
-        id = crm_concat("cli-prefer-rule", rsc_id, '-');
60de42
-        crm_xml_add(rule, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(rule, "cli-prefer-rule-%s", rsc_id);
60de42
         crm_xml_add(rule, XML_RULE_ATTR_SCORE, INFINITY_S);
60de42
         crm_xml_add(rule, XML_RULE_ATTR_BOOLEAN_OP, "and");
60de42
 
60de42
-        id = crm_concat("cli-prefer-expr", rsc_id, '-');
60de42
-        crm_xml_add(expr, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(expr, "cli-prefer-expr-%s", rsc_id);
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_ATTRIBUTE, "#uname");
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_OPERATION, "eq");
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_VALUE, host);
60de42
         crm_xml_add(expr, XML_EXPR_ATTR_TYPE, "string");
60de42
 
60de42
         expr = create_xml_node(rule, "date_expression");
60de42
-        id = crm_concat("cli-prefer-lifetime-end", rsc_id, '-');
60de42
-        crm_xml_add(expr, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
-
60de42
+        crm_xml_set_id(expr, "cli-prefer-lifetime-end-%s", rsc_id);
60de42
         crm_xml_add(expr, "operation", "lt");
60de42
         crm_xml_add(expr, "end", later_s);
60de42
     }
60de42
@@ -228,7 +204,6 @@ cli_resource_prefer(const char *rsc_id, const char *host, cib_t * cib_conn)
60de42
 int
60de42
 cli_resource_clear(const char *rsc_id, const char *host, GListPtr allnodes, cib_t * cib_conn)
60de42
 {
60de42
-    char *id = NULL;
60de42
     int rc = pcmk_ok;
60de42
     xmlNode *fragment = NULL;
60de42
     xmlNode *location = NULL;
60de42
@@ -240,30 +215,25 @@ cli_resource_clear(const char *rsc_id, const char *host, GListPtr allnodes, cib_
60de42
     fragment = create_xml_node(NULL, XML_CIB_TAG_CONSTRAINTS);
60de42
 
60de42
     if(host) {
60de42
-        id = crm_strdup_printf("cli-ban-%s-on-%s", rsc_id, host);
60de42
         location = create_xml_node(fragment, XML_CONS_TAG_RSC_LOCATION);
60de42
-        crm_xml_add(location, XML_ATTR_ID, id);
60de42
-        free(id);
60de42
+        crm_xml_set_id(location, "cli-ban-%s-on-%s", rsc_id, host);
60de42
 
60de42
     } else {
60de42
         GListPtr n = allnodes;
60de42
         for(; n; n = n->next) {
60de42
             node_t *target = n->data;
60de42
 
60de42
-            id = crm_strdup_printf("cli-ban-%s-on-%s", rsc_id, target->details->uname);
60de42
             location = create_xml_node(fragment, XML_CONS_TAG_RSC_LOCATION);
60de42
-            crm_xml_add(location, XML_ATTR_ID, id);
60de42
-            free(id);
60de42
+            crm_xml_set_id(location, "cli-ban-%s-on-%s",
60de42
+                           rsc_id, target->details->uname);
60de42
         }
60de42
     }
60de42
 
60de42
-    id = crm_strdup_printf("cli-prefer-%s", rsc_id);
60de42
     location = create_xml_node(fragment, XML_CONS_TAG_RSC_LOCATION);
60de42
-    crm_xml_add(location, XML_ATTR_ID, id);
60de42
+    crm_xml_set_id(location, "cli-prefer-%s", rsc_id);
60de42
     if(host && do_force == FALSE) {
60de42
         crm_xml_add(location, XML_CIB_TAG_NODE, host);
60de42
     }
60de42
-    free(id);
60de42
 
60de42
     crm_log_xml_info(fragment, "Delete");
60de42
     rc = cib_conn->cmds->delete(cib_conn, XML_CIB_TAG_CONSTRAINTS, fragment, cib_options);
60de42
diff --git a/tools/fake_transition.c b/tools/fake_transition.c
60de42
index 26f55a2..9f9eaed 100644
60de42
--- a/tools/fake_transition.c
60de42
+++ b/tools/fake_transition.c
60de42
@@ -67,7 +67,6 @@ inject_transient_attr(xmlNode * cib_node, const char *name, const char *value)
60de42
     xmlNode *nvp = NULL;
60de42
     xmlChar *node_path;
60de42
     const char *node_uuid = ID(cib_node);
60de42
-    char *nvp_id = crm_concat(name, node_uuid, '-');
60de42
 
60de42
     node_path = xmlGetNodePath(cib_node);
60de42
     quiet_log(" + Injecting attribute %s=%s into %s '%s'\n",
60de42
@@ -87,11 +86,9 @@ inject_transient_attr(xmlNode * cib_node, const char *name, const char *value)
60de42
     }
60de42
 
60de42
     nvp = create_xml_node(container, XML_CIB_TAG_NVPAIR);
60de42
-    crm_xml_add(nvp, XML_ATTR_ID, nvp_id);
60de42
+    crm_xml_set_id(nvp, "%s-%s", name, node_uuid);
60de42
     crm_xml_add(nvp, XML_NVPAIR_ATTR_NAME, name);
60de42
     crm_xml_add(nvp, XML_NVPAIR_ATTR_VALUE, value);
60de42
-
60de42
-    free(nvp_id);
60de42
 }
60de42
 
60de42
 static void
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From c37145733538ee92153dc26e5b40c6fcfad47fdb Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Mon, 20 Mar 2017 10:52:42 -0500
60de42
Subject: [PATCH 5/5] Refactor: libpe_status: add convenience functions for
60de42
 clone detection
60de42
60de42
---
60de42
 include/crm/pengine/status.h | 41 +++++++++++++++++++++++++++++++++++++++++
60de42
 1 file changed, 41 insertions(+)
60de42
60de42
diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h
60de42
index e748792..ce3236b 100644
60de42
--- a/include/crm/pengine/status.h
60de42
+++ b/include/crm/pengine/status.h
60de42
@@ -19,6 +19,7 @@
60de42
 #  define PENGINE_STATUS__H
60de42
 
60de42
 #  include <glib.h>
60de42
+#  include <stdbool.h>
60de42
 #  include <crm/common/iso8601.h>
60de42
 #  include <crm/pengine/common.h>
60de42
 
60de42
@@ -433,4 +434,44 @@ node_t *pe_find_node_id(GListPtr node_list, const char *id);
60de42
 node_t *pe_find_node_any(GListPtr node_list, const char *id, const char *uname);
60de42
 GListPtr find_operations(const char *rsc, const char *node, gboolean active_filter,
60de42
                          pe_working_set_t * data_set);
60de42
+
60de42
+/*!
60de42
+ * \brief Check whether a resource is any clone type
60de42
+ *
60de42
+ * \param[in] rsc  Resource to check
60de42
+ *
60de42
+ * \return TRUE if resource is clone, FALSE otherwise
60de42
+ */
60de42
+static inline bool
60de42
+pe_rsc_is_clone(resource_t *rsc)
60de42
+{
60de42
+    return rsc && ((rsc->variant == pe_clone) || (rsc->variant == pe_master));
60de42
+}
60de42
+
60de42
+/*!
60de42
+ * \brief Check whether a resource is a globally unique clone
60de42
+ *
60de42
+ * \param[in] rsc  Resource to check
60de42
+ *
60de42
+ * \return TRUE if resource is unique clone, FALSE otherwise
60de42
+ */
60de42
+static inline bool
60de42
+pe_rsc_is_unique_clone(resource_t *rsc)
60de42
+{
60de42
+    return pe_rsc_is_clone(rsc) && is_set(rsc->flags, pe_rsc_unique);
60de42
+}
60de42
+
60de42
+/*!
60de42
+ * \brief Check whether a resource is an anonymous clone
60de42
+ *
60de42
+ * \param[in] rsc  Resource to check
60de42
+ *
60de42
+ * \return TRUE if resource is anonymous clone, FALSE otherwise
60de42
+ */
60de42
+static inline bool
60de42
+pe_rsc_is_anon_clone(resource_t *rsc)
60de42
+{
60de42
+    return pe_rsc_is_clone(rsc) && is_not_set(rsc->flags, pe_rsc_unique);
60de42
+}
60de42
+
60de42
 #endif
60de42
-- 
60de42
1.8.3.1
60de42