pacemaker  3.0.0-d8340737c4
Scalable High-Availability cluster resource manager
pcmk__cib_element_in_patchset_test.c
Go to the documentation of this file.
1 /*
2  * Copyright 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 General Public License version 2
7  * or later (GPLv2+) WITHOUT ANY WARRANTY.
8  */
9 
10 #include <crm_internal.h>
11 
13 #include <crm/common/xml.h>
15 
16 #define ORIG_CIB \
17  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
18  " " PCMK_XA_EPOCH "=\"0\"" \
19  " " PCMK_XA_NUM_UPDATES "=\"0\">" \
20  "<" PCMK_XE_CONFIGURATION ">" \
21  "<" PCMK_XE_CRM_CONFIG "/>" \
22  "<" PCMK_XE_NODES ">" \
23  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
24  " " PCMK_XA_UNAME "=\"node-1\"/>" \
25  "</" PCMK_XE_NODES ">" \
26  "<" PCMK_XE_RESOURCES "/>" \
27  "<" PCMK_XE_CONSTRAINTS "/>" \
28  "</" PCMK_XE_CONFIGURATION ">" \
29  "<" PCMK_XE_STATUS "/>" \
30  "</" PCMK_XE_CIB ">"
31 
32 static void
33 assert_in_patchset(const char *source_s, const char *target_s,
34  const char *element, bool reference)
35 {
36  xmlNode *source = pcmk__xml_parse(source_s);
37  xmlNode *target = pcmk__xml_parse(target_s);
38  xmlNode *patchset = NULL;
39 
40  xml_track_changes(target, NULL, NULL, false);
42  patchset = xml_create_patchset(2, source, target, NULL, false);
43 
44  if (reference) {
45  assert_true(pcmk__cib_element_in_patchset(patchset, element));
46  } else {
47  assert_false(pcmk__cib_element_in_patchset(patchset, element));
48  }
49 
50  pcmk__xml_free(source);
52  pcmk__xml_free(patchset);
53 }
54 
55 static void
56 null_patchset_asserts(void **state)
57 {
60 }
61 
62 // PCMK_XE_ALERTS element has been created relative to ORIG_CIB
63 #define CREATE_CIB \
64  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
65  " " PCMK_XA_EPOCH "=\"0\"" \
66  " " PCMK_XA_NUM_UPDATES "=\"0\">" \
67  "<" PCMK_XE_CONFIGURATION ">" \
68  "<" PCMK_XE_CRM_CONFIG "/>" \
69  "<" PCMK_XE_NODES ">" \
70  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
71  " " PCMK_XA_UNAME "=\"node-1\"/>" \
72  "</" PCMK_XE_NODES ">" \
73  "<" PCMK_XE_RESOURCES "/>" \
74  "<" PCMK_XE_CONSTRAINTS "/>" \
75  "<" PCMK_XE_ALERTS "/>" \
76  "</" PCMK_XE_CONFIGURATION ">" \
77  "<" PCMK_XE_STATUS "/>" \
78  "</" PCMK_XE_CIB ">"
79 
80 static void
81 create_op(void **state)
82 {
83  // Requested element was created
84  assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_ALERTS, true);
85 
86  // Requested element's descendant was created
87  assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_CONFIGURATION, true);
88  assert_in_patchset(ORIG_CIB, CREATE_CIB, NULL, true);
89 
90  // Requested element was not changed
91  assert_in_patchset(ORIG_CIB, CREATE_CIB, PCMK_XE_STATUS, false);
92 }
93 
94 static void
95 delete_op(void **state)
96 {
97  // Requested element was deleted
98  assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_ALERTS, true);
99 
100  // Requested element's descendant was deleted
101  assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_CONFIGURATION, true);
102  assert_in_patchset(CREATE_CIB, ORIG_CIB, NULL, true);
103 
104  // Requested element was not changed
105  assert_in_patchset(CREATE_CIB, ORIG_CIB, PCMK_XE_STATUS, false);
106 }
107 
108 // PCMK_XE_CIB XML attribute was added relative to ORIG_CIB
109 #define MODIFY_ADD_CIB \
110  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
111  " " PCMK_XA_EPOCH "=\"0\"" \
112  " " PCMK_XA_NUM_UPDATES "=\"0\"" \
113  " " PCMK_XA_CRM_FEATURE_SET "=\"3.19.7\">" \
114  "<" PCMK_XE_CONFIGURATION ">" \
115  "<" PCMK_XE_CRM_CONFIG "/>" \
116  "<" PCMK_XE_NODES ">" \
117  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
118  " " PCMK_XA_UNAME "=\"node-1\"/>" \
119  "</" PCMK_XE_NODES ">" \
120  "<" PCMK_XE_RESOURCES "/>" \
121  "<" PCMK_XE_CONSTRAINTS "/>" \
122  "</" PCMK_XE_CONFIGURATION ">" \
123  "<" PCMK_XE_STATUS "/>" \
124  "</" PCMK_XE_CIB ">"
125 
126 // PCMK_XE_CIB XML attribute was updated relative to ORIG_CIB
127 #define MODIFY_UPDATE_CIB \
128  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
129  " " PCMK_XA_EPOCH "=\"0\"" \
130  " " PCMK_XA_NUM_UPDATES "=\"1\">" \
131  "<" PCMK_XE_CONFIGURATION ">" \
132  "<" PCMK_XE_CRM_CONFIG "/>" \
133  "<" PCMK_XE_NODES ">" \
134  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
135  " " PCMK_XA_UNAME "=\"node-1\"/>" \
136  "</" PCMK_XE_NODES ">" \
137  "<" PCMK_XE_RESOURCES "/>" \
138  "<" PCMK_XE_CONSTRAINTS "/>" \
139  "</" PCMK_XE_CONFIGURATION ">" \
140  "<" PCMK_XE_STATUS "/>" \
141  "</" PCMK_XE_CIB ">"
142 
143 // PCMK_XE_NODE XML attribute was added relative to ORIG_CIB
144 #define MODIFY_ADD_NODE_CIB \
145  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
146  " " PCMK_XA_EPOCH "=\"0\"" \
147  " " PCMK_XA_NUM_UPDATES "=\"0\">" \
148  "<" PCMK_XE_CONFIGURATION ">" \
149  "<" PCMK_XE_CRM_CONFIG "/>" \
150  "<" PCMK_XE_NODES ">" \
151  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
152  " " PCMK_XA_UNAME "=\"node-1\"" \
153  " " PCMK_XA_TYPE "=\"member\"/>" \
154  "</" PCMK_XE_NODES ">" \
155  "<" PCMK_XE_RESOURCES "/>" \
156  "<" PCMK_XE_CONSTRAINTS "/>" \
157  "</" PCMK_XE_CONFIGURATION ">" \
158  "<" PCMK_XE_STATUS "/>" \
159  "</" PCMK_XE_CIB ">"
160 
161 // PCMK_XE_NODE XML attribute was updated relative to ORIG_CIB
162 #define MODIFY_UPDATE_NODE_CIB \
163  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
164  " " PCMK_XA_EPOCH "=\"0\"" \
165  " " PCMK_XA_NUM_UPDATES "=\"0\">" \
166  "<" PCMK_XE_CONFIGURATION ">" \
167  "<" PCMK_XE_CRM_CONFIG "/>" \
168  "<" PCMK_XE_NODES ">" \
169  "<" PCMK_XE_NODE " " PCMK_XA_ID "=\"1\"" \
170  " " PCMK_XA_UNAME "=\"node-2\"/>" \
171  "</" PCMK_XE_NODES ">" \
172  "<" PCMK_XE_RESOURCES "/>" \
173  "<" PCMK_XE_CONSTRAINTS "/>" \
174  "</" PCMK_XE_CONFIGURATION ">" \
175  "<" PCMK_XE_STATUS "/>" \
176  "</" PCMK_XE_CIB ">"
177 
178 static void
179 modify_op(void **state)
180 {
181  // Requested element was modified (attribute added)
182  assert_in_patchset(ORIG_CIB, MODIFY_ADD_CIB, PCMK_XE_CIB, true);
183 
184  // Requested element was modified (attribute updated)
185  assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_CIB, PCMK_XE_CIB, true);
186 
187  // Requested element was modified (attribute deleted)
188  assert_in_patchset(MODIFY_ADD_CIB, ORIG_CIB, PCMK_XE_CIB, true);
189 
190  // Requested element's descendant was modified (attribute added)
191  assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, PCMK_XE_CIB, true);
192  assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, NULL, true);
193 
194  // Requested element's descendant was modified (attribute updated)
195  assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, PCMK_XE_CIB, true);
196  assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, NULL, true);
197 
198  // Requested element's descenant was modified (attribute deleted)
199  assert_in_patchset(MODIFY_ADD_NODE_CIB, ORIG_CIB, PCMK_XE_CIB, true);
200  assert_in_patchset(MODIFY_ADD_NODE_CIB, ORIG_CIB, NULL, true);
201 
202  // Requested element was not changed
203  assert_in_patchset(ORIG_CIB, MODIFY_ADD_CIB, PCMK_XE_STATUS, false);
204  assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_CIB, PCMK_XE_STATUS, false);
205  assert_in_patchset(ORIG_CIB, MODIFY_ADD_NODE_CIB, PCMK_XE_STATUS, false);
206  assert_in_patchset(ORIG_CIB, MODIFY_UPDATE_NODE_CIB, PCMK_XE_STATUS, false);
207 }
208 
209 // PCMK_XE_RESOURCES and PCMK_XE_CONSTRAINTS are swapped relative to ORIG_CIB
210 #define MOVE_CIB \
211  "<" PCMK_XE_CIB " " PCMK_XA_ADMIN_EPOCH "=\"0\"" \
212  " " PCMK_XA_EPOCH "=\"0\"" \
213  " " PCMK_XA_NUM_UPDATES "=\"0\">" \
214  "<" PCMK_XE_CONFIGURATION ">" \
215  "<" PCMK_XE_CRM_CONFIG "/>" \
216  "<" PCMK_XE_NODES "/>" \
217  "<" PCMK_XE_CONSTRAINTS "/>" \
218  "<" PCMK_XE_RESOURCES "/>" \
219  "</" PCMK_XE_CONFIGURATION ">" \
220  "<" PCMK_XE_STATUS "/>" \
221  "</" PCMK_XE_CIB ">"
222 
223 static void
224 move_op(void **state)
225 {
226  // Requested element was moved
227  assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_RESOURCES, true);
228  assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_CONSTRAINTS, true);
229 
230  // Requested element's descendant was moved
231  assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_CONFIGURATION, true);
232  assert_in_patchset(ORIG_CIB, MOVE_CIB, NULL, true);
233 
234  // Requested element was not changed
235  assert_in_patchset(ORIG_CIB, MOVE_CIB, PCMK_XE_STATUS, false);
236 }
237 
239  cmocka_unit_test(null_patchset_asserts),
240  cmocka_unit_test(create_op),
241  cmocka_unit_test(delete_op),
242  cmocka_unit_test(modify_op),
243  cmocka_unit_test(move_op))
#define PCMK_XE_CIB
Definition: xml_names.h:79
#define PCMK_XE_STATUS
Definition: xml_names.h:204
#define PCMK_XE_CONSTRAINTS
Definition: xml_names.h:89
#define PCMK_XE_ALERTS
Definition: xml_names.h:66
void xml_track_changes(xmlNode *xml, const char *user, xmlNode *acl_source, bool enforce_acls)
Definition: xml.c:346
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
void pcmk__xml_free(xmlNode *xml)
Definition: xml.c:789
int pcmk__xml_test_setup_group(void **state)
Definition: unittest.c:85
Wrappers for and extensions to libxml2.
#define pcmk__assert_asserts(stmt)
#define PCMK_XE_CONFIGURATION
Definition: xml_names.h:87
int pcmk__xml_test_teardown_group(void **state)
Definition: unittest.c:104
xmlNode * pcmk__xml_parse(const char *input)
Definition: xml_io.c:168
const char * target
Definition: pcmk_fence.c:31
#define MODIFY_UPDATE_NODE_CIB
#define PCMK_XE_NODES
Definition: xml_names.h:142
bool pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element)
Definition: patchset.c:827
void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml)
Definition: xml.c:1399
xmlNode * xml_create_patchset(int format, xmlNode *source, xmlNode *target, bool *config, bool manage_version)
Definition: patchset.c:243
#define PCMK_XE_RESOURCES
Definition: xml_names.h:179