14#include <libxml/xmlstring.h>
26 const char *
name = NULL;
40 data->data.pairs = g_list_prepend(
data->data.pairs, pair);
62 const char *value = NULL;
75 if (pcmk__str_empty(value)
77 crm_info(
"Unrecognizable message from attribute manager: "
95 set_pairs_data(&reply_data, reply);
98 crm_info(
"Unrecognizable message from attribute manager: "
99 "message subtype '%s' unknown", pcmk__s(value,
""));
109 g_list_free_full(reply_data.
data.
pairs, free);
139create_attrd_op(
const char *user_name)
151connect_and_send_attrd_request(
pcmk_ipc_api_t *api,
const xmlNode *request)
153 static const int max_retries = 5;
154 int remaining_attempts = max_retries;
156 bool created_api =
false;
173 if (rc == ENOTCONN || rc == ECONNREFUSED) {
174 sleep(max_retries - remaining_attempts);
180 remaining_attempts--;
181 }
while ((rc == ENOTCONN || rc == ECONNREFUSED) && remaining_attempts >= 0);
191 const char *resource,
const char *operation,
192 const char *interval_spec,
const char *user_name,
196 xmlNode *request = create_attrd_op(user_name);
197 const char *interval_desc = NULL;
198 const char *op_desc = NULL;
206 interval_desc = pcmk__s(interval_spec,
"nonrecurring");
209 interval_desc =
"all";
210 op_desc =
"operations";
212 crm_debug(
"Asking %s to clear failure of %s %s for %s on %s",
214 pcmk__s(resource,
"all resources"), pcmk__s(node,
"all nodes"));
224 rc = connect_and_send_attrd_request(api, request);
234 const char *
target = NULL;
247 options &= ~pcmk__node_attr_delay;
257 xmlNode *request = NULL;
264 crm_debug(
"Asking %s to purge transient attributes%s for %s",
266 (reap?
" and node cache entries" :
""),
267 pcmk__s(node,
"local node"));
269 request = create_attrd_op(NULL);
275 rc = connect_and_send_attrd_request(api, request);
286 xmlNode *request = NULL;
287 const char *
target = NULL;
300 }
else if (node == NULL) {
305 crm_debug(
"Querying %s for value of '%s'%s%s",
307 ((node == NULL)?
"" :
" on "), pcmk__s(node,
""));
309 request = create_attrd_op(NULL);
315 rc = connect_and_send_attrd_request(api, request);
324 xmlNode *request = NULL;
331 crm_debug(
"Asking %s to write all transient attributes for %s to CIB",
334 request = create_attrd_op(NULL);
339 rc = connect_and_send_attrd_request(api, request);
346add_op_attr(xmlNode *op, uint32_t options)
358populate_update_op(xmlNode *op,
const char *node,
const char *
name,
const char *value,
359 const char *dampen,
const char *set, uint32_t options)
373 add_op_attr(op, options);
393 const char *value,
const char *dampen,
const char *set,
394 const char *user_name, uint32_t options)
397 xmlNode *request = NULL;
398 const char *
target = NULL;
410 crm_debug(
"Asking %s to update '%s' to '%s' for %s",
412 pcmk__s(node,
"local node"));
414 request = create_attrd_op(user_name);
415 populate_update_op(request, node,
name, value, dampen, set, options);
417 rc = connect_and_send_attrd_request(api, request);
425 const char *set,
const char *user_name,
429 xmlNode *request = NULL;
457 for (GList *iter = attrs; iter != NULL; iter = iter->next) {
461 const char *
target = NULL;
462 xmlNode *child = NULL;
465 if (request == NULL) {
466 request = create_attrd_op(user_name);
467 add_op_attr(request, options);
482 populate_update_op(child, pair->
node, pair->
name, pair->
value, dampen,
486 dampen, set, user_name, options);
494 rc = connect_and_send_attrd_request(api, request);
const char * pcmk__node_attr_target(const char *name)
@ pcmk__node_attr_pattern
@ pcmk__node_attr_sync_cluster
@ pcmk__node_attr_sync_local
@ pcmk__node_attr_utilization
@ pcmk__node_attr_private
@ pcmk__node_attr_query_all
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
#define PCMK__ATTRD_CMD_UPDATE_BOTH
#define PCMK__ATTRD_CMD_REFRESH
#define PCMK__ATTRD_CMD_CLEAR_FAILURE
#define PCMK__ATTRD_CMD_UPDATE_DELAY
#define PCMK__ATTRD_CMD_QUERY
#define PCMK__ATTRD_CMD_PEER_REMOVE
#define PCMK__ATTRD_CMD_UPDATE
G_GNUC_INTERNAL int pcmk__send_ipc_request(pcmk_ipc_api_t *api, const xmlNode *request)
G_GNUC_INTERNAL void pcmk__call_ipc_callback(pcmk_ipc_api_t *api, enum pcmk_ipc_event event_type, crm_exit_t status, void *event_data)
IPC interface to Pacemaker daemons.
@ pcmk_ipc_event_reply
Daemon's reply to client IPC request.
@ pcmk_ipc_attrd
Attribute manager.
const char * pcmk_ipc_name(const pcmk_ipc_api_t *api, bool for_log)
Get the IPC name used with an IPC API connection.
void pcmk_free_ipc_api(pcmk_ipc_api_t *api)
Free the contents of an IPC API object.
pcmk_ipc_dispatch
How IPC replies should be dispatched.
@ pcmk_ipc_dispatch_sync
Sending a command will wait for any reply.
int pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server)
Create a new object for using Pacemaker daemon IPC.
int pcmk__attrd_api_update(pcmk_ipc_api_t *api, const char *node, const char *name, const char *value, const char *dampen, const char *set, const char *user_name, uint32_t options)
pcmk__ipc_methods_t * pcmk__attrd_api_methods(void)
int pcmk__attrd_api_refresh(pcmk_ipc_api_t *api, const char *node)
int pcmk__attrd_api_update_list(pcmk_ipc_api_t *api, GList *attrs, const char *dampen, const char *set, const char *user_name, uint32_t options)
int pcmk__attrd_api_clear_failures(pcmk_ipc_api_t *api, const char *node, const char *resource, const char *operation, const char *interval_spec, const char *user_name, uint32_t options)
int pcmk__attrd_api_query(pcmk_ipc_api_t *api, const char *node, const char *name, uint32_t options)
int pcmk__attrd_api_purge(pcmk_ipc_api_t *api, const char *node, bool reap)
int pcmk__attrd_api_delete(pcmk_ipc_api_t *api, const char *node, const char *name, uint32_t options)
@ pcmk__attrd_reply_unknown
@ pcmk__attrd_reply_query
int pcmk__connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type, int attempts)
#define crm_info(fmt, args...)
#define crm_debug(fmt, args...)
#define PCMK__VALUE_LOCAL
#define PCMK__VALUE_CLUSTER
#define PCMK__VALUE_ATTRD
@ CRM_EX_PROTOCOL
Protocol violated.
enum crm_exit_e crm_exit_t
Exit status codes for tools and daemons.
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
union pcmk__attrd_api_reply_t::@0 data
enum pcmk__attrd_api_reply reply_type
int(* new_data)(pcmk_ipc_api_t *api)
bool(* reply_expected)(pcmk_ipc_api_t *api, const xmlNode *request)
void(* free_data)(void *api_data)
bool(* dispatch)(pcmk_ipc_api_t *api, xmlNode *msg)
int(* post_connect)(pcmk_ipc_api_t *api)
enum pcmk_ipc_dispatch dispatch_type
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
const char * crm_xml_add_int(xmlNode *node, const char *name, int value)
Create an XML attribute with specified name and integer value.
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_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value)
void pcmk__xml_free(xmlNode *xml)
#define PCMK_XE_UTILIZATION
#define PCMK_XE_INSTANCE_ATTRIBUTES
#define PCMK__XA_ATTR_CLEAR_OPERATION
#define PCMK__XA_ATTR_USER
#define PCMK__XA_ATTR_CLEAR_INTERVAL
#define PCMK__XA_ATTR_REGEX
#define PCMK__XA_ATTR_IS_PRIVATE
#define PCMK__XA_ATTR_SET
#define PCMK__XA_ATTR_RESOURCE
#define PCMK__XA_ATTR_VALUE
#define PCMK__XA_ATTR_SET_TYPE
#define PCMK__XA_ATTR_DAMPENING
#define PCMK__XA_ATTR_NAME
#define PCMK__XA_ATTR_SYNC_POINT
#define PCMK__XA_ATTR_IS_REMOTE
#define PCMK__XA_ATTR_HOST