pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__cib_element_in_patchset_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2024-2025 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
32static void
33assert_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
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
55static void
56null_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
80static void
81create_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
94static void
95delete_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
178static void
179modify_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
223static void
224move_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))
const char * target
Definition pcmk_fence.c:31
#define pcmk__assert_asserts(stmt)
int pcmk__xml_test_teardown_group(void **state)
Definition unittest.c:105
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)
int pcmk__xml_test_setup_group(void **state)
Definition unittest.c:87
Wrappers for and extensions to libxml2.
xmlNode * xml_create_patchset(int format, xmlNode *source, xmlNode *target, bool *config, bool manage_version)
Definition patchset.c:244
bool pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element)
Definition patchset.c:833
void pcmk__xml_doc_set_flags(xmlDoc *doc, uint32_t flags)
Definition xml.c:128
@ pcmk__xf_ignore_attr_pos
Ignore attribute moves within an element (set for document only)
void pcmk__xml_free(xmlNode *xml)
Definition xml.c:816
void pcmk__xml_mark_changes(xmlNode *old_xml, xmlNode *new_xml)
Definition xml.c:1537
xmlNode * pcmk__xml_parse(const char *input)
Definition xml_io.c:167
#define PCMK_XE_CONSTRAINTS
Definition xml_names.h:89
#define PCMK_XE_CIB
Definition xml_names.h:79
#define PCMK_XE_STATUS
Definition xml_names.h:204
#define PCMK_XE_RESOURCES
Definition xml_names.h:179
#define PCMK_XE_ALERTS
Definition xml_names.h:66
#define PCMK_XE_CONFIGURATION
Definition xml_names.h:87
#define PCMK_XE_NODES
Definition xml_names.h:142