]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
python-common: python-common: fix /hosts/ parsing in servicespecs
authorJoshua Schmid <jschmid@suse.de>
Thu, 12 Mar 2020 21:52:14 +0000 (22:52 +0100)
committerSebastian Wagner <sebastian.wagner@suse.com>
Tue, 14 Apr 2020 14:50:50 +0000 (16:50 +0200)
Signed-off-by: Joshua Schmid <jschmid@suse.de>
(cherry picked from commit 494728c5dc729de2dcc9c40d92e154c2bd5d8008)

src/python-common/ceph/deployment/service_spec.py
src/python-common/ceph/tests/test_service_spec.py

index 13bc2dd5426780736b72ecb853e9a8df008f1e04..bfcbdd73ffbc98436fd52fcdd9ba3e05d09d40d1 100644 (file)
@@ -110,7 +110,9 @@ class HostPlacementSpec(namedtuple('HostPlacementSpec', ['hostname', 'network',
         if ',' in network:
             networks = [x for x in network.split(',')]
         else:
-            networks.append(network)
+            if network != '':
+                networks.append(network)
+
         for network in networks:
             # only if we have versioned network configs
             if network.startswith('v') or network.startswith('[v'):
@@ -207,7 +209,11 @@ class PlacementSpec(object):
         c = data.copy()
         hosts = c.get('hosts', [])
         if hosts:
-            c['hosts'] = [HostPlacementSpec.from_json(host) for host in hosts]
+            c['hosts'] = []
+            for host in hosts:
+                c['hosts'].append(HostPlacementSpec.parse(host) if
+                                  isinstance(host, str) else
+                                  HostPlacementSpec.from_json(host))
         _cls = cls(**c)
         _cls.validate()
         return _cls
@@ -426,7 +432,9 @@ class ServiceSpec(object):
                 args.update(v)
                 continue
             args.update({k: v})
-        return cls(**args)
+        _cls = cls(**args)
+        _cls.validate()
+        return _cls
 
     def service_name(self):
         n = self.service_type
index 4b2c85c4b1fd397a9969a5f5b358d0673cbd7707..12a8be84bfd6569018e988813c8e37f8805e6054 100644 (file)
@@ -1,10 +1,12 @@
 # flake8: noqa
 import json
+import yaml
 
 import pytest
 
-from ceph.deployment.service_spec import HostPlacementSpec, PlacementSpec, RGWSpec, \
-    servicespec_validate_add, ServiceSpecValidationError
+from ceph.deployment.service_spec import HostPlacementSpec, PlacementSpec, RGWSpec, NFSServiceSpec, \
+    servicespec_validate_add, ServiceSpec, ServiceSpecValidationError
+from ceph.deployment.drive_group import DriveGroupSpec
 
 
 @pytest.mark.parametrize("test_input,expected, require_network",
@@ -24,6 +26,7 @@ def test_parse_host_placement_specs(test_input, expected, require_network):
     assert ret == expected
     assert str(ret) == test_input
 
+
 @pytest.mark.parametrize(
     "test_input,expected",
     [
@@ -66,23 +69,36 @@ def test_parse_placement_specs_raises(test_input):
                          [("myhost:1.1.1.1/24"),
                           # wrong ip format
                           ("myhost:1"),
-                          # empty string
-                          ("myhost=1"),
                           ])
-def test_parse_host_placement_specs_raises(test_input):
+def test_parse_host_placement_specs_raises_wrong_format(test_input):
     with pytest.raises(ValueError):
-        ret = HostPlacementSpec.parse(test_input)
+        HostPlacementSpec.parse(test_input)
 
 
-def test_rgwspec():
-    """
-    {
-        "rgw_zone": "zonename",
-        "service_type": "rgw",
-        "rgw_frontend_port": 8080,
-        "rgw_realm": "realm"
+@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'),
+        ("osd", DriveGroupSpec, 'test'),
+    ])
+def test_servicespec_map_test(s_type, o_spec, s_id):
+    dict_spec = {
+        "service_id": s_id,
+        "service_type": s_type,
+        "placement":
+            dict(hosts=["host1:1.1.1.1"])
     }
-    """
-    example = json.loads(test_rgwspec.__doc__.strip())
-    spec = RGWSpec.from_json(example)
-    assert servicespec_validate_add(spec) is None
\ No newline at end of file
+    spec = ServiceSpec.from_json(dict_spec)
+    assert isinstance(spec, o_spec)
+    assert isinstance(spec.placement, PlacementSpec)
+    assert isinstance(spec.placement.hosts[0], HostPlacementSpec)
+    assert spec.placement.hosts[0].hostname == 'host1'
+    assert spec.placement.hosts[0].network == '1.1.1.1'
+    assert spec.placement.hosts[0].name == ''
+    assert servicespec_validate_add(spec) is None
+    ServiceSpec.from_json(spec.to_json())
+