From 5bcab230ad4c647ca78b18bd4a66e30a4bb4417f Mon Sep 17 00:00:00 2001 From: Oyvind Albrigtsen Date: Wed, 16 Jun 2021 11:19:03 +0200 Subject: [PATCH 1/2] Feature: crm_resource: report not supported for --force-* w/systemd, upstart, nagios and bundled resources --- tools/crm_resource.c | 21 ++++---------- tools/crm_resource_runtime.c | 67 +++++++++++++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/tools/crm_resource.c b/tools/crm_resource.c index 4abdd03..fa7902c 100644 --- a/tools/crm_resource.c +++ b/tools/crm_resource.c @@ -660,21 +660,12 @@ attr_set_type_cb(const gchar *option_name, const gchar *optarg, gpointer data, G gboolean class_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - if (!(pcmk_get_ra_caps(optarg) & pcmk_ra_cap_params)) { - if (!args->quiet) { - g_set_error(error, G_OPTION_ERROR, CRM_EX_INVALID_PARAM, - "Standard %s does not support parameters\n", optarg); - } - return FALSE; - - } else { - if (options.v_class != NULL) { - free(options.v_class); - } - - options.v_class = strdup(optarg); + if (options.v_class != NULL) { + free(options.v_class); } + options.v_class = strdup(optarg); + options.cmdline_config = TRUE; options.require_resource = FALSE; return TRUE; @@ -1422,7 +1413,7 @@ validate_cmdline_config(void) } else if (options.rsc_cmd != cmd_execute_agent) { g_set_error(&error, PCMK__EXITC_ERROR, CRM_EX_USAGE, "--class, --agent, and --provider can only be used with " - "--validate"); + "--validate and --force-*"); // Not all of --class, --agent, and --provider need to be given. Not all // classes support the concept of a provider. Check that what we were given @@ -1841,7 +1832,7 @@ main(int argc, char **argv) if (options.cmdline_config) { exit_code = cli_resource_execute_from_params(out, NULL, options.v_class, options.v_provider, options.v_agent, - "validate-all", options.cmdline_params, + options.operation, options.cmdline_params, options.override_params, options.timeout_ms, args->verbosity, options.force, options.check_level); } else { diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index fe42e60..59e6df5 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -1674,24 +1674,59 @@ wait_till_stable(pcmk__output_t *out, int timeout_ms, cib_t * cib) return rc; } +static const char * +get_action(const char *rsc_action) { + const char *action = NULL; + + if (pcmk__str_eq(rsc_action, "validate", pcmk__str_casei)) { + action = "validate-all"; + + } else if (pcmk__str_eq(rsc_action, "force-check", pcmk__str_casei)) { + action = "monitor"; + + } else if (pcmk__strcase_any_of(rsc_action, "force-start", "force-stop", + "force-demote", "force-promote", NULL)) { + action = rsc_action+6; + } else { + action = rsc_action; + } + + return action; +} + crm_exit_t cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name, const char *rsc_class, const char *rsc_prov, - const char *rsc_type, const char *action, + const char *rsc_type, const char *rsc_action, GHashTable *params, GHashTable *override_hash, int timeout_ms, int resource_verbose, gboolean force, int check_level) { + const char *action = NULL; GHashTable *params_copy = NULL; crm_exit_t exit_code = CRM_EX_OK; svc_action_t *op = NULL; if (pcmk__str_eq(rsc_class, PCMK_RESOURCE_CLASS_STONITH, pcmk__str_casei)) { out->err(out, "Sorry, the %s option doesn't support %s resources yet", - action, rsc_class); + rsc_action, rsc_class); + crm_exit(CRM_EX_UNIMPLEMENT_FEATURE); + } else if (pcmk__strcase_any_of(rsc_class, PCMK_RESOURCE_CLASS_SYSTEMD, + PCMK_RESOURCE_CLASS_UPSTART, PCMK_RESOURCE_CLASS_NAGIOS, NULL)) { + out->err(out, "Sorry, the %s option doesn't support %s resources", + rsc_action, rsc_class); + crm_exit(CRM_EX_UNIMPLEMENT_FEATURE); + } else if (pcmk__str_eq(rsc_class, PCMK_RESOURCE_CLASS_SERVICE, + pcmk__str_casei) && !pcmk__str_eq( + resources_find_service_class(rsc_name), PCMK_RESOURCE_CLASS_LSB, + pcmk__str_casei)) { + out->err(out, "Sorry, the %s option doesn't support %s resources", + rsc_action, resources_find_service_class(rsc_name)); crm_exit(CRM_EX_UNIMPLEMENT_FEATURE); } + action = get_action(rsc_action); + /* If no timeout was provided, grab the default. */ if (timeout_ms == 0) { timeout_ms = crm_get_msec(CRM_DEFAULT_OP_TIMEOUT_S); @@ -1766,7 +1801,7 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name, exit_code = op->rc; out->message(out, "resource-agent-action", resource_verbose, rsc_class, - rsc_prov, rsc_type, rsc_name, action, override_hash, op->rc, + rsc_prov, rsc_type, rsc_name, rsc_action, override_hash, op->rc, op->status, op->stdout_data, op->stderr_data); } else { exit_code = op->rc == 0 ? CRM_EX_ERROR : op->rc; @@ -1790,27 +1825,15 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name, const char *rtype = NULL; const char *rprov = NULL; const char *rclass = NULL; - const char *action = NULL; GHashTable *params = NULL; - if (pcmk__str_eq(rsc_action, "validate", pcmk__str_casei)) { - action = "validate-all"; - - } else if (pcmk__str_eq(rsc_action, "force-check", pcmk__str_casei)) { - action = "monitor"; - - } else if (pcmk__str_eq(rsc_action, "force-stop", pcmk__str_casei)) { - action = rsc_action+6; - - } else if (pcmk__strcase_any_of(rsc_action, "force-start", "force-demote", + if (pcmk__strcase_any_of(rsc_action, "force-start", "force-demote", "force-promote", NULL)) { - action = rsc_action+6; - if(pe_rsc_is_clone(rsc)) { GList *nodes = cli_resource_search(rsc, requested_name, data_set); if(nodes != NULL && force == FALSE) { out->err(out, "It is not safe to %s %s here: the cluster claims it is already active", - action, rsc->id); + rsc_action, rsc->id); out->err(out, "Try setting target-role=Stopped first or specifying " "the force option"); return CRM_EX_UNSAFE; @@ -1818,9 +1841,6 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name, g_list_free_full(nodes, free); } - - } else { - action = rsc_action; } if(pe_rsc_is_clone(rsc)) { @@ -1831,6 +1851,9 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name, if(rsc->variant == pe_group) { out->err(out, "Sorry, the %s option doesn't support group resources", rsc_action); return CRM_EX_UNIMPLEMENT_FEATURE; + } else if (rsc->variant == pe_container || pe_rsc_is_bundled(rsc)) { + out->err(out, "Sorry, the %s option doesn't support bundled resources", rsc_action); + return CRM_EX_UNIMPLEMENT_FEATURE; } rclass = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); @@ -1841,12 +1864,12 @@ cli_resource_execute(pe_resource_t *rsc, const char *requested_name, data_set); if (timeout_ms == 0) { - timeout_ms = pe_get_configured_timeout(rsc, action, data_set); + timeout_ms = pe_get_configured_timeout(rsc, get_action(rsc_action), data_set); } rid = pe_rsc_is_anon_clone(rsc->parent)? requested_name : rsc->id; - exit_code = cli_resource_execute_from_params(out, rid, rclass, rprov, rtype, action, + exit_code = cli_resource_execute_from_params(out, rid, rclass, rprov, rtype, rsc_action, params, override_hash, timeout_ms, resource_verbose, force, check_level); return exit_code; -- 1.8.3.1 From 289cd231186755d99c1262eb9f968dc852409588 Mon Sep 17 00:00:00 2001 From: Oyvind Albrigtsen Date: Fri, 16 Jul 2021 13:20:55 +0200 Subject: [PATCH 2/2] Refactor: crm_resource: remove duplicate Overriding message that's handled elsewhere --- tools/crm_resource_runtime.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index 59e6df5..ce037c5 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -1791,8 +1791,6 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name, g_hash_table_iter_init(&iter, override_hash); while (g_hash_table_iter_next(&iter, (gpointer *) & name, (gpointer *) & value)) { - out->info(out, "Overriding the cluster configuration for '%s' with '%s' = '%s'", - rsc_name, name, value); g_hash_table_replace(op->params, strdup(name), strdup(value)); } } -- 1.8.3.1