]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
python-common: drivegroup: add 'method' property
authorSage Weil <sage@newdream.net>
Tue, 3 Aug 2021 18:35:27 +0000 (14:35 -0400)
committerSage Weil <sage@newdream.net>
Tue, 2 Nov 2021 15:36:49 +0000 (11:36 -0400)
The DriveGroup method can be none, 'raw', or 'lvm'.

Signed-off-by: Sage Weil <sage@newdream.net>
src/python-common/ceph/deployment/drive_group.py
src/python-common/ceph/deployment/translate.py

index e063e0d5d82de85c9fa2c918232e57613a5d475f..0befac1169e6895c6fd32dd629ab6c2974fd4391 100644 (file)
@@ -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 <AND> or <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
index 144a82f9b4f622345c7d23cbffa914c18de34d90..6ca440cff3bf929a0b48e1c2150e21895b868cd7 100644 (file)
@@ -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"