16 #include <libxml/tree.h>
21 gboolean dependents) {
28 rsc->
id, score, dependents ?
"needs" :
"with",
32 rsc->
id, score, cons->
id);
43 xmlNodePtr node = NULL;
75 for (lpc = list; lpc != NULL; lpc = lpc->next) {
80 for (lpc2 = cons->
node_list_rh; lpc2 != NULL; lpc2 = lpc2->next) {
106 "pe_node_t *",
"pe_node_t *",
"pe_action_t *",
111 const char *change = va_arg(args,
const char *);
120 char *details = NULL;
121 bool same_host = FALSE;
122 bool same_role = FALSE;
123 bool need_role = FALSE;
125 static int rsc_width = 5;
126 static int detail_width = 5;
129 CRM_ASSERT(destination != NULL || origin != NULL);
135 len = strlen(rsc->
id);
136 if(len > rsc_width) {
145 if(origin != NULL && destination != NULL && origin->
details == destination->
details) {
153 if (need_role && (origin == NULL)) {
157 }
else if (origin == NULL) {
161 }
else if (need_role && (destination == NULL)) {
165 }
else if (destination == NULL) {
169 }
else if (need_role && same_role && same_host) {
173 }
else if (same_role && same_host) {
177 }
else if (need_role && same_role) {
181 }
else if (same_role) {
185 }
else if (same_host) {
194 len = strlen(details);
195 if(len > detail_width) {
202 }
else if(source->
reason) {
206 reason = strdup(
"blocked");
210 out->list_item(out, NULL,
"%-8s %-*s ( %*s )%s%s", change, rsc_width,
211 rsc->
id, detail_width, details, reason ?
" " :
"", reason ? reason :
"");
219 "pe_node_t *",
"pe_node_t *",
"pe_action_t *",
224 const char *change = va_arg(args,
const char *);
231 char *change_str = NULL;
233 bool same_host = FALSE;
234 bool same_role = FALSE;
235 bool need_role = FALSE;
239 CRM_ASSERT(destination != NULL || origin != NULL);
241 if (source == NULL) {
250 if(origin != NULL && destination != NULL && origin->
details == destination->
details) {
258 change_str = g_ascii_strdown(change, -1);
260 "action", change_str,
265 if (need_role && (origin == NULL)) {
273 }
else if (origin == NULL) {
277 }
else if (need_role && (destination == NULL)) {
284 }
else if (destination == NULL) {
288 }
else if (need_role && same_role && same_host) {
295 }
else if (same_role && same_host) {
299 }
else if (need_role && same_role) {
307 }
else if (same_role) {
314 }
else if (same_host) {
338 }
else if(source->
reason) {
353 gboolean recursive = va_arg(args, gboolean);
362 for (GList *lpc = rsc->
rsc_cons; lpc != NULL; lpc = lpc->next) {
369 out->list_item(out, NULL,
"%s (id=%s - loop)", cons->
rsc_rh->
id, cons->
id);
373 hdr = colocations_header(cons->
rsc_rh, cons, FALSE);
374 out->list_item(out, NULL,
"%s", hdr);
378 out->begin_list(out, NULL, NULL, NULL);
380 out->message(out,
"locations-list", cons->
rsc_rh);
382 out->message(out,
"rsc-is-colocated-with-list", cons->
rsc_rh, recursive);
394 rsc_is_colocated_with_list_xml(
pcmk__output_t *out, va_list args) {
396 gboolean recursive = va_arg(args, gboolean);
405 for (GList *lpc = rsc->
rsc_cons; lpc != NULL; lpc = lpc->next) {
409 colocations_xml_node(out, cons->
rsc_rh, cons);
413 colocations_xml_node(out, cons->
rsc_rh, cons);
414 do_locations_list_xml(out, cons->
rsc_rh,
false);
417 out->message(out,
"rsc-is-colocated-with-list", cons->
rsc_rh, recursive);
428 gboolean recursive = va_arg(args, gboolean);
437 for (GList *lpc = rsc->
rsc_cons_lhs; lpc != NULL; lpc = lpc->next) {
444 out->list_item(out, NULL,
"%s (id=%s - loop)", cons->
rsc_lh->
id, cons->
id);
448 hdr = colocations_header(cons->
rsc_lh, cons, TRUE);
449 out->list_item(out, NULL,
"%s", hdr);
453 out->begin_list(out, NULL, NULL, NULL);
455 out->message(out,
"locations-list", cons->
rsc_lh);
457 out->message(out,
"rscs-colocated-with-list", cons->
rsc_lh, recursive);
471 gboolean recursive = va_arg(args, gboolean);
480 for (GList *lpc = rsc->
rsc_cons_lhs; lpc != NULL; lpc = lpc->next) {
484 colocations_xml_node(out, cons->
rsc_lh, cons);
488 colocations_xml_node(out, cons->
rsc_lh, cons);
489 do_locations_list_xml(out, cons->
rsc_lh,
false);
492 out->message(out,
"rscs-colocated-with-list", cons->
rsc_lh, recursive);
508 for (lpc = list; lpc != NULL; lpc = lpc->next) {
513 for (lpc2 = cons->
node_list_rh; lpc2 != NULL; lpc2 = lpc2->next) {
518 out->list_item(out, NULL,
"Node %s (score=%s, id=%s, rsc=%s)",
532 return do_locations_list_xml(out, rsc,
true);
535 PCMK__OUTPUT_ARGS(
"stacks-constraints",
"pe_resource_t *",
"pe_working_set_t *",
"gboolean")
540 gboolean recursive = va_arg(args, gboolean);
550 out->message(out,
"locations-list", rsc);
553 out->message(out,
"rscs-colocated-with-list", rsc, recursive);
556 out->message(out,
"rsc-is-colocated-with-list", rsc, recursive);
560 PCMK__OUTPUT_ARGS(
"stacks-constraints",
"pe_resource_t *",
"pe_working_set_t *",
"gboolean")
565 gboolean recursive = va_arg(args, gboolean);
576 do_locations_list_xml(out, rsc,
false);
579 out->message(out,
"rscs-colocated-with-list", rsc, recursive);
582 out->message(out,
"rsc-is-colocated-with-list", rsc, recursive);
588 PCMK__OUTPUT_ARGS(
"health",
"const char *",
"const char *",
"const char *",
"const char *")
592 const char *sys_from G_GNUC_UNUSED = va_arg(args,
const char *);
593 const char *host_from = va_arg(args,
const char *);
594 const char *fsa_state = va_arg(args,
const char *);
595 const char *result = va_arg(args,
const char *);
597 if (!out->is_quiet(out)) {
598 return out->info(out,
"Controller on %s in state %s: %s",
crm_str(host_from),
600 }
else if (fsa_state != NULL) {
608 PCMK__OUTPUT_ARGS(
"health",
"const char *",
"const char *",
"const char *",
"const char *")
612 const char *sys_from = va_arg(args,
const char *);
613 const char *host_from = va_arg(args,
const char *);
614 const char *fsa_state = va_arg(args,
const char *);
615 const char *result = va_arg(args,
const char *);
618 "node_name",
crm_str(host_from),
625 PCMK__OUTPUT_ARGS(
"pacemakerd-health",
"const char *",
"const char *",
"const char *")
629 const char *sys_from = va_arg(args,
const char *);
630 const char *state = va_arg(args,
const char *);
631 const char *last_updated = va_arg(args,
const char *);
633 if (!out->is_quiet(out)) {
634 return out->info(out,
"Status of %s: '%s' %s %s",
crm_str(sys_from),
635 crm_str(state), (!pcmk__str_empty(last_updated))?
636 "last updated":
"",
crm_str(last_updated));
645 PCMK__OUTPUT_ARGS(
"pacemakerd-health",
"const char *",
"const char *",
"const char *")
649 const char *sys_from = va_arg(args,
const char *);
650 const char *state = va_arg(args,
const char *);
651 const char *last_updated = va_arg(args,
const char *);
655 "last_updated",
crm_str(last_updated),
664 const char *dc = va_arg(args,
const char *);
666 if (!out->is_quiet(out)) {
667 return out->info(out,
"Designated Controller is: %s",
crm_str(dc));
668 }
else if (dc != NULL) {
680 const char *dc = va_arg(args,
const char *);
688 PCMK__OUTPUT_ARGS(
"crmadmin-node",
"const char *",
"const char *",
"const char *",
"gboolean")
692 const char *
type = va_arg(args,
const char *);
693 const char *
name = va_arg(args,
const char *);
694 const char *
id = va_arg(args,
const char *);
695 gboolean BASH_EXPORT = va_arg(args, gboolean);
697 if (out->is_quiet(out)) {
700 }
else if (BASH_EXPORT) {
701 return out->info(out,
"export %s=%s",
crm_str(name),
crm_str(
id));
703 return out->info(out,
"%s node: %s (%s)", type ? type :
"cluster",
708 PCMK__OUTPUT_ARGS(
"crmadmin-node",
"const char *",
"const char *",
"const char *",
"gboolean")
712 const char *type = va_arg(args,
const char *);
713 const char *name = va_arg(args,
const char *);
714 const char *
id = va_arg(args,
const char *);
717 "type", type ? type :
"cluster",
725 "guint",
"op_digest_cache_t *")
731 const char *task = va_arg(args,
const char *);
732 guint interval_ms = va_arg(args, guint);
735 char *action_desc = NULL;
736 const char *rsc_desc =
"unknown resource";
737 const char *node_desc =
"unknown node";
739 if (interval_ms != 0) {
741 ((task == NULL)?
"unknown" : task));
743 action_desc = strdup(
"probe action");
746 ((task == NULL)?
"unknown" : task));
748 if ((rsc != NULL) && (rsc->
id != NULL)) {
754 out->begin_list(out, NULL, NULL,
"Digests for %s %s on %s",
755 rsc_desc, action_desc, node_desc);
758 if (digests == NULL) {
759 out->list_item(out, NULL,
"none");
764 out->list_item(out, NULL,
"%s (all parameters)",
768 out->list_item(out, NULL,
"%s (non-private parameters)",
772 out->list_item(out, NULL,
"%s (non-reloadable parameters)",
780 add_digest_xml(xmlNode *parent,
const char *type,
const char *digest,
781 xmlNode *digest_source)
783 if (digest != NULL) {
786 crm_xml_add(digest_xml,
"type", ((type == NULL)?
"unspecified" : type));
788 if (digest_source != NULL) {
795 "guint",
"op_digest_cache_t *")
801 const char *task = va_arg(args,
const char *);
802 guint interval_ms = va_arg(args, guint);
812 "interval", interval_s,
815 if (digests != NULL) {
826 #define STOP_SANITY_ASSERT(lineno) do { \
827 if(current && current->details->unclean) { \
829 } else if(stop == NULL) { \
830 crm_err("%s:%d: No stop action exists for %s", \
831 __func__, lineno, rsc->id); \
832 CRM_ASSERT(stop != NULL); \
833 } else if (pcmk_is_set(stop->flags, pe_action_optional)) { \
834 crm_err("%s:%d: Action %s is still optional", \
835 __func__, lineno, stop->uuid); \
836 CRM_ASSERT(!pcmk_is_set(stop->flags, pe_action_optional)); \
848 gboolean moving = va_arg(args, gboolean);
850 GList *possible_matches = NULL;
861 || (current == NULL && next == NULL)) {
873 if (possible_matches) {
874 start = possible_matches->data;
875 g_list_free(possible_matches);
881 start_node = current;
884 if (possible_matches) {
885 stop = possible_matches->data;
886 g_list_free(possible_matches);
890 if (possible_matches) {
891 promote = possible_matches->data;
892 g_list_free(possible_matches);
896 if (possible_matches) {
897 demote = possible_matches->data;
898 g_list_free(possible_matches);
905 if (possible_matches) {
906 migrate_op = possible_matches->data;
911 }
else if ((migrate_op != NULL) && (current != NULL)
913 rc = out->message(out,
"rsc-action-item",
"Migrate", rsc, current,
917 rc = out->message(out,
"rsc-action-item",
"Reload", rsc, current,
921 if ((demote != NULL) && (promote != NULL)
924 rc = out->message(out,
"rsc-action-item",
"Re-promote", rsc,
925 current, next, promote, demote);
932 rc = out->message(out,
"rsc-action-item",
"Stop", rsc, current,
933 NULL, stop, (stop && stop->
reason)? stop : start);
936 }
else if (moving && current) {
938 rsc, current, next, stop, NULL);
941 rc = out->message(out,
"rsc-action-item",
"Recover", rsc, current,
946 rc = out->message(out,
"rsc-action-item",
"Restart", rsc, current,
951 g_list_free(possible_matches);
962 for (gIter = rsc->
running_on; gIter != NULL; gIter = gIter->next) {
967 if (possible_matches) {
968 stop_op = possible_matches->data;
969 g_list_free(possible_matches);
976 if (out->message(out,
"rsc-action-item",
"Stop", rsc, node, NULL,
977 stop_op, (stop_op && stop_op->reason)? stop_op : start) ==
pcmk_rc_ok) {
984 }
else if ((stop != NULL)
987 rc = out->message(out,
"rsc-action-item",
"Recover", rsc, current,
992 rc = out->message(out,
"rsc-action-item",
"Move", rsc, current, next,
997 rc = out->message(out,
"rsc-action-item",
"Reload", rsc, current, next,
1001 rc = out->message(out,
"rsc-action-item",
"Restart", rsc, current,
1007 rc = out->message(out,
"rsc-action-item",
"Demote", rsc, current,
1008 next, demote, NULL);
1012 rc = out->message(out,
"rsc-action-item",
"Promote", rsc, current,
1013 next, promote, NULL);
1016 rc = out->message(out,
"rsc-action-item",
"Start", rsc, current, next,
1027 char *task = va_arg(args,
char *);
1028 char *node_name = va_arg(args,
char *);
1029 char *reason = va_arg(args,
char *);
1033 }
else if (reason) {
1034 out->list_item(out, NULL,
"%s %s '%s'", task, node_name, reason);
1046 char *task = va_arg(args,
char *);
1047 char *node_name = va_arg(args,
char *);
1048 char *reason = va_arg(args,
char *);
1052 }
else if (reason) {
1065 PCMK__OUTPUT_ARGS(
"inject-cluster-action",
"const char *",
"const char *",
"xmlNodePtr")
1069 const char *node = va_arg(args,
const char *);
1070 const char *task = va_arg(args,
const char *);
1071 xmlNodePtr rsc = va_arg(args, xmlNodePtr);
1073 if (out->is_quiet(out)) {
1078 out->list_item(out, NULL,
"Cluster action: %s for %s on %s", task,
ID(rsc), node);
1080 out->list_item(out, NULL,
"Cluster action: %s on %s", task, node);
1086 PCMK__OUTPUT_ARGS(
"inject-cluster-action",
"const char *",
"const char *",
"xmlNodePtr")
1090 const char *node = va_arg(args,
const char *);
1091 const char *task = va_arg(args,
const char *);
1092 xmlNodePtr rsc = va_arg(args, xmlNodePtr);
1094 xmlNodePtr xml_node = NULL;
1096 if (out->is_quiet(out)) {
1116 char *
target = va_arg(args,
char *);
1117 const char *op = va_arg(args,
const char *);
1119 if (out->is_quiet(out)) {
1123 out->list_item(out, NULL,
"Fencing %s (%s)", target, op);
1131 char *target = va_arg(args,
char *);
1132 const char *op = va_arg(args,
const char *);
1134 if (out->is_quiet(out)) {
1149 const char *name = va_arg(args,
const char *);
1150 const char *value = va_arg(args,
const char *);
1151 xmlNodePtr cib_node = va_arg(args, xmlNodePtr);
1153 xmlChar *node_path = NULL;
1155 if (out->is_quiet(out)) {
1159 node_path = xmlGetNodePath(cib_node);
1161 out->list_item(out, NULL,
"Injecting attribute %s=%s into %s '%s'",
1162 name, value, node_path,
ID(cib_node));
1172 const char *name = va_arg(args,
const char *);
1173 const char *value = va_arg(args,
const char *);
1174 xmlNodePtr cib_node = va_arg(args, xmlNodePtr);
1176 xmlChar *node_path = NULL;
1178 if (out->is_quiet(out)) {
1182 node_path = xmlGetNodePath(cib_node);
1187 "node_path", node_path,
1188 "cib_node",
ID(cib_node),
1198 char *spec = va_arg(args,
char *);
1200 if (out->is_quiet(out)) {
1204 out->list_item(out, NULL,
"Injecting %s into the configuration", spec);
1212 char *spec = va_arg(args,
char *);
1214 if (out->is_quiet(out)) {
1228 const char *quorum = va_arg(args,
const char *);
1229 const char *watchdog = va_arg(args,
const char *);
1231 if (out->is_quiet(out)) {
1235 out->begin_list(out, NULL, NULL,
"Performing Requested Modifications");
1238 out->list_item(out, NULL,
"Setting quorum: %s", quorum);
1242 out->list_item(out, NULL,
"Setting watchdog: %s", watchdog);
1252 const char *quorum = va_arg(args,
const char *);
1253 const char *watchdog = va_arg(args,
const char *);
1255 xmlNodePtr node = NULL;
1257 if (out->is_quiet(out)) {
1278 const char *action = va_arg(args,
const char *);
1279 char *node = va_arg(args,
char *);
1281 if (out->is_quiet(out)) {
1286 out->list_item(out, NULL,
"Bringing node %s online", node);
1289 out->list_item(out, NULL,
"Taking node %s offline", node);
1292 out->list_item(out, NULL,
"Failing node %s", node);
1303 const char *action = va_arg(args,
const char *);
1304 char *node = va_arg(args,
char *);
1306 if (out->is_quiet(out)) {
1321 const char *action = va_arg(args,
const char *);
1322 char *ticket = va_arg(args,
char *);
1324 if (out->is_quiet(out)) {
1329 out->list_item(out, NULL,
"Making ticket %s standby", ticket);
1331 out->list_item(out, NULL,
"%s ticket %s", action, ticket);
1341 const char *action = va_arg(args,
const char *);
1342 char *ticket = va_arg(args,
char *);
1344 if (out->is_quiet(out)) {
1359 const char *node = va_arg(args,
const char *);
1360 const char *task = va_arg(args,
const char *);
1362 if (out->is_quiet(out)) {
1366 out->list_item(out, NULL,
"Pseudo action: %s%s%s", task, node ?
" on " :
"",
1375 const char *node = va_arg(args,
const char *);
1376 const char *task = va_arg(args,
const char *);
1378 xmlNodePtr xml_node = NULL;
1380 if (out->is_quiet(out)) {
1394 PCMK__OUTPUT_ARGS(
"inject-rsc-action",
"const char *",
"const char *",
"char *",
"guint")
1398 const char *rsc = va_arg(args,
const char *);
1399 const char *operation = va_arg(args,
const char *);
1400 char *node = va_arg(args,
char *);
1401 guint interval_ms = va_arg(args, guint);
1403 if (out->is_quiet(out)) {
1408 out->list_item(out, NULL,
"Resource action: %-15s %s=%u on %s",
1409 rsc, operation, interval_ms, node);
1411 out->list_item(out, NULL,
"Resource action: %-15s %s on %s",
1412 rsc, operation, node);
1418 PCMK__OUTPUT_ARGS(
"inject-rsc-action",
"const char *",
"const char *",
"char *",
"guint")
1422 const char *rsc = va_arg(args,
const char *);
1423 const char *operation = va_arg(args,
const char *);
1424 char *node = va_arg(args,
char *);
1425 guint interval_ms = va_arg(args, guint);
1427 xmlNodePtr xml_node = NULL;
1429 if (out->is_quiet(out)) {
1440 char *interval_s = pcmk__itoa(interval_ms);
1450 {
"crmadmin-node",
"default", crmadmin_node_text },
1451 {
"crmadmin-node",
"xml", crmadmin_node_xml },
1452 {
"dc",
"default", dc_text },
1453 {
"dc",
"xml", dc_xml },
1454 {
"digests",
"default", digests_text },
1455 {
"digests",
"xml", digests_xml },
1456 {
"health",
"default", health_text },
1457 {
"health",
"xml", health_xml },
1458 {
"inject-attr",
"default", inject_attr },
1459 {
"inject-attr",
"xml", inject_attr_xml },
1460 {
"inject-cluster-action",
"default", inject_cluster_action },
1461 {
"inject-cluster-action",
"xml", inject_cluster_action_xml },
1462 {
"inject-fencing-action",
"default", inject_fencing_action },
1463 {
"inject-fencing-action",
"xml", inject_fencing_action_xml },
1464 {
"inject-modify-config",
"default", inject_modify_config },
1465 {
"inject-modify-config",
"xml", inject_modify_config_xml },
1466 {
"inject-modify-node",
"default", inject_modify_node },
1467 {
"inject-modify-node",
"xml", inject_modify_node_xml },
1468 {
"inject-modify-ticket",
"default", inject_modify_ticket },
1469 {
"inject-modify-ticket",
"xml", inject_modify_ticket_xml },
1470 {
"inject-pseudo-action",
"default", inject_pseudo_action },
1471 {
"inject-pseudo-action",
"xml", inject_pseudo_action_xml },
1472 {
"inject-rsc-action",
"default", inject_rsc_action },
1473 {
"inject-rsc-action",
"xml", inject_rsc_action_xml },
1474 {
"inject-spec",
"default", inject_spec },
1475 {
"inject-spec",
"xml", inject_spec_xml },
1476 {
"locations-list",
"default", locations_list },
1477 {
"locations-list",
"xml", locations_list_xml },
1478 {
"node-action",
"default", node_action },
1479 {
"node-action",
"xml", node_action_xml },
1480 {
"pacemakerd-health",
"default", pacemakerd_health_text },
1481 {
"pacemakerd-health",
"xml", pacemakerd_health_xml },
1482 {
"rsc-action",
"default", rsc_action_default },
1483 {
"rsc-action-item",
"default", rsc_action_item },
1484 {
"rsc-action-item",
"xml", rsc_action_item_xml },
1485 {
"rsc-is-colocated-with-list",
"default", rsc_is_colocated_with_list },
1486 {
"rsc-is-colocated-with-list",
"xml", rsc_is_colocated_with_list_xml },
1487 {
"rscs-colocated-with-list",
"default", rscs_colocated_with_list },
1488 {
"rscs-colocated-with-list",
"xml", rscs_colocated_with_list_xml },
1489 {
"stacks-constraints",
"default", stacks_and_constraints },
1490 {
"stacks-constraints",
"xml", stacks_and_constraints_xml },
1492 { NULL, NULL, NULL }
#define CRM_CHECK(expr, failure_action)
xmlNodePtr pcmk__output_create_xml_node(pcmk__output_t *out, const char *name,...)
#define crm_notice(fmt, args...)
#define XML_CIB_TAG_CONSTRAINTS
GList * find_actions(GList *input, const char *key, const pe_node_t *on_node)
xmlNode * get_object_root(const char *object_type, xmlNode *the_root)
enum rsc_role_e next_role
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
void pcmk__xe_set_props(xmlNodePtr node,...)
gboolean unpack_constraints(xmlNode *xml_constraints, pe_working_set_t *data_set)
#define XML_CONS_TAG_RSC_DEPEND
#define CRM_LOG_ASSERT(expr)
enum crm_ais_msg_types type
#define pe__set_resource_flags(resource, flags_to_set)
void void void pcmk__formatted_printf(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
const char * role2text(enum rsc_role_e role)
pe_resource_t * uber_parent(pe_resource_t *rsc)
#define PCMK__OUTPUT_ARGS(ARGS...)
#define XML_CONS_TAG_RSC_LOCATION
char * digest_secure_calc
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
xmlNode * add_node_copy(xmlNode *new_parent, xmlNode *xml_node)
struct pe_node_shared_s * details
void pcmk__register_lib_messages(pcmk__output_t *out)
xmlNode * create_xml_node(xmlNode *parent, const char *name)
#define pe_rsc_allocating
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
Function and executable result codes.
const xmlChar * pcmkXmlStr
#define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)
#define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)
#define STOP_SANITY_ASSERT(lineno)
This structure contains everything that makes up a single output formatter.
void pe__clear_resource_flags_on_all(pe_working_set_t *data_set, uint64_t flag)
void pcmk__register_messages(pcmk__output_t *out, pcmk__message_entry_t *table)
enum pe_action_flags flags
const char * node_attribute
GList * pe__resource_actions(const pe_resource_t *rsc, const pe_node_t *node, const char *task, bool require_node)
Find all actions of given type for a resource.
char * digest_restart_calc
xmlNodePtr pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name,...)
#define pe_rsc_info(rsc, fmt, args...)
char * score2char(int score)