diff --git a/blivet/blivet.py b/blivet/blivet.py index 399992a41..48cc59b45 100644 --- a/blivet/blivet.py +++ b/blivet/blivet.py @@ -753,6 +753,9 @@ def new_btrfs(self, *args, **kwargs): fmt_args = kwargs.pop("fmt_args", {}) fmt_args.update({"mountpoint": mountpoint}) + create_options = kwargs.get("create_options", None) + fmt_args.update({"create_options": create_options}) + if kwargs.pop("subvol", False): dev_class = BTRFSSubVolumeDevice diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py index 0cbaa44d9..f4ba11772 100644 --- a/blivet/devices/btrfs.py +++ b/blivet/devices/btrfs.py @@ -21,6 +21,7 @@ import os import copy +import shlex import tempfile import uuid @@ -473,10 +474,12 @@ def _create(self): md_level = str(self.metadata_level) else: md_level = None + + extra = [] if self.uuid: - extra = {"-U": self.uuid} - else: - extra = None + extra.append(blockdev.ExtraArg("-U", self.uuid)) + if self.format and self.format._create_options: + extra.extend(blockdev.ExtraArg(arg) for arg in shlex.split(self.format._create_options)) try: blockdev.btrfs.create_volume([d.path for d in self.parents], label=self.format.label, diff --git a/tests/unit_tests/devices_test/btrfs_test.py b/tests/unit_tests/devices_test/btrfs_test.py index 41731e91e..2a0c5a5c3 100644 --- a/tests/unit_tests/devices_test/btrfs_test.py +++ b/tests/unit_tests/devices_test/btrfs_test.py @@ -39,11 +39,18 @@ def test_new_btrfs(self): with patch.object(vol, "_pre_create"): with patch.object(vol, "_post_create"): vol.create() - blockdev.create_volume.assert_called_with(['/dev/bd1'], - label='testvolume', - data_level=None, - md_level=None, - extra={'-U': vol.uuid}) + blockdev.create_volume.assert_called() + args = blockdev.create_volume.call_args.args + self.assertEqual(args, (['/dev/bd1'],)) + kwargs = blockdev.create_volume.call_args.kwargs + self.assertEqual(kwargs['label'], 'testvolume') + self.assertEqual(kwargs['data_level'], None) + self.assertEqual(kwargs['md_level'], None) + + extra = kwargs['extra'] + self.assertTrue(extra) + self.assertEqual(extra[0].opt, "-U") + self.assertEqual(extra[0].val, vol.uuid) with patch("blivet.devicetree.DeviceTree.names", []): sub = b.new_btrfs_sub_volume(name="testsub", parents=[vol]) @@ -53,6 +60,37 @@ def test_new_btrfs(self): self.assertEqual(sub.size, vol.size) self.assertEqual(sub.volume, vol) + def test_new_btrfs_options(self): + b = blivet.Blivet() + bd = StorageDevice("bd1", fmt=blivet.formats.get_format("btrfs"), + size=Size("2 GiB"), exists=False) + + b.devicetree._add_device(bd) + + with patch("blivet.devicetree.DeviceTree.names", []): + vol = b.new_btrfs(name="testvolume", parents=[bd], create_options="--csum xxhash") + + b.create_device(vol) + + with patch("blivet.devices.btrfs.blockdev.btrfs") as blockdev: + with patch.object(vol, "_pre_create"): + with patch.object(vol, "_post_create"): + vol.create() + blockdev.create_volume.assert_called() + args = blockdev.create_volume.call_args.args + self.assertEqual(args, (['/dev/bd1'],)) + kwargs = blockdev.create_volume.call_args.kwargs + self.assertEqual(kwargs['label'], 'testvolume') + self.assertEqual(kwargs['data_level'], None) + self.assertEqual(kwargs['md_level'], None) + + extra = kwargs['extra'] + self.assertTrue(extra) + self.assertEqual(extra[0].opt, "-U") + self.assertEqual(extra[0].val, vol.uuid) + self.assertEqual(extra[1].opt, "--csum") + self.assertEqual(extra[2].opt, "xxhash") + def test_device_id(self): bd = StorageDevice("bd1", fmt=blivet.formats.get_format("btrfs"), size=Size("2 GiB"), exists=False)