]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
python-common/drive_group: handle fields outside of 'spec' even when 'spec' is provided 53115/head
authorAdam King <adking@redhat.com>
Wed, 31 May 2023 17:08:35 +0000 (13:08 -0400)
committerAdam King <adking@redhat.com>
Wed, 23 Aug 2023 20:16:29 +0000 (16:16 -0400)
Otherwise certain specs such as

service_type: osd
service_id: xxx
service_name: osd.xxx
placement:
  hosts:
  - vm-00
spec:
  osds_per_device: 2
data_devices:
  paths:
  - /dev/vde

fail to apply with

Error EINVAL: ServiceSpec: 'dict' object has no attribute 'validate'

which is not a useful error message. This is caused by the
spec assuming all osd specific fields are either defined
in the 'spec' section or outside of it, but not mixed in.
We could also just consider these specs to be invalid
and just raise a better error message, but it seems easier
to make the minor adjustment for it to work, given there doesn't
seem to be an issue with mixing the styles for specs for
other service types.

Fixes: https://tracker.ceph.com/issues/61533
Signed-off-by: Adam King <adking@redhat.com>
(cherry picked from commit 12901f617d9f21dcc4de9b039b7ab6484fbc99ca)

src/python-common/ceph/deployment/drive_group.py
src/python-common/ceph/tests/test_drive_group.py

index 7ac9759523dd8bb9f1b321d4a46915a9de97b858..62f03173b91574c25ffeb21bdf148a13eec75079 100644 (file)
@@ -288,8 +288,8 @@ class DriveGroupSpec(ServiceSpec):
         # spec: was not mandatory in octopus
         if 'spec' in args:
             args['spec'].update(cls._drive_group_spec_from_json(s_id, args['spec']))
-        else:
-            args.update(cls._drive_group_spec_from_json(s_id, args))
+        args.update(cls._drive_group_spec_from_json(
+                    s_id, {k: v for k, v in args.items() if k != 'spec'}))
 
         return super(DriveGroupSpec, cls)._from_json_impl(args)
 
index faa001a0233ab2df72a36122e0f185f7c63a305c..77e9b4083d495d44e0582878b092d97946c7c154 100644 (file)
@@ -35,6 +35,18 @@ data_devices:
   - path: /dev/sda
     crush_device_class: ssd"""
     ),
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+spec:
+  osds_per_device: 2
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd"""
+    ),
 ])
 def test_DriveGroup(test_input):