pacemaker 2.1.6-6fdc9deea29
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
remote.c
Go to the documentation of this file.
1/*
2 * Copyright 2013-2022 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#include <crm_internal.h>
11#include <crm/msg_xml.h>
12#include <crm/common/xml.h>
14#include <glib.h>
15
16bool
19{
20 return (rsc != NULL) && rsc->is_remote_node
22}
23
24bool
26{
27 return (node != NULL) && (node->details->type == node_remote)
28 && ((node->details->remote_rsc == NULL)
29 || (node->details->remote_rsc->container == NULL));
30}
31
32bool
34{
35 return (node != NULL) && (node->details->type == node_remote)
36 && (node->details->remote_rsc != NULL)
37 && (node->details->remote_rsc->container != NULL);
38}
39
40bool
42{
43 return (node != NULL) && (node->details->type == node_remote);
44}
45
46bool
48{
49 return pe__is_guest_node(node)
50 && pe_rsc_is_bundled(node->details->remote_rsc);
51}
52
67 const pe_resource_t *rsc)
68{
69 if ((rsc != NULL) && (data_set != NULL)
71
72 for (GList *gIter = rsc->fillers; gIter != NULL; gIter = gIter->next) {
73 pe_resource_t *filler = gIter->data;
74
75 if (filler->is_remote_node) {
76 return filler;
77 }
78 }
79 }
80 return NULL;
81}
82
83bool
85{
86 const char *value = NULL;
87
88 if (xml == NULL) {
89 return false;
90 }
91
92 value = crm_element_value(xml, XML_ATTR_TYPE);
93 if (!pcmk__str_eq(value, "remote", pcmk__str_casei)) {
94 return false;
95 }
96
98 if (!pcmk__str_eq(value, PCMK_RESOURCE_CLASS_OCF, pcmk__str_casei)) {
99 return false;
100 }
101
103 if (!pcmk__str_eq(value, "pacemaker", pcmk__str_casei)) {
104 return false;
105 }
106
107 return true;
108}
109
119void
121 void (*helper)(const pe_node_t*, void*), void *user_data)
122{
123 GList *iter;
124
125 CRM_CHECK(data_set && host && host->details && helper, return);
127 return;
128 }
129 for (iter = host->details->running_rsc; iter != NULL; iter = iter->next) {
130 pe_resource_t *rsc = (pe_resource_t *) iter->data;
131
132 if (rsc->is_remote_node && (rsc->container != NULL)) {
133 pe_node_t *guest_node = pe_find_node(data_set->nodes, rsc->id);
134
135 if (guest_node) {
136 (*helper)(guest_node, user_data);
137 }
138 }
139 }
140}
141
157xmlNode *
158pe_create_remote_xml(xmlNode *parent, const char *uname,
159 const char *container_id, const char *migrateable,
160 const char *is_managed, const char *start_timeout,
161 const char *server, const char *port)
162{
163 xmlNode *remote;
164 xmlNode *xml_sub;
165
167
168 // Add identity
169 crm_xml_add(remote, XML_ATTR_ID, uname);
171 crm_xml_add(remote, XML_AGENT_ATTR_PROVIDER, "pacemaker");
172 crm_xml_add(remote, XML_ATTR_TYPE, "remote");
173
174 // Add meta-attributes
175 xml_sub = create_xml_node(remote, XML_TAG_META_SETS);
176 crm_xml_set_id(xml_sub, "%s-%s", uname, XML_TAG_META_SETS);
177 crm_create_nvpair_xml(xml_sub, NULL,
179 if (container_id) {
180 crm_create_nvpair_xml(xml_sub, NULL,
181 XML_RSC_ATTR_CONTAINER, container_id);
182 }
183 if (migrateable) {
184 crm_create_nvpair_xml(xml_sub, NULL,
185 XML_OP_ATTR_ALLOW_MIGRATE, migrateable);
186 }
187 if (is_managed) {
188 crm_create_nvpair_xml(xml_sub, NULL, XML_RSC_ATTR_MANAGED, is_managed);
189 }
190
191 // Add instance attributes
192 if (port || server) {
193 xml_sub = create_xml_node(remote, XML_TAG_ATTR_SETS);
194 crm_xml_set_id(xml_sub, "%s-%s", uname, XML_TAG_ATTR_SETS);
195 if (server) {
197 server);
198 }
199 if (port) {
200 crm_create_nvpair_xml(xml_sub, NULL, "port", port);
201 }
202 }
203
204 // Add operations
205 xml_sub = create_xml_node(remote, "operations");
206 crm_create_op_xml(xml_sub, uname, "monitor", "30s", "30s");
207 if (start_timeout) {
208 crm_create_op_xml(xml_sub, uname, "start", "0", start_timeout);
209 }
210 return remote;
211}
212
213// History entry to be checked for fail count clearing
214struct check_op {
215 const xmlNode *rsc_op; // History entry XML
216 pe_resource_t *rsc; // Known resource corresponding to history entry
217 pe_node_t *node; // Known node corresponding to history entry
218 enum pe_check_parameters check_type; // What needs checking
219};
220
221void
222pe__add_param_check(const xmlNode *rsc_op, pe_resource_t *rsc,
223 pe_node_t *node, enum pe_check_parameters flag,
225{
226 struct check_op *check_op = NULL;
227
228 CRM_CHECK(data_set && rsc_op && rsc && node, return);
229
230 check_op = calloc(1, sizeof(struct check_op));
231 CRM_ASSERT(check_op != NULL);
232
233 crm_trace("Deferring checks of %s until after allocation", ID(rsc_op));
234 check_op->rsc_op = rsc_op;
235 check_op->rsc = rsc;
236 check_op->node = node;
237 check_op->check_type = flag;
238 data_set->param_check = g_list_prepend(data_set->param_check, check_op);
239}
240
248void
250 void (*cb)(pe_resource_t*, pe_node_t*, const xmlNode*,
252{
253 CRM_CHECK(data_set && cb, return);
254
255 for (GList *item = data_set->param_check; item != NULL; item = item->next) {
256 struct check_op *check_op = item->data;
257
258 cb(check_op->rsc, check_op->node, check_op->rsc_op,
259 check_op->check_type);
260 }
261}
262
263void
265{
266 if (data_set && data_set->param_check) {
267 g_list_free_full(data_set->param_check, free);
268 data_set->param_check = NULL;
269 }
270}
#define PCMK_RESOURCE_CLASS_OCF
Definition agents.h:27
const char * parent
Definition cib.c:25
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.
Definition operations.c:428
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
Definition util.h:121
pcmk__cpg_host_t host
Definition cpg.c:4
char uname[MAX_NAME]
Definition cpg.c:5
#define CRM_CHECK(expr, failure_action)
Definition logging.h:235
#define crm_trace(fmt, args...)
Definition logging.h:381
#define ID(x)
Definition msg_xml.h:480
#define XML_BOOLEAN_TRUE
Definition msg_xml.h:159
#define XML_RSC_ATTR_MANAGED
Definition msg_xml.h:248
#define XML_RSC_ATTR_CONTAINER
Definition msg_xml.h:257
#define XML_TAG_ATTR_SETS
Definition msg_xml.h:222
#define XML_ATTR_ID
Definition msg_xml.h:147
#define XML_OP_ATTR_ALLOW_MIGRATE
Definition msg_xml.h:272
#define XML_AGENT_ATTR_PROVIDER
Definition msg_xml.h:283
#define XML_AGENT_ATTR_CLASS
Definition msg_xml.h:282
#define XML_TAG_META_SETS
Definition msg_xml.h:223
#define XML_ATTR_TYPE
Definition msg_xml.h:151
#define XML_RSC_ATTR_INTERNAL_RSC
Definition msg_xml.h:258
#define XML_RSC_ATTR_REMOTE_RA_ADDR
Definition msg_xml.h:263
#define XML_CIB_TAG_RESOURCE
Definition msg_xml.h:230
pe_working_set_t * data_set
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
Definition nvpair.c:496
xmlNode * crm_create_nvpair_xml(xmlNode *parent, const char *id, const char *name, const char *value)
Create an XML name/value pair.
Definition nvpair.c:812
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
Definition nvpair.c:302
pe_check_parameters
Definition pe_types.h:218
@ node_remote
Definition pe_types.h:90
#define pe_flag_have_remote_nodes
Definition pe_types.h:134
bool pe__is_bundle_node(const pe_node_t *node)
Definition remote.c:47
void pe__add_param_check(const xmlNode *rsc_op, pe_resource_t *rsc, pe_node_t *node, enum pe_check_parameters flag, pe_working_set_t *data_set)
Definition remote.c:222
bool pe__is_guest_node(const pe_node_t *node)
Definition remote.c:33
void pe__free_param_checks(pe_working_set_t *data_set)
Definition remote.c:264
bool xml_contains_remote_node(xmlNode *xml)
Definition remote.c:84
pe_resource_t * pe__resource_contains_guest_node(const pe_working_set_t *data_set, const pe_resource_t *rsc)
Definition remote.c:66
bool pe__resource_is_remote_conn(const pe_resource_t *rsc, const pe_working_set_t *data_set)
Definition remote.c:17
bool pe__is_guest_or_remote_node(const pe_node_t *node)
Definition remote.c:41
xmlNode * pe_create_remote_xml(xmlNode *parent, const char *uname, const char *container_id, const char *migrateable, const char *is_managed, const char *start_timeout, const char *server, const char *port)
Definition remote.c:158
bool pe__is_remote_node(const pe_node_t *node)
Definition remote.c:25
void pe_foreach_guest_node(const pe_working_set_t *data_set, const pe_node_t *host, void(*helper)(const pe_node_t *, void *), void *user_data)
Definition remote.c:120
void pe__foreach_param_check(pe_working_set_t *data_set, void(*cb)(pe_resource_t *, pe_node_t *, const xmlNode *, enum pe_check_parameters))
Definition remote.c:249
#define CRM_ASSERT(expr)
Definition results.h:42
pe_node_t * pe_find_node(const GList *node_list, const char *node_name)
Find a node by name in a list of nodes.
Definition status.c:473
@ pcmk__str_casei
struct pe_node_shared_s * details
Definition pe_types.h:268
pe_resource_t * remote_rsc
Definition pe_types.h:253
enum node_type type
Definition pe_types.h:233
pe_resource_t * container
Definition pe_types.h:412
gboolean is_remote_node
Definition pe_types.h:376
GList * fillers
Definition pe_types.h:413
GList * param_check
Definition pe_types.h:208
unsigned long long flags
Definition pe_types.h:169
Wrappers for and extensions to libxml2.
void crm_xml_set_id(xmlNode *xml, const char *format,...) G_GNUC_PRINTF(2
xmlNode * create_xml_node(xmlNode *parent, const char *name)
Definition xml.c:677