]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph_volume: fix multiple db/wal devices
authorDimitri Savineau <dsavinea@redhat.com>
Fri, 27 Mar 2020 21:16:41 +0000 (17:16 -0400)
committerDimitri Savineau <savineau.dimitri@gmail.com>
Mon, 30 Mar 2020 14:04:26 +0000 (10:04 -0400)
When using the lvm batch ceph-volume subcommand with dedicated devices
for bluestore (db/wal) then the list of devices is convert to a string
instead of being extended via an iterable.
This was working with only one dedicated device but starting with more
then the ceph_volume module fails.

TASK [ceph-osd : use ceph-volume lvm batch to create bluestore osds] **
fatal: [xxxxxx]: FAILED! => changed=true
  cmd:
  - ceph-volume
  - --cluster
  - ceph
  - lvm
  - batch
  - --bluestore
  - --yes
  - --prepare
  - --osds-per-device
  - '4'
  - /dev/nvme2n1
  - /dev/nvme3n1
  - /dev/nvme4n1
  - /dev/nvme5n1
  - /dev/nvme6n1
  - --db-devices
  - /dev/nvme0n1 /dev/nvme1n1
  - --report
  - --format=json
  msg: non-zero return code
  rc: 2
  stderr: |2-
     stderr: lsblk: /dev/nvme0n1 /dev/nvme1n1: not a block device
     stderr: error: /dev/nvme0n1 /dev/nvme1n1: No such file or directory
     stderr: Unknown device, --name=, --path=, or absolute path in /dev/ or /sys expected.
    usage: ceph-volume lvm batch [-h] [--db-devices [DB_DEVICES [DB_DEVICES ...]]]
                                 [--wal-devices [WAL_DEVICES [WAL_DEVICES ...]]]
                                 [--journal-devices [JOURNAL_DEVICES [JOURNAL_DEVICES ...]]]
                                 [--no-auto] [--bluestore] [--filestore]
                                 [--report] [--yes] [--format {json,pretty}]
                                 [--dmcrypt]
                                 [--crush-device-class CRUSH_DEVICE_CLASS]
                                 [--no-systemd]
                                 [--osds-per-device OSDS_PER_DEVICE]
                                 [--block-db-size BLOCK_DB_SIZE]
                                 [--block-wal-size BLOCK_WAL_SIZE]
                                 [--journal-size JOURNAL_SIZE] [--prepare]
                                 [--osd-ids [OSD_IDS [OSD_IDS ...]]]
                                 [DEVICES [DEVICES ...]]
    ceph-volume lvm batch: error: Unable to proceed with non-existing device: /dev/nvme0n1 /dev/nvme1n1

So the dedicated device list is considered as a single string.

This commit also adds the block_db_devices and wal_devices documentation
to the ceph_volume module.

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1816713
Signed-off-by: Dimitri Savineau <dsavinea@redhat.com>
(cherry picked from commit 760b6cd7b0b671d63e2d6ea32ec336edd2f8cd32)

library/ceph_volume.py
tests/library/test_ceph_volume.py

index 9468a2012c2df7f4306d2e62d1b582e42d32594c..6b3f7016a74544919597a60907fc62e1946fb71d 100644 (file)
@@ -114,6 +114,18 @@ options:
             - Only applicable if action is 'batch'.
         required: false
         default: -1
+    block_db_devices:
+        description:
+            - A list of devices for bluestore block db to pass to the 'ceph-volume lvm batch' subcommand.
+            - Only applicable if action is 'batch'.
+            - Only applicable if objectstore is 'bluestore'.
+        required: false
+    wal_devices:
+        description:
+            - A list of devices for bluestore block wal to pass to the 'ceph-volume lvm batch' subcommand.
+            - Only applicable if action is 'batch'.
+            - Only applicable if objectstore is 'bluestore'.
+        required: false
     report:
         description:
             - If provided the --report flag will be passed to 'ceph-volume lvm batch'.
@@ -320,10 +332,12 @@ def batch(module, container_image):
     cmd.extend(batch_devices)
 
     if block_db_devices and objectstore == 'bluestore':
-        cmd.extend(['--db-devices', ' '.join(block_db_devices)])
+        cmd.append('--db-devices')
+        cmd.extend(block_db_devices)
 
     if wal_devices and objectstore == 'bluestore':
-        cmd.extend(['--wal-devices', ' '.join(wal_devices)])
+        cmd.append('--wal-devices')
+        cmd.extend(wal_devices)
 
     return cmd
 
index 1254c1c7a4c48cb799321be65f89efd3b1472a50..917d94db7d626da1730719abd0abb6595f6a1a78 100644 (file)
@@ -344,3 +344,76 @@ class TestCephVolumeModule(object):
         result = ceph_volume.batch(
             fake_module, fake_container_image)
         assert result == expected_command_list
+
+    def test_batch_bluestore_with_dedicated_db(self):
+        fake_module = MagicMock()
+        fake_module.params = {'objectstore': 'bluestore',
+                              'block_db_size': '-1',
+                              'cluster': 'ceph',
+                              'batch_devices': ["/dev/sda", "/dev/sdb"],
+                              'block_db_devices': ["/dev/sdc", "/dev/sdd"]}
+
+        fake_container_image = None
+        expected_command_list = ['ceph-volume',
+                                 '--cluster',
+                                 'ceph',
+                                 'lvm',
+                                 'batch',
+                                 '--bluestore',
+                                 '--yes',
+                                 '/dev/sda',
+                                 '/dev/sdb',
+                                 '--db-devices',
+                                 '/dev/sdc',
+                                 '/dev/sdd']
+        result = ceph_volume.batch(
+            fake_module, fake_container_image)
+        assert result == expected_command_list
+
+    def test_batch_bluestore_with_dedicated_wal(self):
+        fake_module = MagicMock()
+        fake_module.params = {'objectstore': 'bluestore',
+                              'cluster': 'ceph',
+                              'block_db_size': '-1',
+                              'batch_devices': ["/dev/sda", "/dev/sdb"],
+                              'wal_devices': ["/dev/sdc", "/dev/sdd"]}
+
+        fake_container_image = None
+        expected_command_list = ['ceph-volume',
+                                 '--cluster',
+                                 'ceph',
+                                 'lvm',
+                                 'batch',
+                                 '--bluestore',
+                                 '--yes',
+                                 '/dev/sda',
+                                 '/dev/sdb',
+                                 '--wal-devices',
+                                 '/dev/sdc',
+                                 '/dev/sdd']
+        result = ceph_volume.batch(
+            fake_module, fake_container_image)
+        assert result == expected_command_list
+
+    def test_batch_bluestore_with_custom_db_size(self):
+        fake_module = MagicMock()
+        fake_module.params = {'objectstore': 'bluestore',
+                              'cluster': 'ceph',
+                              'block_db_size': '4096',
+                              'batch_devices': ["/dev/sda", "/dev/sdb"]}
+
+        fake_container_image = None
+        expected_command_list = ['ceph-volume',
+                                 '--cluster',
+                                 'ceph',
+                                 'lvm',
+                                 'batch',
+                                 '--bluestore',
+                                 '--yes',
+                                 '--block-db-size',
+                                 '4096',
+                                 '/dev/sda',
+                                 '/dev/sdb']
+        result = ceph_volume.batch(
+            fake_module, fake_container_image)
+        assert result == expected_command_list