diff --git a/charms_ceph/utils.py b/charms_ceph/utils.py index 1894cf4..30b4a8a 100644 --- a/charms_ceph/utils.py +++ b/charms_ceph/utils.py @@ -1514,11 +1514,11 @@ def get_devices(name): def osdize(dev, osd_format, osd_journal, ignore_errors=False, encrypt=False, - bluestore=False, key_manager=CEPH_KEY_MANAGER): + bluestore=False, key_manager=CEPH_KEY_MANAGER, osd_id=None): if dev.startswith('/dev'): osdize_dev(dev, osd_format, osd_journal, ignore_errors, encrypt, - bluestore, key_manager) + bluestore, key_manager, osd_id) else: if cmp_pkgrevno('ceph', '14.0.0') >= 0: log("Directory backed OSDs can not be created on Nautilus", @@ -1528,7 +1528,8 @@ def osdize(dev, osd_format, osd_journal, ignore_errors=False, encrypt=False, def osdize_dev(dev, osd_format, osd_journal, ignore_errors=False, - encrypt=False, bluestore=False, key_manager=CEPH_KEY_MANAGER): + encrypt=False, bluestore=False, key_manager=CEPH_KEY_MANAGER, + osd_id=None): """ Prepare a block device for use as a Ceph OSD @@ -1593,7 +1594,8 @@ def osdize_dev(dev, osd_format, osd_journal, ignore_errors=False, osd_journal, encrypt, bluestore, - key_manager) + key_manager, + osd_id) else: cmd = _ceph_disk(dev, osd_format, @@ -1677,7 +1679,7 @@ def _ceph_disk(dev, osd_format, osd_journal, encrypt=False, bluestore=False): def _ceph_volume(dev, osd_journal, encrypt=False, bluestore=False, - key_manager=CEPH_KEY_MANAGER): + key_manager=CEPH_KEY_MANAGER, osd_id=None): """ Prepare and activate a device for usage as a Ceph OSD using ceph-volume. @@ -1689,6 +1691,7 @@ def _ceph_volume(dev, osd_journal, encrypt=False, bluestore=False, :param: encrypt: Use block device encryption :param: bluestore: Use bluestore storage for OSD :param: key_manager: dm-crypt Key Manager to use + :param: osd_id: The OSD-id to recycle, or None to create a new one :raises subprocess.CalledProcessError: in the event that any supporting LVM operation failed. :returns: list. 'ceph-volume' command and required parameters for @@ -1710,6 +1713,9 @@ def _ceph_volume(dev, osd_journal, encrypt=False, bluestore=False, if encrypt and key_manager == CEPH_KEY_MANAGER: cmd.append('--dmcrypt') + if osd_id is not None: + cmd.extend(['--osd-id', str(osd_id)]) + # On-disk journal volume creation if not osd_journal and not bluestore: journal_lv_type = 'journal' diff --git a/unit_tests/test_utils.py b/unit_tests/test_utils.py index bf7a553..289c4f7 100644 --- a/unit_tests/test_utils.py +++ b/unit_tests/test_utils.py @@ -127,7 +127,41 @@ class CephTestCase(unittest.TestCase): _is_active_bluestore_device.return_value = False utils.osdize('/dev/sdb', osd_format='xfs', osd_journal=None, bluestore=False) - _ceph_volume.assert_called_with('/dev/sdb', None, False, False, 'ceph') + _ceph_volume.assert_called_with('/dev/sdb', None, False, False, + 'ceph', None) + _check_call.assert_called_with(['ceph-volume', 'prepare']) + db.get.assert_called_with('osd-devices', []) + db.set.assert_called_with('osd-devices', ['/dev/sdb']) + db.flush.assert_called_once() + + @patch.object(utils, 'kv') + @patch.object(utils.subprocess, 'check_call') + @patch.object(utils, '_ceph_volume') + @patch.object(utils, 'is_mapped_luks_device') + @patch.object(utils, 'is_active_bluestore_device') + @patch.object(utils.os.path, 'exists') + @patch.object(utils, 'is_device_mounted') + @patch.object(utils, 'cmp_pkgrevno') + @patch.object(utils, 'is_block_device') + def test_osdize_dev_ceph_volume_with_osdid(self, _is_blk, _cmp, _mounted, + _exists, _is_mapped_luks_device, + _is_active_bluestore_device, + _ceph_volume, _check_call, _kv): + """Test that _ceph_volume is called with an OSD id.""" + db = MagicMock() + _kv.return_value = db + db.get.return_value = [] + _is_blk.return_value = True + _mounted.return_value = False + _exists.return_value = True + _cmp.return_value = 1 + _ceph_volume.return_value = ['ceph-volume', 'prepare'] + _is_mapped_luks_device.return_value = False + _is_active_bluestore_device.return_value = False + utils.osdize('/dev/sdb', osd_format='xfs', osd_journal=None, + bluestore=False, osd_id=123) + _ceph_volume.assert_called_with('/dev/sdb', None, False, False, + 'ceph', 123) _check_call.assert_called_with(['ceph-volume', 'prepare']) db.get.assert_called_with('osd-devices', []) db.set.assert_called_with('osd-devices', ['/dev/sdb'])