40 pcmk__op_key(
const char *rsc_id,
const char *op_type, guint interval_ms)
48 parse_op_key(
const char *key,
char **rsc_id,
char **op_type, guint *interval_ms)
51 char *mutable_key = NULL;
52 char *mutable_key_ptr = NULL;
53 size_t len = 0, offset = 0;
54 unsigned long long ch = 0;
55 guint local_interval_ms = 0;
73 while ((offset > 0) && isdigit(key[offset])) {
74 ch = key[offset] -
'0';
75 for (
int digits = len - offset; digits > 1; --digits) {
78 local_interval_ms += ch;
81 crm_trace(
"Operation key '%s' has interval %ums", key, local_interval_ms);
83 *interval_ms = local_interval_ms;
86 CRM_CHECK((offset != (len - 1)) && (key[offset] ==
'_'),
return FALSE);
88 mutable_key =
strndup(key, offset);
91 while (offset > 0 && key[offset] !=
'_') {
96 free(mutable_key);
return FALSE);
98 mutable_key_ptr = mutable_key + offset + 1;
100 crm_trace(
" Action: %s", mutable_key_ptr);
102 *op_type = strdup(mutable_key_ptr);
105 mutable_key[offset] = 0;
108 notify = strstr(mutable_key,
"_post_notify");
109 if (notify &&
safe_str_eq(notify,
"_post_notify")) {
113 notify = strstr(mutable_key,
"_pre_notify");
114 if (notify &&
safe_str_eq(notify,
"_pre_notify")) {
120 *rsc_id = mutable_key;
134 CRM_CHECK(notify_type != NULL,
return NULL);
136 rsc_id, notify_type, op_type);
156 int *
op_status,
int *op_rc,
int *target_rc)
160 gboolean result = TRUE;
161 int local_op_status = -1;
162 int local_op_rc = -1;
167 res = sscanf(magic,
"%d:%d;%ms", &local_op_status, &local_op_rc, &key);
169 key = calloc(1, strlen(magic) - 3);
171 res = sscanf(magic,
"%d:%d;%s", &local_op_status, &local_op_rc, key);
174 crm_err(
"Could not decode transition information '%s': %s",
177 }
else if (res < 3) {
178 crm_warn(
"Transition information '%s' incomplete (%d of 3 expected items)",
183 *op_status = local_op_status;
186 *op_rc = local_op_rc;
201 action_id, transition_id, target_rc, 36, node);
221 int local_transition_id = -1;
222 int local_action_id = -1;
223 int local_target_rc = -1;
224 char local_uuid[37] = {
'\0' };
241 if (sscanf(key,
"%d:%d:%d:%36s", &local_action_id, &local_transition_id,
242 &local_target_rc, local_uuid) != 4) {
243 crm_err(
"Invalid transition key '%s'", key);
246 if (strlen(local_uuid) != 36) {
247 crm_warn(
"Invalid UUID '%s' in transition key '%s'", local_uuid, key);
250 *uuid = strdup(local_uuid);
254 *transition_id = local_transition_id;
257 *action_id = local_action_id;
260 *target_rc = local_target_rc;
276 guint interval_ms = 0;
278 const char *attr_filter[] = {
287 const int meta_len = strlen(
CRM_META);
289 if (param_set == NULL) {
294 for (
int lpc = 0; lpc <
DIMOF(attr_filter); lpc++) {
308 for (xmlAttrPtr xIter = param_set->properties; xIter != NULL; ) {
309 const char *prop_name = (
const char *) (xIter->name);
314 if (strncasecmp(prop_name,
CRM_META, meta_len) == 0) {
319 if ((interval_ms != 0) && (timeout != NULL)) {
357 if (target_rc != op->
rc) {
378 const char *interval_spec,
const char *
timeout)
382 CRM_CHECK(prefix && task && interval_spec,
return NULL);
411 CRM_CHECK(rsc_class || op,
return FALSE);
#define CRM_CHECK(expr, failure_action)
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
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.
#define CRMD_ACTION_MIGRATED
const char * pcmk_strerror(int rc)
int rsc_op_expected_rc(lrmd_event_data_t *event)
#define CRMD_ACTION_NOTIFY
#define XML_LRM_ATTR_INTERVAL
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
#define XML_LRM_ATTR_OP_DIGEST
#define CRMD_ACTION_PROMOTE
bool crm_op_needs_metadata(const char *rsc_class, const char *op)
Check whether an operation requires resource agent meta-data.
void pcmk__filter_op_for_digest(xmlNode *param_set)
char * strndup(const char *str, size_t len)
char * crm_meta_name(const char *field)
#define CRMD_ACTION_START
#define crm_warn(fmt, args...)
#define CRMD_ACTION_DEMOTE
char * pcmk__notify_key(const char *rsc_id, const char *notify_type, const char *op_type)
int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest)
Retrieve the millisecond value of an XML attribute.
char * crm_element_value_copy(const xmlNode *data, const char *name)
Retrieve a copy of the value of an XML attribute.
#define crm_trace(fmt, args...)
Wrappers for and extensions to libxml2.
xmlNode * create_xml_node(xmlNode *parent, const char *name)
uint32_t pcmk_get_ra_caps(const char *standard)
Get capabilities of a resource agent standard.
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
#define CRMD_ACTION_RELOAD
#define XML_LRM_ATTR_TARGET_UUID
gboolean did_rsc_op_fail(lrmd_event_data_t *event, int target_rc)
#define crm_err(fmt, args...)
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.
void crm_xml_set_id(xmlNode *xml, const char *format,...) __attribute__((__format__(__printf__
void xml_remove_prop(xmlNode *obj, const char *name)
#define XML_LRM_ATTR_INTERVAL_MS
#define CRMD_ACTION_MIGRATE
#define XML_ATTR_CRM_VERSION
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.
char * pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node)
#define XML_LRM_ATTR_TARGET
#define safe_str_eq(a, b)
char * crm_strdup_printf(char const *format,...) __attribute__((__format__(__printf__
#define CRMD_ACTION_STATUS