From 11cbc8c2839f5579f682f13c48a18da750c4c079 Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Wed, 3 Aug 2016 15:36:08 -0500 Subject: [PATCH] Low: tools: make crm_mon resources section more consistent Always prints a header in HTML and console output, and indicates if there are no resources of the requested type to show. --- tools/crm_mon.c | 284 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 174 insertions(+), 110 deletions(-) diff --git a/tools/crm_mon.c b/tools/crm_mon.c index a141852..4352641 100644 --- a/tools/crm_mon.c +++ b/tools/crm_mon.c @@ -1042,6 +1042,174 @@ print_node_end(FILE *stream) /*! * \internal + * \brief Print resources section heading appropriate to options + * + * \param[in] stream File stream to display output to + */ +static void +print_resources_heading(FILE *stream) +{ + const char *heading; + + if (group_by_node) { + + /* Active resources have already been printed by node */ + heading = (inactive_resources? "Inactive resources" : NULL); + + } else if (inactive_resources) { + heading = "Full list of resources"; + + } else { + heading = "Active resources"; + } + + /* Print section heading */ + switch (output_format) { + case mon_output_plain: + case mon_output_console: + print_as("\n%s:\n\n", heading); + break; + + case mon_output_html: + case mon_output_cgi: + fprintf(stream, "
\n

%s

\n", heading); + break; + + case mon_output_xml: + fprintf(stream, " \n"); + break; + + default: + break; + } + +} + +/*! + * \internal + * \brief Print whatever resource section closing is appropriate + * + * \param[in] stream File stream to display output to + */ +static void +print_resources_closing(FILE *stream, gboolean printed_heading) +{ + const char *heading; + + /* What type of resources we did or did not display */ + if (group_by_node) { + heading = "inactive "; + } else if (inactive_resources) { + heading = ""; + } else { + heading = "active "; + } + + switch (output_format) { + case mon_output_plain: + case mon_output_console: + if (!printed_heading) { + print_as("\nNo %sresources\n\n", heading); + } + break; + + case mon_output_html: + case mon_output_cgi: + if (!printed_heading) { + fprintf(stream, "
\n

No %sresources

\n", heading); + } + break; + + case mon_output_xml: + fprintf(stream, " %s\n", + (printed_heading? "
" : "")); + break; + + default: + break; + } +} + +/*! + * \internal + * \brief Print whatever resource section(s) are appropriate + * + * \param[in] stream File stream to display output to + * \param[in] data_set Cluster state to display + * \param[in] print_opts Bitmask of pe_print_options + */ +static void +print_resources(FILE *stream, pe_working_set_t *data_set, int print_opts) +{ + GListPtr rsc_iter; + const char *prefix = NULL; + gboolean printed_heading = FALSE; + gboolean brief_output = print_brief; + + /* If we already showed active resources by node, and + * we're not showing inactive resources, we have nothing to do + */ + if (group_by_node && !inactive_resources) { + return; + } + + /* XML uses an indent, and ignores brief option for resources */ + if (output_format == mon_output_xml) { + prefix = " "; + brief_output = FALSE; + } + + /* If we haven't already printed resources grouped by node, + * and brief output was requested, print resource summary */ + if (brief_output && !group_by_node) { + print_resources_heading(stream); + printed_heading = TRUE; + print_rscs_brief(data_set->resources, NULL, print_opts, stream, + inactive_resources); + } + + /* For each resource, display it if appropriate */ + for (rsc_iter = data_set->resources; rsc_iter != NULL; rsc_iter = rsc_iter->next) { + resource_t *rsc = (resource_t *) rsc_iter->data; + + /* Complex resources may have some sub-resources active and some inactive */ + gboolean is_active = rsc->fns->active(rsc, TRUE); + gboolean partially_active = rsc->fns->active(rsc, FALSE); + + /* Skip inactive orphans (deleted but still in CIB) */ + if (is_set(rsc->flags, pe_rsc_orphan) && !is_active) { + continue; + + /* Skip active resources if we already displayed them by node */ + } else if (group_by_node) { + if (is_active) { + continue; + } + + /* Skip primitives already counted in a brief summary */ + } else if (brief_output && (rsc->variant == pe_native)) { + continue; + + /* Skip resources that aren't at least partially active, + * unless we're displaying inactive resources + */ + } else if (!partially_active && !inactive_resources) { + continue; + } + + /* Print this resource */ + if (printed_heading == FALSE) { + print_resources_heading(stream); + printed_heading = TRUE; + } + rsc->fns->print(rsc, prefix, print_opts, stream); + } + + print_resources_closing(stream, printed_heading); +} + +/*! + * \internal * \brief Print heading for resource history * * \param[in] stream File stream to display output to @@ -2852,58 +3020,8 @@ print_status(pe_working_set_t * data_set) free(online_guest_nodes); } - /* If we haven't already displayed resources grouped by node, - * or we need to print inactive resources, print a resources section */ - if (group_by_node == FALSE || inactive_resources) { - - /* If we're printing inactive resources, display a heading */ - if (inactive_resources) { - if (group_by_node == FALSE) { - print_as("\nFull list of resources:\n"); - } else { - print_as("\nInactive resources:\n"); - } - } - print_as("\n"); - - /* If we haven't already printed resources grouped by node, - * and brief output was requested, print resource summary */ - if (print_brief && group_by_node == FALSE) { - print_rscs_brief(data_set->resources, NULL, print_opts, stdout, - inactive_resources); - } - - /* For each resource, display it if appropriate */ - for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { - resource_t *rsc = (resource_t *) gIter->data; - - /* Complex resources may have some sub-resources active and some inactive */ - gboolean is_active = rsc->fns->active(rsc, TRUE); - gboolean partially_active = rsc->fns->active(rsc, FALSE); - - /* Always ignore inactive orphan resources (deleted but not yet gone from CIB) */ - if (is_set(rsc->flags, pe_rsc_orphan) && (is_active == FALSE)) { - continue; - } - - /* If we already printed resources grouped by node, - * only print inactive resources, if that was requested */ - if (group_by_node == TRUE) { - if ((is_active == FALSE) && inactive_resources) { - rsc->fns->print(rsc, NULL, print_opts, stdout); - } - continue; - } - - /* Otherwise, print resource if it's at least partially active - * or we're displaying inactive resources, - * except for primitive resources already counted in a brief summary */ - if (!(print_brief && (rsc->variant == pe_native)) - && (partially_active || inactive_resources)) { - rsc->fns->print(rsc, NULL, print_opts, stdout); - } - } - } + /* Print resources section, if needed */ + print_resources(stdout, data_set, print_opts); /* print Node Attributes section if requested */ if (show & mon_show_attributes) { @@ -3009,28 +3127,8 @@ print_xml_status(pe_working_set_t * data_set) } fprintf(stream, " \n"); - /*** RESOURCES ***/ - if (group_by_node == FALSE || inactive_resources) { - fprintf(stream, " \n"); - for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { - resource_t *rsc = (resource_t *) gIter->data; - gboolean is_active = rsc->fns->active(rsc, TRUE); - gboolean partially_active = rsc->fns->active(rsc, FALSE); - - if (is_set(rsc->flags, pe_rsc_orphan) && is_active == FALSE) { - continue; - - } else if (group_by_node == FALSE) { - if (partially_active || inactive_resources) { - rsc->fns->print(rsc, " ", print_opts, stream); - } - - } else if (is_active == FALSE && inactive_resources) { - rsc->fns->print(rsc, " ", print_opts, stream); - } - } - fprintf(stream, " \n"); - } + /* Print resources section, if needed */ + print_resources(stream, data_set, print_opts); /* print Node Attributes section if requested */ if (show & mon_show_attributes) { @@ -3153,42 +3251,8 @@ print_html_status(pe_working_set_t * data_set, const char *filename) } fprintf(stream, "\n"); - if (group_by_node && inactive_resources) { - fprintf(stream, "

Inactive Resources

\n"); - - } else if (group_by_node == FALSE) { - fprintf(stream, "
\n

Resource List

\n"); - } - - if (group_by_node == FALSE || inactive_resources) { - if (print_brief && group_by_node == FALSE) { - print_rscs_brief(data_set->resources, NULL, print_opts, stream, - inactive_resources); - } - - for (gIter = data_set->resources; gIter != NULL; gIter = gIter->next) { - resource_t *rsc = (resource_t *) gIter->data; - gboolean is_active = rsc->fns->active(rsc, TRUE); - gboolean partially_active = rsc->fns->active(rsc, FALSE); - - if (print_brief && group_by_node == FALSE - && rsc->variant == pe_native) { - continue; - } - - if (is_set(rsc->flags, pe_rsc_orphan) && is_active == FALSE) { - continue; - - } else if (group_by_node == FALSE) { - if (partially_active || inactive_resources) { - rsc->fns->print(rsc, NULL, print_opts, stream); - } - - } else if (is_active == FALSE && inactive_resources) { - rsc->fns->print(rsc, NULL, print_opts, stream); - } - } - } + /* Print resources section, if needed */ + print_resources(stream, data_set, print_opts); /* print Node Attributes section if requested */ if (show & mon_show_attributes) { -- 1.8.3.1