]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/cephadm/tests/test_spec.py
import 15.2.4
[ceph.git] / ceph / src / pybind / mgr / cephadm / tests / test_spec.py
CommitLineData
1911f103
TL
1import json
2
3import pytest
4
e306af50
TL
5from ceph.deployment.service_spec import ServiceSpec, NFSServiceSpec, RGWSpec, \
6 ServiceSpecValidationError, IscsiServiceSpec, PlacementSpec
7
1911f103
TL
8from orchestrator import DaemonDescription, OrchestratorError
9
10
11def 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
483def 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