This source file includes following definitions.
- pcmk__free_node
- pcmk__free_node_copy
- pcmk_node_is_online
- pcmk_node_is_pending
- pcmk_node_is_clean
- pcmk_node_is_shutting_down
- pcmk_node_is_in_maintenance
- pcmk_foreach_active_resource
- pcmk__find_node_in_list
- pcmk_cib_node_shutdown
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <libxml/tree.h>
13 #include <crm/common/nvpair.h>
14
15
16
17
18
19
20
21 void
22 pcmk__free_node(gpointer user_data)
23 {
24 pcmk_node_t *node = user_data;
25
26 if (node == NULL) {
27 return;
28 }
29 if (node->details == NULL) {
30 free(node);
31 return;
32 }
33
34
35
36
37 crm_trace("Freeing node %s", (pcmk__is_pacemaker_remote_node(node)?
38 "(guest or remote)" : pcmk__node_name(node)));
39
40 if (node->priv->attrs != NULL) {
41 g_hash_table_destroy(node->priv->attrs);
42 }
43 if (node->priv->utilization != NULL) {
44 g_hash_table_destroy(node->priv->utilization);
45 }
46 if (node->priv->digest_cache != NULL) {
47 g_hash_table_destroy(node->priv->digest_cache);
48 }
49 g_list_free(node->details->running_rsc);
50 g_list_free(node->priv->assigned_resources);
51 free(node->priv);
52 free(node->details);
53 free(node->assign);
54 free(node);
55 }
56
57
58
59
60
61
62
63 void
64 pcmk__free_node_copy(void *data)
65 {
66 if (data != NULL) {
67 pcmk_node_t *node = data;
68
69 if (node->assign != NULL) {
70
71 free(node->assign);
72 }
73 free(node);
74 }
75 }
76
77
78
79
80
81
82
83
84
85 bool
86 pcmk_node_is_online(const pcmk_node_t *node)
87 {
88 return (node != NULL) && node->details->online;
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103 bool
104 pcmk_node_is_pending(const pcmk_node_t *node)
105 {
106 return (node != NULL) && node->details->pending;
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 bool
123 pcmk_node_is_clean(const pcmk_node_t *node)
124 {
125 return (node != NULL) && !(node->details->unclean);
126 }
127
128
129
130
131
132
133
134
135
136 bool
137 pcmk_node_is_shutting_down(const pcmk_node_t *node)
138 {
139 return (node != NULL) && node->details->shutdown;
140 }
141
142
143
144
145
146
147
148
149
150 bool
151 pcmk_node_is_in_maintenance(const pcmk_node_t *node)
152 {
153 return (node != NULL) && node->details->maintenance;
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167
168 bool
169 pcmk_foreach_active_resource(pcmk_node_t *node,
170 bool (*fn)(pcmk_resource_t *, void *),
171 void *user_data)
172 {
173 bool result = false;
174
175 if ((node != NULL) && (fn != NULL)) {
176 for (GList *item = node->details->running_rsc; item != NULL;
177 item = item->next) {
178
179 result = fn((pcmk_resource_t *) item->data, user_data);
180 if (!result) {
181 break;
182 }
183 }
184 }
185 return result;
186 }
187
188
189
190
191
192
193
194
195
196
197 pcmk_node_t *
198 pcmk__find_node_in_list(const GList *nodes, const char *node_name)
199 {
200 if (node_name != NULL) {
201 for (const GList *iter = nodes; iter != NULL; iter = iter->next) {
202 pcmk_node_t *node = (pcmk_node_t *) iter->data;
203
204 if (pcmk__str_eq(node->priv->name, node_name, pcmk__str_casei)) {
205 return node;
206 }
207 }
208 }
209 return NULL;
210 }
211
212 #define XP_SHUTDOWN "//" PCMK__XE_NODE_STATE "[@" PCMK_XA_UNAME "='%s']/" \
213 PCMK__XE_TRANSIENT_ATTRIBUTES "/" PCMK_XE_INSTANCE_ATTRIBUTES "/" \
214 PCMK_XE_NVPAIR "[@" PCMK_XA_NAME "='" PCMK__NODE_ATTR_SHUTDOWN "']"
215
216
217
218
219
220
221
222
223
224
225
226
227 const char *
228 pcmk_cib_node_shutdown(xmlNode *cib, const char *node)
229 {
230 if ((cib != NULL) && (node != NULL)) {
231 char *xpath = crm_strdup_printf(XP_SHUTDOWN, node);
232 xmlNode *match = pcmk__xpath_find_one(cib->doc, xpath, LOG_TRACE);
233
234 free(xpath);
235 if (match != NULL) {
236 return crm_element_value(match, PCMK_XA_VALUE);
237 }
238 }
239 return NULL;
240 }