14#include <libxml/tree.h>
26 const char * desc = NULL;
36#define FILTER_STR { PCMK__FAIL_COUNT_PREFIX, PCMK__LAST_FAILURE_PREFIX, \
37 PCMK__NODE_ATTR_SHUTDOWN, PCMK_NODE_ATTR_TERMINATE, \
38 PCMK_NODE_ATTR_STANDBY, "#", NULL }
41compare_attribute(gconstpointer a, gconstpointer b)
45 rc = strcmp((
const char *)a, (
const char *)b);
66add_extra_info(
const pcmk_node_t *node, GList *rsc_list,
72 for (gIter = rsc_list; gIter != NULL; gIter = gIter->next) {
74 const char *
type = g_hash_table_lookup(rsc->priv->meta,
76 const char *
name = NULL;
77 GHashTable *params = NULL;
79 if (rsc->priv->children != NULL) {
80 if (add_extra_info(node, rsc->priv->children,
scheduler,
81 attrname, expected_score)) {
99 int host_list_num = 0;
100 const char *hosts = g_hash_table_lookup(params,
"host_list");
101 const char *multiplier = g_hash_table_lookup(params,
"multiplier");
105 char **host_list = g_strsplit(hosts,
" ", 0);
106 host_list_num = g_strv_length(host_list);
107 g_strfreev(host_list);
110 if ((multiplier == NULL)
119 *expected_score = host_list_num * multiplier_i;
128filter_attr_list(GList *attr_list,
char *
name)
136 for (i = 0; filt_str[i] != NULL; i++) {
137 if (g_str_has_prefix(
name, filt_str[i])) {
142 return g_list_insert_sorted(attr_list,
name, compare_attribute);
146get_operation_list(xmlNode *rsc_entry) {
147 GList *op_list = NULL;
148 xmlNode *rsc_op = NULL;
171 op_list = g_list_append(op_list, rsc_op);
179add_dump_node(gpointer key, gpointer value, gpointer user_data)
181 xmlNodePtr node = user_data;
188append_dump_text(gpointer key, gpointer value, gpointer user_data)
190 char **dump_text = user_data;
192 *dump_text, (
char *)key, (
char *)value);
195 *dump_text = new_text;
198#define XPATH_STACK "//" PCMK_XE_NVPAIR \
199 "[@" PCMK_XA_NAME "='" \
200 PCMK_OPT_CLUSTER_INFRASTRUCTURE "']"
215last_changed_string(
const char *last_written,
const char *user,
216 const char *client,
const char *origin) {
217 if (last_written != NULL || user != NULL || client != NULL || origin != NULL) {
219 last_written ? last_written :
"",
222 client ?
" via " :
"",
223 client ? client :
"",
224 origin ?
" on " :
"",
225 origin ? origin :
"");
232op_history_string(xmlNode *xml_op,
const char *task,
const char *interval_ms_s,
233 int rc,
bool print_timing) {
235 char *interval_str = NULL;
238 if (interval_ms_s && !pcmk__str_eq(interval_ms_s,
"0",
pcmk__str_casei)) {
245 char *last_change_str = NULL;
246 char *exec_str = NULL;
247 char *queue_str = NULL;
249 const char *value = NULL;
260 pcmk__s(epoch_str,
""));
279 interval_str ? interval_str :
"",
280 last_change_str ? last_change_str :
"",
281 exec_str ? exec_str :
"",
282 queue_str ? queue_str :
"",
285 if (last_change_str) {
286 free(last_change_str);
298 interval_str ?
":" :
"",
299 interval_str ? interval_str :
"");
310resource_history_string(
pcmk_resource_t *rsc,
const char *rsc_id,
bool all,
311 int failcount, time_t last_failure) {
316 }
else if (all || failcount || last_failure > 0) {
317 char *failcount_s = NULL;
318 char *lastfail_s = NULL;
324 failcount_s = strdup(
"");
326 if (last_failure > 0) {
335 failcount_s, pcmk__s(lastfail_s,
""));
360 && !pcmk__is_pacemaker_remote_node(node)) {
362 const char *feature_set = g_hash_table_lookup(node->
priv->
attrs,
368 return pcmk__s(feature_set,
"<3.15.1");
376 const char *feature_set = NULL;
377 for (GList *gIter =
scheduler->
nodes; gIter != NULL; gIter = gIter->next) {
379 const char *node_feature_set = get_node_feature_set(node);
380 if (node_feature_set != NULL) {
381 if (feature_set == NULL) {
382 feature_set = node_feature_set;
383 }
else if (strcmp(feature_set, node_feature_set) != 0) {
392formatted_xml_buf(
const pcmk_resource_t *rsc, GString *xml_buf,
bool raw)
402#define XPATH_DC_VERSION "//" PCMK_XE_NVPAIR \
403 "[@" PCMK_XA_NAME "='" PCMK_OPT_DC_VERSION "']"
405PCMK__OUTPUT_ARGS(
"cluster-summary",
"pcmk_scheduler_t *",
406 "enum pcmk_pacemakerd_state",
"uint32_t",
"uint32_t")
412 uint32_t section_opts = va_arg(args, uint32_t);
413 uint32_t show_opts = va_arg(args, uint32_t);
416 const char *stack_s = get_cluster_stack(
scheduler);
420 out->message(out,
"cluster-stack", stack_s, pcmkd_state);
426 const char *dc_version_s = dc_version?
432 bool mixed_version = is_mixed_version(
scheduler);
436 dc_version_s, dc_name, mixed_version);
452 last_written, user, client, origin);
457 out->message(out,
"cluster-counts", g_list_length(
scheduler->
nodes),
465 out->message(out,
"cluster-options",
scheduler);
479PCMK__OUTPUT_ARGS(
"cluster-summary",
"pcmk_scheduler_t *",
480 "enum pcmk_pacemakerd_state",
"uint32_t",
"uint32_t")
486 uint32_t section_opts = va_arg(args, uint32_t);
487 uint32_t show_opts = va_arg(args, uint32_t);
490 const char *stack_s = get_cluster_stack(
scheduler);
494 out->message(out,
"cluster-stack", stack_s, pcmkd_state);
502 const char *dc_version_s = dc_version?
508 bool mixed_version = is_mixed_version(
scheduler);
512 dc_version_s, dc_name, mixed_version);
528 last_written, user, client, origin);
533 out->message(out,
"cluster-counts", g_list_length(
scheduler->
nodes),
546 out->begin_list(out, NULL, NULL,
"Config Options");
547 out->message(out,
"cluster-options",
scheduler);
565 const char *node_host = NULL;
566 const char *node_id = NULL;
572 if (print_detail && pcmk__is_guest_or_bundle_node(node)) {
577 host_node = pcmk__current_node(launcher);
579 if (host_node && host_node->
details) {
582 if (node_host == NULL) {
595 name_len = strlen(node->
priv->
name) + 1;
597 name_len += strlen(node_host) + 1;
600 name_len += strlen(node_id) + 3;
605 strcpy(node_name, node->
priv->
name);
607 strcat(node_name,
"@");
608 strcat(node_name, node_host);
611 strcat(node_name,
" (");
612 strcat(node_name, node_id);
613 strcat(node_name,
")");
622 xmlNodePtr xml_node = NULL;
631 va_start(pairs, tag_name);
650PCMK__OUTPUT_ARGS(
"ban",
"pcmk_node_t *",
"pcmk__location_t *",
"uint32_t")
655 uint32_t show_opts = va_arg(args, uint32_t);
660 location->
id, location->
rsc->
id,
670PCMK__OUTPUT_ARGS(
"ban",
"pcmk_node_t *",
"pcmk__location_t *",
"uint32_t")
675 uint32_t show_opts = va_arg(args, uint32_t);
679 out->list_item(out, NULL,
"%s\tprevents %s from running %son %s",
680 location->
id, location->
rsc->
id,
687PCMK__OUTPUT_ARGS(
"ban",
"pcmk_node_t *",
"pcmk__location_t *",
"uint32_t")
692 uint32_t show_opts G_GNUC_UNUSED = va_arg(args, uint32_t);
695 char *weight_s = pcmk__itoa(pe_node->
assign->
score);
716PCMK__OUTPUT_ARGS(
"ban-list",
"pcmk_scheduler_t *",
"const char *",
"GList *",
721 const char *prefix = va_arg(args,
const char *);
722 GList *only_rsc = va_arg(args, GList *);
723 uint32_t show_opts = va_arg(args, uint32_t);
724 bool print_spacer = va_arg(args,
int);
726 GList *gIter, *gIter2;
731 gIter != NULL; gIter = gIter->next) {
735 if (prefix != NULL && !g_str_has_prefix(location->
id, prefix)) {
746 for (gIter2 = location->
nodes; gIter2 != NULL; gIter2 = gIter2->next) {
751 out->message(out,
"ban", node, location, show_opts);
760PCMK__OUTPUT_ARGS(
"cluster-counts",
"unsigned int",
"int",
"int",
"int")
763 unsigned int nnodes = va_arg(args,
unsigned int);
764 int nresources = va_arg(args,
int);
765 int ndisabled = va_arg(args,
int);
766 int nblocked = va_arg(args,
int);
770 xmlNode *child = NULL;
776 if (ndisabled && nblocked) {
795 }
else if (ndisabled && !nblocked) {
808 }
else if (!ndisabled && nblocked) {
830PCMK__OUTPUT_ARGS(
"cluster-counts",
"unsigned int",
"int",
"int",
"int")
833 unsigned int nnodes = va_arg(args,
unsigned int);
834 int nresources = va_arg(args,
int);
835 int ndisabled = va_arg(args,
int);
836 int nblocked = va_arg(args,
int);
838 out->list_item(out, NULL,
"%d node%s configured",
841 if (ndisabled && nblocked) {
842 out->list_item(out, NULL,
"%d resource instance%s configured "
843 "(%d DISABLED, %d BLOCKED from "
844 "further action due to failure)",
847 }
else if (ndisabled && !nblocked) {
848 out->list_item(out, NULL,
"%d resource instance%s configured "
851 }
else if (!ndisabled && nblocked) {
852 out->list_item(out, NULL,
"%d resource instance%s configured "
853 "(%d BLOCKED from further action "
857 out->list_item(out, NULL,
"%d resource instance%s configured",
864PCMK__OUTPUT_ARGS(
"cluster-counts",
"unsigned int",
"int",
"int",
"int")
867 unsigned int nnodes = va_arg(args,
unsigned int);
868 int nresources = va_arg(args,
int);
869 int ndisabled = va_arg(args,
int);
870 int nblocked = va_arg(args,
int);
872 xmlNodePtr nodes_node = NULL;
873 xmlNodePtr resources_node = NULL;
882 s = pcmk__itoa(nnodes);
886 s = pcmk__itoa(nresources);
890 s = pcmk__itoa(ndisabled);
894 s = pcmk__itoa(nblocked);
901PCMK__OUTPUT_ARGS(
"cluster-dc",
"pcmk_node_t *",
"const char *",
"const char *",
906 const char *quorum = va_arg(args,
const char *);
907 const char *dc_version_s = va_arg(args,
const char *);
908 char *dc_name = va_arg(args,
char *);
909 bool mixed_version = va_arg(args,
int);
912 xmlNode *child = NULL;
920 dc_name, pcmk__s(dc_version_s,
"unknown"));
953PCMK__OUTPUT_ARGS(
"cluster-dc",
"pcmk_node_t *",
"const char *",
"const char *",
958 const char *quorum = va_arg(args,
const char *);
959 const char *dc_version_s = va_arg(args,
const char *);
960 char *dc_name = va_arg(args,
char *);
961 bool mixed_version = va_arg(args,
int);
964 out->list_item(out,
"Current DC",
965 "%s (version %s) - %spartition %s quorum",
966 dc_name, dc_version_s ? dc_version_s :
"unknown",
967 mixed_version ?
"MIXED-VERSION " :
"",
970 out->list_item(out,
"Current DC",
"NONE");
976PCMK__OUTPUT_ARGS(
"cluster-dc",
"pcmk_node_t *",
"const char *",
"const char *",
981 const char *quorum = va_arg(args,
const char *);
982 const char *dc_version_s = va_arg(args,
const char *);
983 char *dc_name G_GNUC_UNUSED = va_arg(args,
char *);
984 bool mixed_version = va_arg(args,
int);
987 const char *with_quorum = pcmk__btoa(
crm_is_true(quorum));
988 const char *mixed_version_s = pcmk__btoa(mixed_version);
1007PCMK__OUTPUT_ARGS(
"maint-mode",
"uint64_t")
1010 uint64_t
flags = va_arg(args, uint64_t);
1025PCMK__OUTPUT_ARGS(
"cluster-options",
"pcmk_scheduler_t *")
1031 out->list_item(out, NULL,
"STONITH of failed nodes enabled");
1033 out->list_item(out, NULL,
"STONITH of failed nodes disabled");
1037 out->list_item(out, NULL,
"Cluster is symmetric");
1039 out->list_item(out, NULL,
"Cluster is asymmetric");
1049 out->list_item(out, NULL,
"No quorum policy: Freeze resources");
1053 out->list_item(out, NULL,
"No quorum policy: Stop ALL resources");
1057 out->list_item(out, NULL,
"No quorum policy: Demote promotable "
1058 "resources and stop all other resources");
1062 out->list_item(out, NULL,
"No quorum policy: Ignore");
1066 out->list_item(out, NULL,
1067 "No quorum policy: Fence nodes in partition");
1073 xmlNode *child = NULL;
1083 " (the cluster will not attempt to start, stop,"
1084 " or recover services)");
1088 xmlNode *child = NULL;
1098 " (the cluster will keep all resources stopped)");
1101 out->list_item(out, NULL,
"Resource management: enabled");
1107PCMK__OUTPUT_ARGS(
"cluster-options",
"pcmk_scheduler_t *")
1113 return out->info(out,
"Resource management is DISABLED. The cluster will not attempt to start, stop or recover services.");
1115 return out->info(out,
"Resource management is DISABLED. The cluster has stopped all resources.");
1121PCMK__OUTPUT_ARGS(
"cluster-options",
"pcmk_scheduler_t *")
1127 out->list_item(out, NULL,
"STONITH of failed nodes enabled");
1129 out->list_item(out, NULL,
"STONITH of failed nodes disabled");
1133 out->list_item(out, NULL,
"Cluster is symmetric");
1135 out->list_item(out, NULL,
"Cluster is asymmetric");
1140 out->list_item(out, NULL,
"No quorum policy: Freeze resources");
1144 out->list_item(out, NULL,
"No quorum policy: Stop ALL resources");
1148 out->list_item(out, NULL,
"No quorum policy: Demote promotable "
1149 "resources and stop all other resources");
1153 out->list_item(out, NULL,
"No quorum policy: Ignore");
1157 out->list_item(out, NULL,
1158 "No quorum policy: Fence nodes in partition");
1197PCMK__OUTPUT_ARGS(
"cluster-options",
"pcmk_scheduler_t *")
1204 const char *symmetric_cluster =
1206 const char *no_quorum_policy =
1210 const char *stop_all_resources = pcmk__flag_text(
scheduler->
flags,
1212 char *stonith_timeout_ms_s =
1215 char *priority_fencing_delay_ms_s =
1225 stonith_timeout_ms_s,
1227 priority_fencing_delay_ms_s,
1229 free(stonith_timeout_ms_s);
1230 free(priority_fencing_delay_ms_s);
1235PCMK__OUTPUT_ARGS(
"cluster-stack",
"const char *",
"enum pcmk_pacemakerd_state")
1238 const char *stack_s = va_arg(args,
const char *);
1243 xmlNode *child = NULL;
1265PCMK__OUTPUT_ARGS(
"cluster-stack",
"const char *",
"enum pcmk_pacemakerd_state")
1268 const char *stack_s = va_arg(args,
const char *);
1273 out->list_item(out,
"Stack",
"%s (%s)",
1276 out->list_item(out,
"Stack",
"%s", stack_s);
1282PCMK__OUTPUT_ARGS(
"cluster-stack",
"const char *",
"enum pcmk_pacemakerd_state")
1285 const char *stack_s = va_arg(args,
const char *);
1289 const char *state_s = NULL;
1303PCMK__OUTPUT_ARGS(
"cluster-times",
"const char *",
"const char *",
1304 "const char *",
"const char *",
"const char *")
1307 const char *our_nodename = va_arg(args,
const char *);
1308 const char *last_written = va_arg(args,
const char *);
1309 const char *user = va_arg(args,
const char *);
1310 const char *client = va_arg(args,
const char *);
1311 const char *origin = va_arg(args,
const char *);
1315 xmlNode *child = NULL;
1317 char *time_s = NULL;
1328 if (our_nodename != NULL) {
1341 time_s = last_changed_string(last_written, user, client, origin);
1348PCMK__OUTPUT_ARGS(
"cluster-times",
"const char *",
"const char *",
1349 "const char *",
"const char *",
"const char *")
1352 const char *our_nodename = va_arg(args,
const char *);
1353 const char *last_written = va_arg(args,
const char *);
1354 const char *user = va_arg(args,
const char *);
1355 const char *client = va_arg(args,
const char *);
1356 const char *origin = va_arg(args,
const char *);
1376PCMK__OUTPUT_ARGS(
"cluster-times",
"const char *",
"const char *",
1377 "const char *",
"const char *",
"const char *")
1380 const char *our_nodename = va_arg(args,
const char *);
1381 const char *last_written = va_arg(args,
const char *);
1382 const char *user = va_arg(args,
const char *);
1383 const char *client = va_arg(args,
const char *);
1384 const char *origin = va_arg(args,
const char *);
1388 out->list_item(out,
"Last updated",
"%s%s%s",
1389 time_s, (our_nodename != NULL)?
" on " :
"",
1390 pcmk__s(our_nodename,
""));
1393 time_s = last_changed_string(last_written, user, client, origin);
1395 out->list_item(out,
"Last change",
" %s", time_s);
1415failed_action_friendly(
pcmk__output_t *out,
const xmlNode *xml_op,
1416 const char *op_key,
const char *node_name,
int rc,
1417 int status,
const char *exit_reason,
1418 const char *exec_time)
1420 char *rsc_id = NULL;
1422 guint interval_ms = 0;
1423 time_t last_change_epoch = 0;
1424 GString *str = NULL;
1426 if (pcmk__str_empty(op_key)
1427 || !
parse_op_key(op_key, &rsc_id, &task, &interval_ms)) {
1435 str = g_string_sized_new(256);
1439 if (interval_ms != 0) {
1443 pcmk__g_strcat(str, pcmk__readable_action(task, interval_ms),
" on ",
1448 if (!pcmk__str_empty(exit_reason)) {
1454 pcmk_exec_status_str(status), NULL);
1455 if (!pcmk__str_empty(exit_reason)) {
1458 g_string_append_c(str,
')');
1463 &last_change_epoch) ==
pcmk_ok) {
1469 if (!pcmk__str_empty(exec_time)) {
1470 int exec_time_ms = 0;
1473 && (exec_time_ms > 0)) {
1480 out->
list_item(out, NULL,
"%s", str->str);
1481 g_string_free(str, TRUE);
1500failed_action_technical(
pcmk__output_t *out,
const xmlNode *xml_op,
1501 const char *op_key,
const char *node_name,
int rc,
1502 int status,
const char *exit_reason,
1503 const char *exec_time)
1508 const char *lrm_status = pcmk_exec_status_str(status);
1509 time_t last_change_epoch = 0;
1510 GString *str = NULL;
1512 if (pcmk__str_empty(op_key)) {
1513 op_key =
"unknown operation";
1515 if (pcmk__str_empty(exit_status)) {
1516 exit_status =
"unknown exit status";
1518 if (pcmk__str_empty(call_id)) {
1519 call_id =
"unknown";
1522 str = g_string_sized_new(256);
1524 g_string_append_printf(str,
"%s on %s '%s' (%d): call=%s, status='%s'",
1525 op_key, node_name, exit_status, rc, call_id,
1528 if (!pcmk__str_empty(exit_reason)) {
1533 &last_change_epoch) ==
pcmk_ok) {
1538 "'", last_change_str,
"'", NULL);
1539 free(last_change_str);
1541 if (!pcmk__str_empty(queue_time)) {
1544 if (!pcmk__str_empty(exec_time)) {
1548 out->
list_item(out, NULL,
"%s", str->str);
1549 g_string_free(str, TRUE);
1552PCMK__OUTPUT_ARGS(
"failed-action",
"xmlNode *",
"uint32_t")
1556 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
1557 uint32_t show_opts = va_arg(args, uint32_t);
1559 const char *op_key = pcmk__xe_history_key(xml_op);
1572 if (pcmk__str_empty(node_name)) {
1573 node_name =
"unknown node";
1577 failed_action_technical(out, xml_op, op_key, node_name, rc, status,
1578 exit_reason, exec_time);
1580 failed_action_friendly(out, xml_op, op_key, node_name, rc, status,
1581 exit_reason, exec_time);
1586PCMK__OUTPUT_ARGS(
"failed-action",
"xmlNode *",
"uint32_t")
1589 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
1590 uint32_t show_opts G_GNUC_UNUSED = va_arg(args, uint32_t);
1592 const char *op_key = pcmk__xe_history_key(xml_op);
1598 const char *exitstatus = NULL;
1602 const char *status_s = NULL;
1605 gchar *exit_reason_esc = NULL;
1607 xmlNodePtr node = NULL;
1611 exit_reason = exit_reason_esc;
1621 rc_s = pcmk__itoa(rc);
1622 status_s = pcmk_exec_status_str(status);
1624 op_key_name, op_key,
1635 &epoch) ==
pcmk_ok) && (epoch > 0)) {
1640 guint interval_ms = 0;
1641 char *interval_ms_s = NULL;
1658 free(interval_ms_s);
1662 g_free(exit_reason_esc);
1666PCMK__OUTPUT_ARGS(
"failed-action-list",
"pcmk_scheduler_t *",
"GList *",
1667 "GList *",
"uint32_t",
"bool")
1671 GList *only_node = va_arg(args, GList *);
1672 GList *only_rsc = va_arg(args, GList *);
1673 uint32_t show_opts = va_arg(args, uint32_t);
1674 bool print_spacer = va_arg(args,
int);
1676 xmlNode *xml_op = NULL;
1699 if (!
parse_op_key(pcmk__xe_history_key(xml_op), &rsc, NULL, NULL)) {
1711 out->message(out,
"failed-action", xml_op, show_opts);
1722 xmlNode *child = NULL;
1746 " with active resources)");
1772 }
else if (health == 0) {
1780 const char *feature_set = get_node_feature_set(node);
1781 if (feature_set != NULL) {
1788PCMK__OUTPUT_ARGS(
"node",
"pcmk_node_t *",
"uint32_t",
"bool",
1789 "GList *",
"GList *")
1793 uint32_t show_opts = va_arg(args, uint32_t);
1794 bool full = va_arg(args,
int);
1795 GList *only_node = va_arg(args, GList *);
1796 GList *only_rsc = va_arg(args, GList *);
1801 xmlNode *item_node = NULL;
1802 xmlNode *child = NULL;
1807 out->begin_list(out, NULL, NULL,
"%s:", node_name);
1811 status_node(node, item_node, show_opts);
1815 out->begin_list(out, NULL, NULL,
"Resources");
1827 out->begin_list(out, NULL, NULL,
"%s:", node_name);
1831 status_node(node, item_node, show_opts);
1839 out->message(out, (
const char *) rsc->priv->xml->name,
1840 show_opts, rsc, only_node, only_rsc);
1852 status_node(node, item_node, show_opts);
1855 out->begin_list(out, NULL, NULL,
"%s:", node_name);
1875 return "UNCLEAN (online)";
1878 return "UNCLEAN (pending)";
1881 return "UNCLEAN (offline)";
1893 return "OFFLINE (standby)";
1897 return "standby (with active resources)";
1902 return "maintenance";
1904 return "OFFLINE (maintenance)";
1914PCMK__OUTPUT_ARGS(
"node",
"pcmk_node_t *",
"uint32_t",
"bool",
"GList *",
1919 uint32_t show_opts = va_arg(args, uint32_t);
1920 bool full = va_arg(args,
int);
1921 GList *only_node = va_arg(args, GList *);
1922 GList *only_rsc = va_arg(args, GList *);
1926 GString *str = g_string_sized_new(64);
1930 if (pcmk__is_guest_or_bundle_node(node)) {
1931 g_string_append(str,
"GuestNode");
1932 }
else if (pcmk__is_remote_node(node)) {
1933 g_string_append(str,
"RemoteNode");
1935 g_string_append(str,
"Node");
1937 pcmk__g_strcat(str,
" ", node_name,
": ", node_text_status(node), NULL);
1940 g_string_append(str,
" (health is RED)");
1941 }
else if (health == 0) {
1942 g_string_append(str,
" (health is YELLOW)");
1945 const char *feature_set = get_node_feature_set(node);
1946 if (feature_set != NULL) {
1958 out->begin_list(out, NULL, NULL,
"%s", str->str);
1959 out->begin_list(out, NULL, NULL,
"Resources");
1970 GList *gIter2 = NULL;
1972 out->begin_list(out, NULL, NULL,
"%s", str->str);
1973 out->begin_list(out, NULL, NULL,
"Resources");
1979 out->message(out, (
const char *) rsc->priv->xml->name,
1980 show_opts, rsc, only_node, only_rsc);
1987 out->list_item(out, NULL,
"%s", str->str);
1990 g_string_free(str, TRUE);
1994 out->begin_list(out, NULL, NULL,
"Node: %s", node_name);
2012health_text(
int health)
2016 }
else if (health == 0) {
2046PCMK__OUTPUT_ARGS(
"node",
"pcmk_node_t *",
"uint32_t",
"bool",
"GList *",
2051 uint32_t show_opts G_GNUC_UNUSED = va_arg(args, uint32_t);
2052 bool full = va_arg(args,
int);
2053 GList *only_node = va_arg(args, GList *);
2054 GList *only_rsc = va_arg(args, GList *);
2058 const char *standby = pcmk__flag_text(node->
priv->
flags,
2060 const char *standby_onfail = pcmk__flag_text(node->
priv->
flags,
2066 const char *feature_set = get_node_feature_set(node);
2068 const char *expected_up = pcmk__flag_text(node->
priv->
flags,
2070 const bool is_dc = pcmk__same_node(node,
2073 char *resources_running = pcmk__itoa(length);
2074 const char *node_type = node_variant_text(node->
priv->
variant);
2096 free(resources_running);
2099 if (pcmk__is_guest_or_bundle_node(node)) {
2112 out->message(out, (
const char *) rsc->priv->xml->name,
2113 show_opts, rsc, only_node, only_rsc);
2127PCMK__OUTPUT_ARGS(
"node-attribute",
"const char *",
"const char *",
"bool",
"int")
2130 const char *
name = va_arg(args,
const char *);
2131 const char *value = va_arg(args,
const char *);
2132 bool add_extra = va_arg(args,
int);
2133 int expected_score = va_arg(args,
int);
2138 if (value == NULL) {
2144 out->list_item(out, NULL,
"%-32s\t: %-10s\t: Connectivity is lost",
name, value);
2145 }
else if (v < expected_score) {
2146 out->list_item(out, NULL,
"%-32s\t: %-10s\t: Connectivity is degraded (Expected=%d)",
name, value, expected_score);
2148 out->list_item(out, NULL,
"%-32s\t: %-10s",
name, value);
2151 out->list_item(out, NULL,
"%-32s\t: %-10s",
name, value);
2157PCMK__OUTPUT_ARGS(
"node-attribute",
"const char *",
"const char *",
"bool",
"int")
2160 const char *
name = va_arg(args,
const char *);
2161 const char *value = va_arg(args,
const char *);
2162 bool add_extra = va_arg(args,
int);
2163 int expected_score = va_arg(args,
int);
2168 xmlNode *child = NULL;
2170 if (value != NULL) {
2182 }
else if (v < expected_score) {
2186 "(connectivity is degraded -- expected %d)",
2190 out->list_item(out, NULL,
"%s: %s",
name, value);
2196PCMK__OUTPUT_ARGS(
"node-and-op",
"pcmk_scheduler_t *",
"xmlNode *")
2200 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
2203 gchar *node_str = NULL;
2204 char *last_change_str = NULL;
2208 time_t last_change = 0;
2216 const pcmk_node_t *node = pcmk__current_node(rsc);
2217 const char *target_role = g_hash_table_lookup(rsc->
priv->
meta,
2226 show_opts, target_role,
false);
2241 out->list_item(out, NULL,
"%s: %s (node=%s, call=%s, rc=%s%s): %s",
2242 node_str, pcmk__xe_history_key(xml_op),
2246 last_change_str ? last_change_str :
"",
2247 pcmk_exec_status_str(status));
2250 free(last_change_str);
2254PCMK__OUTPUT_ARGS(
"node-and-op",
"pcmk_scheduler_t *",
"xmlNode *")
2258 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
2264 const char *status_s = NULL;
2267 time_t last_change = 0;
2268 xmlNode *node = NULL;
2272 status_s = pcmk_exec_status_str(status);
2294 (has_provider? provider :
""),
2306 const char *last_rc_change =
pcmk__trim(ctime(&last_change));
2318PCMK__OUTPUT_ARGS(
"node-attribute",
"const char *",
"const char *",
"bool",
"int")
2321 const char *
name = va_arg(args,
const char *);
2322 const char *value = va_arg(args,
const char *);
2323 bool add_extra = va_arg(args,
int);
2324 int expected_score = va_arg(args,
int);
2332 char *buf = pcmk__itoa(expected_score);
2340PCMK__OUTPUT_ARGS(
"node-attribute-list",
"pcmk_scheduler_t *",
"uint32_t",
2341 "bool",
"GList *",
"GList *")
2345 uint32_t show_opts = va_arg(args, uint32_t);
2346 bool print_spacer = va_arg(args,
int);
2347 GList *only_node = va_arg(args, GList *);
2348 GList *only_rsc = va_arg(args, GList *);
2353 for (GList *gIter =
scheduler->
nodes; gIter != NULL; gIter = gIter->next) {
2356 GList *attr_list = NULL;
2357 GHashTableIter iter;
2365 g_hash_table_iter_init(&iter, node->
priv->
attrs);
2366 while (g_hash_table_iter_next (&iter, &key, NULL)) {
2367 attr_list = filter_attr_list(attr_list, key);
2370 if (attr_list == NULL) {
2376 g_list_free(attr_list);
2382 out->message(out,
"node", node, show_opts,
false, only_node, only_rsc);
2384 for (GList *aIter = attr_list; aIter != NULL; aIter = aIter->next) {
2385 const char *
name = aIter->data;
2386 const char *value = NULL;
2387 int expected_score = 0;
2388 bool add_extra =
false;
2396 out->message(out,
"node-attribute",
name, value, add_extra,
2400 g_list_free(attr_list);
2408PCMK__OUTPUT_ARGS(
"node-capacity",
"const pcmk_node_t *",
"const char *")
2413 const char *comment = va_arg(args,
const char *);
2416 comment, pcmk__node_name(node));
2420 out->list_item(out, NULL,
"%s", dump_text);
2426PCMK__OUTPUT_ARGS(
"node-capacity",
"const pcmk_node_t *",
"const char *")
2432 const char *comment = va_arg(args,
const char *);
2438 g_hash_table_foreach(node->
priv->
utilization, add_dump_node, xml_node);
2443PCMK__OUTPUT_ARGS(
"node-history-list",
"pcmk_scheduler_t *",
"pcmk_node_t *",
2444 "xmlNode *",
"GList *",
"GList *",
"uint32_t",
"uint32_t")
2449 xmlNode *node_state = va_arg(args, xmlNode *);
2450 GList *only_node = va_arg(args, GList *);
2451 GList *only_rsc = va_arg(args, GList *);
2452 uint32_t section_opts = va_arg(args, uint32_t);
2453 uint32_t show_opts = va_arg(args, uint32_t);
2455 xmlNode *lrm_rsc = NULL;
2456 xmlNode *rsc_entry = NULL;
2472 if (rsc_id == NULL) {
2490 if (pcmk__is_group(
parent)) {
2502 time_t last_failure = 0;
2506 if (failcount <= 0) {
2512 out->message(out,
"node", node, show_opts,
false, only_node,
2516 out->message(out,
"resource-history", rsc, rsc_id,
false,
2517 failcount, last_failure,
false);
2519 GList *op_list = get_operation_list(rsc_entry);
2522 if (op_list == NULL) {
2531 out->message(out,
"node", node, show_opts,
false, only_node,
2535 out->message(out,
"resource-operation-list",
scheduler, rsc, node,
2536 op_list, show_opts);
2544PCMK__OUTPUT_ARGS(
"node-list",
"GList *",
"GList *",
"GList *",
"uint32_t",
"bool")
2547 GList *nodes = va_arg(args, GList *);
2548 GList *only_node = va_arg(args, GList *);
2549 GList *only_rsc = va_arg(args, GList *);
2550 uint32_t show_opts = va_arg(args, uint32_t);
2551 bool print_spacer G_GNUC_UNUSED = va_arg(args,
int);
2555 for (GList *gIter = nodes; gIter != NULL; gIter = gIter->next) {
2565 out->message(out,
"node", node, show_opts,
true, only_node, only_rsc);
2572PCMK__OUTPUT_ARGS(
"node-list",
"GList *",
"GList *",
"GList *",
"uint32_t",
"bool")
2575 GList *nodes = va_arg(args, GList *);
2576 GList *only_node = va_arg(args, GList *);
2577 GList *only_rsc = va_arg(args, GList *);
2578 uint32_t show_opts = va_arg(args, uint32_t);
2579 bool print_spacer = va_arg(args,
int);
2582 GString *online_nodes = NULL;
2583 GString *online_remote_nodes = NULL;
2584 GString *online_guest_nodes = NULL;
2585 GString *offline_nodes = NULL;
2586 GString *offline_remote_nodes = NULL;
2590 for (GList *gIter = nodes; gIter != NULL; gIter = gIter->next) {
2615 if (pcmk__is_guest_or_bundle_node(node)) {
2616 pcmk__add_word(&online_guest_nodes, 1024, node_name);
2618 }
else if (pcmk__is_remote_node(node)) {
2619 pcmk__add_word(&online_remote_nodes, 1024, node_name);
2622 pcmk__add_word(&online_nodes, 1024, node_name);
2629 if (pcmk__is_remote_node(node)) {
2630 pcmk__add_word(&offline_remote_nodes, 1024, node_name);
2632 }
else if (pcmk__is_guest_or_bundle_node(node)) {
2636 pcmk__add_word(&offline_nodes, 1024, node_name);
2643 out->message(out,
"node", node, show_opts,
true, only_node, only_rsc);
2648 if (online_nodes != NULL) {
2649 out->list_item(out,
"Online",
"[ %s ]",
2650 (
const char *) online_nodes->str);
2651 g_string_free(online_nodes, TRUE);
2653 if (offline_nodes != NULL) {
2654 out->list_item(out,
"OFFLINE",
"[ %s ]",
2655 (
const char *) offline_nodes->str);
2656 g_string_free(offline_nodes, TRUE);
2658 if (online_remote_nodes) {
2659 out->list_item(out,
"RemoteOnline",
"[ %s ]",
2660 (
const char *) online_remote_nodes->str);
2661 g_string_free(online_remote_nodes, TRUE);
2663 if (offline_remote_nodes) {
2664 out->list_item(out,
"RemoteOFFLINE",
"[ %s ]",
2665 (
const char *) offline_remote_nodes->str);
2666 g_string_free(offline_remote_nodes, TRUE);
2668 if (online_guest_nodes != NULL) {
2669 out->list_item(out,
"GuestOnline",
"[ %s ]",
2670 (
const char *) online_guest_nodes->str);
2671 g_string_free(online_guest_nodes, TRUE);
2678PCMK__OUTPUT_ARGS(
"node-list",
"GList *",
"GList *",
"GList *",
"uint32_t",
"bool")
2681 GList *nodes = va_arg(args, GList *);
2682 GList *only_node = va_arg(args, GList *);
2683 GList *only_rsc = va_arg(args, GList *);
2684 uint32_t show_opts = va_arg(args, uint32_t);
2685 bool print_spacer G_GNUC_UNUSED = va_arg(args,
int);
2692 for (GList *gIter = nodes; gIter != NULL; gIter = gIter->next) {
2700 out->message(out,
"node", node, show_opts,
true, only_node, only_rsc);
2707PCMK__OUTPUT_ARGS(
"node-summary",
"pcmk_scheduler_t *",
"GList *",
"GList *",
2708 "uint32_t",
"uint32_t",
"bool")
2712 GList *only_node = va_arg(args, GList *);
2713 GList *only_rsc = va_arg(args, GList *);
2714 uint32_t section_opts = va_arg(args, uint32_t);
2715 uint32_t show_opts = va_arg(args, uint32_t);
2716 bool print_spacer = va_arg(args,
int);
2718 xmlNode *node_state = NULL;
2723 if (xmlChildElementCount(cib_status) == 0) {
2733 pcmk__xe_id(node_state));
2747 out->message(out,
"node-history-list",
scheduler, node, node_state,
2748 only_node, only_rsc, section_opts, show_opts);
2755PCMK__OUTPUT_ARGS(
"node-weight",
"const pcmk_resource_t *",
"const char *",
2756 "const char *",
"const char *")
2761 const char *prefix = va_arg(args,
const char *);
2762 const char *
uname = va_arg(args,
const char *);
2763 const char *score = va_arg(args,
const char *);
2766 out->list_item(out, NULL,
"%s: %s allocation score on %s: %s",
2767 prefix, rsc->
id,
uname, score);
2769 out->list_item(out, NULL,
"%s: %s = %s", prefix,
uname, score);
2775PCMK__OUTPUT_ARGS(
"node-weight",
"const pcmk_resource_t *",
"const char *",
2776 "const char *",
"const char *")
2781 const char *prefix = va_arg(args,
const char *);
2782 const char *
uname = va_arg(args,
const char *);
2783 const char *score = va_arg(args,
const char *);
2798PCMK__OUTPUT_ARGS(
"op-history",
"xmlNode *",
"const char *",
"const char *",
"int",
"uint32_t")
2801 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
2802 const char *task = va_arg(args,
const char *);
2803 const char *interval_ms_s = va_arg(args,
const char *);
2804 int rc = va_arg(args,
int);
2805 uint32_t show_opts = va_arg(args, uint32_t);
2807 char *buf = op_history_string(xml_op, task, interval_ms_s, rc,
2810 out->list_item(out, NULL,
"%s", buf);
2816PCMK__OUTPUT_ARGS(
"op-history",
"xmlNode *",
"const char *",
"const char *",
"int",
"uint32_t")
2819 xmlNodePtr xml_op = va_arg(args, xmlNodePtr);
2820 const char *task = va_arg(args,
const char *);
2821 const char *interval_ms_s = va_arg(args,
const char *);
2822 int rc = va_arg(args,
int);
2823 uint32_t show_opts = va_arg(args, uint32_t);
2826 char *rc_s = pcmk__itoa(rc);
2828 xmlNodePtr node = NULL;
2838 if (interval_ms_s && !pcmk__str_eq(interval_ms_s,
"0",
pcmk__str_casei)) {
2845 const char *value = NULL;
2849 &epoch) ==
pcmk_ok) && (epoch > 0)) {
2872PCMK__OUTPUT_ARGS(
"promotion-score",
"pcmk_resource_t *",
"pcmk_node_t *",
2879 const char *score = va_arg(args,
const char *);
2881 if (chosen == NULL) {
2882 out->list_item(out, NULL,
"%s promotion score (inactive): %s",
2883 child_rsc->
id, score);
2885 out->list_item(out, NULL,
"%s promotion score on %s: %s",
2886 child_rsc->
id, pcmk__node_name(chosen), score);
2891PCMK__OUTPUT_ARGS(
"promotion-score",
"pcmk_resource_t *",
"pcmk_node_t *",
2898 const char *score = va_arg(args,
const char *);
2912PCMK__OUTPUT_ARGS(
"resource-config",
"const pcmk_resource_t *",
"bool")
2916 GString *xml_buf = g_string_sized_new(1024);
2917 bool raw = va_arg(args,
int);
2919 formatted_xml_buf(rsc, xml_buf, raw);
2923 g_string_free(xml_buf, TRUE);
2927PCMK__OUTPUT_ARGS(
"resource-config",
"const pcmk_resource_t *",
"bool")
2931 return resource_config(out, args);
2934PCMK__OUTPUT_ARGS(
"resource-history",
"pcmk_resource_t *",
"const char *",
2935 "bool",
"int",
"time_t",
"bool")
2939 const char *rsc_id = va_arg(args,
const char *);
2940 bool all = va_arg(args,
int);
2941 int failcount = va_arg(args,
int);
2942 time_t last_failure = va_arg(args, time_t);
2943 bool as_header = va_arg(args,
int);
2945 char *buf = resource_history_string(rsc, rsc_id, all, failcount, last_failure);
2948 out->begin_list(out, NULL, NULL,
"%s", buf);
2950 out->list_item(out, NULL,
"%s", buf);
2957PCMK__OUTPUT_ARGS(
"resource-history",
"pcmk_resource_t *",
"const char *",
2958 "bool",
"int",
"time_t",
"bool")
2962 const char *rsc_id = va_arg(args,
const char *);
2963 bool all = va_arg(args,
int);
2964 int failcount = va_arg(args,
int);
2965 time_t last_failure = va_arg(args, time_t);
2966 bool as_header = va_arg(args,
int);
2975 }
else if (all || failcount || last_failure > 0) {
2984 if (failcount > 0) {
2985 char *s = pcmk__itoa(failcount);
2991 if (last_failure > 0) {
3011 out->
begin_list(out, NULL, NULL,
"Inactive Resources");
3013 out->
begin_list(out, NULL, NULL,
"Full List of Resources");
3015 out->
begin_list(out, NULL, NULL,
"Active Resources");
3020PCMK__OUTPUT_ARGS(
"resource-list",
"pcmk_scheduler_t *",
"uint32_t",
"bool",
3021 "GList *",
"GList *",
"bool")
3026 uint32_t show_opts = va_arg(args, uint32_t);
3027 bool print_summary = va_arg(args,
int);
3028 GList *only_node = va_arg(args, GList *);
3029 GList *only_rsc = va_arg(args, GList *);
3030 bool print_spacer = va_arg(args,
int);
3034 bool printed_header =
false;
3051 print_resource_header(out, show_opts);
3052 printed_header =
true;
3060 rsc_iter != NULL; rsc_iter = rsc_iter->next) {
3081 && pcmk__is_primitive(rsc)) {
3094 if (!printed_header) {
3096 print_resource_header(out, show_opts);
3097 printed_header =
true;
3101 x = out->message(out, (
const char *) rsc->
priv->
xml->name,
3102 show_opts, rsc, only_node, only_rsc);
3109 if (!printed_header) {
3111 print_resource_header(out, show_opts);
3112 printed_header =
true;
3119 out->list_item(out, NULL,
"No inactive resources");
3121 out->list_item(out, NULL,
"No resources");
3123 out->list_item(out, NULL,
"No active resources");
3127 if (printed_header) {
3134PCMK__OUTPUT_ARGS(
"resource-operation-list",
"pcmk_scheduler_t *",
3135 "pcmk_resource_t *",
"pcmk_node_t *",
"GList *",
"uint32_t")
3143 GList *op_list = va_arg(args, GList *);
3144 uint32_t show_opts = va_arg(args, uint32_t);
3146 GList *gIter = NULL;
3150 for (gIter = op_list; gIter != NULL; gIter = gIter->next) {
3151 xmlNode *xml_op = (xmlNode *) gIter->data;
3168 time_t last_failure = 0;
3173 failcount, last_failure,
true);
3178 out->message(out,
"op-history", xml_op, task, interval_ms_s,
3179 op_rc_i, show_opts);
3183 g_list_free(op_list);
3189PCMK__OUTPUT_ARGS(
"resource-util",
"pcmk_resource_t *",
"pcmk_node_t *",
3196 const char *fn = va_arg(args,
const char *);
3199 fn, rsc->
id, pcmk__node_name(node));
3203 out->list_item(out, NULL,
"%s", dump_text);
3209PCMK__OUTPUT_ARGS(
"resource-util",
"pcmk_resource_t *",
"pcmk_node_t *",
3217 const char *fn = va_arg(args,
const char *);
3219 xmlNodePtr xml_node = NULL;
3226 g_hash_table_foreach(rsc->
priv->
utilization, add_dump_node, xml_node);
3231static inline const char *
3240static inline const char *
3246PCMK__OUTPUT_ARGS(
"ticket",
"pcmk__ticket_t *",
"bool",
"bool")
3250 bool raw = va_arg(args,
int);
3251 bool details = va_arg(args,
int);
3253 GString *detail_str = NULL;
3256 out->list_item(out, ticket->
id,
"%s", ticket->
id);
3260 if (details && g_hash_table_size(ticket->
state) > 0) {
3261 GHashTableIter iter;
3262 const char *
name = NULL;
3263 const char *value = NULL;
3264 bool already_added =
false;
3266 detail_str = g_string_sized_new(100);
3269 g_hash_table_iter_init(&iter, ticket->
state);
3270 while (g_hash_table_iter_next(&iter, (
void **) &
name, (
void **) &value)) {
3271 if (already_added) {
3272 g_string_append_printf(detail_str,
", %s=",
name);
3274 g_string_append_printf(detail_str,
"%s=",
name);
3275 already_added =
true;
3279 char *epoch_str = NULL;
3306 if (detail_str == NULL) {
3309 out->list_item(out, NULL,
"%s\t%s%s last-granted=\"%s\"",
3310 ticket->
id, ticket_status(ticket),
3311 ticket_standby_text(ticket), pcmk__s(epoch_str,
""));
3314 out->list_item(out, NULL,
"%s\t%s%s %s",
3315 ticket->
id, ticket_status(ticket),
3316 ticket_standby_text(ticket), detail_str->str);
3319 out->list_item(out, NULL,
"%s\t%s%s%s", ticket->
id,
3320 ticket_status(ticket),
3321 ticket_standby_text(ticket),
3322 detail_str != NULL ? detail_str->str :
"");
3325 if (detail_str != NULL) {
3326 g_string_free(detail_str, TRUE);
3332PCMK__OUTPUT_ARGS(
"ticket",
"pcmk__ticket_t *",
"bool",
"bool")
3336 bool raw G_GNUC_UNUSED = va_arg(args,
int);
3337 bool details G_GNUC_UNUSED = va_arg(args,
int);
3341 xmlNodePtr node = NULL;
3342 GHashTableIter iter;
3343 const char *
name = NULL;
3344 const char *value = NULL;
3359 g_hash_table_iter_init(&iter, ticket->
state);
3360 while (g_hash_table_iter_next(&iter, (
void **) &
name, (
void **) &value)) {
3375PCMK__OUTPUT_ARGS(
"ticket-list",
"GHashTable *",
"bool",
"bool",
"bool")
3378 GHashTable *tickets = va_arg(args, GHashTable *);
3379 bool print_spacer = va_arg(args,
int);
3380 bool raw = va_arg(args,
int);
3381 bool details = va_arg(args,
int);
3383 GHashTableIter iter;
3386 if (g_hash_table_size(tickets) == 0) {
3393 out->begin_list(out, NULL, NULL,
"Tickets");
3396 g_hash_table_iter_init(&iter, tickets);
3397 while (g_hash_table_iter_next(&iter, NULL, &value)) {
3399 out->message(out,
"ticket", ticket, raw, details);
3408 {
"ban",
"default", ban_text },
3409 {
"ban",
"html", ban_html },
3410 {
"ban",
"xml", ban_xml },
3411 {
"ban-list",
"default", ban_list },
3417 {
"cluster-counts",
"default", cluster_counts_text },
3418 {
"cluster-counts",
"html", cluster_counts_html },
3419 {
"cluster-counts",
"xml", cluster_counts_xml },
3420 {
"cluster-dc",
"default", cluster_dc_text },
3421 {
"cluster-dc",
"html", cluster_dc_html },
3422 {
"cluster-dc",
"xml", cluster_dc_xml },
3423 {
"cluster-options",
"default", cluster_options_text },
3424 {
"cluster-options",
"html", cluster_options_html },
3425 {
"cluster-options",
"log", cluster_options_log },
3426 {
"cluster-options",
"xml", cluster_options_xml },
3427 {
"cluster-summary",
"default", cluster_summary },
3428 {
"cluster-summary",
"html", cluster_summary_html },
3429 {
"cluster-stack",
"default", cluster_stack_text },
3430 {
"cluster-stack",
"html", cluster_stack_html },
3431 {
"cluster-stack",
"xml", cluster_stack_xml },
3432 {
"cluster-times",
"default", cluster_times_text },
3433 {
"cluster-times",
"html", cluster_times_html },
3434 {
"cluster-times",
"xml", cluster_times_xml },
3435 {
"failed-action",
"default", failed_action_default },
3436 {
"failed-action",
"xml", failed_action_xml },
3437 {
"failed-action-list",
"default", failed_action_list },
3440 {
"maint-mode",
"text", cluster_maint_mode_text },
3441 {
"node",
"default", node_text },
3442 {
"node",
"html", node_html },
3443 {
"node",
"xml", node_xml },
3444 {
"node-and-op",
"default", node_and_op },
3445 {
"node-and-op",
"xml", node_and_op_xml },
3446 {
"node-capacity",
"default", node_capacity },
3447 {
"node-capacity",
"xml", node_capacity_xml },
3448 {
"node-history-list",
"default", node_history_list },
3449 {
"node-list",
"default", node_list_text },
3450 {
"node-list",
"html", node_list_html },
3451 {
"node-list",
"xml", node_list_xml },
3452 {
"node-weight",
"default", node_weight },
3453 {
"node-weight",
"xml", node_weight_xml },
3454 {
"node-attribute",
"default", node_attribute_text },
3455 {
"node-attribute",
"html", node_attribute_html },
3456 {
"node-attribute",
"xml", node_attribute_xml },
3457 {
"node-attribute-list",
"default", node_attribute_list },
3458 {
"node-summary",
"default", node_summary },
3459 {
"op-history",
"default", op_history_text },
3460 {
"op-history",
"xml", op_history_xml },
3464 {
"promotion-score",
"default", promotion_score },
3465 {
"promotion-score",
"xml", promotion_score_xml },
3466 {
"resource-config",
"default", resource_config },
3467 {
"resource-config",
"text", resource_config_text },
3468 {
"resource-history",
"default", resource_history_text },
3469 {
"resource-history",
"xml", resource_history_xml },
3470 {
"resource-list",
"default", resource_list },
3471 {
"resource-operation-list",
"default", resource_operation_list },
3472 {
"resource-util",
"default", resource_util },
3473 {
"resource-util",
"xml", resource_util_xml },
3474 {
"ticket",
"default", ticket_default },
3475 {
"ticket",
"xml", ticket_xml },
3476 {
"ticket-list",
"default", ticket_list },
3478 { NULL, NULL, NULL }
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
#define PCMK_ACTION_MONITOR
#define PCMK_ACTION_NOTIFY
uint32_t pcmk_get_ra_caps(const char *standard)
Get capabilities of a resource agent standard.
const char * pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, enum pcmk__rsc_node node_type)
xmlNode * pcmk_find_cib_element(xmlNode *cib, const char *element_name)
Find an element in the CIB.
char * pcmk__format_nvpair(const char *name, const char *value, const char *units)
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
GHashTable * pe_rsc_params(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_scheduler_t *scheduler)
Get a table of resource parameters.
enum pcmk_ipc_server type
#define CRM_ATTR_FEATURE_SET
const char * pcmk__pcmkd_state_enum2friendly(enum pcmk_pacemakerd_state state)
const char * pcmk_pacemakerd_api_daemon_state_enum2text(enum pcmk_pacemakerd_state state)
@ pcmk_pacemakerd_state_invalid
#define crm_time_log_timeofday
#define crm_time_log_with_timezone
#define crm_time_log_date
char * pcmk__epoch2str(const time_t *source, uint32_t flags)
const char * pcmk__readable_interval(guint interval_ms)
#define CRM_CHECK(expr, failure_action)
pcmk_scheduler_t * scheduler
@ pcmk__node_fail_standby
@ pcmk__node_variant_remote
@ pcmk__node_variant_cluster
#define PCMK_META_INTERVAL
#define PCMK_META_MIGRATION_THRESHOLD
#define PCMK_VALUE_UNKNOWN
#define PCMK_META_ON_FAIL
#define PCMK_VALUE_REVOKED
#define PCMK_VALUE_GRANTED
#define PCMK_VALUE_OFFLINE
#define PCMK_VALUE_YELLOW
#define PCMK_VALUE_STANDBY
#define PCMK_VALUE_DEMOTE
#define PCMK_VALUE_FREEZE
#define PCMK_VALUE_REMOTE
#define PCMK_META_TARGET_ROLE
#define PCMK_VALUE_IGNORE
#define PCMK_VALUE_MEMBER
#define PCMK_VALUE_ONLINE
#define PCMK__VALUE_MAINT
#define PCMK__VALUE_HEALTH_YELLOW
#define PCMK__VALUE_WARNING
#define PCMK__VALUE_HEALTH_RED
Control output from tools.
@ pcmk_show_failed_detail
@ pcmk_show_inactive_rscs
@ pcmk_section_operations
@ pcmk_section_maint_mode
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
xmlNodePtr pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name,...) G_GNUC_NULL_TERMINATED
void pcmk__output_xml_push_parent(pcmk__output_t *out, xmlNodePtr parent)
xmlNodePtr pcmk__output_xml_peek_parent(pcmk__output_t *out)
void pcmk__register_messages(pcmk__output_t *out, const pcmk__message_entry_t *table)
xmlNode * pcmk__html_create(xmlNode *parent, const char *name, const char *id, const char *class_name)
#define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)
xmlNodePtr pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, const char *id, const char *class_name, const char *text)
#define PCMK__OUTPUT_SPACER_IF(out_obj, cond)
xmlNodePtr pcmk__output_create_xml_node(pcmk__output_t *out, const char *name,...) G_GNUC_NULL_TERMINATED
void void void pcmk__formatted_printf(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
#define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)
const char * pe__resource_description(const pcmk_resource_t *rsc, uint32_t show_opts)
void pe__register_messages(pcmk__output_t *out)
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name,...)
char * pe__node_display_name(pcmk_node_t *node, bool print_detail)
int pe__clone_xml(pcmk__output_t *out, va_list args)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
bool pe__rsc_running_on_any(pcmk_resource_t *rsc, GList *node_list)
int pe__bundle_xml(pcmk__output_t *out, va_list args)
int pe__group_xml(pcmk__output_t *out, va_list args)
int pe__node_health(pcmk_node_t *node)
int pe__bundle_html(pcmk__output_t *out, va_list args)
int pe__clone_default(pcmk__output_t *out, va_list args)
GList * pe__filter_rsc_list(GList *rscs, GList *filter)
int pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, time_t *last_failure, uint32_t flags, const xmlNode *xml_op)
int pe__bundle_text(pcmk__output_t *out, va_list args)
gint sort_op_by_callid(gconstpointer a, gconstpointer b)
int pe__rscs_brief_output(pcmk__output_t *out, GList *rsc_list, unsigned int options)
gchar * pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts, const char *target_role, bool show_nodes)
int pe__resource_xml(pcmk__output_t *out, va_list args)
int pe__group_default(pcmk__output_t *out, va_list args)
int pe__resource_text(pcmk__output_t *out, va_list args)
int pe__resource_html(pcmk__output_t *out, va_list args)
bool pcmk_xe_mask_probe_failure(const xmlNode *xml_op)
Check whether an action history entry represents a maskable probe.
@ CRM_EX_NOT_RUNNING
Service safely stopped.
const char * crm_exit_str(crm_exit_t exit_code)
@ PCMK_EXEC_DONE
Action completed, result is known.
@ PCMK_EXEC_UNKNOWN
Used only to initialize variables.
#define pcmk__assert(expr)
#define PCMK_ROLE_PROMOTED
@ pcmk_role_promoted
Promoted.
pe_quorum_policy
Possible responses to loss of quorum.
@ pcmk_no_quorum_freeze
Do not recover resources from outside partition.
@ pcmk_no_quorum_stop
Stop all resources in partition.
@ pcmk_no_quorum_ignore
Act as if partition still holds quorum.
@ pcmk_no_quorum_demote
Demote promotable resources and stop all others.
@ pcmk_no_quorum_fence
Fence all nodes in partition.
@ pcmk__sched_in_maintenance
@ pcmk__sched_fencing_enabled
@ pcmk__sched_symmetric_cluster
pcmk_node_t * pe_find_node_id(const GList *node_list, const char *id)
Find a node by ID in a list of nodes.
pcmk_resource_t * pe_find_resource(GList *rsc_list, const char *id)
const char * rsc_printable_id(const pcmk_resource_t *rsc)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
gboolean crm_is_true(const char *s)
int pcmk__scan_min_int(const char *text, int *result, int minimum)
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)
#define pcmk__plural_s(i)
char * pcmk__trim(char *str)
int pcmk__scan_ll(const char *text, long long *result, long long default_value)
void pcmk__str_update(char **str, const char *value)
bool pcmk__strcase_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
void pcmk__g_strcat(GString *buffer,...) G_GNUC_NULL_TERMINATED
Location constraint object.
enum rsc_role_e role_filter
enum pcmk__node_variant variant
pcmk_scheduler_t * scheduler
This structure contains everything that makes up a single output formatter.
void(* begin_list)(pcmk__output_t *out, const char *singular_noun, const char *plural_noun, const char *format,...) G_GNUC_PRINTF(4
void void(* list_item)(pcmk__output_t *out, const char *name, const char *format,...) G_GNUC_PRINTF(3
const pcmk_node_t * pending_node
pcmk_resource_t * launcher
const pcmk__rsc_methods_t * fns
pcmk__resource_private_t * priv
bool(* is_filtered)(const pcmk_resource_t *rsc, const GList *only_rsc, bool check_parent)
bool(* active)(const pcmk_resource_t *rsc, bool all)
guint priority_fencing_ms
GList * location_constraints
pcmk__scheduler_private_t * priv
enum pe_quorum_policy no_quorum_policy
pcmk__node_private_t * priv
struct pcmk__node_details * details
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest)
Retrieve the millisecond value of an XML attribute.
int crm_element_value_epoch(const xmlNode *xml, const char *name, time_t *dest)
Retrieve the seconds-since-epoch value of an XML attribute.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void void pcmk__xe_set_propv(xmlNodePtr node, va_list pairs)
void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value)
void pcmk__xe_set_content(xmlNode *node, const char *format,...) G_GNUC_PRINTF(2
void pcmk__xe_set_props(xmlNodePtr node,...) G_GNUC_NULL_TERMINATED
@ pcmk__xml_fmt_pretty
Include indentation and newlines.
bool pcmk__xml_needs_escape(const char *text, enum pcmk__xml_escape_type type)
char * pcmk__xml_escape(const char *text, enum pcmk__xml_escape_type type)
void pcmk__xml_string(const xmlNode *data, uint32_t options, GString *buffer, int depth)
#define PCMK_XA_PROMOTED_ONLY
#define PCMK_XE_UTILIZATION
#define PCMK_XA_MAINTENANCE_MODE
#define PCMK_XA_LAST_FAILURE
#define PCMK_XA_ID_AS_RESOURCE
#define PCMK_XA_DESCRIPTION
#define PCMK_XA_STONITH_TIMEOUT_MS
#define PCMK_XE_LAST_UPDATE
#define PCMK_XA_QUEUE_TIME
#define PCMK_XA_MIXED_VERSION
#define PCMK_XA_UPDATE_ORIGIN
#define PCMK_XE_PROMOTION_SCORE
#define PCMK_XE_RESOURCES_CONFIGURED
#define PCMK_XA_EXITSTATUS
#define PCMK_XA_CIB_LAST_WRITTEN
#define PCMK_XA_STOP_ALL_RESOURCES
#define PCMK_XA_OPERATION
#define PCMK_XA_NO_QUORUM_POLICY
#define PCMK_XE_RESOURCE_HISTORY
#define PCMK_XA_RESOURCES_RUNNING
#define PCMK_XA_EXITREASON
#define PCMK_XE_ATTRIBUTE
#define PCMK_XE_CURRENT_DC
#define PCMK_XA_LAST_RC_CHANGE
#define PCMK_XA_EXPECTED_UP
#define PCMK_XA_FAIL_COUNT
#define PCMK_XA_EXEC_TIME
#define PCMK_XA_MAINTENANCE
#define PCMK_XA_HAVE_QUORUM
#define PCMK_XE_NODE_WEIGHT
#define PCMK_XE_CLUSTER_OPTIONS
#define PCMK_XA_LAST_GRANTED
#define PCMK_XA_EXIT_REASON
#define PCMK_XA_PRIORITY_FENCING_DELAY_MS
#define PCMK_XA_WITH_QUORUM
#define PCMK_XA_UPDATE_USER
#define PCMK_XA_STANDBY_ONFAIL
#define PCMK_XE_OPERATION
#define PCMK_XA_SYMMETRIC_CLUSTER
#define PCMK_XA_FEATURE_SET
#define PCMK_XE_LAST_CHANGE
#define PCMK_XE_OPERATION_HISTORY
#define PCMK_XE_NODES_CONFIGURED
#define PCMK_XA_PACEMAKERD_STATE
#define PCMK_XA_UPDATE_CLIENT
#define PCMK_XA_STONITH_ENABLED
#define PCMK__XA_PROMOTED_ONLY_LEGACY
#define PCMK__XE_LRM_RSC_OP
#define PCMK__XE_LRM_RESOURCE
#define PCMK__XE_LRM_RESOURCES
#define PCMK__XA_OPERATION_KEY
#define PCMK__XA_OP_STATUS
#define PCMK__XE_NODE_STATE
xmlNode * pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level)