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 +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 +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 +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 +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 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 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 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 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 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 +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 +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 +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 - 5.2.5-5 +- Pacemaker location constraints as labels (BZs 1980067, 1972277) + * Fri Feb 19 2021 Nathan Scott - 5.2.5-4 - Revert removal of pmcd unit dependencies (BZs 1929556, 1930284)