Blame SOURCES/003-pacemakerd-output.patch

7ac83c
From 7c35387a9896cb968cf4087b5cbed94af44e1ea5 Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Fri, 14 May 2021 12:03:46 -0400
7ac83c
Subject: [PATCH 1/5] Feature: daemons: Convert pacemakerd to formatted output.
7ac83c
7ac83c
The main purpose of this is to finish getting pacemakerd moved off the
7ac83c
existing command line handling code (pcmk__cli_help in particular) so
7ac83c
that code can eventually be deprecated or removed.  pacemakerd itself
7ac83c
does fairly little printing.
7ac83c
---
7ac83c
 daemons/pacemakerd/pacemakerd.c | 58 ++++++++++++++++++++++++++++++-----------
7ac83c
 1 file changed, 43 insertions(+), 15 deletions(-)
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
7ac83c
index ce194bf..bd59729 100644
7ac83c
--- a/daemons/pacemakerd/pacemakerd.c
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.c
7ac83c
@@ -25,6 +25,7 @@
7ac83c
 #include <crm/common/ipc_internal.h>
7ac83c
 #include <crm/common/mainloop.h>
7ac83c
 #include <crm/common/cmdline_internal.h>
7ac83c
+#include <crm/common/output_internal.h>
7ac83c
 #include <crm/cluster/internal.h>
7ac83c
 #include <crm/cluster.h>
7ac83c
 
7ac83c
@@ -37,6 +38,14 @@ struct {
7ac83c
     gboolean standby;
7ac83c
 } options;
7ac83c
 
7ac83c
+static pcmk__output_t *out = NULL;
7ac83c
+
7ac83c
+static pcmk__supported_format_t formats[] = {
7ac83c
+    PCMK__SUPPORTED_FORMAT_NONE,
7ac83c
+    PCMK__SUPPORTED_FORMAT_TEXT,
7ac83c
+    { NULL, NULL, NULL }
7ac83c
+};
7ac83c
+
7ac83c
 static gboolean
7ac83c
 pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
7ac83c
     return TRUE;
7ac83c
@@ -1167,10 +1176,10 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
7ac83c
 }
7ac83c
 
7ac83c
 static GOptionContext *
7ac83c
-build_arg_context(pcmk__common_args_t *args) {
7ac83c
+build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
7ac83c
     GOptionContext *context = NULL;
7ac83c
 
7ac83c
-    context = pcmk__build_arg_context(args, NULL, NULL, NULL);
7ac83c
+    context = pcmk__build_arg_context(args, "text", group, NULL);
7ac83c
     pcmk__add_main_args(context, entries);
7ac83c
     return context;
7ac83c
 }
7ac83c
@@ -1182,9 +1191,11 @@ main(int argc, char **argv)
7ac83c
 
7ac83c
     GError *error = NULL;
7ac83c
 
7ac83c
+    int rc = pcmk_rc_ok;
7ac83c
+    GOptionGroup *output_group = NULL;
7ac83c
     pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
7ac83c
     gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
7ac83c
-    GOptionContext *context = build_arg_context(args);
7ac83c
+    GOptionContext *context = build_arg_context(args, &output_group);
7ac83c
 
7ac83c
     bool old_instance_connected = false;
7ac83c
 
7ac83c
@@ -1195,23 +1205,30 @@ main(int argc, char **argv)
7ac83c
     mainloop_add_signal(SIGHUP, pcmk_ignore);
7ac83c
     mainloop_add_signal(SIGQUIT, pcmk_sigquit);
7ac83c
 
7ac83c
+    pcmk__register_formats(output_group, formats);
7ac83c
     if (!g_option_context_parse_strv(context, &processed_args, &error)) {
7ac83c
         exit_code = CRM_EX_USAGE;
7ac83c
         goto done;
7ac83c
     }
7ac83c
 
7ac83c
+    rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
7ac83c
+    if (rc != pcmk_rc_ok) {
7ac83c
+        exit_code = CRM_EX_ERROR;
7ac83c
+        g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Error creating output format %s: %s",
7ac83c
+                    args->output_ty, pcmk_rc_str(rc));
7ac83c
+        goto done;
7ac83c
+    }
7ac83c
+
7ac83c
     if (options.features) {
7ac83c
-        printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
7ac83c
-               CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
+        out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
7ac83c
+                  BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
         exit_code = CRM_EX_OK;
7ac83c
         goto done;
7ac83c
     }
7ac83c
 
7ac83c
     if (args->version) {
7ac83c
-        g_strfreev(processed_args);
7ac83c
-        pcmk__free_arg_context(context);
7ac83c
-        /* FIXME:  When pacemakerd is converted to use formatted output, this can go. */
7ac83c
-        pcmk__cli_help('v', CRM_EX_USAGE);
7ac83c
+        out->version(out, false);
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 
7ac83c
     setenv("LC_ALL", "C", 1);
7ac83c
@@ -1248,6 +1265,13 @@ main(int argc, char **argv)
7ac83c
     crm_ipc_close(old_instance);
7ac83c
     crm_ipc_destroy(old_instance);
7ac83c
 
7ac83c
+    /* Don't allow any accidental output after this point. */
7ac83c
+    if (out != NULL) {
7ac83c
+        out->finish(out, exit_code, true, NULL);
7ac83c
+        pcmk__output_free(out);
7ac83c
+        out = NULL;
7ac83c
+    }
7ac83c
+
7ac83c
 #ifdef SUPPORT_COROSYNC
7ac83c
     if (mcp_read_config() == FALSE) {
7ac83c
         exit_code = CRM_EX_UNAVAILABLE;
7ac83c
@@ -1333,6 +1357,11 @@ done:
7ac83c
     g_strfreev(processed_args);
7ac83c
     pcmk__free_arg_context(context);
7ac83c
 
7ac83c
-    pcmk__output_and_clear_error(error, NULL);
7ac83c
+    pcmk__output_and_clear_error(error, out);
7ac83c
+
7ac83c
+    if (out != NULL) {
7ac83c
+        out->finish(out, exit_code, true, NULL);
7ac83c
+        pcmk__output_free(out);
7ac83c
+    }
7ac83c
     crm_exit(exit_code);
7ac83c
 }
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 35e6da64381fcb092d81ce16835cc28670b077cb Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Mon, 17 May 2021 10:04:04 -0400
7ac83c
Subject: [PATCH 2/5] Features: daemons: Output the pacemakerd feature list in
7ac83c
 XML.
7ac83c
7ac83c
---
7ac83c
 daemons/pacemakerd/pacemakerd.c | 45 ++++++++++++++++++++++++++++++++++++++---
7ac83c
 1 file changed, 42 insertions(+), 3 deletions(-)
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
7ac83c
index bd59729..93cf743 100644
7ac83c
--- a/daemons/pacemakerd/pacemakerd.c
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.c
7ac83c
@@ -43,6 +43,42 @@ static pcmk__output_t *out = NULL;
7ac83c
 static pcmk__supported_format_t formats[] = {
7ac83c
     PCMK__SUPPORTED_FORMAT_NONE,
7ac83c
     PCMK__SUPPORTED_FORMAT_TEXT,
7ac83c
+    PCMK__SUPPORTED_FORMAT_XML,
7ac83c
+    { NULL, NULL, NULL }
7ac83c
+};
7ac83c
+
7ac83c
+static int
7ac83c
+pacemakerd_features(pcmk__output_t *out, va_list args) {
7ac83c
+    out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
7ac83c
+              BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
+    return pcmk_rc_ok;
7ac83c
+}
7ac83c
+
7ac83c
+static int
7ac83c
+pacemakerd_features_xml(pcmk__output_t *out, va_list args) {
7ac83c
+    gchar **feature_list = g_strsplit(CRM_FEATURES, " ", 0);
7ac83c
+
7ac83c
+    pcmk__output_xml_create_parent(out, "pacemakerd",
7ac83c
+                                   "version", PACEMAKER_VERSION,
7ac83c
+                                   "build", BUILD_VERSION,
7ac83c
+                                   "feature_set", CRM_FEATURE_SET,
7ac83c
+                                   NULL);
7ac83c
+    out->begin_list(out, NULL, NULL, "features");
7ac83c
+
7ac83c
+    for (char **s = feature_list; *s != NULL; s++) {
7ac83c
+        pcmk__output_create_xml_text_node(out, "feature", *s);
7ac83c
+    }
7ac83c
+
7ac83c
+    out->end_list(out);
7ac83c
+
7ac83c
+    g_strfreev(feature_list);
7ac83c
+    return pcmk_rc_ok;
7ac83c
+}
7ac83c
+
7ac83c
+static pcmk__message_entry_t fmt_functions[] = {
7ac83c
+    { "features", "default", pacemakerd_features },
7ac83c
+    { "features", "xml", pacemakerd_features_xml },
7ac83c
+
7ac83c
     { NULL, NULL, NULL }
7ac83c
 };
7ac83c
 
7ac83c
@@ -200,7 +236,7 @@ static GOptionContext *
7ac83c
 build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
7ac83c
     GOptionContext *context = NULL;
7ac83c
 
7ac83c
-    context = pcmk__build_arg_context(args, "text", group, NULL);
7ac83c
+    context = pcmk__build_arg_context(args, "text (default), xml", group, NULL);
7ac83c
     pcmk__add_main_args(context, entries);
7ac83c
     return context;
7ac83c
 }
7ac83c
@@ -241,9 +277,12 @@ main(int argc, char **argv)
7ac83c
         goto done;
7ac83c
     }
7ac83c
 
7ac83c
+    pcmk__force_args(context, &error, "%s --xml-simple-list", g_get_prgname());
7ac83c
+
7ac83c
+    pcmk__register_messages(out, fmt_functions);
7ac83c
+
7ac83c
     if (options.features) {
7ac83c
-        out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
7ac83c
-                  BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
+        out->message(out, "features");
7ac83c
         exit_code = CRM_EX_OK;
7ac83c
         goto done;
7ac83c
     }
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 5b7f5eb35b025b59805cf3c7c3dcb6a3cf4b71b3 Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Mon, 17 May 2021 11:09:53 -0400
7ac83c
Subject: [PATCH 3/5] Low: daemons: Conditionally enable logging in pacemakerd.
7ac83c
7ac83c
If we're doing an interactive command-line call, use
7ac83c
pcmk__cli_init_logging.  At the moment, all command line calls except
7ac83c
for --shutdown do their work before logging would even come up, so we
7ac83c
really only need to do this for --shutdown.
7ac83c
7ac83c
If we're doing a daemon call, use crm_log_init.
7ac83c
---
7ac83c
 daemons/pacemakerd/pacemakerd.c | 7 +++++--
7ac83c
 1 file changed, 5 insertions(+), 2 deletions(-)
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
7ac83c
index 93cf743..c20bde7 100644
7ac83c
--- a/daemons/pacemakerd/pacemakerd.c
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.c
7ac83c
@@ -296,8 +296,11 @@ main(int argc, char **argv)
7ac83c
 
7ac83c
     pcmk__set_env_option("mcp", "true");
7ac83c
 
7ac83c
-    pcmk__cli_init_logging("pacemakerd", args->verbosity);
7ac83c
-    crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
7ac83c
+    if (options.shutdown) {
7ac83c
+        pcmk__cli_init_logging("pacemakerd", args->verbosity);
7ac83c
+    } else {
7ac83c
+        crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
7ac83c
+    }
7ac83c
 
7ac83c
     crm_debug("Checking for existing Pacemaker instance");
7ac83c
     old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 2393362bb7489e86d937ed46a1c5cfb93d9bf3ab Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Mon, 17 May 2021 11:58:06 -0400
7ac83c
Subject: [PATCH 4/5] Fix: include: Bump CRM_FEATURE_SET for new pacemakerd
7ac83c
 args.
7ac83c
7ac83c
---
7ac83c
 include/crm/crm.h | 2 +-
7ac83c
 1 file changed, 1 insertion(+), 1 deletion(-)
7ac83c
7ac83c
diff --git a/include/crm/crm.h b/include/crm/crm.h
7ac83c
index fdfc825..92a98fa 100644
7ac83c
--- a/include/crm/crm.h
7ac83c
+++ b/include/crm/crm.h
7ac83c
@@ -66,7 +66,7 @@ extern "C" {
7ac83c
  * >=3.0.13: Fail counts include operation name and interval
7ac83c
  * >=3.2.0:  DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
7ac83c
  */
7ac83c
-#  define CRM_FEATURE_SET		"3.10.0"
7ac83c
+#  define CRM_FEATURE_SET		"3.10.1"
7ac83c
 
7ac83c
 /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
7ac83c
  * recipient of a CPG message. This imposes an arbitrary limit on cluster node
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 3ad8edbd91631b87ef5f53fa2d68f0c8bbb9ee2b Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Mon, 17 May 2021 11:57:09 -0400
7ac83c
Subject: [PATCH 5/5] Feature: xml: Add schema for pacemakerd.
7ac83c
7ac83c
---
7ac83c
 xml/Makefile.am             |  1 +
7ac83c
 xml/api/pacemakerd-2.10.rng | 28 ++++++++++++++++++++++++++++
7ac83c
 2 files changed, 29 insertions(+)
7ac83c
 create mode 100644 xml/api/pacemakerd-2.10.rng
7ac83c
7ac83c
diff --git a/xml/Makefile.am b/xml/Makefile.am
7ac83c
index 12a51c5..b9448d4 100644
7ac83c
--- a/xml/Makefile.am
7ac83c
+++ b/xml/Makefile.am
7ac83c
@@ -56,6 +56,7 @@ API_request_base	= command-output	\
7ac83c
 			  crm_simulate		\
7ac83c
 			  crmadmin		\
7ac83c
 			  digests		\
7ac83c
+			  pacemakerd 		\
7ac83c
 			  stonith_admin		\
7ac83c
 			  version
7ac83c
 
7ac83c
diff --git a/xml/api/pacemakerd-2.10.rng b/xml/api/pacemakerd-2.10.rng
7ac83c
new file mode 100644
7ac83c
index 0000000..41a11e7
7ac83c
--- /dev/null
7ac83c
+++ b/xml/api/pacemakerd-2.10.rng
7ac83c
@@ -0,0 +1,28 @@
7ac83c
+
7ac83c
+
7ac83c
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
7ac83c
+
7ac83c
+    <start>
7ac83c
+        <ref name="element-pacemakerd"/>
7ac83c
+    </start>
7ac83c
+
7ac83c
+    <define name="element-pacemakerd">
7ac83c
+        <element name="pacemakerd">
7ac83c
+            <attribute name="version"> <text /> </attribute>
7ac83c
+            <attribute name="build"> <text /> </attribute>
7ac83c
+            <attribute name="feature_set"> <text /> </attribute>
7ac83c
+
7ac83c
+            <optional>
7ac83c
+                <ref name="feature-list" />
7ac83c
+            </optional>
7ac83c
+        </element>
7ac83c
+    </define>
7ac83c
+
7ac83c
+    <define name="feature-list">
7ac83c
+        <element name="features">
7ac83c
+            <oneOrMore>
7ac83c
+                <element name="feature"> <text/> </element>
7ac83c
+            </oneOrMore>
7ac83c
+        </element>
7ac83c
+    </define>
7ac83c
+</grammar>
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c