]>
Commit | Line | Data |
---|---|---|
1911f103 TL |
1 | import json |
2 | ||
3 | import pytest | |
4 | ||
e306af50 TL |
5 | from ceph.deployment.service_spec import ServiceSpec, NFSServiceSpec, RGWSpec, \ |
6 | ServiceSpecValidationError, IscsiServiceSpec, PlacementSpec | |
7 | ||
1911f103 TL |
8 | from orchestrator import DaemonDescription, OrchestratorError |
9 | ||
10 | ||
11 | def test_spec_octopus(): | |
12 | # https://tracker.ceph.com/issues/44934 | |
13 | # Those are real user data from early octopus. | |
14 | # Please do not modify those JSON values. | |
15 | specs_text = """[ | |
16 | { | |
17 | "placement": { | |
18 | "count": 1 | |
19 | }, | |
20 | "service_type": "alertmanager" | |
21 | }, | |
22 | { | |
23 | "placement": { | |
24 | "host_pattern": "*" | |
25 | }, | |
26 | "service_type": "crash" | |
27 | }, | |
28 | { | |
29 | "placement": { | |
30 | "count": 1 | |
31 | }, | |
32 | "service_type": "grafana" | |
33 | }, | |
34 | { | |
35 | "placement": { | |
36 | "count": 2 | |
37 | }, | |
38 | "service_type": "mgr" | |
39 | }, | |
40 | { | |
41 | "placement": { | |
42 | "count": 5 | |
43 | }, | |
44 | "service_type": "mon" | |
45 | }, | |
46 | { | |
47 | "placement": { | |
48 | "host_pattern": "*" | |
49 | }, | |
50 | "service_type": "node-exporter" | |
51 | }, | |
52 | { | |
53 | "placement": { | |
54 | "count": 1 | |
55 | }, | |
56 | "service_type": "prometheus" | |
57 | }, | |
58 | { | |
59 | "placement": { | |
60 | "hosts": [ | |
61 | { | |
62 | "hostname": "ceph-001", | |
63 | "network": "", | |
64 | "name": "" | |
65 | } | |
66 | ] | |
67 | }, | |
68 | "service_type": "rgw", | |
69 | "service_id": "default-rgw-realm.eu-central-1.1", | |
70 | "rgw_realm": "default-rgw-realm", | |
71 | "rgw_zone": "eu-central-1", | |
72 | "subcluster": "1" | |
73 | } | |
74 | ] | |
75 | """ | |
76 | dds_text = """[ | |
77 | { | |
78 | "hostname": "ceph-001", | |
79 | "container_id": "d94d7969094d", | |
80 | "container_image_id": "0881eb8f169f5556a292b4e2c01d683172b12830a62a9225a98a8e206bb734f0", | |
81 | "container_image_name": "docker.io/prom/alertmanager:latest", | |
82 | "daemon_id": "ceph-001", | |
83 | "daemon_type": "alertmanager", | |
84 | "version": "0.20.0", | |
85 | "status": 1, | |
86 | "status_desc": "running", | |
87 | "last_refresh": "2020-04-03T15:31:48.725856", | |
88 | "created": "2020-04-02T19:23:08.829543", | |
89 | "started": "2020-04-03T07:29:16.932838" | |
90 | }, | |
91 | { | |
92 | "hostname": "ceph-001", | |
93 | "container_id": "c4b036202241", | |
94 | "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1", | |
95 | "container_image_name": "docker.io/ceph/ceph:v15", | |
96 | "daemon_id": "ceph-001", | |
97 | "daemon_type": "crash", | |
98 | "version": "15.2.0", | |
99 | "status": 1, | |
100 | "status_desc": "running", | |
101 | "last_refresh": "2020-04-03T15:31:48.725903", | |
102 | "created": "2020-04-02T19:23:11.390694", | |
103 | "started": "2020-04-03T07:29:16.910897" | |
104 | }, | |
105 | { | |
106 | "hostname": "ceph-001", | |
107 | "container_id": "5b7b94b48f31", | |
108 | "container_image_id": "87a51ecf0b1c9a7b187b21c1b071425dafea0d765a96d5bc371c791169b3d7f4", | |
109 | "container_image_name": "docker.io/ceph/ceph-grafana:latest", | |
110 | "daemon_id": "ceph-001", | |
111 | "daemon_type": "grafana", | |
112 | "version": "6.6.2", | |
113 | "status": 1, | |
114 | "status_desc": "running", | |
115 | "last_refresh": "2020-04-03T15:31:48.725950", | |
116 | "created": "2020-04-02T19:23:52.025088", | |
117 | "started": "2020-04-03T07:29:16.847972" | |
118 | }, | |
119 | { | |
120 | "hostname": "ceph-001", | |
121 | "container_id": "9ca007280456", | |
122 | "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1", | |
123 | "container_image_name": "docker.io/ceph/ceph:v15", | |
124 | "daemon_id": "ceph-001.gkjwqp", | |
125 | "daemon_type": "mgr", | |
126 | "version": "15.2.0", | |
127 | "status": 1, | |
128 | "status_desc": "running", | |
129 | "last_refresh": "2020-04-03T15:31:48.725807", | |
130 | "created": "2020-04-02T19:22:18.648584", | |
131 | "started": "2020-04-03T07:29:16.856153" | |
132 | }, | |
133 | { | |
134 | "hostname": "ceph-001", | |
135 | "container_id": "3d1ba9a2b697", | |
136 | "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1", | |
137 | "container_image_name": "docker.io/ceph/ceph:v15", | |
138 | "daemon_id": "ceph-001", | |
139 | "daemon_type": "mon", | |
140 | "version": "15.2.0", | |
141 | "status": 1, | |
142 | "status_desc": "running", | |
143 | "last_refresh": "2020-04-03T15:31:48.725715", | |
144 | "created": "2020-04-02T19:22:13.863300", | |
145 | "started": "2020-04-03T07:29:17.206024" | |
146 | }, | |
147 | { | |
148 | "hostname": "ceph-001", | |
149 | "container_id": "36d026c68ba1", | |
150 | "container_image_id": "e5a616e4b9cf68dfcad7782b78e118be4310022e874d52da85c55923fb615f87", | |
151 | "container_image_name": "docker.io/prom/node-exporter:latest", | |
152 | "daemon_id": "ceph-001", | |
153 | "daemon_type": "node-exporter", | |
154 | "version": "0.18.1", | |
155 | "status": 1, | |
156 | "status_desc": "running", | |
157 | "last_refresh": "2020-04-03T15:31:48.725996", | |
158 | "created": "2020-04-02T19:23:53.880197", | |
159 | "started": "2020-04-03T07:29:16.880044" | |
160 | }, | |
161 | { | |
162 | "hostname": "ceph-001", | |
163 | "container_id": "faf76193cbfe", | |
164 | "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1", | |
165 | "container_image_name": "docker.io/ceph/ceph:v15", | |
166 | "daemon_id": "0", | |
167 | "daemon_type": "osd", | |
168 | "version": "15.2.0", | |
169 | "status": 1, | |
170 | "status_desc": "running", | |
171 | "last_refresh": "2020-04-03T15:31:48.726088", | |
172 | "created": "2020-04-02T20:35:02.991435", | |
173 | "started": "2020-04-03T07:29:19.373956" | |
174 | }, | |
175 | { | |
176 | "hostname": "ceph-001", | |
177 | "container_id": "f82505bae0f1", | |
178 | "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1", | |
179 | "container_image_name": "docker.io/ceph/ceph:v15", | |
180 | "daemon_id": "1", | |
181 | "daemon_type": "osd", | |
182 | "version": "15.2.0", | |
183 | "status": 1, | |
184 | "status_desc": "running", | |
185 | "last_refresh": "2020-04-03T15:31:48.726134", | |
186 | "created": "2020-04-02T20:35:17.142272", | |
187 | "started": "2020-04-03T07:29:19.374002" | |
188 | }, | |
189 | { | |
190 | "hostname": "ceph-001", | |
191 | "container_id": "2708d84cd484", | |
192 | "container_image_id": "358a0d2395fe711bb8258e8fb4b2d7865c0a9a6463969bcd1452ee8869ea6653", | |
193 | "container_image_name": "docker.io/prom/prometheus:latest", | |
194 | "daemon_id": "ceph-001", | |
195 | "daemon_type": "prometheus", | |
196 | "version": "2.17.1", | |
197 | "status": 1, | |
198 | "status_desc": "running", | |
199 | "last_refresh": "2020-04-03T15:31:48.726042", | |
200 | "created": "2020-04-02T19:24:10.281163", | |
201 | "started": "2020-04-03T07:29:16.926292" | |
202 | }, | |
203 | { | |
204 | "hostname": "ceph-001", | |
205 | "daemon_id": "default-rgw-realm.eu-central-1.1.ceph-001.ytywjo", | |
206 | "daemon_type": "rgw", | |
207 | "status": 1, | |
208 | "status_desc": "starting" | |
209 | } | |
210 | ]""" | |
211 | specs_json = json.loads(specs_text) | |
212 | dds_json = json.loads(dds_text) | |
213 | specs = [ServiceSpec.from_json(j) for j in specs_json] | |
214 | dds = [DaemonDescription.from_json(j) for j in dds_json] | |
215 | ||
216 | # just some verification that we can sill read old octopus specs | |
217 | def remove_service_name(j): | |
218 | if 'service_name' in j: | |
219 | j_c = j.copy() | |
220 | del j_c['service_name'] | |
221 | return j_c | |
222 | return j | |
223 | assert specs_json == [remove_service_name(s.to_json()) for s in specs] | |
224 | assert dds_json == [d.to_json() for d in dds] | |
225 | ||
226 | ||
227 | @pytest.mark.parametrize("spec,dd,valid", | |
228 | [ | |
e306af50 | 229 | # https://tracker.ceph.com/issues/44934 |
1911f103 | 230 | ( |
1911f103 TL |
231 | RGWSpec( |
232 | rgw_realm="default-rgw-realm", | |
233 | rgw_zone="eu-central-1", | |
234 | subcluster='1', | |
235 | ), | |
236 | DaemonDescription( | |
237 | daemon_type='rgw', | |
238 | daemon_id="default-rgw-realm.eu-central-1.1.ceph-001.ytywjo", | |
239 | hostname="ceph-001", | |
240 | ), | |
241 | True | |
242 | ), | |
243 | ( | |
244 | # no subcluster | |
245 | RGWSpec( | |
246 | rgw_realm="default-rgw-realm", | |
247 | rgw_zone="eu-central-1", | |
248 | ), | |
249 | DaemonDescription( | |
250 | daemon_type='rgw', | |
251 | daemon_id="default-rgw-realm.eu-central-1.ceph-001.ytywjo", | |
252 | hostname="ceph-001", | |
253 | ), | |
254 | True | |
255 | ), | |
256 | ( | |
257 | # with tld | |
258 | RGWSpec( | |
259 | rgw_realm="default-rgw-realm", | |
260 | rgw_zone="eu-central-1", | |
261 | subcluster='1', | |
262 | ), | |
263 | DaemonDescription( | |
264 | daemon_type='rgw', | |
265 | daemon_id="default-rgw-realm.eu-central-1.1.host.domain.tld.ytywjo", | |
266 | hostname="host.domain.tld", | |
267 | ), | |
268 | True | |
269 | ), | |
e306af50 TL |
270 | ( |
271 | # explicit naming | |
272 | RGWSpec( | |
273 | rgw_realm="realm", | |
274 | rgw_zone="zone", | |
275 | ), | |
276 | DaemonDescription( | |
277 | daemon_type='rgw', | |
278 | daemon_id="realm.zone.a", | |
279 | hostname="smithi028", | |
280 | ), | |
281 | True | |
282 | ), | |
1911f103 TL |
283 | ( |
284 | # without host | |
285 | RGWSpec( | |
286 | service_type='rgw', | |
287 | rgw_realm="default-rgw-realm", | |
288 | rgw_zone="eu-central-1", | |
289 | subcluster='1', | |
290 | ), | |
291 | DaemonDescription( | |
292 | daemon_type='rgw', | |
293 | daemon_id="default-rgw-realm.eu-central-1.1.hostname.ytywjo", | |
294 | hostname=None, | |
295 | ), | |
296 | False | |
297 | ), | |
e306af50 TL |
298 | ( |
299 | # zone contains hostname | |
300 | # https://tracker.ceph.com/issues/45294 | |
301 | RGWSpec( | |
302 | rgw_realm="default.rgw.realm", | |
303 | rgw_zone="ceph.001", | |
304 | subcluster='1', | |
305 | ), | |
306 | DaemonDescription( | |
307 | daemon_type='rgw', | |
308 | daemon_id="default.rgw.realm.ceph.001.1.ceph.001.ytywjo", | |
309 | hostname="ceph.001", | |
310 | ), | |
311 | True | |
312 | ), | |
313 | ||
314 | # https://tracker.ceph.com/issues/45293 | |
315 | ( | |
316 | ServiceSpec( | |
317 | service_type='mds', | |
318 | service_id="a", | |
319 | ), | |
320 | DaemonDescription( | |
321 | daemon_type='mds', | |
322 | daemon_id="a.host1.abc123", | |
323 | hostname="host1", | |
324 | ), | |
325 | True | |
326 | ), | |
327 | ( | |
328 | # '.' char in service_id | |
329 | ServiceSpec( | |
330 | service_type='mds', | |
331 | service_id="a.b.c", | |
332 | ), | |
333 | DaemonDescription( | |
334 | daemon_type='mds', | |
335 | daemon_id="a.b.c.host1.abc123", | |
336 | hostname="host1", | |
337 | ), | |
338 | True | |
339 | ), | |
340 | ||
341 | # https://tracker.ceph.com/issues/45617 | |
342 | ( | |
343 | # daemon_id does not contain hostname | |
344 | ServiceSpec( | |
345 | service_type='mds', | |
346 | service_id="a", | |
347 | ), | |
348 | DaemonDescription( | |
349 | daemon_type='mds', | |
350 | daemon_id="a", | |
351 | hostname="host1", | |
352 | ), | |
353 | True | |
354 | ), | |
355 | ( | |
356 | # daemon_id only contains hostname | |
357 | ServiceSpec( | |
358 | service_type='mds', | |
359 | service_id="host1", | |
360 | ), | |
361 | DaemonDescription( | |
362 | daemon_type='mds', | |
363 | daemon_id="host1", | |
364 | hostname="host1", | |
365 | ), | |
366 | True | |
367 | ), | |
368 | ||
369 | # https://tracker.ceph.com/issues/45399 | |
370 | ( | |
371 | # daemon_id only contains hostname | |
372 | ServiceSpec( | |
373 | service_type='mds', | |
374 | service_id="a", | |
375 | ), | |
376 | DaemonDescription( | |
377 | daemon_type='mds', | |
378 | daemon_id="a.host1.abc123", | |
379 | hostname="host1.site", | |
380 | ), | |
381 | True | |
382 | ), | |
383 | ( | |
384 | NFSServiceSpec( | |
385 | service_id="a", | |
386 | ), | |
387 | DaemonDescription( | |
388 | daemon_type='nfs', | |
389 | daemon_id="a.host1", | |
390 | hostname="host1.site", | |
391 | ), | |
392 | True | |
393 | ), | |
394 | ||
395 | # https://tracker.ceph.com/issues/45293 | |
396 | ( | |
397 | NFSServiceSpec( | |
398 | service_id="a", | |
399 | ), | |
400 | DaemonDescription( | |
401 | daemon_type='nfs', | |
402 | daemon_id="a.host1", | |
403 | hostname="host1", | |
404 | ), | |
405 | True | |
406 | ), | |
407 | ( | |
408 | # service_id contains a '.' char | |
409 | NFSServiceSpec( | |
410 | service_id="a.b.c", | |
411 | ), | |
412 | DaemonDescription( | |
413 | daemon_type='nfs', | |
414 | daemon_id="a.b.c.host1", | |
415 | hostname="host1", | |
416 | ), | |
417 | True | |
418 | ), | |
419 | ( | |
420 | # trailing chars after hostname | |
421 | NFSServiceSpec( | |
422 | service_id="a.b.c", | |
423 | ), | |
424 | DaemonDescription( | |
425 | daemon_type='nfs', | |
426 | daemon_id="a.b.c.host1.abc123", | |
427 | hostname="host1", | |
428 | ), | |
429 | True | |
430 | ), | |
431 | ( | |
432 | # chars after hostname without '.' | |
433 | NFSServiceSpec( | |
434 | service_id="a", | |
435 | ), | |
436 | DaemonDescription( | |
437 | daemon_type='nfs', | |
438 | daemon_id="a.host1abc123", | |
439 | hostname="host1", | |
440 | ), | |
441 | False | |
442 | ), | |
443 | ( | |
444 | # chars before hostname without '.' | |
445 | NFSServiceSpec( | |
446 | service_id="a", | |
447 | ), | |
448 | DaemonDescription( | |
449 | daemon_type='nfs', | |
450 | daemon_id="ahost1.abc123", | |
451 | hostname="host1", | |
452 | ), | |
453 | False | |
454 | ), | |
455 | ||
456 | # https://tracker.ceph.com/issues/45293 | |
457 | ( | |
458 | IscsiServiceSpec( | |
459 | service_type='iscsi', | |
460 | service_id="a", | |
461 | ), | |
462 | DaemonDescription( | |
463 | daemon_type='iscsi', | |
464 | daemon_id="a.host1.abc123", | |
465 | hostname="host1", | |
466 | ), | |
467 | True | |
468 | ), | |
469 | ( | |
470 | # '.' char in service_id | |
471 | IscsiServiceSpec( | |
472 | service_type='iscsi', | |
473 | service_id="a.b.c", | |
474 | ), | |
475 | DaemonDescription( | |
476 | daemon_type='iscsi', | |
477 | daemon_id="a.b.c.host1.abc123", | |
478 | hostname="host1", | |
479 | ), | |
480 | True | |
481 | ), | |
1911f103 | 482 | ]) |
e306af50 TL |
483 | def test_daemon_description_service_name(spec: ServiceSpec, |
484 | dd: DaemonDescription, | |
485 | valid: bool): | |
1911f103 TL |
486 | if valid: |
487 | assert spec.service_name() == dd.service_name() | |
488 | else: | |
489 | with pytest.raises(OrchestratorError): | |
490 | dd.service_name() | |
491 |