From 81e46bc64472a88c493b26f5948ae29f71ebfbed Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 3 Aug 2021 14:35:27 -0400 Subject: [PATCH] python-common: drivegroup: add 'method' property The DriveGroup method can be none, 'raw', or 'lvm'. Signed-off-by: Sage Weil --- .../ceph/deployment/drive_group.py | 16 +++++++++++++++- src/python-common/ceph/deployment/translate.py | 18 ++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/python-common/ceph/deployment/drive_group.py b/src/python-common/ceph/deployment/drive_group.py index e063e0d5d82de..0befac1169e68 100644 --- a/src/python-common/ceph/deployment/drive_group.py +++ b/src/python-common/ceph/deployment/drive_group.py @@ -1,3 +1,4 @@ +import enum import yaml from ceph.deployment.inventory import Device @@ -10,6 +11,11 @@ except ImportError: pass +class OSDMethod(str, enum.Enum): + raw = 'raw' + lvm = 'lvm' + + class DeviceSelection(object): """ Used within :class:`ceph.deployment.drive_group.DriveGroupSpec` to specify the devices @@ -144,7 +150,7 @@ class DriveGroupSpec(ServiceSpec): "data_devices", "db_devices", "wal_devices", "journal_devices", "data_directories", "osds_per_device", "objectstore", "osd_id_claims", "journal_size", "unmanaged", "filter_logic", "preview_only", - "data_allocate_fraction" + "data_allocate_fraction", "method" ] def __init__(self, @@ -169,6 +175,7 @@ class DriveGroupSpec(ServiceSpec): filter_logic='AND', # type: str preview_only=False, # type: bool data_allocate_fraction=None, # type: Optional[float] + method=None, # type: Optional[OSDMethod] ): assert service_type is None or service_type == 'osd' super(DriveGroupSpec, self).__init__('osd', service_id=service_id, @@ -230,6 +237,8 @@ class DriveGroupSpec(ServiceSpec): #: Allocate a fraction of the data device (0,1.0] self.data_allocate_fraction = data_allocate_fraction + self.method = method + @classmethod def _from_json_impl(cls, json_drive_group): # type: (dict) -> DriveGroupSpec @@ -316,6 +325,11 @@ class DriveGroupSpec(ServiceSpec): if self.filter_logic not in ['AND', 'OR']: raise DriveGroupValidationError('filter_logic must be either or ') + if self.method not in [None, 'lvm', 'raw']: + raise DriveGroupValidationError('method must be one of None, lvm, raw') + if self.method == 'raw' and self.objectstore == 'filestore': + raise DriveGroupValidationError('method raw only supports bluestore') + def __repr__(self) -> str: keys = [ key for key in self._supported_features if getattr(self, key) is not None diff --git a/src/python-common/ceph/deployment/translate.py b/src/python-common/ceph/deployment/translate.py index 144a82f9b4f62..6ca440cff3bf9 100644 --- a/src/python-common/ceph/deployment/translate.py +++ b/src/python-common/ceph/deployment/translate.py @@ -36,7 +36,16 @@ class to_ceph_volume(object): return None cmd = "" - if self.spec.objectstore == 'filestore': + if self.spec.method == 'raw': + assert self.spec.objectstore == 'bluestore' + cmd = "raw prepare --bluestore" + cmd += " --data {}".format(" ".join(data_devices)) + if db_devices: + cmd += " --block.db {}".format(" ".join(db_devices)) + if wal_devices: + cmd += " --block.wal {}".format(" ".join(wal_devices)) + + elif self.spec.objectstore == 'filestore': cmd = "lvm batch --no-auto" cmd += " {}".format(" ".join(data_devices)) @@ -50,7 +59,7 @@ class to_ceph_volume(object): cmd += " --filestore" - if self.spec.objectstore == 'bluestore': + elif self.spec.objectstore == 'bluestore': cmd = "lvm batch --no-auto {}".format(" ".join(data_devices)) @@ -78,8 +87,9 @@ class to_ceph_volume(object): if self.osd_id_claims: cmd += " --osd-ids {}".format(" ".join(self.osd_id_claims)) - cmd += " --yes" - cmd += " --no-systemd" + if self.spec.method != 'raw': + cmd += " --yes" + cmd += " --no-systemd" if self.preview: cmd += " --report" -- 2.39.5