174 return "restart-container";
177 return "reset-remote";
196 g_list_free_full(
action->actions_before, free);
197 g_list_free_full(
action->actions_after, free);
198 if (
action->extra != NULL) {
199 g_hash_table_destroy(
action->extra);
201 if (
action->meta != NULL) {
202 g_hash_table_destroy(
action->meta);
205 free(
action->cancel_task);
225pcmk__op_key(
const char *rsc_id,
const char *op_type, guint interval_ms)
231static inline gboolean
232convert_interval(
const char *s, guint *interval_ms)
237 l = strtoul(s, NULL, 10);
243 *interval_ms = (guint) l;
259match_before(
const char *key,
size_t position,
const char **matches)
261 for (
int i = 0; matches[i] != NULL; ++i) {
262 const size_t match_len = strlen(matches[i]);
265 if (position > (match_len + 1)) {
266 const size_t possible = position - match_len - 1;
268 if ((key[possible] ==
'_')
269 && (strncmp(key + possible + 1, matches[i], match_len) == 0)) {
278parse_op_key(
const char *key,
char **rsc_id,
char **op_type, guint *interval_ms)
280 guint local_interval_ms = 0;
281 const size_t key_len = (key == NULL)? 0 : strlen(key);
284 size_t action_underbar = 0;
285 size_t interval_underbar = 0;
291 const char *actions_with_underbars[] = {
296 const char *action_prefixes_with_underbars[] = {
321 interval_underbar = key_len - 2;
322 while ((interval_underbar > 2) && (key[interval_underbar] !=
'_')) {
325 if ((interval_underbar == 2)
326 || !convert_interval(key + interval_underbar + 1, &local_interval_ms)) {
331 action_underbar = match_before(key, interval_underbar,
332 actions_with_underbars);
333 if (action_underbar == 0) {
334 action_underbar = interval_underbar - 2;
335 while ((action_underbar > 0) && (key[action_underbar] !=
'_')) {
338 if (action_underbar == 0) {
342 possible = match_before(key, action_underbar,
343 action_prefixes_with_underbars);
345 action_underbar = possible;
349 if (rsc_id != NULL) {
350 *rsc_id = strndup(key, action_underbar);
353 if (op_type != NULL) {
354 *op_type = strndup(key + action_underbar + 1,
355 interval_underbar - action_underbar - 1);
358 if (interval_ms != NULL) {
359 *interval_ms = local_interval_ms;
370 CRM_CHECK(notify_type != NULL,
return NULL);
372 rsc_id, notify_type, op_type);
392 int *op_status,
int *op_rc,
int *target_rc)
397 int local_op_status = -1;
398 int local_op_rc = -1;
403 res = sscanf(magic,
"%d:%d;%ms", &local_op_status, &local_op_rc, &key);
407 res = sscanf(magic,
"%d:%d;%s", &local_op_status, &local_op_rc, key);
410 crm_err(
"Could not decode transition information '%s': %s",
413 }
else if (res < 3) {
414 crm_warn(
"Transition information '%s' incomplete (%d of 3 expected items)",
419 *op_status = local_op_status;
422 *op_rc = local_op_rc;
437 action_id, transition_id, target_rc, 36, node);
457 int local_transition_id = -1;
458 int local_action_id = -1;
459 int local_target_rc = -1;
460 char local_uuid[37] = {
'\0' };
477 if (sscanf(key,
"%d:%d:%d:%36s", &local_action_id, &local_transition_id,
478 &local_target_rc, local_uuid) != 4) {
479 crm_err(
"Invalid transition key '%s'", key);
482 if (strlen(local_uuid) != 36) {
483 crm_warn(
"Invalid UUID '%s' in transition key '%s'", local_uuid, key);
489 *transition_id = local_transition_id;
492 *action_id = local_action_id;
495 *target_rc = local_target_rc;
529 if (target_rc != op->
rc) {
550 const char *interval_spec,
const char *
timeout)
554 CRM_CHECK(prefix && task && interval_spec,
return NULL);
582 CRM_CHECK((rsc_class != NULL) || (op != NULL),
return false);
584 if ((rsc_class != NULL)
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
void pcmk__free_action(gpointer user_data)
char * pcmk__notify_key(const char *rsc_id, const char *notify_type, const char *op_type)
gboolean decode_transition_key(const char *key, char **uuid, int *transition_id, int *action_id, int *target_rc)
Parse a transition key into its constituent parts.
int rsc_op_expected_rc(const lrmd_event_data_t *op)
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
bool pcmk__is_fencing_action(const char *action)
xmlNode * crm_create_op_xml(xmlNode *parent, const char *prefix, const char *task, const char *interval_spec, const char *timeout)
Create a CIB XML element for an operation.
gboolean did_rsc_op_fail(lrmd_event_data_t *op, int target_rc)
const char * pcmk__action_text(enum pcmk__action_type action)
enum pcmk__action_type pcmk__parse_action(const char *action_name)
char * pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node)
const char * pcmk__on_fail_text(enum pcmk__on_fail on_fail)
bool crm_op_needs_metadata(const char *rsc_class, const char *op)
Check whether an operation requires resource agent meta-data.
gboolean decode_transition_magic(const char *magic, char **uuid, int *transition_id, int *action_id, int *op_status, int *op_rc, int *target_rc)
Parse a transition magic string into its constituent parts.
#define PCMK_ACTION_PROMOTED
#define PCMK_ACTION_RUNNING
#define PCMK_ACTION_REBOOT
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_START
#define PCMK_ACTION_NOTIFIED
#define PCMK_ACTION_MIGRATE_FROM
#define PCMK_ACTION_RELOAD
#define PCMK_ACTION_MIGRATE_TO
#define PCMK_ACTION_STOPPED
#define PCMK_ACTION_MONITOR
#define PCMK_ACTION_STONITH
#define PCMK_ACTION_RELOAD_AGENT
#define PCMK_ACTION_DEMOTED
#define PCMK_ACTION_DEMOTE
#define PCMK_ACTION_DO_SHUTDOWN
#define PCMK_ACTION_NOTIFY
@ pcmk__on_fail_reset_remote
@ pcmk__on_fail_restart_container
@ pcmk__on_fail_fence_node
@ pcmk__on_fail_standby_node
@ pcmk__action_unspecified
#define PCMK__OP_FMT
printf-style format to create operation key from resource, action, interval
uint32_t pcmk_get_ra_caps(const char *standard)
Get capabilities of a resource agent standard.
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
#define crm_warn(fmt, args...)
#define CRM_CHECK(expr, failure_action)
#define crm_err(fmt, args...)
void pcmk__free_node_copy(void *data)
#define PCMK_META_INTERVAL
#define PCMK_META_TIMEOUT
pcmk__action_result_t result
const char * pcmk_rc_str(int rc)
Get a user-friendly description of a return code.
@ PCMK_EXEC_CANCELLED
Action was cancelled.
@ PCMK_EXEC_NO_SECRETS
Necessary CIB secrets are unavailable.
@ PCMK_EXEC_INVALID
Action cannot be attempted (e.g. shutdown)
@ PCMK_EXEC_ERROR
Execution failed, may be retried.
@ PCMK_EXEC_NOT_SUPPORTED
Agent does not implement requested action.
@ PCMK_EXEC_TIMEOUT
Action did not complete in time.
@ PCMK_EXEC_PENDING
Action is in progress.
@ PCMK_EXEC_NO_FENCE_DEVICE
No fence device is configured for target.
@ PCMK_EXEC_NOT_CONNECTED
No connection to executor.
#define pcmk__assert(expr)
#define pcmk__mem_assert(ptr)
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
#define pcmk__str_copy(str)
Wrappers for and extensions to libxml2.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_id(xmlNode *xml, const char *format,...) G_GNUC_PRINTF(2