From 0dee2fc0acd7f5d9cda203ec3f6369afae09ff26 Mon Sep 17 00:00:00 2001 From: Chris Lumens Date: Feb 24 2021 16:08:59 +0000 Subject: Fix: tools: Report if getting fencing history failed in crm_mon. This just takes history_rc into account in the text and html formatters. It was already used by the XML formatter. If we can't get fencing history, add a message to the output indicating that happened. --- diff --git a/tools/crm_mon.c b/tools/crm_mon.c index b0daf76..1a68555 100644 --- a/tools/crm_mon.c +++ b/tools/crm_mon.c @@ -1943,7 +1943,8 @@ mon_refresh_display(gpointer user_data) switch (output_format) { case mon_output_html: case mon_output_cgi: - if (print_html_status(out, mon_data_set, stonith_history, options.mon_ops, + if (print_html_status(out, mon_data_set, crm_errno2exit(history_rc), + stonith_history, options.mon_ops, show, options.neg_location_prefix, options.only_node, options.only_rsc) != 0) { g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_CANTCREAT, "Critical: Unable to output html file"); @@ -1974,15 +1975,17 @@ mon_refresh_display(gpointer user_data) */ #if CURSES_ENABLED blank_screen(); - print_status(out, mon_data_set, stonith_history, options.mon_ops, show, - options.neg_location_prefix, options.only_node, options.only_rsc); + print_status(out, mon_data_set, crm_errno2exit(history_rc), stonith_history, + options.mon_ops, show, options.neg_location_prefix, + options.only_node, options.only_rsc); refresh(); break; #endif case mon_output_plain: - print_status(out, mon_data_set, stonith_history, options.mon_ops, show, - options.neg_location_prefix, options.only_node, options.only_rsc); + print_status(out, mon_data_set, crm_errno2exit(history_rc), stonith_history, + options.mon_ops, show, options.neg_location_prefix, + options.only_node, options.only_rsc); break; case mon_output_unset: diff --git a/tools/crm_mon.h b/tools/crm_mon.h index f746507..73c926d 100644 --- a/tools/crm_mon.h +++ b/tools/crm_mon.h @@ -95,17 +95,17 @@ typedef enum mon_output_format_e { #define mon_op_default (mon_op_print_pending | mon_op_fence_history | mon_op_fence_connect) void print_status(pcmk__output_t *out, pe_working_set_t *data_set, - stonith_history_t *stonith_history, unsigned int mon_ops, - unsigned int show, char *prefix, char *only_node, - char *only_rsc); + crm_exit_t history_rc, stonith_history_t *stonith_history, + unsigned int mon_ops, unsigned int show, char *prefix, + char *only_node, char *only_rsc); void print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, crm_exit_t history_rc, stonith_history_t *stonith_history, unsigned int mon_ops, unsigned int show, char *prefix, char *only_node, char *only_rsc); int print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, - stonith_history_t *stonith_history, unsigned int mon_ops, - unsigned int show, char *prefix, char *only_node, - char *only_rsc); + crm_exit_t history_rc, stonith_history_t *stonith_history, + unsigned int mon_ops, unsigned int show, char *prefix, + char *only_node, char *only_rsc); GList *append_attr_list(GList *attr_list, char *name); void blank_screen(void); diff --git a/tools/crm_mon_print.c b/tools/crm_mon_print.c index 8ae11bf..73406bd 100644 --- a/tools/crm_mon_print.c +++ b/tools/crm_mon_print.c @@ -656,6 +656,7 @@ print_failed_actions(pcmk__output_t *out, pe_working_set_t *data_set, * * \param[in] out The output functions structure. * \param[in] data_set Cluster state to display. + * \param[in] history_rc Result of getting stonith history * \param[in] stonith_history List of stonith actions. * \param[in] mon_ops Bitmask of mon_op_*. * \param[in] show Bitmask of mon_show_*. @@ -663,14 +664,16 @@ print_failed_actions(pcmk__output_t *out, pe_working_set_t *data_set, */ void print_status(pcmk__output_t *out, pe_working_set_t *data_set, - stonith_history_t *stonith_history, unsigned int mon_ops, - unsigned int show, char *prefix, char *only_node, char *only_rsc) + crm_exit_t history_rc, stonith_history_t *stonith_history, + unsigned int mon_ops, unsigned int show, char *prefix, + char *only_node, char *only_rsc) { GListPtr unames = NULL; GListPtr resources = NULL; unsigned int print_opts = get_resource_display_options(mon_ops); int rc = pcmk_rc_no_output; + bool already_printed_failure = false; CHECK_RC(rc, out->message(out, "cluster-summary", data_set, pcmk_is_set(mon_ops, mon_op_print_clone_detail), @@ -731,13 +734,23 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, if (pcmk_is_set(show, mon_show_fence_failed) && pcmk_is_set(mon_ops, mon_op_fence_history)) { - stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, - GINT_TO_POINTER(st_failed)); + if (history_rc == 0) { + stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, + GINT_TO_POINTER(st_failed)); + + if (hp) { + CHECK_RC(rc, out->message(out, "failed-fencing-list", stonith_history, unames, + pcmk_is_set(mon_ops, mon_op_fence_full_history), + rc == pcmk_rc_ok)); + } + } else { + PCMK__OUTPUT_SPACER_IF(out, rc == pcmk_rc_ok); + out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); + out->list_item(out, NULL, "Failed to get fencing history: %s", + crm_exit_str(history_rc)); + out->end_list(out); - if (hp) { - CHECK_RC(rc, out->message(out, "failed-fencing-list", stonith_history, unames, - pcmk_is_set(mon_ops, mon_op_fence_full_history), - rc == pcmk_rc_ok)); + already_printed_failure = true; } } @@ -754,7 +767,15 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, /* Print stonith history */ if (pcmk_is_set(mon_ops, mon_op_fence_history)) { - if (pcmk_is_set(show, mon_show_fence_worked)) { + if (history_rc != 0) { + if (!already_printed_failure) { + PCMK__OUTPUT_SPACER_IF(out, rc == pcmk_rc_ok); + out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); + out->list_item(out, NULL, "Failed to get fencing history: %s", + crm_exit_str(history_rc)); + out->end_list(out); + } + } else if (pcmk_is_set(show, mon_show_fence_worked)) { stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_neq, GINT_TO_POINTER(st_failed)); @@ -783,6 +804,7 @@ print_status(pcmk__output_t *out, pe_working_set_t *data_set, * * \param[in] out The output functions structure. * \param[in] data_set Cluster state to display. + * \param[in] history_rc Result of getting stonith history * \param[in] stonith_history List of stonith actions. * \param[in] mon_ops Bitmask of mon_op_*. * \param[in] show Bitmask of mon_show_*. @@ -878,6 +900,7 @@ print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, * * \param[in] out The output functions structure. * \param[in] data_set Cluster state to display. + * \param[in] history_rc Result of getting stonith history * \param[in] stonith_history List of stonith actions. * \param[in] mon_ops Bitmask of mon_op_*. * \param[in] show Bitmask of mon_show_*. @@ -885,14 +908,15 @@ print_xml_status(pcmk__output_t *out, pe_working_set_t *data_set, */ int print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, - stonith_history_t *stonith_history, unsigned int mon_ops, - unsigned int show, char *prefix, char *only_node, - char *only_rsc) + crm_exit_t history_rc, stonith_history_t *stonith_history, + unsigned int mon_ops, unsigned int show, char *prefix, + char *only_node, char *only_rsc) { GListPtr unames = NULL; GListPtr resources = NULL; unsigned int print_opts = get_resource_display_options(mon_ops); + bool already_printed_failure = false; out->message(out, "cluster-summary", data_set, pcmk_is_set(mon_ops, mon_op_print_clone_detail), @@ -950,18 +974,32 @@ print_html_status(pcmk__output_t *out, pe_working_set_t *data_set, if (pcmk_is_set(show, mon_show_fence_failed) && pcmk_is_set(mon_ops, mon_op_fence_history)) { - stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, - GINT_TO_POINTER(st_failed)); + if (history_rc == 0) { + stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_eq, + GINT_TO_POINTER(st_failed)); - if (hp) { - out->message(out, "failed-fencing-list", stonith_history, unames, - pcmk_is_set(mon_ops, mon_op_fence_full_history), FALSE); + if (hp) { + out->message(out, "failed-fencing-list", stonith_history, unames, + pcmk_is_set(mon_ops, mon_op_fence_full_history), FALSE); + } + } else { + out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); + out->list_item(out, NULL, "Failed to get fencing history: %s", + crm_exit_str(history_rc)); + out->end_list(out); } } /* Print stonith history */ if (pcmk_is_set(mon_ops, mon_op_fence_history)) { - if (pcmk_is_set(show, mon_show_fence_worked)) { + if (history_rc != 0) { + if (!already_printed_failure) { + out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); + out->list_item(out, NULL, "Failed to get fencing history: %s", + crm_exit_str(history_rc)); + out->end_list(out); + } + } else if (pcmk_is_set(show, mon_show_fence_worked)) { stonith_history_t *hp = stonith__first_matching_event(stonith_history, stonith__event_state_neq, GINT_TO_POINTER(st_failed));