diff --git a/SOURCES/redhat-bugzilla-1980067.patch b/SOURCES/redhat-bugzilla-1980067.patch
new file mode 100644
index 0000000..6c97240
--- /dev/null
+++ b/SOURCES/redhat-bugzilla-1980067.patch
@@ -0,0 +1,2419 @@
+From 7b21619f0022b9eba7ad5b9c3c018471c4be9a93 Mon Sep 17 00:00:00 2001
+From: Paul Evans <pevans@redhat.com>
+Date: Mon, 8 Feb 2021 18:14:37 +0000
+Subject: [PATCH 1/7] pmdahacluster: Quick README.md update
+
+Update README.md to reflect pmns root node update to ha_cluster
+---
+ src/pmdas/hacluster/README.md | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/pmdas/hacluster/README.md b/src/pmdas/hacluster/README.md
+index 4d0fcabf5..709cb721d 100644
+--- a/src/pmdas/hacluster/README.md
++++ b/src/pmdas/hacluster/README.md
+@@ -6,7 +6,7 @@ The PMDA collects it's metric data from the following components that make up a
+ 
+ ## General Notes
+ 
+-### `hacluster.drbd.split_brain`
++### `ha_cluster.drbd.split_brain`
+ 
+ This metric signals if there is a split brain occurring in DRBD per instance resource:volume. The metric will return the value `1` if a split brain is detected, otherwise it will be `0`.
+ 
+@@ -37,7 +37,7 @@ exposed by this PMDA.
+ Once the PMDA has been installed, the following command will list all of
+ the available metrics and their explanatory “help” text:
+ 
+-		# $ pminfo -fT hacluster
++		# $ pminfo -fT ha_cluster
+ 
+ ## Installation
+ 
+-- 
+2.31.1
+
+
+From f68df957286df0b0c2bb091d1025cf3c4adc2810 Mon Sep 17 00:00:00 2001
+From: Ken McDonell <kenj@kenj.id.au>
+Date: Sun, 4 Apr 2021 07:35:45 +1000
+Subject: [PATCH 2/7] src/pmdas/hacluster/pacemaker.c: plug small mem leak on
+ error path in hacluster_refresh_pacemaker_resources() (covscan)
+
+Fixes Coverity CID 366053.
+---
+ src/pmdas/hacluster/pacemaker.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/pmdas/hacluster/pacemaker.c b/src/pmdas/hacluster/pacemaker.c
+index 25d80ed41..2dc53f8cf 100644
+--- a/src/pmdas/hacluster/pacemaker.c
++++ b/src/pmdas/hacluster/pacemaker.c
+@@ -625,8 +625,11 @@ hacluster_refresh_pacemaker_resources(const char *instance_name, struct resource
+ 
+ 	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
+ 
+-	if ((pf = popen(buffer, "r")) == NULL)
++	if ((pf = popen(buffer, "r")) == NULL) {
++		if (!no_node_attachment)
++		    free(tofree);
+ 		return -oserror();
++	}
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 
+-- 
+2.31.1
+
+
+From 625e3a493611864d8785091d0f95a2e1ec293eea Mon Sep 17 00:00:00 2001
+From: Paul Evans <pevans@redhat.com>
+Date: Fri, 9 Apr 2021 21:10:12 +0100
+Subject: [PATCH 3/7] pmdahacluster: Correct logic for
+ ha_cluster.pacemaker.resources.* metrics
+
+Correct the logic for pacemaker resources metrics in the hacluster PMDA
+simplifying the logic and correcting the issue seen under QA testing
+pointed out by Ken along with further corrections in the pacemaker
+resources metric collection.
+
+Have also included further buffer overflow guarding for the most of
+the sscanf cases in pacemaker.c.
+
+Bonus: Corrected spelling mistakes also pointed out in helptext.
+---
+ qa/1897.out                     | 32 ++++++++++++++++----------------
+ src/pmdas/hacluster/help        | 28 ++++++++++++++--------------
+ src/pmdas/hacluster/pacemaker.c | 19 ++++---------------
+ 3 files changed, 34 insertions(+), 45 deletions(-)
+
+diff --git a/qa/1897.out b/qa/1897.out
+index ff9c3ff6c..054b1e92f 100644
+--- a/qa/1897.out
++++ b/qa/1897.out
+@@ -337,7 +337,7 @@ ha_cluster.pacemaker.nodes.status.dc PMID: 155.3.8 [Whether the node status is g
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the disconnected status is reportered by the node in the cluster, a
++Whether the disconnected status is reported by the node in the cluster, a
+ value of 1 confirms the node status as disconnected.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 1
+@@ -346,7 +346,7 @@ ha_cluster.pacemaker.nodes.status.expected_up PMID: 155.3.7 [Whether the node st
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the expected_up status is reportered by the node in the cluster, a
++Whether the expected_up status is reported by the node in the cluster, a
+ value of 1 confirms the node status as expected_up.
+     inst [0 or "node-1"] value 1
+     inst [1 or "node-2"] value 1
+@@ -355,7 +355,7 @@ ha_cluster.pacemaker.nodes.status.maintenance PMID: 155.3.3 [Whether the node st
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the maintenance status is reportered by the node in the cluster, a
++Whether the maintenance status is reported by the node in the cluster, a
+ value of 1 confirms the node status as online.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -364,7 +364,7 @@ ha_cluster.pacemaker.nodes.status.online PMID: 155.3.0 [Whether the node status
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the online status is reportered by the node in the cluster, a value of
++Whether the online status is reported by the node in the cluster, a value of
+ 1 confirms the node status as online.
+     inst [0 or "node-1"] value 1
+     inst [1 or "node-2"] value 1
+@@ -373,7 +373,7 @@ ha_cluster.pacemaker.nodes.status.pending PMID: 155.3.4 [Whether the node status
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the pending status is reportered by the node in the cluster, a value of
++Whether the pending status is reported by the node in the cluster, a value of
+ 1 confirms the node status as pending.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -382,7 +382,7 @@ ha_cluster.pacemaker.nodes.status.shutdown PMID: 155.3.6 [Whether the node statu
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the shutdown status is reportered by the node in the cluster, a value
++Whether the shutdown status is reported by the node in the cluster, a value
+ of 1 confirms the node status as shutdown.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -391,7 +391,7 @@ ha_cluster.pacemaker.nodes.status.standby PMID: 155.3.1 [Whether the node status
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the standby status is reportered by the node in the cluster, a value of
++Whether the standby status is reported by the node in the cluster, a value of
+ 1 confirms the node status as standby.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -400,7 +400,7 @@ ha_cluster.pacemaker.nodes.status.standby_on_fail PMID: 155.3.2 [Whether the nod
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the standby_on_fail status is reportered by the node in the cluster,
++Whether the standby_on_fail status is reported by the node in the cluster,
+ a value of 1 confirms the node status as standby_on_fail.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -409,7 +409,7 @@ ha_cluster.pacemaker.nodes.status.unclean PMID: 155.3.5 [Whether the node status
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+ Help:
+-Whether the unclean status is reportered by the node in the cluster, a value of
++Whether the unclean status is reported by the node in the cluster, a value of
+ 1 confirms the node status as unclean.
+     inst [0 or "node-1"] value 0
+     inst [1 or "node-2"] value 0
+@@ -466,7 +466,7 @@ ha_cluster.pacemaker.resources.managed PMID: 155.5.3 [Value is either true or fa
+     Semantics: instant  Units: count
+ Help:
+ The value of whether the resource instance in the cluster is managed or not.
+-    inst [0 or "my_first_svc:node-1"] value 0
++    inst [0 or "my_first_svc:node-1"] value 1
+     inst [5 or "rsc_TEST:node-1"] value 1
+     inst [1 or "rsc_Test:node-1"] value 1
+     inst [2 or "rsc_Test:node-2"] value 1
+@@ -489,9 +489,9 @@ ha_cluster.pacemaker.resources.status.active PMID: 155.5.5 [Whether the resource
+     Data Type: 32-bit unsigned int  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+ Help:
+-Whether the active status is reportered by the resource in the cluster, a
++Whether the active status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as active.
+-    inst [0 or "my_first_svc:node-1"] value 0
++    inst [0 or "my_first_svc:node-1"] value 1
+     inst [5 or "rsc_TEST:node-1"] value 1
+     inst [1 or "rsc_Test:node-1"] value 1
+     inst [2 or "rsc_Test:node-2"] value 1
+@@ -502,7 +502,7 @@ ha_cluster.pacemaker.resources.status.blocked PMID: 155.5.7 [Whether the resourc
+     Data Type: 32-bit unsigned int  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+ Help:
+-Whether the blocked status is reportered by the resource in the cluster, a
++Whether the blocked status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as blocked.
+     inst [0 or "my_first_svc:node-1"] value 0
+     inst [5 or "rsc_TEST:node-1"] value 0
+@@ -515,7 +515,7 @@ ha_cluster.pacemaker.resources.status.failed PMID: 155.5.8 [Whether the resource
+     Data Type: 32-bit unsigned int  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+ Help:
+-Whether the failed status is reportered by the resource in the cluster, a 
++Whether the failed status is reported by the resource in the cluster, a 
+ value of 1 confirms the resource status as failed.
+     inst [0 or "my_first_svc:node-1"] value 0
+     inst [5 or "rsc_TEST:node-1"] value 0
+@@ -528,7 +528,7 @@ ha_cluster.pacemaker.resources.status.failure_ignored PMID: 155.5.9 [Whether the
+     Data Type: 32-bit unsigned int  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+ Help:
+-Whether the failure_ignored status is reportered by the resource in the
++Whether the failure_ignored status is reported by the resource in the
+ cluster, a value of 1 confirms the resource status as failure_ignored.
+     inst [0 or "my_first_svc:node-1"] value 0
+     inst [5 or "rsc_TEST:node-1"] value 0
+@@ -541,7 +541,7 @@ ha_cluster.pacemaker.resources.status.orphaned PMID: 155.5.6 [Whether the resour
+     Data Type: 32-bit unsigned int  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+ Help:
+-Whether the orphaned status is reportered by the resource in the cluster, a
++Whether the orphaned status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as orphaned.
+     inst [0 or "my_first_svc:node-1"] value 0
+     inst [5 or "rsc_TEST:node-1"] value 0
+diff --git a/src/pmdas/hacluster/help b/src/pmdas/hacluster/help
+index fa5bf9106..704e940c0 100644
+--- a/src/pmdas/hacluster/help
++++ b/src/pmdas/hacluster/help
+@@ -64,39 +64,39 @@ Pacemaker internals.
+ The membership type given to the node in the Pacemaker cluster.
+ 
+ @ ha_cluster.pacemaker.nodes.status.online Whether the node status is given as online
+-Whether the online status is reportered by the node in the cluster, a value of
++Whether the online status is reported by the node in the cluster, a value of
+ 1 confirms the node status as online.
+ 
+ @ ha_cluster.pacemaker.nodes.status.standby Whether the node status is given as standby
+-Whether the standby status is reportered by the node in the cluster, a value of
++Whether the standby status is reported by the node in the cluster, a value of
+ 1 confirms the node status as standby.
+ 
+ @ ha_cluster.pacemaker.nodes.status.standby_on_fail Whether the node status is given as standby_on_fail
+-Whether the standby_on_fail status is reportered by the node in the cluster,
++Whether the standby_on_fail status is reported by the node in the cluster,
+ a value of 1 confirms the node status as standby_on_fail.
+ 
+ @ ha_cluster.pacemaker.nodes.status.maintenance Whether the node status is given as maintenance
+-Whether the maintenance status is reportered by the node in the cluster, a
++Whether the maintenance status is reported by the node in the cluster, a
+ value of 1 confirms the node status as online.
+ 
+ @ ha_cluster.pacemaker.nodes.status.pending Whether the node status is given as pending
+-Whether the pending status is reportered by the node in the cluster, a value of
++Whether the pending status is reported by the node in the cluster, a value of
+ 1 confirms the node status as pending.
+ 
+ @ ha_cluster.pacemaker.nodes.status.unclean Whether the node status is given as unclean
+-Whether the unclean status is reportered by the node in the cluster, a value of
++Whether the unclean status is reported by the node in the cluster, a value of
+ 1 confirms the node status as unclean.
+ 
+ @ ha_cluster.pacemaker.nodes.status.shutdown Whether the node status is given as shutdown
+-Whether the shutdown status is reportered by the node in the cluster, a value
++Whether the shutdown status is reported by the node in the cluster, a value
+ of 1 confirms the node status as shutdown.
+ 
+ @ ha_cluster.pacemaker.nodes.status.expected_up Whether the node status is given as expected_up
+-Whether the expected_up status is reportered by the node in the cluster, a
++Whether the expected_up status is reported by the node in the cluster, a
+ value of 1 confirms the node status as expected_up.
+ 
+ @ ha_cluster.pacemaker.nodes.status.dc Whether the node status is given as disconnected
+-Whether the disconnected status is reportered by the node in the cluster, a
++Whether the disconnected status is reported by the node in the cluster, a
+ value of 1 confirms the node status as disconnected.
+ 
+ @ ha_cluster.pacemaker.resources.agent The name of the resource agent for this resource
+@@ -118,23 +118,23 @@ The value of whether the resource instance in the cluster is managed or not.
+ The value of the given role state for the resource instance in the cluster.
+ 
+ @ ha_cluster.pacemaker.resources.status.active Whether the resources status is given as active
+-Whether the active status is reportered by the resource in the cluster, a
++Whether the active status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as active.
+ 
+ @ ha_cluster.pacemaker.resources.status.orphaned Whether the resources status is given as orphaned
+-Whether the orphaned status is reportered by the resource in the cluster, a
++Whether the orphaned status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as orphaned.
+ 
+ @ ha_cluster.pacemaker.resources.status.blocked Whether the resources status is given as blocked
+-Whether the blocked status is reportered by the resource in the cluster, a
++Whether the blocked status is reported by the resource in the cluster, a
+ value of 1 confirms the resource status as blocked.
+ 
+ @ ha_cluster.pacemaker.resources.status.failed Whether the resources status is given as failed
+-Whether the failed status is reportered by the resource in the cluster, a 
++Whether the failed status is reported by the resource in the cluster, a 
+ value of 1 confirms the resource status as failed.
+ 
+ @ ha_cluster.pacemaker.resources.status.failure_ignored Whether the resources status is given as failure_ignored
+-Whether the failure_ignored status is reportered by the resource in the
++Whether the failure_ignored status is reported by the resource in the
+ cluster, a value of 1 confirms the resource status as failure_ignored.
+ 
+ @ ha_cluster.corosync.quorate Value given for quorate
+diff --git a/src/pmdas/hacluster/pacemaker.c b/src/pmdas/hacluster/pacemaker.c
+index 2dc53f8cf..8f8e626a5 100644
+--- a/src/pmdas/hacluster/pacemaker.c
++++ b/src/pmdas/hacluster/pacemaker.c
+@@ -513,7 +513,7 @@ hacluster_refresh_pacemaker_nodes(const char *node_name, struct nodes *nodes)
+ 
+ 		/* Collect our node names */
+ 		if (found_nodes && strstr(buffer, node_name)) {
+-			sscanf(buffer, "%*s %*s %*s online=\"%[^\"]\" standby=\"%[^\"]\" standby_onfail=\"%[^\"]\" maintenance=\"%[^\"]\" pending=\"%[^\"]\" unclean=\"%[^\"]\" shutdown=\"%[^\"]\" expected_up=\"%[^\"]\" is_dc =\"%[^\"]\" %*s type=\"%[^\"]\"",
++			sscanf(buffer, "%*s %*s %*s online=\"%9[^\"]\" standby=\"%9[^\"]\" standby_onfail=\"%9[^\"]\" maintenance=\"%9[^\"]\" pending=\"%9[^\"]\" unclean=\"%9[^\"]\" shutdown=\"%9[^\"]\" expected_up=\"%9[^\"]\" is_dc =\"%9[^\"]\" %*s type=\"%9[^\"]\"",
+ 				online,
+ 				standby,
+ 				standby_on_fail,
+@@ -671,19 +671,8 @@ hacluster_refresh_pacemaker_resources(const char *instance_name, struct resource
+ 			/* Collect our metrics */
+ 			if (strstr(buffer, "resource id=") && strstr(buffer, resource_id)) {
+ 
+-				if(strstr(resources->clone, "\0") || strstr(resources->group, "\0")) {
+-					sscanf(buffer, "%*s %*s resource_agent=\"%[^\"]\" role=\"%[^\"]\" active=\"%[^\"]\" orphaned=\"%[^\"]\" blocked=\"%[^\"]\" managed=\"%[^\"]\" failed=\"%[^\"]\" failure_ignored=\"%[^\"]\"",
+-						resources->agent,
+-						resources->role,
+-						active,
+-						orphaned,
+-						blocked,
+-						managed,
+-						failed,
+-						failure_ignored
+-					);
+-				} else if ((strstr(resources->clone, "\0") || strstr(resources->group, "\0")) && strstr(buffer, "target_role")) { 
+-					sscanf(buffer, "%*s %*s resource_agent=\"%[^\"]\" role=\"%[^\"]\" %*s active=\"%[^\"]\" orphaned=\"%[^\"]\" blocked=\"%[^\"]\" managed=\"%[^\"]\" failed=\"%[^\"]\" failure_ignored=\"%[^\"]\"",
++				if (strstr(buffer, "target_role")) { 
++					sscanf(buffer, "%*s %*s resource_agent=\"%[^\"]\" role=\"%[^\"]\" %*s active=\"%7[^\"]\" orphaned=\"%7[^\"]\" blocked=\"%7[^\"]\" managed=\"%7[^\"]\" failed=\"%7[^\"]\" failure_ignored=\"%7[^\"]\"",
+ 						resources->agent,
+ 						resources->role,
+ 						active,
+@@ -694,7 +683,7 @@ hacluster_refresh_pacemaker_resources(const char *instance_name, struct resource
+ 						failure_ignored
+ 					);
+ 				} else {
+-					sscanf(buffer, "%*s %*s resource_agent=\"%[^\"]\" role=\"%[^\"]\" %*s active=\"%[^\"]\" orphaned=\"%[^\"]\" blocked=\"%[^\"]\" managed=\"%[^\"]\" failed=\"%[^\"]\" failure_ignored=\"%[^\"]\"",
++					sscanf(buffer, "%*s %*s resource_agent=\"%[^\"]\" role=\"%[^\"]\" active=\"%7[^\"]\" orphaned=\"%7[^\"]\" blocked=\"%7[^\"]\" managed=\"%7[^\"]\" failed=\"%7[^\"]\" failure_ignored=\"%7[^\"]\"",
+ 						resources->agent,
+ 						resources->role,
+ 						active,
+-- 
+2.31.1
+
+
+From 7f39eb78a86b244a046d7014c744abe21b3bef52 Mon Sep 17 00:00:00 2001
+From: Paul Evans <pevans@redhat.com>
+Date: Fri, 9 Apr 2021 21:12:19 +0100
+Subject: [PATCH 4/7] pmdahacluster: Reduce log messages from popen()
+
+The PMDA is designed to be able to collect metrics on setups where not all
+of the HA Cluster components might exist. Suppress some of these logging
+warnings when certain components are not available on the host system.
+---
+ src/pmdas/hacluster/corosync.c  | 20 +++++++--------
+ src/pmdas/hacluster/drbd.c      |  8 +++---
+ src/pmdas/hacluster/pacemaker.c | 14 +++++------
+ src/pmdas/hacluster/pmda.c      | 44 +++++++++++++++++++--------------
+ src/pmdas/hacluster/sbd.c       |  4 +--
+ 5 files changed, 49 insertions(+), 41 deletions(-)
+
+diff --git a/src/pmdas/hacluster/corosync.c b/src/pmdas/hacluster/corosync.c
+index c7964b621..ee0052dee 100644
+--- a/src/pmdas/hacluster/corosync.c
++++ b/src/pmdas/hacluster/corosync.c
+@@ -139,10 +139,10 @@ hacluster_refresh_corosync_node(const char *node_name, struct member_votes *node
+ 	char *buffer_ptr;
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", quorumtool_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", quorumtool_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		if (strstr(buffer, node_name)) {
+@@ -187,10 +187,10 @@ hacluster_refresh_corosync_global()
+ 	char buffer[4096], quorate[6];
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", quorumtool_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", quorumtool_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 	
+@@ -218,10 +218,10 @@ hacluster_refresh_corosync_global()
+ 	}
+ 	pclose(pf);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", cfgtool_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cfgtool_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 
+@@ -240,10 +240,10 @@ hacluster_refresh_corosync_ring(const char *ring_name, struct rings *rings)
+ 	FILE *pf;	
+ 	int ring_found = 0;
+ 	
+-	pmsprintf(buffer, sizeof(buffer), "%s", cfgtool_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cfgtool_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 
+@@ -293,10 +293,10 @@ hacluster_refresh_corosync_ring(const char *ring_name, struct rings *rings)
+ 	}
+ 	pclose(pf);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", quorumtool_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", quorumtool_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();  
++		return oserror();
+ 	
+ 	/* 
+ 	 * Check corosync-quorumtool for our node_id and ring_id values for our
+diff --git a/src/pmdas/hacluster/drbd.c b/src/pmdas/hacluster/drbd.c
+index 7fb3b04d0..bec83031c 100644
+--- a/src/pmdas/hacluster/drbd.c
++++ b/src/pmdas/hacluster/drbd.c
+@@ -156,10 +156,10 @@ hacluster_refresh_drbd_resource(const char *resource_name, struct resource *reso
+ 
+ 	int found_node = 0, found_volume = 0, nesting = 0;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", drbdsetup_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	/* 
+ 	 * We need to split our combined NODE:VOLUME instance names into their
+@@ -274,10 +274,10 @@ hacluster_refresh_drbd_peer_device(const char *peer_name, struct peer_device *pe
+ 
+ 	int found_node = 0, found_peer_node = 0, nesting = 0;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", drbdsetup_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	/* 
+ 	 * We need to split our combined NODE:PEER_NODE_ID instance names into
+diff --git a/src/pmdas/hacluster/pacemaker.c b/src/pmdas/hacluster/pacemaker.c
+index 8f8e626a5..355f4df5c 100644
+--- a/src/pmdas/hacluster/pacemaker.c
++++ b/src/pmdas/hacluster/pacemaker.c
+@@ -360,7 +360,7 @@ hacluster_refresh_pacemaker_global()
+ 	char last_written_text[128], stonith[6];
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", cibadmin_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cibadmin_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -374,7 +374,7 @@ hacluster_refresh_pacemaker_global()
+ 	}
+ 	pclose(pf);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -402,7 +402,7 @@ hacluster_refresh_pacemaker_fail(const char *instance_name, struct fail_count *f
+ 	int found_node_history = 0, found_node_name = 0;
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -455,7 +455,7 @@ hacluster_refresh_pacemaker_constraints(const char *constraints_name, struct loc
+ 	int found_constraints = 0;
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", cibadmin_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cibadmin_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -492,7 +492,7 @@ hacluster_refresh_pacemaker_nodes(const char *node_name, struct nodes *nodes)
+ 	char online[10], standby[10], standby_on_fail[10], maintenance[10], pending[10];
+ 	char unclean[10], shutdown[10], expected_up[10], dc[10];
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -549,7 +549,7 @@ hacluster_refresh_pacemaker_node_attribs(const char *attrib_name, struct attribu
+ 	int found_node_attributes = 0, found_node_name = 0;
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+ 		return -oserror();
+@@ -623,7 +623,7 @@ hacluster_refresh_pacemaker_resources(const char *instance_name, struct resource
+ 		node = strsep(&str, ":");
+ 	}
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL) {
+ 		if (!no_node_attachment)
+diff --git a/src/pmdas/hacluster/pmda.c b/src/pmdas/hacluster/pmda.c
+index 196de2e64..c7ffac6da 100644
+--- a/src/pmdas/hacluster/pmda.c
++++ b/src/pmdas/hacluster/pmda.c
+@@ -359,10 +359,10 @@ hacluster_pacemaker_fail_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_FAIL_INDOM);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* First we need to check whether we are in <node_history> section*/
+@@ -426,11 +426,11 @@ hacluster_pacemaker_constraints_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_CONSTRAINTS_INDOM);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", cibadmin_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cibadmin_command);
+ 	buffer[sizeof(buffer)-1] = '\0';
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* First we need to check whether we are in <constraints> section*/
+@@ -472,10 +472,10 @@ hacluster_pacemaker_nodes_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_NODES_INDOM);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* First we need to check whether we are in <nodes> section*/
+@@ -525,10 +525,10 @@ hacluster_pacemaker_node_attrib_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_NODE_ATTRIB_INDOM);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* First we need to check whether we are in <node_history> section*/
+@@ -598,10 +598,10 @@ hacluster_pacemaker_resources_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom= INDOM(PACEMAKER_RESOURCES_INDOM);
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s", crm_mon_command);
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* First we need to check whether we are in <resources> section*/
+@@ -676,9 +676,11 @@ hacluster_corosync_node_instance_refresh(void)
+ 	 * membership information section of corosync-quorumtool output
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", quorumtool_command);
+ 
+-	if ((pf = popen(quorumtool_command, "r")) == NULL)
+-		return -oserror();
++	if ((pf = popen(buffer, "r")) == NULL)
++		return oserror();
+ 
+ 	while (fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* Clear whitespace at start of each line */
+@@ -735,8 +737,10 @@ hacluster_corosync_ring_instance_refresh(void)
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
+ 	
+-	if ((pf = popen(cfgtool_command, "r")) == NULL)
+-		return -oserror();
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cfgtool_command);
++	
++	if ((pf = popen(buffer, "r")) == NULL)
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 
+@@ -865,8 +869,10 @@ hacluster_drbd_resource_instance_refresh(void)
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
+ 	
+-	if ((pf = popen(drbdsetup_command, "r")) == NULL)
+-		return -oserror();
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
++	
++	if ((pf = popen(buffer, "r")) == NULL)
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* Clear whitespace at start of each line */
+@@ -940,8 +946,10 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
+ 
+-	if ((pf = popen(drbdsetup_command, "r")) == NULL)
+-		return -oserror();
++	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
++
++	if ((pf = popen(buffer, "r")) == NULL)
++		return oserror();
+ 
+ 	while(fgets(buffer, sizeof(buffer)-1, pf) != NULL) {
+ 		/* Clear whitespace at start of each line */
+diff --git a/src/pmdas/hacluster/sbd.c b/src/pmdas/hacluster/sbd.c
+index 5f55d0734..2824f6589 100644
+--- a/src/pmdas/hacluster/sbd.c
++++ b/src/pmdas/hacluster/sbd.c
+@@ -74,10 +74,10 @@ hacluster_refresh_sbd_device(const char *sbd_dev, struct sbd *sbd)
+ 	char buffer[4096];
+ 	FILE *pf;
+ 
+-	pmsprintf(buffer, sizeof(buffer), "%s -d %s dump", sbd_command, sbd_dev);
++	pmsprintf(buffer, sizeof(buffer), "%s -d %s dump 2>&1", sbd_command, sbd_dev);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+-		return -oserror();
++		return oserror();
+ 
+ 	strncpy(sbd->path, sbd_dev, sizeof(sbd->path));
+ 	sbd->path[sizeof(sbd->path)-1] = '\0';
+-- 
+2.31.1
+
+
+From 91241a5f76fc83895621fe35f399b5dcd97e796e Mon Sep 17 00:00:00 2001
+From: Paul Evans <pevans@redhat.com>
+Date: Fri, 18 Jun 2021 00:30:39 +0100
+Subject: [PATCH 5/7] pmdahacluster: Add support for labels on key metrics
+
+Introduction of a number of labels on some metrics allowing the export
+of metadata in cases where PM_TYPE_STRING is not supported.
+
+This will allow information including Pacemaker location constraint data and
+others to be successfully exported in pmproxy using the OpenMetrics API.
+
+Satisfies RHBZ# 1972277: PCP - PMDA HA Cluster (pcp-pmda-hacluster) - unable
+to export pacemaker location constraints data due to unsupported metric type
+---
+ qa/1897.out                         |  66 ++++-
+ src/pmdas/hacluster/corosync.c      |   7 +
+ src/pmdas/hacluster/corosync.h      |   1 +
+ src/pmdas/hacluster/drbd.c          |  14 ++
+ src/pmdas/hacluster/drbd.h          |   2 +
+ src/pmdas/hacluster/help            |  30 ++-
+ src/pmdas/hacluster/pacemaker.c     |  21 ++
+ src/pmdas/hacluster/pacemaker.h     |   3 +
+ src/pmdas/hacluster/pmda.c          | 369 ++++++++++++++++++++++++++--
+ src/pmdas/hacluster/pmdahacluster.h |  58 +++--
+ src/pmdas/hacluster/pmns            | 119 ++++-----
+ src/pmdas/hacluster/sbd.c           |   7 +
+ src/pmdas/hacluster/sbd.h           |   1 +
+ 13 files changed, 602 insertions(+), 96 deletions(-)
+
+diff --git a/qa/1897.out b/qa/1897.out
+index 054b1e92f..b757e857a 100644
+--- a/qa/1897.out
++++ b/qa/1897.out
+@@ -76,6 +76,14 @@ Help:
+ The IP address locally linked to this ring.
+     inst [0 or "0"] value "192.168.122.101"
+ 
++ha_cluster.corosync.rings.all PMID: 155.15.0 [Corosync rings information]
++    Data Type: 32-bit unsigned int  InDom: 155.13 0x26c0000d
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a ring exists. The details of the corrosponding ring
++is given as label metadata values for this metric.
++    inst [0 or "0"] value 1
++
+ ha_cluster.corosync.rings.node_id PMID: 155.8.2 [ID of the local node]
+     Data Type: 64-bit unsigned int  InDom: 155.6 0x26c00006
+     Semantics: instant  Units: count
+@@ -120,6 +128,14 @@ Help:
+ Amount of writes to the bitmap area of metadata by the DRBD resource:volume.
+     inst [0 or "drbd1:0"] value 0
+ 
++ha_cluster.drbd.connections.all PMID: 155.18.0 [DRBD Peer disk information]
++    Data Type: 32-bit unsigned int  InDom: 155.16 0x26c00010
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a drbd peer connection exists. The details of the corrosponding DRBD peer
++connection is given as label metadata values for this metric.
++    inst [0 or "drbd1:1"] value 1
++
+ ha_cluster.drbd.connections.peer_disk_state PMID: 155.11.4 [Peer disk state]
+     Data Type: string  InDom: 155.9 0x26c00009
+     Semantics: instant  Units: count
+@@ -218,6 +234,14 @@ Help:
+ Amount in KiB read by the DRBD resource:volume.
+     inst [0 or "drbd1:0"] value 1888160
+ 
++ha_cluster.drbd.resources.all PMID: 155.17.0 [DRBD resource information]
++    Data Type: 32-bit unsigned int  InDom: 155.15 0x26c0000f
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a drbd resource exists. The details of the corrosponding drbd resource
++is given as label metadata values for this metric.
++    inst [0 or "drbd1:0"] value 1
++
+ ha_cluster.drbd.resources.disk_state PMID: 155.10.3 [Disk state]
+     Data Type: string  InDom: 155.8 0x26c00008
+     Semantics: instant  Units: count
+@@ -285,6 +309,14 @@ The number of fail count per node and resource ID, the actual maximum value
+ depends on Pacemaker internals.
+     inst [0 or "node-1:my_first_svc"] value 0
+ 
++ha_cluster.pacemaker.location_constraints.all PMID: 155.12.0 [Location constraint information]
++    Data Type: 32-bit unsigned int  InDom: 155.10 0x26c0000a
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a location constraint exists. The details of the location constraint
++is given as label metadata values for this metric.
++    inst [0 or "test"] value 1
++
+ ha_cluster.pacemaker.location_constraints.node PMID: 155.2.0 [Node of the location constraint]
+     Data Type: string  InDom: 155.1 0x26c00001
+     Semantics: instant  Units: count
+@@ -327,12 +359,23 @@ ha_cluster.pacemaker.node_attributes PMID: 155.4.0 [Metadata used by Resource Ag
+     Semantics: instant  Units: count
+ Help:
+ The raw values for the cluster metadata attributes and their value per node as
+-used by the Resource Agents. 
++used by the Resource Agents.
+     inst [0 or "node-1:test_clone_state"] value "PROMOTED"
+     inst [1 or "node-1:test_site"] value "PRIMARY_SITE_NAME"
+     inst [2 or "node-2:test_clone_state"] value "DEMOTED"
+     inst [3 or "node-2:test_site"] value "SECONDARY_SITE_NAME"
+ 
++ha_cluster.pacemaker.node_attributes_all PMID: 155.13.0 [Metadata information]
++    Data Type: 32-bit unsigned int  InDom: 155.11 0x26c0000b
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a node metadata exists. The details of the node metadata
++is given as label metadata values for this metric.
++    inst [0 or "node-1:test_clone_state"] value 1
++    inst [1 or "node-1:test_site"] value 1
++    inst [2 or "node-2:test_clone_state"] value 1
++    inst [3 or "node-2:test_site"] value 1
++
+ ha_cluster.pacemaker.nodes.status.dc PMID: 155.3.8 [Whether the node status is given as disconnected]
+     Data Type: 32-bit unsigned int  InDom: 155.2 0x26c00002
+     Semantics: instant  Units: count
+@@ -435,6 +478,19 @@ cluster.
+     inst [4 or "rsc_fs_TEST:node-1"] value "ocf::heartbeat:Filesystem"
+     inst [3 or "rsc_ip_TEST:node-1"] value "ocf::heartbeat:IPaddr2"
+ 
++ha_cluster.pacemaker.resources.all PMID: 155.14.0 [Pacemaker resources information]
++    Data Type: 32-bit unsigned int  InDom: 155.12 0x26c0000c
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a resources exists. The details of the resource
++is given as label metadata values for this metric.
++    inst [0 or "my_first_svc:node-1"] value 1
++    inst [5 or "rsc_TEST:node-1"] value 1
++    inst [1 or "rsc_Test:node-1"] value 1
++    inst [2 or "rsc_Test:node-2"] value 1
++    inst [4 or "rsc_fs_TEST:node-1"] value 1
++    inst [3 or "rsc_ip_TEST:node-1"] value 1
++
+ ha_cluster.pacemaker.resources.clone PMID: 155.5.1 [The name of the clone given for this resource]
+     Data Type: string  InDom: 155.4 0x26c00004
+     Semantics: instant  Units: count
+@@ -557,6 +613,14 @@ Help:
+ Value returns as to whether stonith is enabled or disabled for the cluster.
+     value 0
+ 
++ha_cluster.sbd.all PMID: 155.16.0 [SBD device information]
++    Data Type: 32-bit unsigned int  InDom: 155.14 0x26c0000e
++    Semantics: instant  Units: count
++Help:
++Value is 1 if a sbd device exists. The details of the corrosponding SBD device
++is given as label metadata values for this metric.
++    inst [0 or "/dev/vdb"] value 1
++
+ ha_cluster.sbd.devices.path PMID: 155.9.0 [Path of SBD device]
+     Data Type: string  InDom: 155.7 0x26c00007
+     Semantics: instant  Units: count
+diff --git a/src/pmdas/hacluster/corosync.c b/src/pmdas/hacluster/corosync.c
+index ee0052dee..5549e59b9 100644
+--- a/src/pmdas/hacluster/corosync.c
++++ b/src/pmdas/hacluster/corosync.c
+@@ -132,6 +132,13 @@ hacluster_corosync_ring_fetch(int item, struct rings *rings, pmAtomValue *atom)
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_corosync_ring_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_refresh_corosync_node(const char *node_name, struct member_votes *node)
+ {
+diff --git a/src/pmdas/hacluster/corosync.h b/src/pmdas/hacluster/corosync.h
+index f3d265d17..11c3b3b45 100644
+--- a/src/pmdas/hacluster/corosync.h
++++ b/src/pmdas/hacluster/corosync.h
+@@ -73,6 +73,7 @@ extern int hacluster_corosync_global_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_corosync_global();
+ 
+ extern int hacluster_corosync_ring_fetch(int, struct rings *, pmAtomValue *);
++extern int hacluster_corosync_ring_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_corosync_ring(const char *, struct rings *);
+ 
+ extern void corosync_stats_setup(void);
+diff --git a/src/pmdas/hacluster/drbd.c b/src/pmdas/hacluster/drbd.c
+index bec83031c..2c18a5fae 100644
+--- a/src/pmdas/hacluster/drbd.c
++++ b/src/pmdas/hacluster/drbd.c
+@@ -90,6 +90,13 @@ hacluster_drbd_resource_fetch(int item, struct resource *resource, pmAtomValue *
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_drbd_resource_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_drbd_peer_device_fetch(int item, struct peer_device *peer_device, pmAtomValue *atom)
+ {
+@@ -146,6 +153,13 @@ hacluster_drbd_peer_device_fetch(int item, struct peer_device *peer_device, pmAt
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_drbd_peer_device_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_refresh_drbd_resource(const char *resource_name, struct resource *resource)
+ {
+diff --git a/src/pmdas/hacluster/drbd.h b/src/pmdas/hacluster/drbd.h
+index 0cb687e78..35a2a898c 100644
+--- a/src/pmdas/hacluster/drbd.h
++++ b/src/pmdas/hacluster/drbd.h
+@@ -83,9 +83,11 @@ struct peer_device {
+ };
+ 
+ extern int hacluster_drbd_resource_fetch(int, struct resource *, pmAtomValue *);
++extern int hacluster_drbd_resource_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_drbd_resource(const char *, struct resource *);
+ 
+ extern int hacluster_drbd_peer_device_fetch(int, struct peer_device *, pmAtomValue *);
++extern int hacluster_drbd_peer_device_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_drbd_peer_device(const char *, struct peer_device *);
+ 
+ extern void drbd_stats_setup(void);
+diff --git a/src/pmdas/hacluster/help b/src/pmdas/hacluster/help
+index 704e940c0..bdcd68e5f 100644
+--- a/src/pmdas/hacluster/help
++++ b/src/pmdas/hacluster/help
+@@ -42,7 +42,11 @@ Pacemaker cluster.
+ 
+ @ ha_cluster.pacemaker.node_attributes Metadata used by Resource Agents
+ The raw values for the cluster metadata attributes and their value per node as
+-used by the Resource Agents. 
++used by the Resource Agents.
++
++@ ha_cluster.pacemaker.node_attributes_all Metadata information
++Value is 1 if a node metadata exists. The details of the node metadata
++is given as label metadata values for this metric.
+ 
+ @ ha_cluster.pacemaker.stonith_enabled Whether stonith is enabled in the cluster
+ Value returns as to whether stonith is enabled or disabled for the cluster.
+@@ -60,6 +64,10 @@ The resource role that the location contraint applies to, if any.
+ The score given to the location constraint by Pacemaker, the value depends on
+ Pacemaker internals.
+ 
++@ ha_cluster.pacemaker.location_constraints.all Location constraint information
++Value is 1 if a location constraint exists. The details of the location constraint
++is given as label metadata values for this metric.
++
+ @ ha_cluster.pacemaker.nodes.type The type given to the node
+ The membership type given to the node in the Pacemaker cluster.
+ 
+@@ -137,6 +145,10 @@ value of 1 confirms the resource status as failed.
+ Whether the failure_ignored status is reported by the resource in the
+ cluster, a value of 1 confirms the resource status as failure_ignored.
+ 
++@ ha_cluster.pacemaker.resources.all Pacemaker resources information
++Value is 1 if a resources exists. The details of the resource
++is given as label metadata values for this metric.
++
+ @ ha_cluster.corosync.quorate Value given for quorate
+ The value represents whether or not the cluster is quorate.
+ 
+@@ -180,6 +192,10 @@ The number for the Corosync ring.
+ @ ha_cluster.corosync.rings.ring_id Ring ID
+ The internal Corosync ring ID, corresponds to the first node to join.
+ 
++@ ha_cluster.corosync.rings.all Corosync rings information
++Value is 1 if a ring exists. The details of the corrosponding ring
++is given as label metadata values for this metric.
++
+ @ ha_cluster.sbd.devices.path Path of SBD device
+ The full path given to each SBD device.
+ 
+@@ -187,6 +203,10 @@ The full path given to each SBD device.
+ The current status given for each of the SBD devices, the value is one of
+ healthy or unhealthy.
+ 
++@ ha_cluster.sbd.all SBD device information
++Value is 1 if a sbd device exists. The details of the corrosponding SBD device
++is given as label metadata values for this metric.
++
+ @ ha_cluster.sbd.timeouts.mgswait mgswait timeout value
+ The value threshold for msgwait timeouts for the given SBD device.
+ 
+@@ -260,6 +280,10 @@ The volume number of ther resource for each resource:volume.
+ @ ha_cluster.drbd.resources.disk_state Disk state
+ The current reported disk state of for the resource:volume.
+ 
++@ ha_cluster.drbd.resources.all DRBD resource information
++Value is 1 if a drbd resource exists. The details of the corrosponding drbd resource
++is given as label metadata values for this metric.
++
+ @ ha_cluster.drbd.connections.resource Resource that the connection is for
+ The given resource that the DRBD connection is for each resource:volume.
+ 
+@@ -274,3 +298,7 @@ The reported volume for the connection.
+ 
+ @ ha_cluster.drbd.connections.peer_disk_state Peer disk state
+ The reported peer disk state for the connection.
++
++@ ha_cluster.drbd.connections.all DRBD Peer disk information
++Value is 1 if a drbd peer connection exists. The details of the corrosponding DRBD peer
++connection is given as label metadata values for this metric.
+diff --git a/src/pmdas/hacluster/pacemaker.c b/src/pmdas/hacluster/pacemaker.c
+index 355f4df5c..beff98b83 100644
+--- a/src/pmdas/hacluster/pacemaker.c
++++ b/src/pmdas/hacluster/pacemaker.c
+@@ -221,6 +221,13 @@ hacluster_pacemaker_constraints_fetch(int item, struct location_constraints *loc
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_pacemaker_constraints_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_pacemaker_nodes_fetch(int item, struct nodes *nodes, pmAtomValue *atom)
+ {
+@@ -297,6 +304,13 @@ hacluster_pacemaker_node_attribs_fetch(int item, struct attributes *attributes,
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_pacemaker_node_attribs_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_pacemaker_resources_fetch(int item, struct resources *resources, pmAtomValue *atom)
+ {
+@@ -353,6 +367,13 @@ hacluster_pacemaker_resources_fetch(int item, struct resources *resources, pmAto
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int
++hacluster_pacemaker_resources_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_refresh_pacemaker_global()
+ {
+diff --git a/src/pmdas/hacluster/pacemaker.h b/src/pmdas/hacluster/pacemaker.h
+index fe175e37f..0bd2a7e0f 100644
+--- a/src/pmdas/hacluster/pacemaker.h
++++ b/src/pmdas/hacluster/pacemaker.h
+@@ -124,15 +124,18 @@ extern int hacluster_pacemaker_fail_fetch(int, struct fail_count *, pmAtomValue
+ extern int hacluster_refresh_pacemaker_fail(const char *, struct fail_count *);
+ 
+ extern int hacluster_pacemaker_constraints_fetch(int, struct location_constraints *, pmAtomValue *);
++extern int hacluster_pacemaker_constraints_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_pacemaker_constraints(const char *, struct location_constraints *);
+ 
+ extern int hacluster_pacemaker_nodes_fetch(int, struct nodes *, pmAtomValue *);
+ extern int hacluster_refresh_pacemaker_nodes(const char *, struct nodes *);
+ 
+ extern int hacluster_pacemaker_node_attribs_fetch(int, struct attributes *, pmAtomValue *);
++extern int hacluster_pacemaker_node_attribs_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_pacemaker_node_attribs(const char *, struct attributes *);
+ 
+ extern int hacluster_pacemaker_resources_fetch(int, struct resources *, pmAtomValue *);
++extern int hacluster_pacemaker_resources_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_pacemaker_resources(const char *, struct resources *);
+ 
+ extern void pacemaker_stats_setup(void);
+diff --git a/src/pmdas/hacluster/pmda.c b/src/pmdas/hacluster/pmda.c
+index c7ffac6da..6c9163b25 100644
+--- a/src/pmdas/hacluster/pmda.c
++++ b/src/pmdas/hacluster/pmda.c
+@@ -42,6 +42,13 @@ pmdaIndom indomtable[] = {
+ 	{ .it_indom = SBD_DEVICE_INDOM },
+ 	{ .it_indom = DRBD_RESOURCE_INDOM },
+ 	{ .it_indom = DRBD_PEER_DEVICE_INDOM },
++	{ .it_indom = PACEMAKER_CONSTRAINTS_ALL_INDOM },
++	{ .it_indom = PACEMAKER_NODE_ATTRIB_ALL_INDOM },
++	{ .it_indom = PACEMAKER_RESOURCES_ALL_INDOM },
++	{ .it_indom = COROSYNC_RING_ALL_INDOM},
++	{ .it_indom = SBD_DEVICE_ALL_INDOM},
++	{ .it_indom = DRBD_RESOURCE_ALL_INDOM},
++	{ .it_indom = DRBD_PEER_DEVICE_ALL_INDOM},
+ };
+ 
+ #define INDOM(x) (indomtable[x].it_indom)
+@@ -83,6 +90,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_CONSTRAINTS, PACEMAKER_CONSTRAINTS_SCORE),
+ 		PM_TYPE_STRING, PACEMAKER_CONSTRAINTS_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_PACEMAKER_CONSTRAINTS_ALL, 0),
++		PM_TYPE_U32, PACEMAKER_CONSTRAINTS_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_NODES, PACEMAKER_NODES_ONLINE),
+ 		PM_TYPE_U32, PACEMAKER_NODES_INDOM, PM_SEM_INSTANT,
+@@ -127,6 +138,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_NODE_ATTRIB, PACEMAKER_NODES_ATTRIB_VALUE),
+ 		PM_TYPE_STRING, PACEMAKER_NODE_ATTRIB_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_PACEMAKER_NODE_ATTRIB_ALL, 0),
++		PM_TYPE_U32, PACEMAKER_NODE_ATTRIB_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },	
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_RESOURCES, PACEMAKER_RESOURCES_AGENT),
+ 		PM_TYPE_STRING, PACEMAKER_RESOURCES_INDOM, PM_SEM_INSTANT,
+@@ -139,6 +154,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_RESOURCES, PACEMAKER_RESOURCES_GROUP),
+ 		PM_TYPE_STRING, PACEMAKER_RESOURCES_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_PACEMAKER_RESOURCES_ALL, 0),
++		PM_TYPE_U32, PACEMAKER_RESOURCES_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_PACEMAKER_RESOURCES, PACEMAKER_RESOURCES_MANAGED),
+ 		PM_TYPE_U32, PACEMAKER_RESOURCES_INDOM, PM_SEM_INSTANT,
+@@ -228,6 +247,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_COROSYNC_RING, COROSYNC_RINGS_RING_ID),
+ 		PM_TYPE_STRING, COROSYNC_RING_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_COROSYNC_RING_ALL, 0),
++		PM_TYPE_U32, COROSYNC_RING_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },	
+ 	/* SBD */
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_SBD_DEVICE, SBD_DEVICE_PATH),
+@@ -237,6 +260,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_SBD_DEVICE, SBD_DEVICE_STATUS),
+ 		PM_TYPE_STRING, SBD_DEVICE_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_SBD_DEVICE_ALL, 0),
++		PM_TYPE_U32, SBD_DEVICE_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_SBD_DEVICE, SBD_DEVICE_TIMEOUT_MSGWAIT),
+ 		PM_TYPE_U32, SBD_DEVICE_INDOM, PM_SEM_INSTANT,
+@@ -270,6 +297,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_DRBD_RESOURCE, DRBD_RESOURCE_DISK_STATE),
+ 		PM_TYPE_STRING, DRBD_RESOURCE_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc ={
++		PMDA_PMID(CLUSTER_DRBD_RESOURCE_ALL, 0),
++		PM_TYPE_U32, DRBD_RESOURCE_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_DRBD_RESOURCE, DRBD_RESOURCE_WRITTEN),
+ 		PM_TYPE_U32, DRBD_RESOURCE_INDOM, PM_SEM_INSTANT,
+@@ -318,6 +349,10 @@ pmdaMetric metrictable[] = {
+ 		PMDA_PMID(CLUSTER_DRBD_PEER_DEVICE, DRBD_PEER_DEVICE_PEER_DISK_STATE),
+ 		PM_TYPE_STRING, DRBD_PEER_DEVICE_INDOM, PM_SEM_INSTANT,
+ 		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
++	{ .m_desc = {
++		PMDA_PMID(CLUSTER_DRBD_PEER_DEVICE_ALL, 0),
++		PM_TYPE_U32, DRBD_PEER_DEVICE_ALL_INDOM, PM_SEM_INSTANT,
++		PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) } },
+ 	{ .m_desc = {
+ 		PMDA_PMID(CLUSTER_DRBD_PEER_DEVICE, DRBD_PEER_DEVICE_CONNECTIONS_SYNC),
+ 		PM_TYPE_FLOAT, DRBD_PEER_DEVICE_INDOM, PM_SEM_INSTANT,
+@@ -359,6 +394,12 @@ hacluster_pacemaker_fail_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_FAIL_INDOM);
+ 
++	/*
++	 * Update indom cache based off the reading of crm_mon listed in
++	 * the output from crm_mon
++	 */
++	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+@@ -425,6 +466,14 @@ hacluster_pacemaker_constraints_instance_refresh(void)
+ 	int			found_constraints = 0;
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_CONSTRAINTS_INDOM);
++	pmInDom		indom_all = INDOM(PACEMAKER_CONSTRAINTS_ALL_INDOM);
++
++	/*
++	 * Update indom cache based off the reading of cibadmin listed in
++	 * the output from cibadmin
++	 */
++	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cibadmin_command);
+ 	buffer[sizeof(buffer)-1] = '\0';
+@@ -446,6 +495,7 @@ hacluster_pacemaker_constraints_instance_refresh(void)
+ 			struct  pacemaker_constraints *constraints;
+ 
+ 			sts = pmdaCacheLookupName(indom, constraint_name, NULL, (void **)&constraints);
++			pmdaCacheLookupName(indom_all, constraint_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && constraints == NULL)) {
+ 				constraints = calloc(1, sizeof(struct pacemaker_constraints));
+ 				if (constraints == NULL) {
+@@ -457,6 +507,7 @@ hacluster_pacemaker_constraints_instance_refresh(void)
+ 				continue;
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, constraint_name, (void *)constraints);
++			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, constraint_name, NULL);
+ 		}
+ 	}
+ 	pclose(pf);
+@@ -472,6 +523,12 @@ hacluster_pacemaker_nodes_instance_refresh(void)
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_NODES_INDOM);
+ 
++	/*
++	 * Update indom cache based off the reading of crm_mon listed in
++	 * the output from crm_mon
++	 */
++	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+ 	if ((pf = popen(buffer, "r")) == NULL)
+@@ -524,6 +581,14 @@ hacluster_pacemaker_node_attrib_instance_refresh(void)
+ 	int			found_node_attributes = 0, found_node_name = 0;
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(PACEMAKER_NODE_ATTRIB_INDOM);
++	pmInDom		indom_all = INDOM(PACEMAKER_NODE_ATTRIB_ALL_INDOM);
++
++	/*
++	 * Update indom cache based off the reading of crm_mon listed in
++	 * the output from crm_mon
++	 */
++	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+@@ -571,6 +636,7 @@ hacluster_pacemaker_node_attrib_instance_refresh(void)
+ 				struct  pacemaker_node_attrib *node_attrib;
+ 
+ 				sts = pmdaCacheLookupName(indom, instance_name, NULL, (void **)&node_attrib);
++				pmdaCacheLookupName(indom_all, instance_name, NULL, NULL);
+ 				if (sts == PM_ERR_INST || (sts >=0 && node_attrib == NULL)) {
+ 					node_attrib = calloc(1, sizeof(struct pacemaker_node_attrib));
+ 					if (node_attrib == NULL) {
+@@ -582,6 +648,7 @@ hacluster_pacemaker_node_attrib_instance_refresh(void)
+ 					continue;
+ 
+ 				pmdaCacheStore(indom, PMDA_CACHE_ADD, instance_name, (void *)node_attrib);
++				pmdaCacheStore(indom_all, PMDA_CACHE_ADD, instance_name, NULL);
+ 			}
+ 		}
+ 	}
+@@ -597,6 +664,14 @@ hacluster_pacemaker_resources_instance_refresh(void)
+ 	int			found_resources = 0;
+ 	FILE		*pf;
+ 	pmInDom		indom= INDOM(PACEMAKER_RESOURCES_INDOM);
++	pmInDom		indom_all = INDOM(PACEMAKER_RESOURCES_ALL_INDOM);
++
++	/*
++	 * Update indom cache based off the reading of crm_mon listed in
++	 * the output from crm_mon
++	 */
++	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", crm_mon_command);
+ 
+@@ -641,6 +716,7 @@ hacluster_pacemaker_resources_instance_refresh(void)
+ 				struct pacemaker_resources *pace_resources;
+ 
+ 				sts = pmdaCacheLookupName(indom, instance_name, NULL, (void **)&pace_resources);
++				pmdaCacheLookupName(indom_all, instance_name, NULL, NULL);
+ 				if (sts == PM_ERR_INST || (sts >=0 && pace_resources == NULL)) {
+ 					pace_resources = calloc(1, sizeof(struct pacemaker_resources));
+ 					if (pace_resources == NULL) {
+@@ -652,6 +728,7 @@ hacluster_pacemaker_resources_instance_refresh(void)
+ 					continue;
+ 
+ 				pmdaCacheStore(indom, PMDA_CACHE_ADD, instance_name, (void *)pace_resources);
++				pmdaCacheStore(indom_all, PMDA_CACHE_ADD, instance_name, NULL);
+ 
+ 				/* Clear node name in the event that a resource has not got a node attachment */
+ 				memset(node_name, '\0', sizeof(node_name));
+@@ -730,12 +807,14 @@ hacluster_corosync_ring_instance_refresh(void)
+ 	char		buffer[4096], ring_name[128];
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(COROSYNC_RING_INDOM);
++	pmInDom		indom_all = INDOM(COROSYNC_RING_ALL_INDOM);
+ 
+ 	/*
+ 	 * Update indom cache based off number of nodes listed in the
+ 	 * membership information section of corosync-quorumtool output
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 	
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", cfgtool_command);
+ 	
+@@ -763,6 +842,7 @@ hacluster_corosync_ring_instance_refresh(void)
+ 			struct  corosync_ring *ring;
+ 
+ 			sts = pmdaCacheLookupName(indom, ring_name, NULL, (void **)&ring);
++			pmdaCacheLookupName(indom_all, ring_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && ring == NULL)) {
+ 				ring = calloc(1, sizeof(struct corosync_ring));
+ 				if (ring == NULL) {
+@@ -774,6 +854,7 @@ hacluster_corosync_ring_instance_refresh(void)
+ 				continue;
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, ring_name, (void *)ring);
++			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, ring_name, NULL);
+ 		}
+ 	}
+ 	pclose(pf);
+@@ -789,12 +870,14 @@ hacluster_sbd_device_instance_refresh(void)
+ 	char		*buffer_ptr;
+ 	FILE		*fp;
+ 	pmInDom		indom = INDOM(SBD_DEVICE_INDOM);
++	pmInDom		indom_all = INDOM(SBD_DEVICE_ALL_INDOM);
+ 
+ 	/*
+ 	 * Update indom cache based off number of nodes listed in the
+ 	 * membership information section of corosync-quorumtool output
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 
+ 	if ((fp = fopen(sbd_path, "r")) == NULL)
+ 		/*
+@@ -831,6 +914,7 @@ hacluster_sbd_device_instance_refresh(void)
+ 					struct  sbd_device *sbd;
+ 
+ 					sts = pmdaCacheLookupName(indom, dev_name, NULL, (void **)&sbd);
++					pmdaCacheLookupName(indom_all, dev_name, NULL, NULL);
+ 					if (sts == PM_ERR_INST || (sts >=0 && sbd == NULL)) {
+ 						sbd = calloc(1, sizeof(struct sbd_device));
+ 						if (sbd == NULL) {
+@@ -842,6 +926,7 @@ hacluster_sbd_device_instance_refresh(void)
+ 						continue;
+ 
+ 					pmdaCacheStore(indom, PMDA_CACHE_ADD, dev_name, (void *)sbd);
++					pmdaCacheStore(indom_all, PMDA_CACHE_ADD, dev_name, NULL);
+ 				}
+ 			}
+ 		}
+@@ -860,6 +945,7 @@ hacluster_drbd_resource_instance_refresh(void)
+ 	char		*buffer_ptr;
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(DRBD_RESOURCE_INDOM);
++	pmInDom		indom_all = INDOM(DRBD_RESOURCE_ALL_INDOM);
+ 
+ 	int found_node = 0, found_volume = 0, nesting = 0;
+ 
+@@ -868,6 +954,7 @@ hacluster_drbd_resource_instance_refresh(void)
+ 	 * the json output from drbdsetup
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 	
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
+ 	
+@@ -910,6 +997,7 @@ hacluster_drbd_resource_instance_refresh(void)
+ 			struct  drbd_resource *resource;
+ 
+ 			sts = pmdaCacheLookupName(indom, resource_name, NULL, (void **)&resource);
++			pmdaCacheLookupName(indom_all, resource_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && resource == NULL)) {
+ 				resource = calloc(1, sizeof(struct drbd_resource));
+ 				if (resource == NULL) {
+@@ -921,6 +1009,7 @@ hacluster_drbd_resource_instance_refresh(void)
+ 				continue;
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, resource_name, (void *)resource);
++			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, resource_name, NULL);
+ 			found_volume = 0;
+ 		}
+ 	}
+@@ -937,6 +1026,7 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 	char		*buffer_ptr;
+ 	FILE		*pf;
+ 	pmInDom		indom = INDOM(DRBD_PEER_DEVICE_INDOM);
++	pmInDom		indom_all = INDOM(DRBD_PEER_DEVICE_ALL_INDOM);
+ 
+ 	int found_node = 0, found_peer_node = 0, nesting = 0;
+ 	
+@@ -945,6 +1035,7 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 	 * the json output from drbdsetup
+ 	 */
+ 	pmdaCacheOp(indom, PMDA_CACHE_INACTIVE);
++	pmdaCacheOp(indom_all, PMDA_CACHE_INACTIVE);
+ 
+ 	pmsprintf(buffer, sizeof(buffer), "%s 2>&1", drbdsetup_command);
+ 
+@@ -987,6 +1078,7 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 			struct  drbd_peer_device *peer_device;
+ 
+ 			sts = pmdaCacheLookupName(indom, peer_name, NULL, (void **)&peer_device);
++			pmdaCacheLookupName(indom_all, peer_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && peer_device == NULL)) {
+ 				peer_device = calloc(1, sizeof(struct drbd_peer_device));
+ 				if (peer_device == NULL) {
+@@ -998,6 +1090,7 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 				continue;
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, peer_name, (void *)peer_device);
++			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, peer_name, NULL);
+ 			found_peer_node = 0;
+ 		}
+ 	}
+@@ -1088,7 +1181,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(PACEMAKER_CONSTRAINTS_INDOM), i, &constraint_name, (void **)&constraints) || !constraints)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_PACEMAKER_CONSTRAINTS])
++		if (need_refresh[CLUSTER_PACEMAKER_CONSTRAINTS] ||
++			need_refresh[CLUSTER_PACEMAKER_CONSTRAINTS_ALL])
+ 			hacluster_refresh_pacemaker_constraints(constraint_name, &constraints->location_constraints);
+ 	}
+ 	
+@@ -1108,7 +1202,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(PACEMAKER_NODE_ATTRIB_INDOM), i, &attrib_name, (void **)&node_attribs) || !node_attribs)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_PACEMAKER_NODE_ATTRIB])
++		if (need_refresh[CLUSTER_PACEMAKER_NODE_ATTRIB] ||
++			need_refresh[CLUSTER_PACEMAKER_NODE_ATTRIB_ALL])
+ 			hacluster_refresh_pacemaker_node_attribs(attrib_name, &node_attribs->attributes);
+ 	}
+ 	
+@@ -1118,7 +1213,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(PACEMAKER_RESOURCES_INDOM), i, &pace_resource_name, (void **)&pace_resources) || !pace_resources)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_PACEMAKER_RESOURCES])
++		if (need_refresh[CLUSTER_PACEMAKER_RESOURCES] ||
++			need_refresh[CLUSTER_PACEMAKER_RESOURCES_ALL])
+ 			hacluster_refresh_pacemaker_resources(pace_resource_name, &pace_resources->resources);
+ 	}
+ 
+@@ -1141,7 +1237,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(COROSYNC_RING_INDOM), i, &ring_name, (void **)&ring) || !ring)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_COROSYNC_RING])
++		if (need_refresh[CLUSTER_COROSYNC_RING] ||
++			need_refresh[CLUSTER_COROSYNC_RING_ALL])
+ 			hacluster_refresh_corosync_ring(ring_name, &ring->rings);
+ 	}
+ 	
+@@ -1151,7 +1248,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(SBD_DEVICE_INDOM), i, &sbd_dev, (void **)&sbd) || !sbd)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_SBD_DEVICE])
++		if (need_refresh[CLUSTER_SBD_DEVICE] ||
++			need_refresh[CLUSTER_SBD_DEVICE_ALL])
+ 			hacluster_refresh_sbd_device(sbd_dev, &sbd->sbd);
+ 	}
+ 	
+@@ -1161,7 +1259,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(DRBD_RESOURCE_INDOM), i, &resource_name, (void **)&resource) || !resource)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_DRBD_RESOURCE])
++		if (need_refresh[CLUSTER_DRBD_RESOURCE] ||
++			need_refresh[CLUSTER_DRBD_RESOURCE_ALL])
+ 			hacluster_refresh_drbd_resource(resource_name, &resource->resource);
+ 	}
+ 	
+@@ -1171,7 +1270,8 @@ hacluster_fetch_refresh(pmdaExt *pmda, int *need_refresh)
+ 		if (!pmdaCacheLookup(INDOM(DRBD_PEER_DEVICE_INDOM), i, &peer_device, (void **)&peer) || !peer)
+ 			continue;
+ 
+-		if (need_refresh[CLUSTER_DRBD_PEER_DEVICE])
++		if (need_refresh[CLUSTER_DRBD_PEER_DEVICE] ||
++			need_refresh[CLUSTER_DRBD_PEER_DEVICE_ALL])
+ 			hacluster_refresh_drbd_peer_device(peer_device, &peer->peer_device);
+ 	}
+ 	
+@@ -1228,6 +1328,9 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 				return sts;
+ 			return hacluster_pacemaker_constraints_fetch(item, &constraints->location_constraints, atom);
+ 			
++		case CLUSTER_PACEMAKER_CONSTRAINTS_ALL:
++			return hacluster_pacemaker_constraints_all_fetch(item, atom);			
++			
+ 		case CLUSTER_PACEMAKER_NODES:
+ 			sts = pmdaCacheLookup(INDOM(PACEMAKER_NODES_INDOM), inst, NULL, (void **)&pace_nodes);
+ 			if (sts < 0)
+@@ -1239,6 +1342,9 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 			if (sts < 0)
+ 				return sts;
+ 			return hacluster_pacemaker_node_attribs_fetch(item, &pace_attribs->attributes, atom);
++
++		case CLUSTER_PACEMAKER_NODE_ATTRIB_ALL:
++			return hacluster_pacemaker_node_attribs_all_fetch(item, atom);
+ 			
+ 		case CLUSTER_PACEMAKER_RESOURCES:
+ 			sts = pmdaCacheLookup(INDOM(PACEMAKER_RESOURCES_INDOM), inst, NULL, (void **)&pace_resources);
+@@ -1246,6 +1352,9 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 				return sts;
+ 			return hacluster_pacemaker_resources_fetch(item, &pace_resources->resources, atom);
+ 
++		case CLUSTER_PACEMAKER_RESOURCES_ALL:
++			return hacluster_pacemaker_resources_all_fetch(item, atom);
++
+ 		case CLUSTER_COROSYNC_NODE:
+ 			sts = pmdaCacheLookup(INDOM(COROSYNC_NODE_INDOM), inst, NULL, (void **)&node);
+ 			if (sts < 0)
+@@ -1260,18 +1369,27 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 			if (sts < 0)
+ 				return sts;
+ 			return hacluster_corosync_ring_fetch(item, &ring->rings, atom);
++
++		case CLUSTER_COROSYNC_RING_ALL:
++			return hacluster_corosync_ring_all_fetch(item, atom);
+ 			
+ 		case CLUSTER_SBD_DEVICE:
+ 			sts = pmdaCacheLookup(INDOM(SBD_DEVICE_INDOM), inst, NULL, (void **)&sbd);
+ 			if (sts < 0)
+ 				return sts;
+ 			return hacluster_sbd_device_fetch(item, &sbd->sbd, atom);
++
++		case CLUSTER_SBD_DEVICE_ALL:
++			return hacluster_sbd_device_all_fetch(item, atom);
+ 			
+ 		case CLUSTER_DRBD_RESOURCE:
+ 			sts = pmdaCacheLookup(INDOM(DRBD_RESOURCE_INDOM), inst, NULL, (void **)&resource);
+ 			if (sts < 0)
+ 				return sts;
+-			return hacluster_drbd_resource_fetch(item, &resource->resource, atom);		
++			return hacluster_drbd_resource_fetch(item, &resource->resource, atom);	
++
++		case CLUSTER_DRBD_RESOURCE_ALL:
++			return hacluster_drbd_resource_all_fetch(item, atom);	
+ 		
+ 		case CLUSTER_DRBD_PEER_DEVICE:
+ 			sts = pmdaCacheLookup(INDOM(DRBD_PEER_DEVICE_INDOM), inst, NULL, (void **)&peer);
+@@ -1279,6 +1397,9 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 				return sts;
+ 			return hacluster_drbd_peer_device_fetch(item, &peer->peer_device, atom);
+ 
++		case CLUSTER_DRBD_PEER_DEVICE_ALL:
++			return hacluster_drbd_peer_device_all_fetch(item, atom);
++
+ 		default:
+ 			return PM_ERR_PMID;
+ 	}
+@@ -1286,6 +1407,220 @@ hacluster_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
+ 	return PMDA_FETCH_STATIC;
+ }
+ 
++static int
++hacluster_labelInDom(pmID pmid, pmLabelSet **lp)
++{	
++	unsigned int cluster = pmID_cluster(pmid);
++
++	switch (cluster) {
++		case CLUSTER_PACEMAKER_CONSTRAINTS_ALL:
++			pmdaAddLabels(lp, "{\"constraint\":\"constraint\"}");
++			pmdaAddLabels(lp, "{\"node\":\"node name\"}");
++			pmdaAddLabels(lp, "{\"resource\":\"resource name\"}");
++			pmdaAddLabels(lp, "{\"role\":\"role of node\"}");
++			pmdaAddLabels(lp, "{\"score\":\"score\"}");
++			return 1;
++
++		case CLUSTER_PACEMAKER_NODE_ATTRIB_ALL:
++			pmdaAddLabels(lp, "{\"name\":\"attribute name\"}");
++			pmdaAddLabels(lp, "{\"node\":\"node name\"}");
++			pmdaAddLabels(lp, "{\"value\":\"value\"}");
++			return 1;
++
++		case CLUSTER_PACEMAKER_RESOURCES_ALL:
++			pmdaAddLabels(lp, "{\"agent\":\"agent\"}");
++			pmdaAddLabels(lp, "{\"clone\":\"clone\"}");
++			pmdaAddLabels(lp, "{\"group\":\"group\"}");
++			pmdaAddLabels(lp, "{\"managed\":\"managed\"}");
++			pmdaAddLabels(lp, "{\"node\":\"node name\"}");
++			pmdaAddLabels(lp, "{\"resource\":\"resource name\"}");
++			pmdaAddLabels(lp, "{\"role\":\"role\"}");
++			return 1;
++
++		case CLUSTER_COROSYNC_RING_ALL:
++			pmdaAddLabels(lp, "{\"address\":\"ip address\"}");
++			pmdaAddLabels(lp, "{\"node_id\":\"id of node\"}");
++			pmdaAddLabels(lp, "{\"number\":\"ring number\"}");
++			pmdaAddLabels(lp, "{\"ring_id\":\"id of ring\"}");
++			return 1;
++
++		case CLUSTER_SBD_DEVICE_ALL:
++			pmdaAddLabels(lp, "{\"device\":\"device\"}");
++			pmdaAddLabels(lp, "{\"status\":\"status\"}");
++			return 1;
++
++		case CLUSTER_DRBD_RESOURCE_ALL:
++			pmdaAddLabels(lp, "{\"disk_state\":\"disk state\"}");
++			pmdaAddLabels(lp, "{\"resource\":\"resource name\"}");
++			pmdaAddLabels(lp, "{\"role\":\"role\"}");
++			pmdaAddLabels(lp, "{\"volume\":\"volume\"}");
++			return 1;
++
++		case CLUSTER_DRBD_PEER_DEVICE_ALL:
++			pmdaAddLabels(lp, "{\"peer_disk_state\":\"peer disk state\"}");
++			pmdaAddLabels(lp, "{\"peer_node_id\":\"peer node id\"}");
++			pmdaAddLabels(lp, "{\"peer_role\":\"peer role\"}");
++			pmdaAddLabels(lp, "{\"resource\":\"resource\"}");
++			pmdaAddLabels(lp, "{\"volume\":\"volume\"}");
++			return 1;
++
++		default:
++			break;
++	}
++	return 0;
++}
++			
++static int
++hacluster_label(int ident, int type, pmLabelSet **lpp, pmdaExt *pmda)
++{
++	int sts;
++
++	switch (type) {
++		case PM_LABEL_ITEM:
++			if ((sts = hacluster_labelInDom((pmID)ident, lpp)) <0)
++				return sts;
++			break;
++
++		default:
++			break;
++	}
++	return pmdaLabel(ident, type, lpp, pmda);
++}
++
++static int
++hacluster_labelCallBack(pmInDom indom, unsigned int inst, pmLabelSet **lp)
++{
++	struct location_constraints		*constraints;
++	struct attributes 				*attributes;
++	struct resources 				*resources;
++	struct rings					*ring;
++	struct sbd						*sbd;
++	struct resource					*resource;
++	struct peer_device				*peer_device;
++
++	int 							sts;
++	int								no_node_attachment = 0;
++	char 							*name;
++	char 							*node_name, *attribute_name, *node, *resource_id, *tofree, *str;
++
++	if (indom == PM_INDOM_NULL)
++		return 0;
++
++	switch (pmInDom_serial(indom)) {
++		case PACEMAKER_CONSTRAINTS_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(PACEMAKER_CONSTRAINTS_INDOM), inst, &name, (void **)&constraints);
++			if (sts < 0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++			return pmdaAddLabels(lp, "{\"constraint\":\"%s\", \"node\":\"%s\", \"resource\":\"%s\", \"role\":\"%s\", \"score\":\"%s\"}",
++				name,
++				constraints->node,
++				constraints->resource,
++				constraints->role,
++				constraints->score
++			);
++
++		case PACEMAKER_NODE_ATTRIB_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(PACEMAKER_NODE_ATTRIB_INDOM), inst, &name, (void **)&attributes);
++			if (sts < 0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++			/* 
++	 		 * We need to split our combined NODE:ATTRIBUTE_NAME instance names into their
++	 		 * separated NODE and ATTRIBUTE_NAME fields
++	 		 */
++			tofree = str = strdup(name);
++			attribute_name = strsep(&str, ":");
++			node_name = strsep(&str, ":");
++
++			sts = pmdaAddLabels(lp, "{\"name\":\"%s\", \"node\":\"%s\", \"value\":\"%s\"}",
++				node_name,
++				attribute_name,
++				attributes->value
++			);
++			free(tofree);
++			return sts;
++			
++		case PACEMAKER_RESOURCES_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(PACEMAKER_RESOURCES_INDOM), inst, &name, (void **)&resources);
++			if (sts < 0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++				
++			if (strchr(name, ':') == NULL) {
++				node = (char*)name;
++				no_node_attachment = 1;
++				resource_id = "";
++			} else {
++				tofree = str = strdup(name);
++				node = strsep(&str, ":");
++				resource_id = strsep(&str, ":");
++			}
++				
++			sts = pmdaAddLabels(lp, "{\"agent\":\"%s\", \"clone\":\"%s\", \"group\":\"%s\", \"managed\":%u, \"node\":\"%s\", \"resource\":\"%s\", \"role\":\"%s\"}",
++				resources->agent,
++				resources->clone,
++				resources->group,
++				resources->managed,
++				resource_id,
++				node, 
++				resources->role
++			);
++			
++			if (!no_node_attachment)
++				free(tofree);
++			return sts;
++			
++		case COROSYNC_RING_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(COROSYNC_RING_INDOM), inst, &name, (void **)&ring);
++			if (sts <0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++				
++			return pmdaAddLabels(lp, "{\"address\":\"%s\", \"node_id\":%"PRIu64", \"number\":%u, \"ring_id\":\"%s\"}",
++				ring->address,
++				ring->node_id,
++				ring->number,
++				ring->ring_id
++			);
++
++		case SBD_DEVICE_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(SBD_DEVICE_INDOM), inst, &name, (void**)&sbd);
++			if (sts <0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++				
++			return pmdaAddLabels(lp, "{\"device\":\"%s\", \"status\":\"%s\"}",
++				sbd->path,
++				sbd->status
++			);
++
++		case DRBD_RESOURCE_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(DRBD_RESOURCE_INDOM), inst, &name, (void**)&resource);
++			if (sts <0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++				
++			return pmdaAddLabels(lp, "{\"disk_state\":\"%s\", \"resource\":\"%s\", \"role\":\"%s\", \"volume\":\"%s\"}",
++				resource->disk_state,
++				resource->resource,
++				resource->role,
++				resource->volume
++			);
++			
++		case DRBD_PEER_DEVICE_ALL_INDOM:
++			sts = pmdaCacheLookup(INDOM(DRBD_PEER_DEVICE_INDOM), inst, &name, (void**)&peer_device);
++			if (sts <0 || sts == PMDA_CACHE_INACTIVE)
++				return 0;
++				
++			return pmdaAddLabels(lp, "{\"peer_disk_state\":\"%s\", \"peer_node_id\":\"%s\", \"peer_role\":\"%s\", \"resource\":\"%s\", \"volume\":%"PRIu32"}",
++				peer_device->peer_disk_state,
++				peer_device->peer_node_id,
++				peer_device->peer_role,
++				peer_device->resource,
++				peer_device->volume
++			);
++
++		default:
++			break;
++	}
++	return 0;
++}
++
+ void
+ hacluster_inst_setup(void)
+ {
+@@ -1378,7 +1713,7 @@ hacluster_init(pmdaInterface *dp)
+ 		int sep = pmPathSeparator();
+ 		pmsprintf(helppath, sizeof(helppath), "%s%c" "hacluster" "%c" "help",
+ 			pmGetConfig("PCP_PMDAS_DIR"), sep, sep);
+-		pmdaDSO(dp, PMDA_INTERFACE_4, "HACLUSTER DSO", helppath);
++		pmdaDSO(dp, PMDA_INTERFACE_7, "HACLUSTER DSO", helppath);
+ 	}
+ 
+ 	if (dp->status != 0)
+@@ -1391,13 +1726,15 @@ hacluster_init(pmdaInterface *dp)
+ 	sbd_stats_setup();
+ 	drbd_stats_setup();
+ 
+-	dp->version.four.instance = hacluster_instance;
+-	dp->version.four.fetch = hacluster_fetch;
+-	dp->version.four.text = hacluster_text;
+-	dp->version.four.pmid = hacluster_pmid;
+-	dp->version.four.name = hacluster_name;
+-	dp->version.four.children = hacluster_children;
++	dp->version.seven.instance = hacluster_instance;
++	dp->version.seven.fetch = hacluster_fetch;
++	dp->version.seven.text = hacluster_text;
++	dp->version.seven.pmid = hacluster_pmid;
++	dp->version.seven.name = hacluster_name;
++	dp->version.seven.children = hacluster_children;
++	dp->version.seven.label = hacluster_label;
+ 	pmdaSetFetchCallBack(dp, hacluster_fetchCallBack);
++	pmdaSetLabelCallBack(dp, hacluster_labelCallBack);
+ 
+ 	pmdaSetFlags(dp, PMDA_EXT_FLAG_HASHED);
+ 	pmdaInit(dp, indomtable, nindoms, metrictable, nmetrics);
+@@ -1428,7 +1765,7 @@ main(int argc, char **argv)
+ 	pmSetProgname(argv[0]);
+ 	pmsprintf(helppath, sizeof(helppath), "%s%c" "hacluster" "%c" "help",
+ 		pmGetConfig("PCP_PMDAS_DIR"), sep, sep);
+-	pmdaDaemon(&dispatch, PMDA_INTERFACE_4, pmGetProgname(), HACLUSTER, "hacluster.log", helppath);
++	pmdaDaemon(&dispatch, PMDA_INTERFACE_7, pmGetProgname(), HACLUSTER, "hacluster.log", helppath);
+ 
+ 	pmdaGetOptions(argc, argv, &opts, &dispatch);
+ 	if (opts.errors) {
+diff --git a/src/pmdas/hacluster/pmdahacluster.h b/src/pmdas/hacluster/pmdahacluster.h
+index 9d3c243a4..a813ccb02 100644
+--- a/src/pmdas/hacluster/pmdahacluster.h
++++ b/src/pmdas/hacluster/pmdahacluster.h
+@@ -23,32 +23,46 @@
+ #include "drbd.h"
+ 
+ enum {
+-	CLUSTER_PACEMAKER_GLOBAL = 0,	/* 0  -- NULL INDOM */
+-	CLUSTER_PACEMAKER_FAIL,			/* 1  -- PACEMAKER_FAIL_INDOM */
+-	CLUSTER_PACEMAKER_CONSTRAINTS,	/* 2  -- PACEMAKER_CONSTRAINTS_INDOM */
+-	CLUSTER_PACEMAKER_NODES,		/* 3  -- PACEMAKER_NODES_IDOM*/
+-	CLUSTER_PACEMAKER_NODE_ATTRIB,	/* 4  -- PACEMAKER_NODE_ATRRIB_INDOM */
+-	CLUSTER_PACEMAKER_RESOURCES,	/* 5  -- PACEMAKER_RESOURCES_INDOM */
+-	CLUSTER_COROSYNC_NODE,			/* 6  -- COROSYNC_NODE_INDOM */
+-	CLUSTER_COROSYNC_GLOBAL,		/* 7  -- NULL INDOM */
+-	CLUSTER_COROSYNC_RING,			/* 8  -- COROSYNC_RING INDOM */
+-	CLUSTER_SBD_DEVICE,				/* 9  -- SBD_DEVICES_INDOM */
+-	CLUSTER_DRBD_RESOURCE,			/* 10 -- DRBD_RESOURCE_INDOM */
+-	CLUSTER_DRBD_PEER_DEVICE,		/* 11 -- DRBD_PEER_DEVICE_INDOM */
++	CLUSTER_PACEMAKER_GLOBAL = 0,		/* 0  -- NULL INDOM */
++	CLUSTER_PACEMAKER_FAIL,				/* 1  -- PACEMAKER_FAIL_INDOM */
++	CLUSTER_PACEMAKER_CONSTRAINTS,		/* 2  -- PACEMAKER_CONSTRAINTS_INDOM */
++	CLUSTER_PACEMAKER_NODES,			/* 3  -- PACEMAKER_NODES_IDOM*/
++	CLUSTER_PACEMAKER_NODE_ATTRIB,		/* 4  -- PACEMAKER_NODE_ATRRIB_INDOM */
++	CLUSTER_PACEMAKER_RESOURCES,		/* 5  -- PACEMAKER_RESOURCES_INDOM */
++	CLUSTER_COROSYNC_NODE,				/* 6  -- COROSYNC_NODE_INDOM */
++	CLUSTER_COROSYNC_GLOBAL,			/* 7  -- NULL INDOM */
++	CLUSTER_COROSYNC_RING,				/* 8  -- COROSYNC_RING INDOM */
++	CLUSTER_SBD_DEVICE,					/* 9  -- SBD_DEVICES_INDOM */
++	CLUSTER_DRBD_RESOURCE,				/* 10 -- DRBD_RESOURCE_INDOM */
++	CLUSTER_DRBD_PEER_DEVICE,			/* 11 -- DRBD_PEER_DEVICE_INDOM */
++	CLUSTER_PACEMAKER_CONSTRAINTS_ALL, 	/* 12 -- PACEMAKER_CONSTRAINTS_ALL_INDOM */
++	CLUSTER_PACEMAKER_NODE_ATTRIB_ALL,	/* 13 -- PACEMAKER_NODE_ATTRIB_ALL_INDOM */
++	CLUSTER_PACEMAKER_RESOURCES_ALL,	/* 14 -- PACEMAKER_RESOURCES_ALL_INDOM */
++	CLUSTER_COROSYNC_RING_ALL,			/* 15 -- COROSYNC_RING_ALL_INDOM */
++	CLUSTER_SBD_DEVICE_ALL,				/* 16 -- SBD_DEVICES_ALL_INDOM */
++	CLUSTER_DRBD_RESOURCE_ALL,			/* 17 -- DRBD_RESOURCE_ALL_INDOM */
++	CLUSTER_DRBD_PEER_DEVICE_ALL,		/* 18 -- DRBD_PEER_DEVICE_ALL_INDOM */
+ 	NUM_CLUSTERS
+ };
+ 
+ enum {
+-	PACEMAKER_FAIL_INDOM = 0,		/* 0 -- Pacemaker failure/migrations */
+-	PACEMAKER_CONSTRAINTS_INDOM,	/* 1 -- Pacemaker location constraints */
+-	PACEMAKER_NODES_INDOM,			/* 2 -- Pacemaker nodes data */
+-	PACEMAKER_NODE_ATTRIB_INDOM,	/* 3 -- Pacemaker node attributes */
+-	PACEMAKER_RESOURCES_INDOM,		/* 4 -- Pacemaker resources */
+-	COROSYNC_NODE_INDOM, 			/* 5 -- Corosync available nodes  */
+-	COROSYNC_RING_INDOM,			/* 6 -- Corosync available rings */
+-	SBD_DEVICE_INDOM,		 		/* 7 -- SBD available devices */
+-	DRBD_RESOURCE_INDOM,	 		/* 8 -- DRBD Resources */
+-	DRBD_PEER_DEVICE_INDOM,	 		/* 9 -- DRBD Peer Devices */
++	PACEMAKER_FAIL_INDOM = 0,			/* 0  -- Pacemaker failure/migrations */
++	PACEMAKER_CONSTRAINTS_INDOM,		/* 1  -- Pacemaker location constraints */
++	PACEMAKER_NODES_INDOM,				/* 2  -- Pacemaker nodes data */
++	PACEMAKER_NODE_ATTRIB_INDOM,		/* 3  -- Pacemaker node attributes */
++	PACEMAKER_RESOURCES_INDOM,			/* 4  -- Pacemaker resources */
++	COROSYNC_NODE_INDOM, 				/* 5  -- Corosync available nodes  */
++	COROSYNC_RING_INDOM,				/* 6  -- Corosync available rings */
++	SBD_DEVICE_INDOM,		 			/* 7  -- SBD available devices */
++	DRBD_RESOURCE_INDOM,	 			/* 8  -- DRBD Resources */
++	DRBD_PEER_DEVICE_INDOM,	 			/* 9  -- DRBD Peer Devices */
++	PACEMAKER_CONSTRAINTS_ALL_INDOM,	/* 10 -- Pacemaker location constraints all (labels) */
++	PACEMAKER_NODE_ATTRIB_ALL_INDOM,	/* 11 -- Pacemaker node attributes all(labels) */
++	PACEMAKER_RESOURCES_ALL_INDOM,		/* 12 -- Pacemaker resources all (labels) */
++	COROSYNC_RING_ALL_INDOM,			/* 13 -- Corosync available rings all (labels) */
++	SBD_DEVICE_ALL_INDOM,				/* 14 -- SBD available devices all (labels) */
++	DRBD_RESOURCE_ALL_INDOM,			/* 15 -- DRBD Resources all (labels) */
++	DRBD_PEER_DEVICE_ALL_INDOM,			/* 16 -- DRBD Peer Devicesall (labels) */
+ 	NUM_INDOMS
+ };
+ 
+diff --git a/src/pmdas/hacluster/pmns b/src/pmdas/hacluster/pmns
+index 75fc1ea4c..274d5f2ac 100644
+--- a/src/pmdas/hacluster/pmns
++++ b/src/pmdas/hacluster/pmns
+@@ -21,131 +21,138 @@ ha_cluster {
+ 
+ ha_cluster.pacemaker {
+ 	config_last_change		HACLUSTER:0:0
+-	fail_count			HACLUSTER:1:0
++	fail_count				HACLUSTER:1:0
+ 	location_constraints
+ 	migration_threshold		HACLUSTER:1:1
+ 	nodes
+ 	node_attributes			HACLUSTER:4:0
++	node_attributes_all		HACLUSTER:13:0
+ 	resources
+ 	stonith_enabled			HACLUSTER:0:1
+ }
+ 
+ ha_cluster.pacemaker.location_constraints {
+-	node				HACLUSTER:2:0
+-	resource			HACLUSTER:2:1
+-	role				HACLUSTER:2:2
+-	score				HACLUSTER:2:3
++	node					HACLUSTER:2:0
++	resource				HACLUSTER:2:1
++	role					HACLUSTER:2:2
++	score					HACLUSTER:2:3
++	all						HACLUSTER:12:0
+ }
+ 
+ ha_cluster.pacemaker.nodes {
+ 	status
+-	type				HACLUSTER:3:9
++	type					HACLUSTER:3:9
+ }
+ 
+ ha_cluster.pacemaker.nodes.status {
+-	online				HACLUSTER:3:0
+-	standby				HACLUSTER:3:1
++	online					HACLUSTER:3:0
++	standby					HACLUSTER:3:1
+ 	standby_on_fail			HACLUSTER:3:2
+-	maintenance			HACLUSTER:3:3
+-	pending				HACLUSTER:3:4
+-	unclean				HACLUSTER:3:5
+-	shutdown			HACLUSTER:3:6
+-	expected_up			HACLUSTER:3:7
+-	dc				HACLUSTER:3:8
++	maintenance				HACLUSTER:3:3
++	pending					HACLUSTER:3:4
++	unclean					HACLUSTER:3:5
++	shutdown				HACLUSTER:3:6
++	expected_up				HACLUSTER:3:7
++	dc						HACLUSTER:3:8
+ }
+ 
+ ha_cluster.pacemaker.resources {
+-	agent				HACLUSTER:5:0
+-	clone				HACLUSTER:5:1
+-	group				HACLUSTER:5:2
+-	managed				HACLUSTER:5:3
+-	role				HACLUSTER:5:4
++	agent					HACLUSTER:5:0
++	clone					HACLUSTER:5:1
++	group					HACLUSTER:5:2
++	managed					HACLUSTER:5:3
++	role					HACLUSTER:5:4
+ 	status
++	all						HACLUSTER:14:0
+ }
+ 
+ ha_cluster.pacemaker.resources.status {
+-	active				HACLUSTER:5:5
+-	orphaned			HACLUSTER:5:6
+-	blocked				HACLUSTER:5:7
+-	failed				HACLUSTER:5:8
++	active					HACLUSTER:5:5
++	orphaned				HACLUSTER:5:6
++	blocked					HACLUSTER:5:7
++	failed					HACLUSTER:5:8
+ 	failure_ignored			HACLUSTER:5:9
+ }
+ 
+ ha_cluster.corosync {
+ 	member_votes
+-	quorate				HACLUSTER:7:0
++	quorate					HACLUSTER:7:0
+ 	quorum_votes
+-	ring_errors			HACLUSTER:7:5
++	ring_errors				HACLUSTER:7:5
+ 	rings
+ }
+ 
+ ha_cluster.corosync.member_votes {
+-	votes				HACLUSTER:6:0
+-	local				HACLUSTER:6:1
+-	node_id				HACLUSTER:6:2
++	votes					HACLUSTER:6:0
++	local					HACLUSTER:6:1
++	node_id					HACLUSTER:6:2
+ }
+ 
+ ha_cluster.corosync.quorum_votes {
+ 	expected_votes			HACLUSTER:7:1
+ 	highest_expected		HACLUSTER:7:2
+-	total_votes			HACLUSTER:7:3
+-	quorum				HACLUSTER:7:4
++	total_votes				HACLUSTER:7:3
++	quorum					HACLUSTER:7:4
+ }
+ 
+ ha_cluster.corosync.rings {
+-	status				HACLUSTER:8:0
+-	address				HACLUSTER:8:1
+-	node_id				HACLUSTER:8:2
+-	number				HACLUSTER:8:3
+-	ring_id				HACLUSTER:8:4
++	status					HACLUSTER:8:0
++	address					HACLUSTER:8:1
++	node_id					HACLUSTER:8:2
++	number					HACLUSTER:8:3
++	ring_id					HACLUSTER:8:4
++	all						HACLUSTER:15:0
+ }
+ 
+ ha_cluster.sbd {
+ 	devices
+ 	timeouts
++	all						HACLUSTER:16:0
+ }
+ 
+ ha_cluster.sbd.devices {
+-	path				HACLUSTER:9:0
+-	status				HACLUSTER:9:1
++	path					HACLUSTER:9:0
++	status					HACLUSTER:9:1
+ }
+ 
+ ha_cluster.sbd.timeouts {
+-	mgswait				HACLUSTER:9:2
+-	allocate			HACLUSTER:9:3
+-	loop				HACLUSTER:9:4
+-	watchdog			HACLUSTER:9:5
++	mgswait					HACLUSTER:9:2
++	allocate				HACLUSTER:9:3
++	loop					HACLUSTER:9:4
++	watchdog				HACLUSTER:9:5
+ }
+ 
+ ha_cluster.drbd {
+-	resources			
+-	written				HACLUSTER:10:4
+-	read				HACLUSTER:10:5
+-	al_writes			HACLUSTER:10:6
+-	bm_writes			HACLUSTER:10:7
++	resources
++	written					HACLUSTER:10:4
++	read					HACLUSTER:10:5
++	al_writes				HACLUSTER:10:6
++	bm_writes				HACLUSTER:10:7
+ 	upper_pending			HACLUSTER:10:8
+ 	lower_pending			HACLUSTER:10:9
+-	quorum				HACLUSTER:10:10
++	quorum					HACLUSTER:10:10
+ 	connections
+ 	connections_sync		HACLUSTER:11:5
+-	connections_received		HACLUSTER:11:6
++	connections_received	HACLUSTER:11:6
+ 	connections_sent		HACLUSTER:11:7
+ 	connections_pending		HACLUSTER:11:8
+ 	connections_unacked		HACLUSTER:11:9
+-	split_brain			HACLUSTER:10:11
++	split_brain				HACLUSTER:10:11
+ }
+ 
+ ha_cluster.drbd.resources {
+-	resource			HACLUSTER:10:0
+-	role				HACLUSTER:10:1
+-	volume				HACLUSTER:10:2
+-	disk_state			HACLUSTER:10:3
++	resource				HACLUSTER:10:0
++	role					HACLUSTER:10:1
++	volume					HACLUSTER:10:2
++	disk_state				HACLUSTER:10:3
++	all						HACLUSTER:17:0
+ }
+ 
+ ha_cluster.drbd.connections {
+-	resource			HACLUSTER:11:0
++	resource				HACLUSTER:11:0
+ 	peer_node_id			HACLUSTER:11:1
+-	peer_role			HACLUSTER:11:2
+-	volume				HACLUSTER:11:3
++	peer_role				HACLUSTER:11:2
++	volume					HACLUSTER:11:3
+ 	peer_disk_state			HACLUSTER:11:4
++	all						HACLUSTER:18:0
+ }
+diff --git a/src/pmdas/hacluster/sbd.c b/src/pmdas/hacluster/sbd.c
+index 2824f6589..05f55ad52 100644
+--- a/src/pmdas/hacluster/sbd.c
++++ b/src/pmdas/hacluster/sbd.c
+@@ -68,6 +68,13 @@ hacluster_sbd_device_fetch(int item, struct sbd *sbd, pmAtomValue *atom)
+ 	return PMDA_FETCH_NOVALUES;
+ }
+ 
++int 
++hacluster_sbd_device_all_fetch(int item, pmAtomValue *atom)
++{
++	atom->ul = 1; /* Assign default exists value 1 */
++	return PMDA_FETCH_STATIC;
++}
++
+ int
+ hacluster_refresh_sbd_device(const char *sbd_dev, struct sbd *sbd)
+ {
+diff --git a/src/pmdas/hacluster/sbd.h b/src/pmdas/hacluster/sbd.h
+index 0db22e7a0..0a6971d0e 100644
+--- a/src/pmdas/hacluster/sbd.h
++++ b/src/pmdas/hacluster/sbd.h
+@@ -37,6 +37,7 @@ struct sbd {
+ };
+ 
+ extern int hacluster_sbd_device_fetch(int, struct sbd *, pmAtomValue *);
++extern int hacluster_sbd_device_all_fetch(int, pmAtomValue *);
+ extern int hacluster_refresh_sbd_device(const char *, struct sbd *);
+ 
+ extern void sbd_stats_setup(void);
+-- 
+2.31.1
+
+
+From 96e746ac389999ee5a67f1b1d5621f62cff70bcb Mon Sep 17 00:00:00 2001
+From: Nathan Scott <nathans@redhat.com>
+Date: Sat, 19 Jun 2021 16:32:38 +1000
+Subject: [PATCH 6/7] docs: typo fixes in hacluster help text
+
+---
+ qa/1897.out              | 22 +++++++++++-----------
+ src/pmdas/hacluster/help | 22 +++++++++++-----------
+ 2 files changed, 22 insertions(+), 22 deletions(-)
+
+diff --git a/qa/1897.out b/qa/1897.out
+index b757e857a..a0b53a998 100644
+--- a/qa/1897.out
++++ b/qa/1897.out
+@@ -41,7 +41,7 @@ Help:
+ The number of expected quorum votes for the cluster.
+     value 2
+ 
+-ha_cluster.corosync.quorum_votes.highest_expected PMID: 155.7.2 [Hightest expected vote count]
++ha_cluster.corosync.quorum_votes.highest_expected PMID: 155.7.2 [Highest expected vote count]
+     Data Type: 32-bit unsigned int  InDom: PM_INDOM_NULL 0xffffffff
+     Semantics: instant  Units: count
+ Help:
+@@ -80,7 +80,7 @@ ha_cluster.corosync.rings.all PMID: 155.15.0 [Corosync rings information]
+     Data Type: 32-bit unsigned int  InDom: 155.13 0x26c0000d
+     Semantics: instant  Units: count
+ Help:
+-Value is 1 if a ring exists. The details of the corrosponding ring
++Value is 1 if a ring exists. The details of the corresponding ring
+ is given as label metadata values for this metric.
+     inst [0 or "0"] value 1
+ 
+@@ -132,7 +132,7 @@ ha_cluster.drbd.connections.all PMID: 155.18.0 [DRBD Peer disk information]
+     Data Type: 32-bit unsigned int  InDom: 155.16 0x26c00010
+     Semantics: instant  Units: count
+ Help:
+-Value is 1 if a drbd peer connection exists. The details of the corrosponding DRBD peer
++Value is 1 if a drbd peer connection exists. The details of the corresponding DRBD peer
+ connection is given as label metadata values for this metric.
+     inst [0 or "drbd1:1"] value 1
+ 
+@@ -219,7 +219,7 @@ The number of open requests to the local I/O subsystem by DRBD for the
+ resource:volume.
+     inst [0 or "drbd1:0"] value 0
+ 
+-ha_cluster.drbd.quorum PMID: 155.10.10 [Quorum satus of DRBD resource:volume]
++ha_cluster.drbd.quorum PMID: 155.10.10 [Quorum status of DRBD resource:volume]
+     Data Type: 32-bit unsigned int  InDom: 155.8 0x26c00008
+     Semantics: instant  Units: count
+ Help:
+@@ -238,7 +238,7 @@ ha_cluster.drbd.resources.all PMID: 155.17.0 [DRBD resource information]
+     Data Type: 32-bit unsigned int  InDom: 155.15 0x26c0000f
+     Semantics: instant  Units: count
+ Help:
+-Value is 1 if a drbd resource exists. The details of the corrosponding drbd resource
++Value is 1 if a drbd resource exists. The details of the corresponding drbd resource
+ is given as label metadata values for this metric.
+     inst [0 or "drbd1:0"] value 1
+ 
+@@ -260,21 +260,21 @@ ha_cluster.drbd.resources.role PMID: 155.10.1 [Role of the resource]
+     Data Type: string  InDom: 155.8 0x26c00008
+     Semantics: instant  Units: count
+ Help:
+-The resported role for ther DRBD resource for each resource:volume.
++The reported role for the DRBD resource for each resource:volume.
+     inst [0 or "drbd1:0"] value "Primary"
+ 
+ ha_cluster.drbd.resources.volume PMID: 155.10.2 [Volume of the resource]
+     Data Type: string  InDom: 155.8 0x26c00008
+     Semantics: instant  Units: count
+ Help:
+-The volume number of ther resource for each resource:volume.
++The volume number of the resource for each resource:volume.
+     inst [0 or "drbd1:0"] value "0"
+ 
+ ha_cluster.drbd.split_brain PMID: 155.10.11 [Signal for split brain detection.]
+     Data Type: 32-bit unsigned int  InDom: 155.8 0x26c00008
+     Semantics: instant  Units: count
+ Help:
+-This metric signals if there has been a split brain occuring in DRBD for the
++This metric signals if there has been a split brain occurring in DRBD for the
+ resource:volume, value is 1 is a split brain has been detected.
+     inst [0 or "drbd1:0"] value 1
+ 
+@@ -293,7 +293,7 @@ Help:
+ Amount in KiB written to the DRBD resource:volume.
+     inst [0 or "drbd1:0"] value 0
+ 
+-ha_cluster.pacemaker.config_last_change PMID: 155.0.0 [Unix timestamp corresponding to last Pacmaker configuration change]
++ha_cluster.pacemaker.config_last_change PMID: 155.0.0 [Unix timestamp corresponding to last Pacemaker configuration change]
+     Data Type: 64-bit unsigned int  InDom: PM_INDOM_NULL 0xffffffff
+     Semantics: instant  Units: count
+ Help:
+@@ -335,7 +335,7 @@ ha_cluster.pacemaker.location_constraints.role PMID: 155.2.2 [Resource role of t
+     Data Type: string  InDom: 155.1 0x26c00001
+     Semantics: instant  Units: count
+ Help:
+-The resource role that the location contraint applies to, if any.
++The resource role that the location constraint applies to, if any.
+     inst [0 or "test"] value "Started"
+ 
+ ha_cluster.pacemaker.location_constraints.score PMID: 155.2.3 [Score of the location constraint]
+@@ -617,7 +617,7 @@ ha_cluster.sbd.all PMID: 155.16.0 [SBD device information]
+     Data Type: 32-bit unsigned int  InDom: 155.14 0x26c0000e
+     Semantics: instant  Units: count
+ Help:
+-Value is 1 if a sbd device exists. The details of the corrosponding SBD device
++Value is 1 if a sbd device exists. The details of the corresponding SBD device
+ is given as label metadata values for this metric.
+     inst [0 or "/dev/vdb"] value 1
+ 
+diff --git a/src/pmdas/hacluster/help b/src/pmdas/hacluster/help
+index bdcd68e5f..417bfd4cf 100644
+--- a/src/pmdas/hacluster/help
++++ b/src/pmdas/hacluster/help
+@@ -28,7 +28,7 @@
+ #
+ @ HACLUSTER.0 Instance domain for High Availability Cluster component metrics
+ 
+-@ ha_cluster.pacemaker.config_last_change Unix timestamp corresponding to last Pacmaker configuration change
++@ ha_cluster.pacemaker.config_last_change Unix timestamp corresponding to last Pacemaker configuration change
+ Unix timestamp in seconds corresponding to the last time that the Pacemaker
+ configuration was changed on the system.
+ 
+@@ -58,7 +58,7 @@ The node that the location constraint applies to in the cluster.
+ The resource that the location constraint applies to in the cluster.
+ 
+ @ ha_cluster.pacemaker.location_constraints.role Resource role of the location constraint
+-The resource role that the location contraint applies to, if any.
++The resource role that the location constraint applies to, if any.
+ 
+ @ ha_cluster.pacemaker.location_constraints.score Score of the location constraint
+ The score given to the location constraint by Pacemaker, the value depends on
+@@ -167,7 +167,7 @@ The full corosync ID for the nodes in the cluster.
+ @ ha_cluster.corosync.quorum_votes.expected_votes Expected vote count
+ The number of expected quorum votes for the cluster.
+ 
+-@ ha_cluster.corosync.quorum_votes.highest_expected Hightest expected vote count
++@ ha_cluster.corosync.quorum_votes.highest_expected Highest expected vote count
+ The highest number of expected quorum votes for the cluster. 
+ 
+ @ ha_cluster.corosync.quorum_votes.total_votes Total number of votes
+@@ -193,7 +193,7 @@ The number for the Corosync ring.
+ The internal Corosync ring ID, corresponds to the first node to join.
+ 
+ @ ha_cluster.corosync.rings.all Corosync rings information
+-Value is 1 if a ring exists. The details of the corrosponding ring
++Value is 1 if a ring exists. The details of the corresponding ring
+ is given as label metadata values for this metric.
+ 
+ @ ha_cluster.sbd.devices.path Path of SBD device
+@@ -204,7 +204,7 @@ The current status given for each of the SBD devices, the value is one of
+ healthy or unhealthy.
+ 
+ @ ha_cluster.sbd.all SBD device information
+-Value is 1 if a sbd device exists. The details of the corrosponding SBD device
++Value is 1 if a sbd device exists. The details of the corresponding SBD device
+ is given as label metadata values for this metric.
+ 
+ @ ha_cluster.sbd.timeouts.mgswait mgswait timeout value
+@@ -240,7 +240,7 @@ for the resource:volume.
+ The number of open requests to the local I/O subsystem by DRBD for the
+ resource:volume.
+ 
+-@ ha_cluster.drbd.quorum Quorum satus of DRBD resource:volume
++@ ha_cluster.drbd.quorum Quorum status of DRBD resource:volume
+ The Quorum status of the DRBD resource according to resource:volume, 1 is
+ quorate and 0 is non-quorate.
+ 
+@@ -265,23 +265,23 @@ The number of requests sent which have not yet been acknowledged by DRBD for
+ the resource:volume.
+ 
+ @ ha_cluster.drbd.split_brain Signal for split brain detection.
+-This metric signals if there has been a split brain occuring in DRBD for the
++This metric signals if there has been a split brain occurring in DRBD for the
+ resource:volume, value is 1 is a split brain has been detected.
+ 
+ @ ha_cluster.drbd.resources.resource Name of the resource
+ The name given for the DRBD resource for each resource:volume.
+ 
+ @ ha_cluster.drbd.resources.role Role of the resource
+-The resported role for ther DRBD resource for each resource:volume.
++The reported role for the DRBD resource for each resource:volume.
+ 
+ @ ha_cluster.drbd.resources.volume Volume of the resource
+-The volume number of ther resource for each resource:volume.
++The volume number of the resource for each resource:volume.
+ 
+ @ ha_cluster.drbd.resources.disk_state Disk state
+ The current reported disk state of for the resource:volume.
+ 
+ @ ha_cluster.drbd.resources.all DRBD resource information
+-Value is 1 if a drbd resource exists. The details of the corrosponding drbd resource
++Value is 1 if a drbd resource exists. The details of the corresponding drbd resource
+ is given as label metadata values for this metric.
+ 
+ @ ha_cluster.drbd.connections.resource Resource that the connection is for
+@@ -300,5 +300,5 @@ The reported volume for the connection.
+ The reported peer disk state for the connection.
+ 
+ @ ha_cluster.drbd.connections.all DRBD Peer disk information
+-Value is 1 if a drbd peer connection exists. The details of the corrosponding DRBD peer
++Value is 1 if a drbd peer connection exists. The details of the corresponding DRBD peer
+ connection is given as label metadata values for this metric.
+-- 
+2.31.1
+
+
+From b17119354e2b044a7ba5c9cd36cb6da59ab9ed05 Mon Sep 17 00:00:00 2001
+From: Paul Evans <pevans@redhat.com>
+Date: Mon, 21 Jun 2021 18:46:32 +0100
+Subject: [PATCH 7/7] pmdahacluster: Remove un-needed pmdaCacheLookupName()
+ calls
+
+Update instance refresh code for the label supported metrics to remove the
+superfluous pmdaCacheLookupName() calls.
+
+We update the label supported indoms in mirror to the non-label indoms
+and in turn don't require re-checking instance updates immediately again
+(after doing so for the non-label indoms).
+
+This also fixes the Coverity defects reported by Nathan for unchecked returns
+on these calls.
+---
+ src/pmdas/hacluster/pmda.c | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+diff --git a/src/pmdas/hacluster/pmda.c b/src/pmdas/hacluster/pmda.c
+index 6c9163b25..5be6d3668 100644
+--- a/src/pmdas/hacluster/pmda.c
++++ b/src/pmdas/hacluster/pmda.c
+@@ -495,7 +495,6 @@ hacluster_pacemaker_constraints_instance_refresh(void)
+ 			struct  pacemaker_constraints *constraints;
+ 
+ 			sts = pmdaCacheLookupName(indom, constraint_name, NULL, (void **)&constraints);
+-			pmdaCacheLookupName(indom_all, constraint_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && constraints == NULL)) {
+ 				constraints = calloc(1, sizeof(struct pacemaker_constraints));
+ 				if (constraints == NULL) {
+@@ -636,7 +635,6 @@ hacluster_pacemaker_node_attrib_instance_refresh(void)
+ 				struct  pacemaker_node_attrib *node_attrib;
+ 
+ 				sts = pmdaCacheLookupName(indom, instance_name, NULL, (void **)&node_attrib);
+-				pmdaCacheLookupName(indom_all, instance_name, NULL, NULL);
+ 				if (sts == PM_ERR_INST || (sts >=0 && node_attrib == NULL)) {
+ 					node_attrib = calloc(1, sizeof(struct pacemaker_node_attrib));
+ 					if (node_attrib == NULL) {
+@@ -716,7 +714,6 @@ hacluster_pacemaker_resources_instance_refresh(void)
+ 				struct pacemaker_resources *pace_resources;
+ 
+ 				sts = pmdaCacheLookupName(indom, instance_name, NULL, (void **)&pace_resources);
+-				pmdaCacheLookupName(indom_all, instance_name, NULL, NULL);
+ 				if (sts == PM_ERR_INST || (sts >=0 && pace_resources == NULL)) {
+ 					pace_resources = calloc(1, sizeof(struct pacemaker_resources));
+ 					if (pace_resources == NULL) {
+@@ -842,7 +839,6 @@ hacluster_corosync_ring_instance_refresh(void)
+ 			struct  corosync_ring *ring;
+ 
+ 			sts = pmdaCacheLookupName(indom, ring_name, NULL, (void **)&ring);
+-			pmdaCacheLookupName(indom_all, ring_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && ring == NULL)) {
+ 				ring = calloc(1, sizeof(struct corosync_ring));
+ 				if (ring == NULL) {
+@@ -914,7 +910,6 @@ hacluster_sbd_device_instance_refresh(void)
+ 					struct  sbd_device *sbd;
+ 
+ 					sts = pmdaCacheLookupName(indom, dev_name, NULL, (void **)&sbd);
+-					pmdaCacheLookupName(indom_all, dev_name, NULL, NULL);
+ 					if (sts == PM_ERR_INST || (sts >=0 && sbd == NULL)) {
+ 						sbd = calloc(1, sizeof(struct sbd_device));
+ 						if (sbd == NULL) {
+@@ -997,7 +992,6 @@ hacluster_drbd_resource_instance_refresh(void)
+ 			struct  drbd_resource *resource;
+ 
+ 			sts = pmdaCacheLookupName(indom, resource_name, NULL, (void **)&resource);
+-			pmdaCacheLookupName(indom_all, resource_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && resource == NULL)) {
+ 				resource = calloc(1, sizeof(struct drbd_resource));
+ 				if (resource == NULL) {
+@@ -1010,6 +1004,7 @@ hacluster_drbd_resource_instance_refresh(void)
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, resource_name, (void *)resource);
+ 			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, resource_name, NULL);
++
+ 			found_volume = 0;
+ 		}
+ 	}
+@@ -1078,7 +1073,6 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 			struct  drbd_peer_device *peer_device;
+ 
+ 			sts = pmdaCacheLookupName(indom, peer_name, NULL, (void **)&peer_device);
+-			pmdaCacheLookupName(indom_all, peer_name, NULL, NULL);
+ 			if (sts == PM_ERR_INST || (sts >=0 && peer_device == NULL)) {
+ 				peer_device = calloc(1, sizeof(struct drbd_peer_device));
+ 				if (peer_device == NULL) {
+@@ -1091,6 +1085,7 @@ hacluster_drbd_peer_device_instance_refresh(void)
+ 
+ 			pmdaCacheStore(indom, PMDA_CACHE_ADD, peer_name, (void *)peer_device);
+ 			pmdaCacheStore(indom_all, PMDA_CACHE_ADD, peer_name, NULL);
++
+ 			found_peer_node = 0;
+ 		}
+ 	}
+-- 
+2.31.1
+
diff --git a/SPECS/pcp.spec b/SPECS/pcp.spec
index 9692b78..a4298c9 100644
--- a/SPECS/pcp.spec
+++ b/SPECS/pcp.spec
@@ -1,6 +1,6 @@
 Name:    pcp
 Version: 5.2.5
-Release: 4%{?dist}
+Release: 5%{?dist}
 Summary: System-level performance monitoring and performance management
 License: GPLv2+ and LGPLv2+ and CC-BY
 URL:     https://pcp.io
@@ -10,6 +10,7 @@ Source0: %{bintray}/pcp/source/pcp-%{version}.src.tar.gz
 
 Patch000: redhat-bugzilla-1926756.patch
 Patch001: redhat-bugzilla-1930284.patch
+Patch002: redhat-bugzilla-1980067.patch
 
 %if 0%{?fedora} >= 26 || 0%{?rhel} > 7
 %global __python2 python2
@@ -2249,6 +2250,7 @@ updated policy package.
 %setup -q
 %patch000 -p1
 %patch001 -p1
+%patch002 -p1
 
 %build
 # fix up build version
@@ -3490,6 +3492,9 @@ chown -R pcp:pcp %{_logsdir}/pmproxy 2>/dev/null
 %endif
 
 %changelog
+* Fri Jul 16 2021 Nathan Scott <nathans@redhat.com> - 5.2.5-5
+- Pacemaker location constraints as labels (BZs 1980067, 1972277)
+
 * Fri Feb 19 2021 Nathan Scott <nathans@redhat.com> - 5.2.5-4
 - Revert removal of pmcd unit dependencies (BZs 1929556, 1930284)