from ceph_volume.util import prepare as prepare_utils
from ceph_volume.util import encryption as encryption_utils
from ceph_volume.util import system, disk
+from ceph_volume.util import nvme as nvme_utils
from ceph_volume.systemd import systemctl
from ceph_volume.devices.lvm.common import rollback_osd
from ceph_volume.devices.lvm.listing import direct_report
device = self.args.data
if disk.is_partition(device) or disk.is_device(device):
+ if device_type == 'block' and self.objectstore == 'bluestore':
+ # NVMe preformat already discards, skip mkfs discard.
+ if nvme_utils.preformat(device):
+ self.skip_mkfs_discard = True
# we must create a vg, and then a single lv
lv_name_prefix = "osd-{}".format(device_type)
kwargs = {
assert self.lvm.prepare_data_device('block', 'abcd') == m_create_lv.return_value
assert self.lvm.args.data_size == 102400
+ @patch('ceph_volume.objectstore.lvm.nvme_utils.preformat', Mock(return_value=True))
+ @patch('ceph_volume.util.disk.is_device', Mock(return_value=True))
+ @patch('ceph_volume.api.lvm.create_lv')
+ def test_prepare_data_device_preformats_nvme_and_skips_mkfs_discard(self,
+ m_create_lv: MagicMock,
+ factory: Callable[..., Namespace]) -> None:
+ args = factory(data='/dev/nvme0n1',
+ data_slots=1,
+ data_size=0)
+ self.lvm.args = args
+ self.lvm.objectstore = 'bluestore'
+ m_create_lv.return_value = Volume(lv_name='lv_foo',
+ lv_path='/fake-path',
+ vg_name='vg_foo',
+ lv_tags='',
+ lv_uuid='abcd')
+ self.lvm.prepare_data_device('block', 'abcd')
+ assert self.lvm.skip_mkfs_discard is True
+
@patch('ceph_volume.util.disk.is_device', Mock(return_value=False))
@patch('ceph_volume.util.disk.is_partition', Mock(return_value=False))
def test_prepare_data_device_fails(self, factory):