From af2eb406a83c3e799bc7d86112ecc609114802ce Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Jan 22 2021 12:12:32 +0000 Subject: Refactor: libcrmcommon,libstonithd: expose special attribute constants These will be needed in libcrmcommon, so move them from libstonithd. Also make them public API, since they're Pacemaker-specific strings that external users might find useful. --- diff --git a/daemons/fenced/cts-fence-helper.c b/daemons/fenced/cts-fence-helper.c index a248829..af006b5 100644 --- a/daemons/fenced/cts-fence-helper.c +++ b/daemons/fenced/cts-fence-helper.c @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -184,7 +185,8 @@ run_fence_failure_test(void) { stonith_key_value_t *params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "false_1_node1=1,2 false_1_node2=3,4"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "false_1_node1=1,2 false_1_node2=3,4"); params = stonith_key_value_add(params, "mode", "fail"); single_test(st-> @@ -208,7 +210,8 @@ run_fence_failure_rollover_test(void) { stonith_key_value_t *params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "false_1_node1=1,2 false_1_node2=3,4"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "false_1_node1=1,2 false_1_node2=3,4"); params = stonith_key_value_add(params, "mode", "fail"); single_test(st-> @@ -216,7 +219,8 @@ run_fence_failure_rollover_test(void) "Register device1 for rollover test", 1, 0); stonith_key_value_freeall(params, 1, 1); params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "false_1_node1=1,2 false_1_node2=3,4"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "false_1_node1=1,2 false_1_node2=3,4"); params = stonith_key_value_add(params, "mode", "pass"); single_test(st-> @@ -244,7 +248,8 @@ run_standard_test(void) { stonith_key_value_t *params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "false_1_node1=1,2 false_1_node2=3,4"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "false_1_node1=1,2 false_1_node2=3,4"); params = stonith_key_value_add(params, "mode", "pass"); params = stonith_key_value_add(params, "mock_dynamic_hosts", "false_1_node1 false_1_node2"); @@ -320,7 +325,8 @@ standard_dev_test(void) crm_exit(CRM_EX_DISCONNECT); } - params = stonith_key_value_add(params, "pcmk_host_map", "some-host=pcmk-7 true_1_node1=3,4"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "some-host=pcmk-7 true_1_node1=3,4"); rc = st->cmds->register_device(st, st_opts, "test-id", "stonith-ng", "fence_xvm", params); crm_debug("Register: %d", rc); @@ -498,19 +504,22 @@ test_register_async_devices(int check_event) char buf[16] = { 0, }; stonith_key_value_t *params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "false_1_node1=1,2"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "false_1_node1=1,2"); params = stonith_key_value_add(params, "mode", "fail"); st->cmds->register_device(st, st_opts, "false_1", "stonith-ng", "fence_dummy", params); stonith_key_value_freeall(params, 1, 1); params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "true_1_node1=1,2"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "true_1_node1=1,2"); params = stonith_key_value_add(params, "mode", "pass"); st->cmds->register_device(st, st_opts, "true_1", "stonith-ng", "fence_dummy", params); stonith_key_value_freeall(params, 1, 1); params = NULL; - params = stonith_key_value_add(params, "pcmk_host_map", "custom_timeout_node1=1,2"); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_MAP, + "custom_timeout_node1=1,2"); params = stonith_key_value_add(params, "mode", "fail"); params = stonith_key_value_add(params, "delay", "1000"); snprintf(buf, sizeof(buf) - 1, "%d", MAINLOOP_DEFAULT_TIMEOUT + CUSTOM_TIMEOUT_ADDITION); diff --git a/daemons/fenced/fenced_commands.c b/daemons/fenced/fenced_commands.c index 8d085d4..22b0bcd 100644 --- a/daemons/fenced/fenced_commands.c +++ b/daemons/fenced/fenced_commands.c @@ -128,7 +128,7 @@ get_action_delay_max(stonith_device_t * device, const char * action) return 0; } - value = g_hash_table_lookup(device->params, STONITH_ATTR_DELAY_MAX); + value = g_hash_table_lookup(device->params, PCMK_STONITH_DELAY_MAX); if (value) { delay_max = crm_parse_interval_spec(value) / 1000; } @@ -146,7 +146,7 @@ get_action_delay_base(stonith_device_t * device, const char * action) return 0; } - value = g_hash_table_lookup(device->params, STONITH_ATTR_DELAY_BASE); + value = g_hash_table_lookup(device->params, PCMK_STONITH_DELAY_BASE); if (value) { delay_base = crm_parse_interval_spec(value) / 1000; } @@ -269,7 +269,7 @@ get_action_limit(stonith_device_t * device) const char *value = NULL; int action_limit = 1; - value = g_hash_table_lookup(device->params, STONITH_ATTR_ACTION_LIMIT); + value = g_hash_table_lookup(device->params, PCMK_STONITH_ACTION_LIMIT); if (value) { action_limit = crm_parse_int(value, "1"); if (action_limit == 0) { @@ -897,12 +897,12 @@ build_device_from_xml(xmlNode * msg) device->namespace = crm_element_value_copy(dev, "namespace"); device->params = xml2device_params(device->id, dev); - value = g_hash_table_lookup(device->params, STONITH_ATTR_HOSTLIST); + value = g_hash_table_lookup(device->params, PCMK_STONITH_HOST_LIST); if (value) { device->targets = stonith__parse_targets(value); } - value = g_hash_table_lookup(device->params, STONITH_ATTR_HOSTMAP); + value = g_hash_table_lookup(device->params, PCMK_STONITH_HOST_MAP); device->aliases = build_port_aliases(value, &(device->targets)); device->agent_metadata = get_agent_metadata(device->agent); @@ -942,13 +942,13 @@ target_list_type(stonith_device_t * dev) { const char *check_type = NULL; - check_type = g_hash_table_lookup(dev->params, STONITH_ATTR_HOSTCHECK); + check_type = g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_CHECK); if (check_type == NULL) { - if (g_hash_table_lookup(dev->params, STONITH_ATTR_HOSTLIST)) { + if (g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_LIST)) { check_type = "static-list"; - } else if (g_hash_table_lookup(dev->params, STONITH_ATTR_HOSTMAP)) { + } else if (g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_MAP)) { check_type = "static-list"; } else if (pcmk_is_set(dev->flags, st_device_supports_list)) { check_type = "dynamic-list"; @@ -1067,7 +1067,8 @@ dynamic_list_search_cb(GPid pid, int rc, const char *output, gpointer user_data) if (rc != 0 && !dev->targets) { crm_notice("Disabling port list queries for %s (%d): %s", dev->id, rc, output); /* Fall back to status */ - g_hash_table_replace(dev->params, strdup(STONITH_ATTR_HOSTCHECK), strdup("status")); + g_hash_table_replace(dev->params, + strdup(PCMK_STONITH_HOST_CHECK), strdup("status")); g_list_free_full(dev->targets, free); dev->targets = NULL; @@ -1658,7 +1659,7 @@ can_fence_host_with_device(stonith_device_t * dev, struct device_search_s *searc if (string_in_list(dev->targets, host)) { can = TRUE; - } else if (g_hash_table_lookup(dev->params, STONITH_ATTR_HOSTMAP) + } else if (g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_MAP) && g_hash_table_lookup(dev->aliases, host)) { can = TRUE; } @@ -1689,8 +1690,8 @@ can_fence_host_with_device(stonith_device_t * dev, struct device_search_s *searc /* we'll respond to this search request async in the cb */ return; } else { - crm_err("Invalid value for " STONITH_ATTR_HOSTCHECK ": %s", check_type); - check_type = "Invalid " STONITH_ATTR_HOSTCHECK; + crm_err("Invalid value for " PCMK_STONITH_HOST_CHECK ": %s", check_type); + check_type = "Invalid " PCMK_STONITH_HOST_CHECK; } if (pcmk__str_eq(host, alias, pcmk__str_casei)) { diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c index 092f604..5c2cc3a 100644 --- a/daemons/fenced/pacemaker-fenced.c +++ b/daemons/fenced/pacemaker-fenced.c @@ -653,7 +653,7 @@ static void cib_device_update(pe_resource_t *rsc, pe_working_set_t *data_set) get_rsc_attributes(rsc->parameters, rsc, node, data_set); get_meta_attributes(rsc->meta, rsc, node, data_set); - rsc_provides = g_hash_table_lookup(rsc->meta, XML_RSC_ATTR_PROVIDES); + rsc_provides = g_hash_table_lookup(rsc->meta, PCMK_STONITH_PROVIDES); g_hash_table_iter_init(&gIter, rsc->parameters); while (g_hash_table_iter_next(&gIter, (gpointer *) & name, (gpointer *) & value)) { @@ -1331,7 +1331,8 @@ main(int argc, char **argv) printf(" \n"); #endif - printf(" \n", STONITH_ATTR_HOSTARG); + printf(" \n", + PCMK_STONITH_HOST_ARGUMENT); printf (" Advanced use only: An alternate parameter to supply instead of 'port'\n"); printf @@ -1342,7 +1343,8 @@ main(int argc, char **argv) printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_HOSTMAP); + printf(" \n", + PCMK_STONITH_HOST_MAP); printf (" A mapping of host names to ports numbers for devices that do not support host names.\n"); printf @@ -1350,25 +1352,28 @@ main(int argc, char **argv) printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_HOSTLIST); - printf - (" A list of machines controlled by this device (Optional unless %s=static-list).\n", - STONITH_ATTR_HOSTCHECK); + printf(" \n", + PCMK_STONITH_HOST_LIST); + printf(" A list of machines controlled by " + "this device (Optional unless %s=static-list).\n", + PCMK_STONITH_HOST_CHECK); printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_HOSTCHECK); + printf(" \n", + PCMK_STONITH_HOST_CHECK); printf (" How to determine which machines are controlled by the device.\n"); printf(" Allowed values: dynamic-list " "(query the device via the 'list' command), static-list " - "(check the " STONITH_ATTR_HOSTLIST " attribute), status " + "(check the " PCMK_STONITH_HOST_LIST " attribute), status " "(query the device via the 'status' command), none (assume " "every device can fence every machine)\n"); printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_DELAY_MAX); + printf(" \n", + PCMK_STONITH_DELAY_MAX); printf (" Enable a random delay for stonith actions and specify the maximum of random delay.\n"); printf @@ -1378,7 +1383,8 @@ main(int argc, char **argv) printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_DELAY_BASE); + printf(" \n", + PCMK_STONITH_DELAY_BASE); printf (" Enable a base delay for stonith actions and specify base delay value.\n"); printf @@ -1388,7 +1394,8 @@ main(int argc, char **argv) printf(" \n"); printf(" \n"); - printf(" \n", STONITH_ATTR_ACTION_LIMIT); + printf(" \n", + PCMK_STONITH_ACTION_LIMIT); printf (" The maximum number of actions can be performed in parallel on this device\n"); printf @@ -1507,7 +1514,8 @@ main(int argc, char **argv) xmlNode *xml; stonith_key_value_t *params = NULL; - params = stonith_key_value_add(params, STONITH_ATTR_HOSTLIST, stonith_our_uname); + params = stonith_key_value_add(params, PCMK_STONITH_HOST_LIST, + stonith_our_uname); xml = create_device_registration_xml("watchdog", st_namespace_internal, STONITH_WATCHDOG_AGENT, params, diff --git a/include/crm/common/agents.h b/include/crm/common/agents.h index b585ada..e9089ae 100644 --- a/include/crm/common/agents.h +++ b/include/crm/common/agents.h @@ -23,6 +23,19 @@ extern "C" { #include // uint32_t #include +/* Special stonith-class agent parameters interpreted directly by Pacemaker + * (not including the pcmk_ACTION_{action,retries,timeout} parameters) + */ +#define PCMK_STONITH_ACTION_LIMIT "pcmk_action_limit" +#define PCMK_STONITH_DELAY_BASE "pcmk_delay_base" +#define PCMK_STONITH_DELAY_MAX "pcmk_delay_max" +#define PCMK_STONITH_HOST_ARGUMENT "pcmk_host_argument" +#define PCMK_STONITH_HOST_CHECK "pcmk_host_check" +#define PCMK_STONITH_HOST_LIST "pcmk_host_list" +#define PCMK_STONITH_HOST_MAP "pcmk_host_map" +#define PCMK_STONITH_PROVIDES "provides" +#define PCMK_STONITH_STONITH_TIMEOUT "stonith-timeout" + // Capabilities supported by a resource agent standard enum pcmk_ra_caps { pcmk_ra_cap_none = 0, diff --git a/include/crm/fencing/internal.h b/include/crm/fencing/internal.h index f33957f..391ab72 100644 --- a/include/crm/fencing/internal.h +++ b/include/crm/fencing/internal.h @@ -152,14 +152,6 @@ void stonith__device_parameter_flags(uint32_t *device_flags, # define T_STONITH_TIMEOUT_VALUE "st-async-timeout-value" # define T_STONITH_NOTIFY "st_notify" -# define STONITH_ATTR_HOSTARG "pcmk_host_argument" -# define STONITH_ATTR_HOSTMAP "pcmk_host_map" -# define STONITH_ATTR_HOSTLIST "pcmk_host_list" -# define STONITH_ATTR_HOSTCHECK "pcmk_host_check" -# define STONITH_ATTR_DELAY_MAX "pcmk_delay_max" -# define STONITH_ATTR_DELAY_BASE "pcmk_delay_base" -# define STONITH_ATTR_ACTION_LIMIT "pcmk_action_limit" - # define STONITH_ATTR_ACTION_OP "action" # define STONITH_OP_EXEC "st_execute" diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h index 1fcb72d..c8b528b 100644 --- a/include/crm/msg_xml.h +++ b/include/crm/msg_xml.h @@ -208,7 +208,6 @@ extern "C" { # define XML_RSC_ATTR_FAIL_TIMEOUT "failure-timeout" # define XML_RSC_ATTR_MULTIPLE "multiple-active" # define XML_RSC_ATTR_REQUIRES "requires" -# define XML_RSC_ATTR_PROVIDES "provides" # define XML_RSC_ATTR_CONTAINER "container" # define XML_RSC_ATTR_INTERNAL_RSC "internal_rsc" # define XML_RSC_ATTR_MAINTENANCE "maintenance" @@ -425,6 +424,17 @@ extern "C" { # define ID(x) crm_element_value(x, XML_ATTR_ID) # define TYPE(x) crm_element_name(x) + +#ifndef PCMK__NO_COMPAT +/* Everything here is deprecated and kept only for public API backward + * compatibility. It will be moved to compatibility.h in a future release. + */ + +//! \deprecated Use PCMK_STONITH_PROVIDES instead +# define XML_RSC_ATTR_PROVIDES "provides" + +#endif + #ifdef __cplusplus } #endif diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c index 3bcdfb3..21ea9c7 100644 --- a/lib/fencing/st_client.c +++ b/lib/fencing/st_client.c @@ -516,7 +516,8 @@ make_args(const char *agent, const char *action, const char *victim, append_arg(STONITH_ATTR_ACTION_OP, action, &arg_list); if (victim && device_args) { const char *alias = victim; - const char *param = g_hash_table_lookup(device_args, STONITH_ATTR_HOSTARG); + const char *param = g_hash_table_lookup(device_args, + PCMK_STONITH_HOST_ARGUMENT); if (port_map && g_hash_table_lookup(port_map, victim)) { alias = g_hash_table_lookup(port_map, victim); @@ -2047,14 +2048,15 @@ stonith_api_validate(stonith_t *st, int call_options, const char *rsc_id, // Convert parameter list to a hash table for (; params; params = params->next) { - if (pcmk__str_eq(params->key, STONITH_ATTR_HOSTARG, pcmk__str_casei)) { + if (pcmk__str_eq(params->key, PCMK_STONITH_HOST_ARGUMENT, + pcmk__str_casei)) { host_arg = params->value; } // Strip out Pacemaker-implemented parameters if (!pcmk__starts_with(params->key, "pcmk_") - && strcmp(params->key, "provides") - && strcmp(params->key, "stonith-timeout")) { + && strcmp(params->key, PCMK_STONITH_PROVIDES) + && strcmp(params->key, PCMK_STONITH_STONITH_TIMEOUT)) { g_hash_table_insert(params_table, strdup(params->key), strdup(params->value)); } diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c index a9bbf4b..44dba47 100644 --- a/lib/pengine/unpack.c +++ b/lib/pengine/unpack.c @@ -169,7 +169,7 @@ pe_fence_node(pe_working_set_t * data_set, pe_node_t * node, // nvpair with provides or requires set to unfencing #define XPATH_UNFENCING_NVPAIR XML_CIB_TAG_NVPAIR \ - "[(@" XML_NVPAIR_ATTR_NAME "='" XML_RSC_ATTR_PROVIDES "'" \ + "[(@" XML_NVPAIR_ATTR_NAME "='" PCMK_STONITH_PROVIDES "'" \ "or @" XML_NVPAIR_ATTR_NAME "='" XML_RSC_ATTR_REQUIRES "') " \ "and @" XML_NVPAIR_ATTR_VALUE "='unfencing']" diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c index 2ad8780..fd238df 100644 --- a/lib/pengine/utils.c +++ b/lib/pengine/utils.c @@ -2362,7 +2362,8 @@ find_unfencing_devices(GListPtr candidates, GListPtr matches) { for (GListPtr gIter = candidates; gIter != NULL; gIter = gIter->next) { pe_resource_t *candidate = gIter->data; - const char *provides = g_hash_table_lookup(candidate->meta, XML_RSC_ATTR_PROVIDES); + const char *provides = g_hash_table_lookup(candidate->meta, + PCMK_STONITH_PROVIDES); const char *requires = g_hash_table_lookup(candidate->meta, XML_RSC_ATTR_REQUIRES); if(candidate->children) {