]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
python-common: clean-up ServiceSpec.service_id handling
authorMichael Fritch <mfritch@suse.com>
Tue, 30 Jun 2020 22:06:20 +0000 (16:06 -0600)
committerMichael Fritch <mfritch@suse.com>
Wed, 22 Jul 2020 22:41:58 +0000 (16:41 -0600)
service_id is required for iscsi, mds, nfs, osd, rgw.

any other service_type (mon, mgr, etc.) should not contain a service_id

Fixes: https://tracker.ceph.com/issues/46175
Signed-off-by: Michael Fritch <mfritch@suse.com>
src/pybind/mgr/orchestrator/_interface.py
src/python-common/ceph/deployment/service_spec.py
src/python-common/ceph/tests/test_service_spec.py

index 29ac9c8431d85a0a7118610a63b8f9aa8874f308..586662a508f9858d44e97ee31d3e52d184c01feb 100644 (file)
@@ -1333,13 +1333,13 @@ class DaemonDescription(object):
             # daemon_id == "service_id"
             return self.daemon_id
 
-        if self.daemon_type in ['mds', 'nfs', 'iscsi', 'rgw']:
+        if self.daemon_type in ServiceSpec.REQUIRES_SERVICE_ID:
             return _match()
 
         return self.daemon_id
 
     def service_name(self):
-        if self.daemon_type in ['rgw', 'mds', 'nfs', 'iscsi']:
+        if self.daemon_type in ServiceSpec.REQUIRES_SERVICE_ID:
             return f'{self.daemon_type}.{self.service_id()}'
         return self.daemon_type
 
index 2e887c67a68498cdcfd13f63418d9dd0b743f2fa..a677ff419a0b543157b571029a1bfd1d83abeaeb 100644 (file)
@@ -372,6 +372,7 @@ class ServiceSpec(object):
     """
     KNOWN_SERVICE_TYPES = 'alertmanager crash grafana iscsi mds mgr mon nfs ' \
                           'node-exporter osd prometheus rbd-mirror rgw'.split()
+    REQUIRES_SERVICE_ID = 'iscsi mds nfs osd rgw'.split()
 
     @classmethod
     def _cls(cls, service_type):
@@ -414,7 +415,9 @@ class ServiceSpec(object):
 
         assert service_type in ServiceSpec.KNOWN_SERVICE_TYPES, service_type
         self.service_type = service_type
-        self.service_id = service_id
+        self.service_id = None
+        if self.service_type in self.REQUIRES_SERVICE_ID:
+            self.service_id = service_id
         self.unmanaged = unmanaged
         self.preview_only = preview_only
 
@@ -527,8 +530,12 @@ class ServiceSpec(object):
         if not self.service_type:
             raise ServiceSpecValidationError('Cannot add Service: type required')
 
-        if self.service_type in ['mds', 'rgw', 'nfs', 'iscsi'] and not self.service_id:
-            raise ServiceSpecValidationError('Cannot add Service: id required')
+        if self.service_type in self.REQUIRES_SERVICE_ID:
+            if not self.service_id:
+                raise ServiceSpecValidationError('Cannot add Service: id required')
+        elif self.service_id:
+            raise ServiceSpecValidationError(
+                    f'Service of type \'{self.service_type}\' should not contain a service id')
 
         if self.placement is not None:
             self.placement.validate()
index f91e55af618a2461f8ea67dc9f8f31deee218fa3..2d923c6c7d24135ac653f35fbb28dafe0d6ddb93 100644 (file)
@@ -75,18 +75,7 @@ def test_parse_host_placement_specs_raises_wrong_format(test_input):
         HostPlacementSpec.parse(test_input)
 
 
-@pytest.mark.parametrize(
-    "s_type,o_spec,s_id",
-    [
-        ("mgr", ServiceSpec, 'test'),
-        ("mon", ServiceSpec, 'test'),
-        ("mds", ServiceSpec, 'test'),
-        ("rgw", RGWSpec, 'realm.zone'),
-        ("nfs", NFSServiceSpec, 'test'),
-        ("iscsi", IscsiServiceSpec, 'test'),
-        ("osd", DriveGroupSpec, 'test'),
-    ])
-def test_servicespec_map_test(s_type, o_spec, s_id):
+def _get_dict_spec(s_type, s_id):
     dict_spec = {
         "service_id": s_id,
         "service_type": s_type,
@@ -105,7 +94,26 @@ def test_servicespec_map_test(s_type, o_spec, s_id):
                 'all': True
             }
         }
-    spec = ServiceSpec.from_json(dict_spec)
+    elif s_type == 'rgw':
+        dict_spec['rgw_realm'] = 'realm'
+        dict_spec['rgw_zone'] = 'zone'
+
+    return dict_spec
+
+
+@pytest.mark.parametrize(
+    "s_type,o_spec,s_id",
+    [
+        ("mgr", ServiceSpec, 'test'),
+        ("mon", ServiceSpec, 'test'),
+        ("mds", ServiceSpec, 'test'),
+        ("rgw", RGWSpec, 'realm.zone'),
+        ("nfs", NFSServiceSpec, 'test'),
+        ("iscsi", IscsiServiceSpec, 'test'),
+        ("osd", DriveGroupSpec, 'test'),
+    ])
+def test_servicespec_map_test(s_type, o_spec, s_id):
+    spec = ServiceSpec.from_json(_get_dict_spec(s_type, s_id))
     assert isinstance(spec, o_spec)
     assert isinstance(spec.placement, PlacementSpec)
     assert isinstance(spec.placement.hosts[0], HostPlacementSpec)
@@ -183,7 +191,7 @@ spec:
                                          service_type='mon',
                                          service_id='foo'
                                      ),
-                                     False
+                                     True
                              ),
                              # Add service_type='mgr'
                              (
@@ -225,3 +233,19 @@ def test_spec_hash_eq(spec1: ServiceSpec,
                       eq: bool):
 
     assert (spec1 == spec2) is eq
+
+@pytest.mark.parametrize(
+    "s_type,s_id,s_name",
+    [
+        ('mgr', 's_id', 'mgr'),
+        ('mon', 's_id', 'mon'),
+        ('mds', 's_id', 'mds.s_id'),
+        ('rgw', 's_id', 'rgw.s_id'),
+        ('nfs', 's_id', 'nfs.s_id'),
+        ('iscsi', 's_id', 'iscsi.s_id'),
+        ('osd', 's_id', 'osd.s_id'),
+    ])
+def test_service_name(s_type, s_id, s_name):
+    spec = ServiceSpec.from_json(_get_dict_spec(s_type, s_id))
+    spec.validate()
+    assert spec.service_name() == s_name