]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/tests/test_spec.py
1 # Disable autopep8 for this file:
9 from ceph
.deployment
.service_spec
import ServiceSpec
, NFSServiceSpec
, RGWSpec
, \
10 IscsiServiceSpec
, AlertManagerSpec
, HostPlacementSpec
, CustomContainerSpec
12 from orchestrator
import DaemonDescription
, OrchestratorError
15 @pytest.mark
.parametrize(
22 "service_type": "alertmanager"
28 "service_type": "crash"
34 "service_type": "grafana"
52 "service_type": "node-exporter"
58 "service_type": "prometheus"
64 "hostname": "ceph-001",
70 "service_type": "rgw",
71 "service_id": "default-rgw-realm.eu-central-1.1",
72 "rgw_realm": "default-rgw-realm",
73 "rgw_zone": "eu-central-1",
77 "service_type": "osd",
78 "service_id": "osd_spec_default",
83 "model": "MC-55-44-XZ"
86 "model": "SSD-123-foo"
89 "model": "NVME-QQQQ-987"
95 def test_spec_octopus(spec_json
):
96 # https://tracker.ceph.com/issues/44934
97 # Those are real user data from early octopus.
98 # Please do not modify those JSON values.
100 spec
= ServiceSpec
.from_json(spec_json
)
101 # just some verification that we can sill read old octopus specs
102 def convert_to_old_style_json(j
):
104 j_c
.pop('service_name', None)
106 spec
= j_c
.pop('spec')
108 if 'placement' in j_c
:
109 if 'hosts' in j_c
['placement']:
110 j_c
['placement']['hosts'] = [
112 'hostname': HostPlacementSpec
.parse(h
).hostname
,
113 'network': HostPlacementSpec
.parse(h
).network
,
114 'name': HostPlacementSpec
.parse(h
).name
116 for h
in j_c
['placement']['hosts']
118 j_c
.pop('objectstore', None)
119 j_c
.pop('filter_logic', None)
121 assert spec_json
== convert_to_old_style_json(spec
.to_json())
124 @pytest.mark
.parametrize(
128 "hostname": "ceph-001",
129 "container_id": "d94d7969094d",
130 "container_image_id": "0881eb8f169f5556a292b4e2c01d683172b12830a62a9225a98a8e206bb734f0",
131 "container_image_name": "docker.io/prom/alertmanager:latest",
132 "daemon_id": "ceph-001",
133 "daemon_type": "alertmanager",
136 "status_desc": "running",
137 "last_refresh": "2020-04-03T15:31:48.725856",
138 "created": "2020-04-02T19:23:08.829543",
139 "started": "2020-04-03T07:29:16.932838",
143 "hostname": "ceph-001",
144 "container_id": "c4b036202241",
145 "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1",
146 "container_image_name": "docker.io/ceph/ceph:v15",
147 "daemon_id": "ceph-001",
148 "daemon_type": "crash",
151 "status_desc": "running",
152 "last_refresh": "2020-04-03T15:31:48.725903",
153 "created": "2020-04-02T19:23:11.390694",
154 "started": "2020-04-03T07:29:16.910897",
158 "hostname": "ceph-001",
159 "container_id": "5b7b94b48f31",
160 "container_image_id": "87a51ecf0b1c9a7b187b21c1b071425dafea0d765a96d5bc371c791169b3d7f4",
161 "container_image_name": "docker.io/ceph/ceph-grafana:latest",
162 "daemon_id": "ceph-001",
163 "daemon_type": "grafana",
166 "status_desc": "running",
167 "last_refresh": "2020-04-03T15:31:48.725950",
168 "created": "2020-04-02T19:23:52.025088",
169 "started": "2020-04-03T07:29:16.847972",
173 "hostname": "ceph-001",
174 "container_id": "9ca007280456",
175 "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1",
176 "container_image_name": "docker.io/ceph/ceph:v15",
177 "daemon_id": "ceph-001.gkjwqp",
178 "daemon_type": "mgr",
181 "status_desc": "running",
182 "last_refresh": "2020-04-03T15:31:48.725807",
183 "created": "2020-04-02T19:22:18.648584",
184 "started": "2020-04-03T07:29:16.856153",
188 "hostname": "ceph-001",
189 "container_id": "3d1ba9a2b697",
190 "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1",
191 "container_image_name": "docker.io/ceph/ceph:v15",
192 "daemon_id": "ceph-001",
193 "daemon_type": "mon",
196 "status_desc": "running",
197 "last_refresh": "2020-04-03T15:31:48.725715",
198 "created": "2020-04-02T19:22:13.863300",
199 "started": "2020-04-03T07:29:17.206024",
203 "hostname": "ceph-001",
204 "container_id": "36d026c68ba1",
205 "container_image_id": "e5a616e4b9cf68dfcad7782b78e118be4310022e874d52da85c55923fb615f87",
206 "container_image_name": "docker.io/prom/node-exporter:latest",
207 "daemon_id": "ceph-001",
208 "daemon_type": "node-exporter",
211 "status_desc": "running",
212 "last_refresh": "2020-04-03T15:31:48.725996",
213 "created": "2020-04-02T19:23:53.880197",
214 "started": "2020-04-03T07:29:16.880044",
218 "hostname": "ceph-001",
219 "container_id": "faf76193cbfe",
220 "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1",
221 "container_image_name": "docker.io/ceph/ceph:v15",
223 "daemon_type": "osd",
226 "status_desc": "running",
227 "last_refresh": "2020-04-03T15:31:48.726088",
228 "created": "2020-04-02T20:35:02.991435",
229 "started": "2020-04-03T07:29:19.373956",
233 "hostname": "ceph-001",
234 "container_id": "f82505bae0f1",
235 "container_image_id": "204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1",
236 "container_image_name": "docker.io/ceph/ceph:v15",
238 "daemon_type": "osd",
241 "status_desc": "running",
242 "last_refresh": "2020-04-03T15:31:48.726134",
243 "created": "2020-04-02T20:35:17.142272",
244 "started": "2020-04-03T07:29:19.374002",
248 "hostname": "ceph-001",
249 "container_id": "2708d84cd484",
250 "container_image_id": "358a0d2395fe711bb8258e8fb4b2d7865c0a9a6463969bcd1452ee8869ea6653",
251 "container_image_name": "docker.io/prom/prometheus:latest",
252 "daemon_id": "ceph-001",
253 "daemon_type": "prometheus",
256 "status_desc": "running",
257 "last_refresh": "2020-04-03T15:31:48.726042",
258 "created": "2020-04-02T19:24:10.281163",
259 "started": "2020-04-03T07:29:16.926292",
263 "hostname": "ceph-001",
264 "daemon_id": "default-rgw-realm.eu-central-1.1.ceph-001.ytywjo",
265 "daemon_type": "rgw",
267 "status_desc": "starting",
272 def test_dd_octopus(dd_json
):
273 # https://tracker.ceph.com/issues/44934
274 # Those are real user data from early octopus.
275 # Please do not modify those JSON values.
276 assert dd_json
== DaemonDescription
.from_json(dd_json
).to_json()
279 @pytest.mark
.parametrize("spec,dd,valid",
281 # https://tracker.ceph.com/issues/44934
284 rgw_realm
="default-rgw-realm",
285 rgw_zone
="eu-central-1",
290 daemon_id
="default-rgw-realm.eu-central-1.1.ceph-001.ytywjo",
298 rgw_realm
="default-rgw-realm",
299 rgw_zone
="eu-central-1",
303 daemon_id
="default-rgw-realm.eu-central-1.ceph-001.ytywjo",
311 rgw_realm
="default-rgw-realm",
312 rgw_zone
="eu-central-1",
317 daemon_id
="default-rgw-realm.eu-central-1.1.host.domain.tld.ytywjo",
318 hostname
="host.domain.tld",
330 daemon_id
="realm.zone.a",
331 hostname
="smithi028",
339 rgw_realm
="default-rgw-realm",
340 rgw_zone
="eu-central-1",
345 daemon_id
="default-rgw-realm.eu-central-1.1.hostname.ytywjo",
351 # zone contains hostname
352 # https://tracker.ceph.com/issues/45294
354 rgw_realm
="default.rgw.realm",
360 daemon_id
="default.rgw.realm.ceph.001.1.ceph.001.ytywjo",
366 # https://tracker.ceph.com/issues/45293
374 daemon_id
="a.host1.abc123",
380 # '.' char in service_id
387 daemon_id
="a.b.c.host1.abc123",
393 # https://tracker.ceph.com/issues/45617
395 # daemon_id does not contain hostname
408 # daemon_id only contains hostname
421 # https://tracker.ceph.com/issues/45399
423 # daemon_id only contains hostname
430 daemon_id
="a.host1.abc123",
431 hostname
="host1.site",
442 hostname
="host1.site",
447 # https://tracker.ceph.com/issues/45293
460 # service_id contains a '.' char
466 daemon_id
="a.b.c.host1",
472 # trailing chars after hostname
478 daemon_id
="a.b.c.host1.abc123",
484 # chars after hostname without '.'
490 daemon_id
="a.host1abc123",
496 # chars before hostname without '.'
502 daemon_id
="ahost1.abc123",
508 # https://tracker.ceph.com/issues/45293
511 service_type
='iscsi',
516 daemon_id
="a.host1.abc123",
522 # '.' char in service_id
524 service_type
='iscsi',
529 daemon_id
="a.b.c.host1.abc123",
535 # fixed daemon id for teuthology.
537 service_type
='iscsi',
550 service_type
='container',
551 service_id
='hello-world',
552 image
='docker.io/library/hello-world:latest',
555 daemon_type
='container',
556 daemon_id
='hello-world.mgr0',
562 def test_daemon_description_service_name(spec
: ServiceSpec
,
563 dd
: DaemonDescription
,
566 assert spec
.service_name() == dd
.service_name()
568 with pytest
.raises(OrchestratorError
):
572 def test_alertmanager_spec_1():
573 spec
= AlertManagerSpec()
574 assert spec
.service_type
== 'alertmanager'
575 assert isinstance(spec
.user_data
, dict)
576 assert len(spec
.user_data
.keys()) == 0
579 def test_alertmanager_spec_2():
580 spec
= AlertManagerSpec(user_data
={'default_webhook_urls': ['foo']})
581 assert isinstance(spec
.user_data
, dict)
582 assert 'default_webhook_urls' in spec
.user_data
.keys()
585 def test_custom_container_spec():
586 spec
= CustomContainerSpec(service_id
='hello-world',
587 image
='docker.io/library/hello-world:latest',
588 entrypoint
='/usr/bin/bash',
591 volume_mounts
={'foo': '/foo'},
597 'source=lib/modules',
598 'destination=/lib/modules',
605 'foo.conf': 'foo\nbar',
606 'bar.conf': ['foo', 'bar']
608 assert spec
.service_type
== 'container'
609 assert spec
.entrypoint
== '/usr/bin/bash'
610 assert spec
.uid
== 1000
611 assert spec
.gid
== 2000
612 assert spec
.volume_mounts
== {'foo': '/foo'}
613 assert spec
.args
== ['--foo']
614 assert spec
.envs
== ['FOO=0815']
615 assert spec
.bind_mounts
== [
618 'source=lib/modules',
619 'destination=/lib/modules',
623 assert spec
.ports
== [8080, 8443]
624 assert spec
.dirs
== ['foo', 'bar']
625 assert spec
.files
== {
626 'foo.conf': 'foo\nbar',
627 'bar.conf': ['foo', 'bar']
631 def test_custom_container_spec_config_json():
632 spec
= CustomContainerSpec(service_id
='foo', image
='foo', dirs
=None)
633 config_json
= spec
.config_json()
634 for key
in ['entrypoint', 'uid', 'gid', 'bind_mounts', 'dirs']:
635 assert key
not in config_json