1 /*
2 * Copyright 2022-2024 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9
10 #ifndef PCMK__CRM_COMMON_IPC_ATTRD_INTERNAL__H
11 #define PCMK__CRM_COMMON_IPC_ATTRD_INTERNAL__H
12
13 #include <glib.h> // GList
14 #include <crm/common/ipc.h> // pcmk_ipc_api_t
15
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19
20 //! Possible types of attribute manager replies
21 enum pcmk__attrd_api_reply {
22 pcmk__attrd_reply_unknown,
23 pcmk__attrd_reply_query,
24 };
25
26 // Information passed with pcmk__attrd_reply_query
27 typedef struct {
28 const char *node;
29 const char *name;
30 const char *value;
31 } pcmk__attrd_query_pair_t;
32
33 /*!
34 * Attribute manager reply passed to event callback
35 *
36 * \note The pointers in the reply are only guaranteed to be meaningful for the
37 * execution of the callback; if the values are needed for later, the
38 * callback should copy them.
39 */
40 typedef struct {
41 enum pcmk__attrd_api_reply reply_type;
42
43 union {
44 // pcmk__attrd_reply_query
45 GList *pairs;
46 } data;
47 } pcmk__attrd_api_reply_t;
48
49 /*!
50 * \internal
51 * \brief Send a request to the attribute manager to clear resource failure
52 *
53 * \param[in,out] api Attribute manager IPC object
54 * \param[in] node Affect only this node (or NULL for all nodes)
55 * \param[in] resource Name of resource to clear (or NULL for all)
56 * \param[in] operation Name of operation to clear (or NULL for all)
57 * \param[in] interval_spec If operation is not NULL, its interval
58 * \param[in] user_name ACL user to pass to the attribute manager
59 * \param[in] options Bitmask of pcmk__node_attr_opts
60 *
61 * \note If \p api is NULL, a new temporary connection will be created
62 * just for this operation and destroyed afterwards. If \p api is
63 * not NULL but is not yet connected to the attribute manager, the object
64 * will be connected for this operation and left connected afterwards.
65 * This allows for reusing an IPC connection.
66 *
67 * \return Standard Pacemaker return code
68 */
69 int pcmk__attrd_api_clear_failures(pcmk_ipc_api_t *api, const char *node,
70 const char *resource, const char *operation,
71 const char *interval_spec, const char *user_name,
72 uint32_t options);
73
74 /*!
75 * \internal
76 *
77 * \brief Delete a previously set attribute by setting its value to NULL
78 *
79 * \param[in,out] api Connection to the attribute manager (or NULL to use
80 * a temporary new connection)
81 * \param[in] node Delete attribute for this node (or NULL for local)
82 * \param[in] name Attribute name
83 * \param[in] options Bitmask of pcmk__node_attr_opts
84 *
85 * \return Standard Pacemaker return code
86 */
87 int pcmk__attrd_api_delete(pcmk_ipc_api_t *api, const char *node, const char *name,
88 uint32_t options);
89
90 /*!
91 * \internal
92 * \brief Request removal of a node's transient attributes
93 *
94 * \param[in,out] api Attribute manager IPC object
95 * \param[in] node Node whose attributes should be purged
96 * \param[in] reap If true, also request removal from node caches
97 *
98 * \note If \p api is NULL, a new temporary connection will be created
99 * just for this operation and destroyed afterwards. If \p api is
100 * not NULL but is not yet connected to the attribute manager, the object
101 * will be connected for this operation and left connected afterwards.
102 * This allows for reusing an IPC connection.
103 *
104 * \return Standard Pacemaker return code
105 */
106 int pcmk__attrd_api_purge(pcmk_ipc_api_t *api, const char *node, bool reap);
107
108 /*!
109 * \internal
110 * \brief Get the value of an attribute from the attribute manager
111 *
112 * \param[in,out] api Connection to the attribute manager
113 * \param[in] node Look up the attribute for this node
114 * (or NULL for the local node)
115 * \param[in] name Attribute name
116 * \param[in] options Bitmask of pcmk__node_attr_opts
117 *
118 * \note Passing pcmk__node_attr_query_all will cause the function to query
119 * the value of \p name on all nodes, regardless of the value of \p node.
120 *
121 * \return Standard Pacemaker return code
122 */
123 int pcmk__attrd_api_query(pcmk_ipc_api_t *api, const char *node, const char *name,
124 uint32_t options);
125
126 /*!
127 * \internal
128 * \brief Tell the attribute manager to update the CIB with current values
129 *
130 * \param[in,out] api Attribute manager IPC object
131 * \param[in] node Affect only this node (or NULL for all nodes)
132 *
133 * \note If \p api is NULL, a new temporary connection will be created
134 * just for this operation and destroyed afterwards. If \p api is
135 * not NULL but is not yet connected to the attribute manager, the object
136 * will be connected for this operation and left connected afterwards.
137 * This allows for reusing an IPC connection.
138 *
139 * \return Standard Pacemaker return code
140 */
141 int pcmk__attrd_api_refresh(pcmk_ipc_api_t *api, const char *node);
142
143 /*!
144 * \internal
145 * \brief Update an attribute's value, time to wait, or both
146 *
147 * \param[in,out] api Attribute manager IPC object
148 * \param[in] node Affect only this node (or NULL for current node)
149 * \param[in] name Attribute name
150 * \param[in] value The attribute's new value, or NULL to unset
151 * \param[in] dampen The new time to wait value, or NULL to unset
152 * \param[in] set ID of attribute set to use (or NULL for first)
153 * \param[in] user_name ACL user to pass to the attribute manager
154 * \param[in] options Bitmask of pcmk__node_attr_opts
155 *
156 * \note If \p api is NULL, a new temporary connection will be created
157 * just for this operation and destroyed afterwards. If \p api is
158 * not NULL but is not yet connected to the attribute manager, the object
159 * will be connected for this operation and left connected afterwards.
160 * This allows for reusing an IPC connection.
161 *
162 * \return Standard Pacemaker return code
163 */
164 int pcmk__attrd_api_update(pcmk_ipc_api_t *api, const char *node, const char *name,
165 const char *value, const char *dampen, const char *set,
166 const char *user_name, uint32_t options);
167
168 /*!
169 * \internal
170 * \brief Like pcmk__attrd_api_update, but for multiple attributes at once
171 *
172 * \param[in,out] api Attribute manager IPC object
173 * \param[in,out] attrs A list of pcmk__attr_query_pair_t structs
174 * \param[in] dampen The new time to wait value, or NULL to unset
175 * \param[in] set ID of attribute set to use (or NULL for first)
176 * \param[in] user_name ACL user to pass to the attribute manager
177 * \param[in] options Bitmask of pcmk__node_attr_opts
178 *
179 * \note If \p api is NULL, a new temporary connection will be created
180 * just for this operation and destroyed afterwards. If \p api is
181 * not NULL but is not yet connected to the attribute manager, the object
182 * will be connected for this operation and left connected afterwards.
183 * This allows for reusing an IPC connection.
184 *
185 * \note Not all attrd versions support setting multiple attributes at once.
186 * For those servers that do not, this function will fall back to just
187 * sending a separate IPC request for each attribute.
188 *
189 * \return Standard Pacemaker return code
190 */
191 int pcmk__attrd_api_update_list(pcmk_ipc_api_t *api, GList *attrs,
192 const char *dampen, const char *set,
193 const char *user_name, uint32_t options);
194
195 #ifdef __cplusplus
196 }
197 #endif
198
199 #endif // PCMK__CRM_COMMON_IPC_ATTRD_INTERNAL__H