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)