From: Adam King Date: Wed, 31 May 2023 17:08:35 +0000 (-0400) Subject: python-common/drive_group: handle fields outside of 'spec' even when 'spec' is provided X-Git-Tag: v19.0.0~1025^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=12901f617d9f21dcc4de9b039b7ab6484fbc99ca;p=ceph-ci.git python-common/drive_group: handle fields outside of 'spec' even when 'spec' is provided 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 --- diff --git a/src/python-common/ceph/deployment/drive_group.py b/src/python-common/ceph/deployment/drive_group.py index 7ac9759523d..62f03173b91 100644 --- a/src/python-common/ceph/deployment/drive_group.py +++ b/src/python-common/ceph/deployment/drive_group.py @@ -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) diff --git a/src/python-common/ceph/tests/test_drive_group.py b/src/python-common/ceph/tests/test_drive_group.py index faa001a0233..77e9b4083d4 100644 --- a/src/python-common/ceph/tests/test_drive_group.py +++ b/src/python-common/ceph/tests/test_drive_group.py @@ -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):