diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c index aab6876..dcb024c 100644 --- a/lib/pacemaker/pcmk_output.c +++ b/lib/pacemaker/pcmk_output.c @@ -95,53 +95,133 @@ colocations_xml_node(pcmk__output_t *out, pe_resource_t *rsc, free(score); } -PCMK__OUTPUT_ARGS("colocations-list", "pe_resource_t *", "gboolean", "gboolean") -static int colocations_list(pcmk__output_t *out, va_list args) { +PCMK__OUTPUT_ARGS("rsc-is-colocated-with-list", "pe_resource_t *", "gboolean") +static int +rsc_is_colocated_with_list(pcmk__output_t *out, va_list args) { pe_resource_t *rsc = va_arg(args, pe_resource_t *); - gboolean dependents = va_arg(args, gboolean); gboolean recursive = va_arg(args, gboolean); - GList *lpc = NULL; - GList *list = rsc->rsc_cons; bool printed_header = false; - if (dependents) { - list = rsc->rsc_cons_lhs; - } - if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { return pcmk_rc_no_output; } pe__set_resource_flags(rsc, pe_rsc_allocating); - for (lpc = list; lpc != NULL; lpc = lpc->next) { + for (GList *lpc = rsc->rsc_cons; lpc != NULL; lpc = lpc->next) { rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; - pe_resource_t *peer = cons->rsc_rh; char *hdr = NULL; - if (dependents) { - peer = cons->rsc_lh; + if (pcmk_is_set(cons->rsc_rh->flags, pe_rsc_allocating)) { + if (!printed_header) { + out->begin_list(out, NULL, NULL, "Colocations"); + printed_header = true; + } + + out->list_item(out, NULL, "%s (id=%s - loop)", cons->rsc_rh->id, cons->id); + continue; + } + + if (!printed_header) { + out->begin_list(out, NULL, NULL, "Colocations"); + printed_header = true; } - if (pcmk_is_set(peer->flags, pe_rsc_allocating)) { - if (dependents == FALSE) { - if (!printed_header) { - out->begin_list(out, NULL, NULL, "Colocations"); - printed_header = true; - } + hdr = colocations_header(cons->rsc_rh, cons, FALSE); + out->list_item(out, NULL, "%s", hdr); + free(hdr); + + out->message(out, "locations-list", cons->rsc_rh); + + if (recursive) { + out->message(out, "rsc-is-colocated-with-list", rsc, recursive); + } + } - out->list_item(out, NULL, "%s (id=%s - loop)", peer->id, cons->id); + if (printed_header) { + out->end_list(out); + } + + return pcmk_rc_no_output; +} + +PCMK__OUTPUT_ARGS("rsc-is-colocated-with-list", "pe_resource_t *", "gboolean") +static int +rsc_is_colocated_with_list_xml(pcmk__output_t *out, va_list args) { + pe_resource_t *rsc = va_arg(args, pe_resource_t *); + gboolean recursive = va_arg(args, gboolean); + + bool printed_header = false; + + if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { + return pcmk_rc_ok; + } + + pe__set_resource_flags(rsc, pe_rsc_allocating); + for (GList *lpc = rsc->rsc_cons; lpc != NULL; lpc = lpc->next) { + rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + + if (pcmk_is_set(cons->rsc_rh->flags, pe_rsc_allocating)) { + if (!printed_header) { + pcmk__output_xml_create_parent(out, "colocations", NULL); + printed_header = true; } + + pcmk__output_create_xml_node(out, "colocation", + "peer", cons->rsc_rh->id, + "id", cons->id, + NULL); + continue; + } + + if (!printed_header) { + pcmk__output_xml_create_parent(out, "colocations", NULL); + printed_header = true; + } + + colocations_xml_node(out, cons->rsc_rh, cons); + out->message(out, "locations-list", cons->rsc_rh); + + if (recursive) { + out->message(out, "rsc-is-colocated-with-list", rsc, recursive); + } + } + + if (printed_header) { + pcmk__output_xml_pop_parent(out); + } + + return pcmk_rc_ok; +} + +PCMK__OUTPUT_ARGS("rscs-colocated-with-list", "pe_resource_t *", "gboolean") +static int +rscs_colocated_with_list(pcmk__output_t *out, va_list args) { + pe_resource_t *rsc = va_arg(args, pe_resource_t *); + gboolean recursive = va_arg(args, gboolean); + + bool printed_header = false; + + if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { + return pcmk_rc_no_output; + } + + pe__set_resource_flags(rsc, pe_rsc_allocating); + for (GList *lpc = rsc->rsc_cons_lhs; lpc != NULL; lpc = lpc->next) { + rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; + char *hdr = NULL; + + if (pcmk_is_set(cons->rsc_lh->flags, pe_rsc_allocating)) { continue; } - if (dependents && recursive) { + if (recursive) { if (!printed_header) { out->begin_list(out, NULL, NULL, "Colocations"); printed_header = true; } - out->message(out, "colocations-list", rsc, dependents, recursive); + out->message(out, "rscs-colocated-with-list", rsc, recursive); } if (!printed_header) { @@ -149,15 +229,11 @@ static int colocations_list(pcmk__output_t *out, va_list args) { printed_header = true; } - hdr = colocations_header(peer, cons, dependents); + hdr = colocations_header(cons->rsc_lh, cons, TRUE); out->list_item(out, NULL, "%s", hdr); free(hdr); - out->message(out, "locations-list", peer); - - if (!dependents && recursive) { - out->message(out, "colocations-list", rsc, dependents, recursive); - } + out->message(out, "locations-list", cons->rsc_lh); } if (printed_header) { @@ -167,55 +243,33 @@ static int colocations_list(pcmk__output_t *out, va_list args) { return pcmk_rc_no_output; } -PCMK__OUTPUT_ARGS("colocations-list", "pe_resource_t *", "gboolean", "gboolean") -static int colocations_list_xml(pcmk__output_t *out, va_list args) { +PCMK__OUTPUT_ARGS("rscs-colocated-with-list", "pe_resource_t *", "gboolean") +static int +rscs_colocated_with_list_xml(pcmk__output_t *out, va_list args) { pe_resource_t *rsc = va_arg(args, pe_resource_t *); - gboolean dependents = va_arg(args, gboolean); gboolean recursive = va_arg(args, gboolean); - GList *lpc = NULL; - GList *list = rsc->rsc_cons; bool printed_header = false; - if (dependents) { - list = rsc->rsc_cons_lhs; - } - if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { return pcmk_rc_ok; } pe__set_resource_flags(rsc, pe_rsc_allocating); - for (lpc = list; lpc != NULL; lpc = lpc->next) { + for (GList *lpc = rsc->rsc_cons_lhs; lpc != NULL; lpc = lpc->next) { rsc_colocation_t *cons = (rsc_colocation_t *) lpc->data; - pe_resource_t *peer = cons->rsc_rh; - if (dependents) { - peer = cons->rsc_lh; - } - - if (pcmk_is_set(peer->flags, pe_rsc_allocating)) { - if (dependents == FALSE) { - if (!printed_header) { - pcmk__output_xml_create_parent(out, "colocations", NULL); - printed_header = true; - } - - pcmk__output_create_xml_node(out, "colocation", - "peer", peer->id, - "id", cons->id, - NULL); - } + if (pcmk_is_set(cons->rsc_lh->flags, pe_rsc_allocating)) { continue; } - if (dependents && recursive) { + if (recursive) { if (!printed_header) { pcmk__output_xml_create_parent(out, "colocations", NULL); printed_header = true; } - out->message(out, "colocations-list", rsc, dependents, recursive); + out->message(out, "rscs-colocated-with-list", rsc, recursive); } if (!printed_header) { @@ -223,12 +277,8 @@ static int colocations_list_xml(pcmk__output_t *out, va_list args) { printed_header = true; } - colocations_xml_node(out, peer, cons); - out->message(out, "locations-list", peer); - - if (!dependents && recursive) { - out->message(out, "colocations-list", rsc, dependents, recursive); - } + colocations_xml_node(out, cons->rsc_lh, cons); + out->message(out, "locations-list", cons->rsc_lh); } if (printed_header) { @@ -315,7 +365,7 @@ stacks_and_constraints(pcmk__output_t *out, va_list args) { pe__clear_resource_flags_on_all(data_set, pe_rsc_allocating); - out->message(out, "colocations-list", rsc, TRUE, recursive); + out->message(out, "rscs-colocated-with-list", rsc, recursive); out->begin_list(out, NULL, NULL, "%s", rsc->id); out->message(out, "locations-list", rsc); @@ -323,7 +373,7 @@ stacks_and_constraints(pcmk__output_t *out, va_list args) { pe__clear_resource_flags_on_all(data_set, pe_rsc_allocating); - out->message(out, "colocations-list", rsc, FALSE, recursive); + out->message(out, "rsc-is-colocated-with-list", rsc, recursive); return pcmk_rc_ok; } @@ -346,7 +396,7 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) { pcmk__output_xml_create_parent(out, "constraints", NULL); - out->message(out, "colocations-list", rsc, TRUE, recursive); + out->message(out, "rscs-colocated-with-list", rsc, recursive); pcmk__output_xml_create_parent(out, "resource", "id", rsc->id, @@ -356,7 +406,7 @@ stacks_and_constraints_xml(pcmk__output_t *out, va_list args) { pe__clear_resource_flags_on_all(data_set, pe_rsc_allocating); - out->message(out, "colocations-list", rsc, FALSE, recursive); + out->message(out, "rsc-is-colocated-with-list", rsc, recursive); return pcmk_rc_ok; } @@ -529,8 +579,10 @@ crmadmin_node_xml(pcmk__output_t *out, va_list args) } static pcmk__message_entry_t fmt_functions[] = { - { "colocations-list", "default", colocations_list }, - { "colocations-list", "xml", colocations_list_xml }, + { "rsc-is-colocated-with-list", "default", rsc_is_colocated_with_list }, + { "rsc-is-colocated-with-list", "xml", rsc_is_colocated_with_list_xml }, + { "rscs-colocated-with-list", "default", rscs_colocated_with_list }, + { "rscs-colocated-with-list", "xml", rscs_colocated_with_list_xml }, { "locations-list", "default", locations_list }, { "locations-list", "xml", locations_list_xml }, { "stacks-constraints", "default", stacks_and_constraints },