Compare commits

...

No commits in common. 'c9' and 'cs10' have entirely different histories.
c9 ... cs10

4
.gitignore vendored

@ -1,2 +1,2 @@
SOURCES/blivet-3.6.0-tests.tar.gz
SOURCES/blivet-3.6.0.tar.gz
SOURCES/blivet-3.10.0-tests.tar.gz
SOURCES/blivet-3.10.0.tar.gz

@ -1,2 +1,2 @@
8393baa22cb433d1012e3923ad0bc232401116c6 SOURCES/blivet-3.6.0-tests.tar.gz
e9d95c1165703fed3da1f35a9199197bfff68f98 SOURCES/blivet-3.6.0.tar.gz
cd4469fb8d7600c11908eb3ac4e4c2d070090367 SOURCES/blivet-3.10.0-tests.tar.gz
41248423a21abcfa7758641d823ad9717ea560c1 SOURCES/blivet-3.10.0.tar.gz

@ -1,35 +0,0 @@
From 2759aaa9cbee38f80819bc136bb893184429380c Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 11 Jul 2018 15:36:24 +0200
Subject: [PATCH] Force command line based libblockdev LVM plugin
---
blivet/__init__.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/blivet/__init__.py b/blivet/__init__.py
index dd8d0f54..62cc539a 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -63,11 +63,16 @@ gi.require_version("BlockDev", "2.0")
from gi.repository import GLib
from gi.repository import BlockDev as blockdev
if arch.is_s390():
- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm"))
+ _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm"))
else:
- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm"))
+ _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm"))
_requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES)
+# XXX force non-dbus LVM plugin
+lvm_plugin = blockdev.PluginSpec()
+lvm_plugin.name = blockdev.Plugin.LVM
+lvm_plugin.so_name = "libbd_lvm.so.2"
+_requested_plugins.append(lvm_plugin)
try:
# do not check for dependencies during libblockdev initializtion, do runtime
# checks instead
--
2.37.3

@ -0,0 +1,28 @@
From 8b527ee85b6594d506d445ff4c30579cccef8ae6 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 11 Nov 2020 13:24:55 +0100
Subject: [PATCH] Remove btrfs from requested libblockdev plugins
---
blivet/__init__.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/blivet/__init__.py b/blivet/__init__.py
index 14bd5c61..1410d78e 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -63,9 +63,9 @@ gi.require_version("BlockDev", "3.0")
from gi.repository import GLib
from gi.repository import BlockDev as blockdev
if arch.is_s390():
- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvme", "fs"))
+ _REQUESTED_PLUGIN_NAMES = set(("lvm", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvme", "fs"))
else:
- _REQUESTED_PLUGIN_NAMES = set(("lvm", "btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvme", "fs"))
+ _REQUESTED_PLUGIN_NAMES = set(("lvm", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvme", "fs"))
_requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES)
try:
--
2.26.2

@ -0,0 +1,49 @@
From 95f565d56d21dd7e0d9033236a20be735665e0af Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 14 May 2024 12:35:12 +0200
Subject: [PATCH] Fix skipping btrfs calls when libblockdev btrfs plugin is
missing
We need to check for the btrfs plugin in the set of available
plugins, not in the missing plugins, because on RHEL the plugin is
not missing, it's not even requested.
---
blivet/devices/btrfs.py | 4 ++--
tests/unit_tests/devices_test/btrfs_test.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py
index c446e7e59..0cbaa44d9 100644
--- a/blivet/devices/btrfs.py
+++ b/blivet/devices/btrfs.py
@@ -40,7 +40,7 @@
from ..formats import get_format, DeviceFormat
from ..size import Size
from ..mounts import mounts_cache
-from .. import missing_plugs
+from .. import avail_plugs
import logging
log = logging.getLogger("blivet")
@@ -382,7 +382,7 @@ def _list_subvolumes(self, mountpoint, snapshots_only=False):
def list_subvolumes(self, snapshots_only=False):
subvols = []
- if "btrfs" in missing_plugs:
+ if "btrfs" not in avail_plugs:
log.debug("not listing btrfs subvolumes, libblockdev btrfs plugin is missing")
return subvols
diff --git a/tests/unit_tests/devices_test/btrfs_test.py b/tests/unit_tests/devices_test/btrfs_test.py
index 785afd209..41731e91e 100644
--- a/tests/unit_tests/devices_test/btrfs_test.py
+++ b/tests/unit_tests/devices_test/btrfs_test.py
@@ -83,7 +83,7 @@ def test_btrfs_list_subvolumes(self):
# mounted but libblockdev btrfs plugin not available
blockdev.reset_mock()
- with patch("blivet.devices.btrfs.missing_plugs", new={"btrfs"}):
+ with patch("blivet.devices.btrfs.avail_plugs", new={"lvm"}):
vol.list_subvolumes()
blockdev.list_subvolumes.assert_not_called()
blockdev.get_default_subvolume_id.assert_not_called()

@ -1,28 +0,0 @@
From f27bdff18e98548f4c094b8cce23ca2d6270e30d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 16 Jul 2018 14:26:11 +0200
Subject: [PATCH] Remove btrfs from requested libblockdev plugins
---
blivet/__init__.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/blivet/__init__.py b/blivet/__init__.py
index 62cc539a..bbc7ea3a 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -63,9 +63,9 @@ gi.require_version("BlockDev", "2.0")
from gi.repository import GLib
from gi.repository import BlockDev as blockdev
if arch.is_s390():
- _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm"))
+ _REQUESTED_PLUGIN_NAMES = set(("swap", "crypto", "loop", "mdraid", "mpath", "dm", "s390", "nvdimm"))
else:
- _REQUESTED_PLUGIN_NAMES = set(("btrfs", "swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm"))
+ _REQUESTED_PLUGIN_NAMES = set(("swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm"))
_requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES)
# XXX force non-dbus LVM plugin
--
2.37.3

@ -1,330 +0,0 @@
From b9021fde8ccdd14cbe192b6597f7ca350b4bb585 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 26 May 2021 12:15:54 +0200
Subject: [PATCH] Revert "More consistent lvm errors (API break)"
This reverts commit 49ec071c6d0673224a0774d613904387c52c7381.
---
blivet/devices/lvm.py | 72 +++++++++++------------
tests/unit_tests/devices_test/lvm_test.py | 14 ++---
2 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
index 38e49e18..b8595d63 100644
--- a/blivet/devices/lvm.py
+++ b/blivet/devices/lvm.py
@@ -304,7 +304,7 @@ class LVMVolumeGroupDevice(ContainerDevice):
def _add_log_vol(self, lv):
""" Add an LV to this VG. """
if lv in self._lvs:
- raise errors.DeviceError("lv is already part of this vg")
+ raise ValueError("lv is already part of this vg")
# verify we have the space, then add it
# do not verify for growing vg (because of ks)
@@ -337,7 +337,7 @@ class LVMVolumeGroupDevice(ContainerDevice):
def _remove_log_vol(self, lv):
""" Remove an LV from this VG. """
if lv not in self.lvs:
- raise errors.DeviceError("specified lv is not part of this vg")
+ raise ValueError("specified lv is not part of this vg")
self._lvs.remove(lv)
@@ -430,7 +430,7 @@ class LVMVolumeGroupDevice(ContainerDevice):
@thpool_reserve.setter
def thpool_reserve(self, value):
if value is not None and not isinstance(value, ThPoolReserveSpec):
- raise AttributeError("Invalid thpool_reserve given, must be of type ThPoolReserveSpec")
+ raise ValueError("Invalid thpool_reserve given, must be of type ThPoolReserveSpec")
self._thpool_reserve = value
@property
@@ -665,14 +665,14 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
if seg_type not in [None, "linear", "thin", "thin-pool", "cache", "vdo-pool", "vdo", "cache-pool"] + lvm.raid_seg_types:
raise ValueError("Invalid or unsupported segment type: %s" % seg_type)
if seg_type and seg_type in lvm.raid_seg_types and not pvs:
- raise errors.DeviceError("List of PVs has to be given for every non-linear LV")
+ raise ValueError("List of PVs has to be given for every non-linear LV")
elif (not seg_type or seg_type == "linear") and pvs:
if not all(isinstance(pv, LVPVSpec) for pv in pvs):
- raise errors.DeviceError("Invalid specification of PVs for a linear LV: either no or complete "
- "specification (with all space split into PVs has to be given")
+ raise ValueError("Invalid specification of PVs for a linear LV: either no or complete "
+ "specification (with all space split into PVs has to be given")
elif sum(spec.size for spec in pvs) != size:
- raise errors.DeviceError("Invalid specification of PVs for a linear LV: the sum of space "
- "assigned to PVs is not equal to the size of the LV")
+ raise ValueError("Invalid specification of PVs for a linear LV: the sum of space "
+ "assigned to PVs is not equal to the size of the LV")
# When this device's format is set in the superclass constructor it will
# try to access self.snapshots.
@@ -721,13 +721,13 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
self._from_lvs = from_lvs
if self._from_lvs:
if exists:
- raise errors.DeviceError("Only new LVs can be created from other LVs")
+ raise ValueError("Only new LVs can be created from other LVs")
if size or maxsize or percent:
- raise errors.DeviceError("Cannot specify size for a converted LV")
+ raise ValueError("Cannot specify size for a converted LV")
if fmt:
- raise errors.DeviceError("Cannot specify format for a converted LV")
+ raise ValueError("Cannot specify format for a converted LV")
if any(lv.vg != self.vg for lv in self._from_lvs):
- raise errors.DeviceError("Conversion of LVs only possible inside a VG")
+ raise ValueError("Conversion of LVs only possible inside a VG")
self._cache = None
if cache_request and not self.exists:
@@ -746,13 +746,13 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
elif isinstance(pv_spec, StorageDevice):
self._pv_specs.append(LVPVSpec(pv_spec, Size(0)))
else:
- raise AttributeError("Invalid PV spec '%s' for the '%s' LV" % (pv_spec, self.name))
+ raise ValueError("Invalid PV spec '%s' for the '%s' LV" % (pv_spec, self.name))
# Make sure any destination PVs are actually PVs in this VG
if not set(spec.pv for spec in self._pv_specs).issubset(set(self.vg.parents)):
missing = [r.name for r in
set(spec.pv for spec in self._pv_specs).difference(set(self.vg.parents))]
msg = "invalid destination PV(s) %s for LV %s" % (missing, self.name)
- raise errors.DeviceError(msg)
+ raise ValueError(msg)
if self._pv_specs:
self._assign_pv_space()
@@ -1130,7 +1130,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
else:
msg = "the specified internal LV '%s' doesn't belong to this LV ('%s')" % (int_lv.lv_name,
self.name)
- raise errors.DeviceError(msg)
+ raise ValueError(msg)
def populate_ksdata(self, data):
super(LVMLogicalVolumeBase, self).populate_ksdata(data)
@@ -1229,7 +1229,7 @@ class LVMInternalLogicalVolumeMixin(object):
def _init_check(self):
# an internal LV should have no parents
if self._parent_lv and self._parents:
- raise errors.DeviceError("an internal LV should have no parents")
+ raise ValueError("an internal LV should have no parents")
@property
def is_internal_lv(self):
@@ -1289,7 +1289,7 @@ class LVMInternalLogicalVolumeMixin(object):
@readonly.setter
def readonly(self, value): # pylint: disable=unused-argument
- raise errors.DeviceError("Cannot make an internal LV read-write")
+ raise ValueError("Cannot make an internal LV read-write")
@property
def type(self):
@@ -1325,7 +1325,7 @@ class LVMInternalLogicalVolumeMixin(object):
def _check_parents(self):
# an internal LV should have no parents
if self._parents:
- raise errors.DeviceError("an internal LV should have no parents")
+ raise ValueError("an internal LV should have no parents")
def _add_to_parents(self):
# nothing to do here, an internal LV has no parents (in the DeviceTree's
@@ -1335,13 +1335,13 @@ class LVMInternalLogicalVolumeMixin(object):
# internal LVs follow different rules limitting size
def _set_size(self, newsize):
if not isinstance(newsize, Size):
- raise AttributeError("new size must of type Size")
+ raise ValueError("new size must of type Size")
if not self.takes_extra_space:
if newsize <= self.parent_lv.size: # pylint: disable=no-member
self._size = newsize # pylint: disable=attribute-defined-outside-init
else:
- raise errors.DeviceError("Internal LV cannot be bigger than its parent LV")
+ raise ValueError("Internal LV cannot be bigger than its parent LV")
else:
# same rules apply as for any other LV
raise NotTypeSpecific()
@@ -1419,18 +1419,18 @@ class LVMSnapshotMixin(object):
return
if self.origin and not isinstance(self.origin, LVMLogicalVolumeDevice):
- raise errors.DeviceError("lvm snapshot origin must be a logical volume")
+ raise ValueError("lvm snapshot origin must be a logical volume")
if self.vorigin and not self.exists:
- raise errors.DeviceError("only existing vorigin snapshots are supported")
+ raise ValueError("only existing vorigin snapshots are supported")
if isinstance(self.origin, LVMLogicalVolumeDevice) and \
isinstance(self.parents[0], LVMVolumeGroupDevice) and \
self.origin.vg != self.parents[0]:
- raise errors.DeviceError("lvm snapshot and origin must be in the same vg")
+ raise ValueError("lvm snapshot and origin must be in the same vg")
if self.is_thin_lv:
if self.origin and self.size and not self.exists:
- raise errors.DeviceError("thin snapshot size is determined automatically")
+ raise ValueError("thin snapshot size is determined automatically")
@property
def is_snapshot_lv(self):
@@ -1606,7 +1606,7 @@ class LVMThinPoolMixin(object):
def _check_from_lvs(self):
if self._from_lvs:
if len(self._from_lvs) != 2:
- raise errors.DeviceError("two LVs required to create a thin pool")
+ raise ValueError("two LVs required to create a thin pool")
def _convert_from_lvs(self):
data_lv, metadata_lv = self._from_lvs
@@ -1652,7 +1652,7 @@ class LVMThinPoolMixin(object):
def _add_log_vol(self, lv):
""" Add an LV to this pool. """
if lv in self._lvs:
- raise errors.DeviceError("lv is already part of this vg")
+ raise ValueError("lv is already part of this vg")
# TODO: add some checking to prevent overcommit for preexisting
self.vg._add_log_vol(lv)
@@ -1663,7 +1663,7 @@ class LVMThinPoolMixin(object):
def _remove_log_vol(self, lv):
""" Remove an LV from this pool. """
if lv not in self._lvs:
- raise errors.DeviceError("specified lv is not part of this vg")
+ raise ValueError("specified lv is not part of this vg")
self._lvs.remove(lv)
self.vg._remove_log_vol(lv)
@@ -1772,14 +1772,14 @@ class LVMThinLogicalVolumeMixin(object):
"""Check that this device has parents as expected"""
if isinstance(self.parents, (list, ParentList)):
if len(self.parents) != 1:
- raise errors.DeviceError("constructor requires a single thin-pool LV")
+ raise ValueError("constructor requires a single thin-pool LV")
container = self.parents[0]
else:
container = self.parents
if not container or not isinstance(container, LVMLogicalVolumeDevice) or not container.is_thin_pool:
- raise errors.DeviceError("constructor requires a thin-pool LV")
+ raise ValueError("constructor requires a thin-pool LV")
@property
def is_thin_lv(self):
@@ -1816,7 +1816,7 @@ class LVMThinLogicalVolumeMixin(object):
def _set_size(self, newsize):
if not isinstance(newsize, Size):
- raise AttributeError("new size must of type Size")
+ raise ValueError("new size must of type Size")
newsize = self.vg.align(newsize)
newsize = self.vg.align(util.numeric_type(newsize))
@@ -2499,7 +2499,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
container = self.parents
if not isinstance(container, LVMVolumeGroupDevice):
- raise AttributeError("constructor requires a LVMVolumeGroupDevice")
+ raise ValueError("constructor requires a LVMVolumeGroupDevice")
@type_specific
def _add_to_parents(self):
@@ -2510,12 +2510,12 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
@type_specific
def _check_from_lvs(self):
"""Check the LVs to create this LV from"""
- raise errors.DeviceError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type)
+ raise ValueError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type)
@type_specific
def _convert_from_lvs(self):
"""Convert the LVs to create this LV from into its internal LVs"""
- raise errors.DeviceError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type)
+ raise ValueError("Cannot create a new LV of type '%s' from other LVs" % self.seg_type)
@property
def external_dependencies(self):
@@ -2535,7 +2535,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
@type_specific
def _set_size(self, newsize):
if not isinstance(newsize, Size):
- raise AttributeError("new size must be of type Size")
+ raise ValueError("new size must be of type Size")
newsize = self.vg.align(newsize)
log.debug("trying to set lv %s size to %s", self.name, newsize)
@@ -2544,7 +2544,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
# space for it. A similar reasoning applies to shrinking the LV.
if not self.exists and newsize > self.size and newsize > self.vg.free_space + self.vg_space_used:
log.error("failed to set size: %s short", newsize - (self.vg.free_space + self.vg_space_used))
- raise errors.DeviceError("not enough free space in volume group")
+ raise ValueError("not enough free space in volume group")
LVMLogicalVolumeBase._set_size(self, newsize)
@@ -2910,7 +2910,7 @@ class LVMCache(Cache):
spec.size = spec.pv.format.free
space_to_assign -= spec.pv.format.free
if space_to_assign > 0:
- raise errors.DeviceError("Not enough free space in the PVs for this cache: %s short" % space_to_assign)
+ raise ValueError("Not enough free space in the PVs for this cache: %s short" % space_to_assign)
@property
def size(self):
diff --git a/tests/unit_tests/devices_test/lvm_test.py b/tests/unit_tests/devices_test/lvm_test.py
index 47613fdc..995c2da4 100644
--- a/tests/unit_tests/devices_test/lvm_test.py
+++ b/tests/unit_tests/devices_test/lvm_test.py
@@ -32,10 +32,10 @@ class LVMDeviceTest(unittest.TestCase):
lv = LVMLogicalVolumeDevice("testlv", parents=[vg],
fmt=blivet.formats.get_format("xfs"))
- with six.assertRaisesRegex(self, errors.DeviceError, "lvm snapshot origin must be a logical volume"):
+ with six.assertRaisesRegex(self, ValueError, "lvm snapshot origin must be a logical volume"):
LVMLogicalVolumeDevice("snap1", parents=[vg], origin=pv)
- with six.assertRaisesRegex(self, errors.DeviceError, "only existing vorigin snapshots are supported"):
+ with six.assertRaisesRegex(self, ValueError, "only existing vorigin snapshots are supported"):
LVMLogicalVolumeDevice("snap1", parents=[vg], vorigin=True)
lv.exists = True
@@ -60,7 +60,7 @@ class LVMDeviceTest(unittest.TestCase):
pool = LVMLogicalVolumeDevice("pool1", parents=[vg], size=Size("500 MiB"), seg_type="thin-pool")
thinlv = LVMLogicalVolumeDevice("thinlv", parents=[pool], size=Size("200 MiB"), seg_type="thin")
- with six.assertRaisesRegex(self, errors.DeviceError, "lvm snapshot origin must be a logical volume"):
+ with six.assertRaisesRegex(self, ValueError, "lvm snapshot origin must be a logical volume"):
LVMLogicalVolumeDevice("snap1", parents=[pool], origin=pv, seg_type="thin")
# now make the constructor succeed so we can test some properties
@@ -310,21 +310,21 @@ class LVMDeviceTest(unittest.TestCase):
vg = LVMVolumeGroupDevice("testvg", parents=[pv, pv2])
# pvs have to be specified for non-linear LVs
- with self.assertRaises(errors.DeviceError):
+ with self.assertRaises(ValueError):
lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"),
fmt=blivet.formats.get_format("xfs"),
exists=False, seg_type="raid1")
- with self.assertRaises(errors.DeviceError):
+ with self.assertRaises(ValueError):
lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"),
fmt=blivet.formats.get_format("xfs"),
exists=False, seg_type="striped")
# no or complete specification has to be given for linear LVs
- with self.assertRaises(errors.DeviceError):
+ with self.assertRaises(ValueError):
lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"),
fmt=blivet.formats.get_format("xfs"),
exists=False, pvs=[pv])
- with self.assertRaises(errors.DeviceError):
+ with self.assertRaises(ValueError):
pv_spec = LVPVSpec(pv, Size("256 MiB"))
pv_spec2 = LVPVSpec(pv2, Size("250 MiB"))
lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("512 MiB"),
--
2.37.3

@ -0,0 +1,32 @@
From b7940496b4f8efdccb9b4097b496b0d9b2af1eea Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 18 Jun 2024 14:47:39 +0200
Subject: [PATCH] tests: Try waiting after partition creation for XFS resize
test
The test randomly fails to find the newly created partition so
lets try waiting a bit with udev settle.
---
tests/storage_tests/formats_test/fs_test.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py
index f3c9fef5a..5da4a9339 100644
--- a/tests/storage_tests/formats_test/fs_test.py
+++ b/tests/storage_tests/formats_test/fs_test.py
@@ -11,6 +11,7 @@
from blivet.devices import PartitionDevice, DiskDevice
from blivet.flags import flags
from blivet.util import capture_output
+from blivet import udev
from .loopbackedtestcase import LoopBackedTestCase
@@ -149,6 +150,7 @@ def _create_partition(self, disk, size):
pend = pstart + int(Size(size) / disk.format.parted_device.sectorSize)
disk.format.add_partition(pstart, pend, parted.PARTITION_NORMAL)
disk.format.parted_disk.commit()
+ udev.settle()
part = disk.format.parted_disk.getPartitionBySector(pstart)
device = PartitionDevice(os.path.basename(part.path))

@ -1,86 +0,0 @@
From 4ad6f485a1e569feb5fd23ffcf78e08a7756e084 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 17 Aug 2022 14:24:21 +0200
Subject: [PATCH 1/2] Use MD populator instead of DM to handle DDF RAID format
---
blivet/formats/dmraid.py | 2 +-
blivet/formats/mdraid.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/blivet/formats/dmraid.py b/blivet/formats/dmraid.py
index 2ba9dcfe..ce15905d 100644
--- a/blivet/formats/dmraid.py
+++ b/blivet/formats/dmraid.py
@@ -43,7 +43,7 @@ class DMRaidMember(DeviceFormat):
#
# One problem that presents is the possibility of someone passing
# a dmraid member to the MDRaidArrayDevice constructor.
- _udev_types = ["adaptec_raid_member", "ddf_raid_member",
+ _udev_types = ["adaptec_raid_member",
"hpt37x_raid_member", "hpt45x_raid_member",
"isw_raid_member",
"jmicron_raid_member", "lsi_mega_raid_member",
diff --git a/blivet/formats/mdraid.py b/blivet/formats/mdraid.py
index 41ddef81..4aa3f3b0 100644
--- a/blivet/formats/mdraid.py
+++ b/blivet/formats/mdraid.py
@@ -41,7 +41,7 @@ class MDRaidMember(DeviceFormat):
""" An mdraid member disk. """
_type = "mdmember"
_name = N_("software RAID")
- _udev_types = ["linux_raid_member"]
+ _udev_types = ["linux_raid_member", "ddf_raid_member"]
parted_flag = PARTITION_RAID
_formattable = True # can be formatted
_supported = True # is supported
--
2.37.3
From abc7e018f43976cdab286d67207d515a74693d16 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 17 Aug 2022 14:24:58 +0200
Subject: [PATCH 2/2] Do not read DDF RAID UUID from udev
The UUID we get from udev isn't the array UUID, we need to get
that using libblockdev.
---
blivet/populator/helpers/mdraid.py | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/blivet/populator/helpers/mdraid.py b/blivet/populator/helpers/mdraid.py
index 3479e3f7..a7602d20 100644
--- a/blivet/populator/helpers/mdraid.py
+++ b/blivet/populator/helpers/mdraid.py
@@ -98,17 +98,21 @@ class MDFormatPopulator(FormatPopulator):
def _get_kwargs(self):
kwargs = super(MDFormatPopulator, self)._get_kwargs()
- try:
- # ID_FS_UUID contains the array UUID
- kwargs["md_uuid"] = udev.device_get_uuid(self.data)
- except KeyError:
- log.warning("mdraid member %s has no md uuid", udev.device_get_name(self.data))
+ kwargs["biosraid"] = udev.device_is_biosraid_member(self.data)
+ if not kwargs["biosraid"]:
+ try:
+ # ID_FS_UUID contains the array UUID
+ kwargs["md_uuid"] = udev.device_get_uuid(self.data)
+ except KeyError:
+ log.warning("mdraid member %s has no md uuid", udev.device_get_name(self.data))
+ else:
+ # for BIOS RAIDs we can't get the UUID from udev, we'll get it from mdadm in `run` below
+ kwargs["md_uuid"] = None
# reset the uuid to the member-specific value
# this will be None for members of v0 metadata arrays
kwargs["uuid"] = udev.device_get_md_device_uuid(self.data)
- kwargs["biosraid"] = udev.device_is_biosraid_member(self.data)
return kwargs
def run(self):
--
2.37.3

@ -0,0 +1,43 @@
From 52c9699ecad592e35e0cd3841744f8cb8e2b2364 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 12 Jun 2024 16:51:43 +0200
Subject: [PATCH] Run mkfs.xfs with the force (-f) option by default
We stopped adding the force option when switching to libblockdev
in fa3add214ba8edf1965bc851b85f2f2a6a3ea107. This was not
intentional and the missing force option is already causing issues
when running mkfs.xfs on misaligned devices.
---
blivet/tasks/fsmkfs.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/blivet/tasks/fsmkfs.py b/blivet/tasks/fsmkfs.py
index 096b02295..45314ea89 100644
--- a/blivet/tasks/fsmkfs.py
+++ b/blivet/tasks/fsmkfs.py
@@ -241,6 +241,7 @@ class FSBlockDevMkfs(task.BasicApplication, FSMkfsTask, metaclass=abc.ABCMeta):
can_set_uuid = False
can_label = False
fstype = None
+ force = False
def do_task(self, options=None, label=False, set_uuid=False, nodiscard=False):
"""Create the format on the device and label if possible and desired.
@@ -277,7 +278,8 @@ def do_task(self, options=None, label=False, set_uuid=False, nodiscard=False):
try:
bd_options = BlockDev.FSMkfsOptions(label=self.fs.label if label else None,
uuid=self.fs.uuid if set_uuid else None,
- no_discard=self.fs._mkfs_nodiscard if nodiscard else False)
+ no_discard=self.fs._mkfs_nodiscard if nodiscard else False,
+ force=self.force)
BlockDev.fs.mkfs(self.fs.device, self.fstype, bd_options, extra={k: '' for k in create_options})
except BlockDev.FSError as e:
raise FSError(str(e))
@@ -331,6 +333,7 @@ class XFSMkfs(FSBlockDevMkfs):
can_nodiscard = True
can_set_uuid = True
can_label = True
+ force = True
class F2FSMkfs(FSBlockDevMkfs):

@ -1,77 +0,0 @@
From 789dd296988aa9da17d97ece1efc33f9e232648e Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 13 Oct 2022 10:47:52 +0200
Subject: [PATCH] Revert "Remove the Blivet.roots attribute"
This reverts commit 19a826073345ca6b57a8f9a95ec855892320300e.
---
blivet/blivet.py | 21 +++++++++++++++++++++
blivet/devicefactory.py | 3 +++
2 files changed, 24 insertions(+)
diff --git a/blivet/blivet.py b/blivet/blivet.py
index bf72ee9c..dc066b03 100644
--- a/blivet/blivet.py
+++ b/blivet/blivet.py
@@ -88,6 +88,7 @@ class Blivet(object):
self.devicetree = DeviceTree(ignored_disks=self.ignored_disks,
exclusive_disks=self.exclusive_disks,
disk_images=self.disk_images)
+ self.roots = []
@property
def short_product_name(self):
@@ -1314,5 +1315,25 @@ class Blivet(object):
p = partition.disk.format.parted_disk.getPartitionByPath(partition.path)
partition.parted_partition = p
+ for root in new.roots:
+ root.swaps = [new.devicetree.get_device_by_id(d.id, hidden=True) for d in root.swaps]
+ root.swaps = [s for s in root.swaps if s]
+
+ removed = set()
+ for (mountpoint, old_dev) in root.mounts.items():
+ if old_dev is None:
+ continue
+
+ new_dev = new.devicetree.get_device_by_id(old_dev.id, hidden=True)
+ if new_dev is None:
+ # if the device has been removed don't include this
+ # mountpoint at all
+ removed.add(mountpoint)
+ else:
+ root.mounts[mountpoint] = new_dev
+
+ for mnt in removed:
+ del root.mounts[mnt]
+
log.debug("finished Blivet copy")
return new
diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py
index 8105bfc7..6f460f6d 100644
--- a/blivet/devicefactory.py
+++ b/blivet/devicefactory.py
@@ -383,6 +383,7 @@ class DeviceFactory(object):
# used for error recovery
self.__devices = []
self.__actions = []
+ self.__roots = []
def _is_container_encrypted(self):
return all(isinstance(p, LUKSDevice) for p in self.device.container.parents)
@@ -994,10 +995,12 @@ class DeviceFactory(object):
_blivet_copy = self.storage.copy()
self.__devices = _blivet_copy.devicetree._devices
self.__actions = _blivet_copy.devicetree._actions
+ self.__roots = _blivet_copy.roots
def _revert_devicetree(self):
self.storage.devicetree._devices = self.__devices
self.storage.devicetree._actions = self.__actions
+ self.storage.roots = self.__roots
class PartitionFactory(DeviceFactory):
--
2.37.3

@ -0,0 +1,742 @@
From 492122f34fe0ee5d0c7bce7f3dd2ce0ca6e3e9f2 Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Fri, 27 Jan 2023 22:01:23 +0100
Subject: [PATCH 1/7] blivet/zfcp: drop modprobe alias, which is superfluous
since udev in RHEL6
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/zfcp.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/blivet/zfcp.py b/blivet/zfcp.py
index a2b7facb..cd765d82 100644
--- a/blivet/zfcp.py
+++ b/blivet/zfcp.py
@@ -555,9 +555,6 @@ class zFCP:
f.write("%s\n" % (d,))
f.close()
- f = open(root + "/etc/modprobe.conf", "a")
- f.write("alias scsi_hostadapter zfcp\n")
- f.close()
# Create ZFCP singleton
--
2.45.2
From a49fdf291acad957675472f5c27be9e5269c199a Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Tue, 28 Feb 2023 17:23:32 +0100
Subject: [PATCH 2/7] blivet/zfcp: remove code broken since zfcp automatic LUN
scan
The old existing test preceding the removed code was only designed for the
old zfcp before it got automatic LUN scan. Hence, the test is incomplete.
With zfcp auto LUN scan, zfcp can just have SCSI devices without any
zfcp unit representation in sysfs.
Do not bother cleaning up an unused FCP device and just remove the code.
Note: Do not confuse zfcp auto port scan with zfcp auto LUN scan.
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/zfcp.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/blivet/zfcp.py b/blivet/zfcp.py
index cd765d82..e2c0dc2d 100644
--- a/blivet/zfcp.py
+++ b/blivet/zfcp.py
@@ -384,9 +384,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
self.devnum, luns[0])
return True
- # no other WWPNs/LUNs exists for this device number, it's safe to bring it offline
- self._set_zfcp_device_offline()
-
return True
--
2.45.2
From 19285bb785ccbfcd72fd1f3242c56e9d06ba74d8 Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Fri, 27 Jan 2023 22:17:45 +0100
Subject: [PATCH 3/7] blivet/zfcp: drop old zfcp port handling gone from the
kernel long ago
Gone since 2008 Linux kernel v2.6.27 commit 235f7f25f492 ("[SCSI] zfcp:
Remove sysfs attribute port_add").
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/zfcp.py | 65 --------------------------------------------------
1 file changed, 65 deletions(-)
diff --git a/blivet/zfcp.py b/blivet/zfcp.py
index e2c0dc2d..82751382 100644
--- a/blivet/zfcp.py
+++ b/blivet/zfcp.py
@@ -240,7 +240,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
super().online_device()
- portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum)
portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn)
unitadd = "%s/unit_add" % (portdir)
unitdir = "%s/%s" % (portdir, self.fcplun)
@@ -253,31 +252,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated "
"automatically although WWPN and LUN have been provided.", self.devnum)
- # create the sysfs directory for the WWPN/port
- if not os.path.exists(portdir):
- if os.path.exists(portadd):
- # older zfcp sysfs interface
- try:
- logged_write_line_to_file(portadd, self.wwpn)
- udev.settle()
- except OSError as e:
- raise ValueError(_("Could not add WWPN %(wwpn)s to zFCP "
- "device %(devnum)s (%(e)s).")
- % {'wwpn': self.wwpn,
- 'devnum': self.devnum,
- 'e': e})
- else:
- # newer zfcp sysfs interface with auto port scan
- raise ValueError(_("WWPN %(wwpn)s not found at zFCP device "
- "%(devnum)s.") % {'wwpn': self.wwpn,
- 'devnum': self.devnum})
- else:
- if os.path.exists(portadd):
- # older zfcp sysfs interface
- log.info("WWPN %(wwpn)s at zFCP device %(devnum)s already "
- "there.", {'wwpn': self.wwpn,
- 'devnum': self.devnum})
-
# create the sysfs directory for the LUN/unit
if not os.path.exists(unitdir):
try:
@@ -323,10 +297,7 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
def offline_device(self):
"""Remove the zFCP device from the system."""
- portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum)
- portremove = "%s/%s/port_remove" % (zfcpsysfs, self.devnum)
unitremove = "%s/%s/%s/unit_remove" % (zfcpsysfs, self.devnum, self.wwpn)
- portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn)
devdir = "%s/%s" % (zfcpsysfs, self.devnum)
try:
@@ -348,42 +319,6 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
% {'fcplun': self.fcplun, 'wwpn': self.wwpn,
'devnum': self.devnum, 'e': e})
- # remove the WWPN only if there are no other LUNs attached
- if os.path.exists(portadd):
- # only try to remove ports with older zfcp sysfs interface
- for lun in os.listdir(portdir):
- if lun.startswith("0x") and \
- os.path.isdir(os.path.join(portdir, lun)):
- log.info("Not removing WWPN %s at zFCP device %s since port still has other LUNs, e.g. %s.",
- self.wwpn, self.devnum, lun)
- return True
-
- try:
- logged_write_line_to_file(portremove, self.wwpn)
- except OSError as e:
- raise ValueError(_("Could not remove WWPN %(wwpn)s on zFCP "
- "device %(devnum)s (%(e)s).")
- % {'wwpn': self.wwpn,
- 'devnum': self.devnum, 'e': e})
-
- # check if there are other WWPNs existing for the zFCP device number
- if os.path.exists(portadd):
- # older zfcp sysfs interface
- for port in os.listdir(devdir):
- if port.startswith("0x") and \
- os.path.isdir(os.path.join(devdir, port)):
- log.info("Not setting zFCP device %s offline since it still has other ports, e.g. %s.",
- self.devnum, port)
- return True
- else:
- # newer zfcp sysfs interface with auto port scan
- luns = glob.glob("%s/0x????????????????/0x????????????????"
- % (devdir,))
- if len(luns) != 0:
- log.info("Not setting zFCP device %s offline since it still has other LUNs, e.g. %s.",
- self.devnum, luns[0])
- return True
-
return True
--
2.45.2
From cc67470805d871ff6ec09d554fb4b65a375e5b59 Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Tue, 16 Jul 2024 10:21:00 +0200
Subject: [PATCH 4/7] blivet/zfcp: change to consolidated persistent device
config by zdev (#1802482,#1937049)
Implements the zfcp part of referenced bugs.
https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/
handles everything as of
ibm-s390-linux/s390-tools@06a30ae
("zdev/dracut: add rd.zfcp cmdline option handling").
It is no longer necessary to perform individual pre-req steps, such as
setting an FCP device online, when we want to attach a LUN. Just call
chzdev to configure zfcp LUNs and let it do what is necessary, including
cio_ignore handling and udev settle.
The spec file update reflects the new dependency on `chzdev` from the
s390 architecture specific sub-package s390utils-core. Actually, this
commit here only depends on `chzdev` in older versions already packaged
and shipped, so no version comparison necessary here.
Since chzdev now implicitly sets the FCP device online
and there is no more preceding explicit FCP device online,
move the path over-specification warning after the call to chzdev.
Otherwise, the FCP device could still be offline and its
port_type unknown, so has_auto_lun_scan() would get wrong information
regarding the port_type being NPIV.
Anaconda handles the persistent config of all s390 device types as of
commit ("write persistent config of any (dasd,zfcp,znet) s390 devices to
sysroot"), so drop the special handling in zfcp.write().
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/zfcp.py | 99 +++++++++-------------------------------------
python-blivet.spec | 1 +
2 files changed, 20 insertions(+), 80 deletions(-)
diff --git a/blivet/zfcp.py b/blivet/zfcp.py
index 82751382..38ab5668 100644
--- a/blivet/zfcp.py
+++ b/blivet/zfcp.py
@@ -104,8 +104,6 @@ class ZFCPDeviceBase(ABC):
if not self.devnum:
raise ValueError(_("You have not specified a device number or the number is invalid"))
- self._device_online_path = os.path.join(zfcpsysfs, self.devnum, "online")
-
# Force str and unicode types in case any of the properties are unicode
def _to_string(self):
return str(self.devnum)
@@ -113,20 +111,6 @@ class ZFCPDeviceBase(ABC):
def __str__(self):
return self._to_string()
- def _free_device(self):
- """Remove the device from the I/O ignore list to make it visible to the system.
-
- :raises: ValueError if the device cannot be removed from the I/O ignore list
- """
-
- if not os.path.exists(self._device_online_path):
- log.info("Freeing zFCP device %s", self.devnum)
- util.run_program(["zfcp_cio_free", "-d", self.devnum])
-
- if not os.path.exists(self._device_online_path):
- raise ValueError(_("zFCP device %s not found, not even in device ignore list.") %
- (self.devnum,))
-
def _set_zfcp_device_online(self):
"""Set the zFCP device online.
@@ -134,10 +118,8 @@ class ZFCPDeviceBase(ABC):
"""
try:
- with open(self._device_online_path) as f:
- devonline = f.readline().strip()
- if devonline != "1":
- logged_write_line_to_file(self._device_online_path, "1")
+ util.run_program(["chzdev", "--enable", "zfcp-host", self.devnum,
+ "--yes", "--no-root-update", "--force"])
except OSError as e:
raise ValueError(_("Could not set zFCP device %(devnum)s "
"online (%(e)s).")
@@ -150,7 +132,8 @@ class ZFCPDeviceBase(ABC):
"""
try:
- logged_write_line_to_file(self._device_online_path, "0")
+ util.run_program(["chzdev", "--disable", "zfcp-host", self.devnum,
+ "--yes", "--no-root-update", "--force"])
except OSError as e:
raise ValueError(_("Could not set zFCP device %(devnum)s "
"offline (%(e)s).")
@@ -163,6 +146,7 @@ class ZFCPDeviceBase(ABC):
:returns: True or False
"""
+ @abstractmethod
def online_device(self):
"""Initialize the device and make its storage block device(s) ready to use.
@@ -170,10 +154,6 @@ class ZFCPDeviceBase(ABC):
:raises: ValueError if the device cannot be initialized
"""
- self._free_device()
- self._set_zfcp_device_online()
- return True
-
def offline_scsi_device(self):
"""Find SCSI devices associated to the zFCP device and remove them from the system."""
@@ -238,25 +218,15 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
:raises: ValueError if the device cannot be initialized
"""
- super().online_device()
-
portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn)
- unitadd = "%s/unit_add" % (portdir)
unitdir = "%s/%s" % (portdir, self.fcplun)
- failed = "%s/failed" % (unitdir)
-
- # Activating using devnum, WWPN, and LUN despite available zFCP auto LUN scan should still
- # be possible as this method was used as a workaround until the support for zFCP auto LUN
- # scan devices has been implemented. Just log a warning message and continue.
- if has_auto_lun_scan(self.devnum):
- log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated "
- "automatically although WWPN and LUN have been provided.", self.devnum)
# create the sysfs directory for the LUN/unit
if not os.path.exists(unitdir):
try:
- logged_write_line_to_file(unitadd, self.fcplun)
- udev.settle()
+ util.run_program(["chzdev", "--enable", "zfcp-lun",
+ "%s:%s:%s" % (self.devnum, self.wwpn, self.fcplun),
+ "--yes", "--no-root-update", "--force"])
except OSError as e:
raise ValueError(_("Could not add LUN %(fcplun)s to WWPN "
"%(wwpn)s on zFCP device %(devnum)s "
@@ -270,48 +240,23 @@ class ZFCPDeviceFullPath(ZFCPDeviceBase):
'wwpn': self.wwpn,
'devnum': self.devnum})
- # check the state of the LUN
- fail = "0"
- try:
- f = open(failed, "r")
- fail = f.readline().strip()
- f.close()
- except OSError as e:
- raise ValueError(_("Could not read failed attribute of LUN "
- "%(fcplun)s at WWPN %(wwpn)s on zFCP device "
- "%(devnum)s (%(e)s).")
- % {'fcplun': self.fcplun,
- 'wwpn': self.wwpn,
- 'devnum': self.devnum,
- 'e': e})
- if fail != "0":
- self.offline_device()
- raise ValueError(_("Failed LUN %(fcplun)s at WWPN %(wwpn)s on "
- "zFCP device %(devnum)s removed again.")
- % {'fcplun': self.fcplun,
- 'wwpn': self.wwpn,
- 'devnum': self.devnum})
+ # Activating using devnum, WWPN, and LUN despite available zFCP auto LUN scan should still
+ # be possible as this method was used as a workaround until the support for zFCP auto LUN
+ # scan devices has been implemented. Just log a warning message and continue.
+ if has_auto_lun_scan(self.devnum):
+ log.warning("zFCP device %s in NPIV mode brought online. All LUNs will be activated "
+ "automatically although WWPN and LUN have been provided.", self.devnum)
return True
def offline_device(self):
"""Remove the zFCP device from the system."""
- unitremove = "%s/%s/%s/unit_remove" % (zfcpsysfs, self.devnum, self.wwpn)
- devdir = "%s/%s" % (zfcpsysfs, self.devnum)
-
- try:
- self.offline_scsi_device()
- except OSError as e:
- raise ValueError(_("Could not correctly delete SCSI device of "
- "zFCP %(devnum)s %(wwpn)s %(fcplun)s "
- "(%(e)s).")
- % {'devnum': self.devnum, 'wwpn': self.wwpn,
- 'fcplun': self.fcplun, 'e': e})
-
# remove the LUN
try:
- logged_write_line_to_file(unitremove, self.fcplun)
+ util.run_program(["chzdev", "--disable", "zfcp-lun",
+ "%s:%s:%s" % (self.devnum, self.wwpn, self.fcplun),
+ "--yes", "--no-root-update", "--force"])
except OSError as e:
raise ValueError(_("Could not remove LUN %(fcplun)s at WWPN "
"%(wwpn)s on zFCP device %(devnum)s "
@@ -340,7 +285,7 @@ class ZFCPDeviceAutoLunScan(ZFCPDeviceBase):
:raises: ValueError if the device cannot be initialized
"""
- super().online_device()
+ self._set_zfcp_device_online()
if not has_auto_lun_scan(self.devnum):
raise ValueError(_("zFCP device %s cannot use auto LUN scan.") % self)
@@ -480,13 +425,7 @@ class zFCP:
log.warning("%s", str(e))
def write(self, root):
- if len(self.fcpdevs) == 0:
- return
- f = open(root + zfcpconf, "w")
- for d in self.fcpdevs:
- f.write("%s\n" % (d,))
- f.close()
-
+ pass
# Create ZFCP singleton
diff --git a/python-blivet.spec b/python-blivet.spec
index 38a389ae..ac8d2841 100644
--- a/python-blivet.spec
+++ b/python-blivet.spec
@@ -70,6 +70,7 @@ Recommends: libblockdev-swap >= %{libblockdevver}
%ifarch s390 s390x
Recommends: libblockdev-s390 >= %{libblockdevver}
+Requires: s390utils-core
%endif
Requires: python3-bytesize >= %{libbytesizever}
--
2.45.2
From 6c4e57d78562962f014970c32381891c71f05e3b Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Tue, 31 Jan 2023 12:01:31 +0100
Subject: [PATCH 5/7] blivet/zfcp: remove no longer used read_config
functionality (#1802482,#1937049)
Implements the zfcp part of referenced bugs.
Since
https://github.com/rhinstaller/anaconda/commit/87ab1ab2a3aa8b95cd75b2f37e0881e5f57656a5
("Support cio_ignore functionality for zFCP devices (#533492)"),
/etc/zfcp.conf replaced /tmp/fcpconfig.
Since
https://github.com/rhinstaller/anaconda/commit/011ea0a1779459ed20990ddf52166aa75a9c1382
("Remove linuxrc.s390"), /etc/zfcp.conf only exists if the user specified
dracut cmdline parameter rd.zfcp=.
https://github.com/ibm-s390-linux/s390-tools/tree/master/zdev/
handles parsing of rd.zfcp= without /etc/zfcp.conf as of
https://github.com/ibm-s390-linux/s390-tools/commit/06a30ae529a5d6ad2369ed81da056bf3a6147bb6
("zdev/dracut: add rd.zfcp cmdline option handling").
https://src.fedoraproject.org/rpms/s390utils.git
no longer writes /etc/zfcp.conf during deprecated parsing of rd.zfcp=
as of commit
("zfcp: migrate to consolidated persistent device config with zdev")
Hence, nothing populates /etc/zfcp.conf during installer boot anymore.
Anaconda imports configuration for all s390 device types as of
commit ("write persistent config of any (dasd,zfcp,znet) s390 devices to
sysroot"). The only remaining import source is from dracut boot parameters.
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/zfcp.py | 60 ++++++++------------------------------------------
1 file changed, 9 insertions(+), 51 deletions(-)
diff --git a/blivet/zfcp.py b/blivet/zfcp.py
index 38ab5668..a33eb48b 100644
--- a/blivet/zfcp.py
+++ b/blivet/zfcp.py
@@ -45,7 +45,6 @@ def logged_write_line_to_file(fn, value):
zfcpsysfs = "/sys/bus/ccw/drivers/zfcp"
scsidevsysfs = "/sys/bus/scsi/devices"
-zfcpconf = "/etc/zfcp.conf"
def _is_lun_scan_allowed():
@@ -323,18 +322,22 @@ class zFCP:
""" ZFCP utility class.
- This class will automatically online to ZFCP drives configured in
- /tmp/fcpconfig when the startup() method gets called. It can also be
- used to manually configure ZFCP devices through the add_fcp() method.
+ This class is used to manually configure ZFCP devices through the
+ add_fcp() method, which is used by the anaconda GUI or by kickstart.
- As this class needs to make sure that /tmp/fcpconfig configured
+ As this class needs to make sure that configured
drives are only onlined once and as it keeps a global list of all ZFCP
devices it is implemented as a Singleton.
+
+ In particular, this class does not create objects for any other method
+ that enables ZFCP devices such as rd.zfcp= or any device auto
+ configuration. These methods make zfcp-attached SCSI disk block devices
+ available, which ZFCPDiskDevice [devices/disk.py] can directly
+ discover.
"""
def __init__(self):
self.fcpdevs = set()
- self.has_read_config = False
self.down = True
# So that users can write zfcp() to get the singleton instance
@@ -345,46 +348,6 @@ class zFCP:
# pylint: disable=unused-argument
return self
- def read_config(self):
- try:
- f = open(zfcpconf, "r")
- except OSError:
- log.info("no %s; not configuring zfcp", zfcpconf)
- return
-
- lines = [x.strip().lower() for x in f.readlines()]
- f.close()
-
- for line in lines:
- if line.startswith("#") or line == '':
- continue
-
- fields = line.split()
-
- # zFCP auto LUN scan available
- if len(fields) == 1:
- devnum = fields[0]
- wwpn = None
- fcplun = None
- elif len(fields) == 3:
- devnum = fields[0]
- wwpn = fields[1]
- fcplun = fields[2]
- elif len(fields) == 5:
- # support old syntax of:
- # devno scsiid wwpn scsilun fcplun
- devnum = fields[0]
- wwpn = fields[2]
- fcplun = fields[4]
- else:
- log.warning("Invalid line found in %s: %s", zfcpconf, line)
- continue
-
- try:
- self.add_fcp(devnum, wwpn, fcplun)
- except ValueError as e:
- log.warning("%s", str(e))
-
def add_fcp(self, devnum, wwpn=None, fcplun=None):
if wwpn and fcplun:
d = ZFCPDeviceFullPath(devnum, wwpn, fcplun)
@@ -410,11 +373,6 @@ class zFCP:
if not self.down:
return
self.down = False
- if not self.has_read_config:
- self.read_config()
- self.has_read_config = True
- # read_config calls add_fcp which calls online_device already
- return
if len(self.fcpdevs) == 0:
return
--
2.45.2
From e119e1e48a8a8bc83ec42d3c6ab31fac7c4a98eb Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Tue, 28 Feb 2023 17:48:04 +0100
Subject: [PATCH 6/7] respect explicit user choice for full path in zfcp
dracut_setup_args
Complements RHBZ#1937030.
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/devices/disk.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py
index 4ae4a845..edbf41c4 100644
--- a/blivet/devices/disk.py
+++ b/blivet/devices/disk.py
@@ -498,7 +498,12 @@ class ZFCPDiskDevice(DiskDevice):
from ..zfcp import has_auto_lun_scan
# zFCP auto LUN scan needs only the device ID
- if has_auto_lun_scan(self.hba_id):
+ # If the user explicitly over-specified with a full path configuration
+ # respect this choice and emit a full path specification nonetheless.
+ errorlevel = util.run_program(["lszdev", "zfcp-lun", "--configured",
+ "%s:%s:%s" % (self.hba_id, self.wwpn,
+ self.fcp_lun)])
+ if has_auto_lun_scan(self.hba_id) and errorlevel != 0:
dracut_args = set(["rd.zfcp=%s" % self.hba_id])
else:
dracut_args = set(["rd.zfcp=%s,%s,%s" % (self.hba_id, self.wwpn, self.fcp_lun,)])
--
2.45.2
From 4c2d39c4fcea9361b60d99327a9eb8b9d89078fb Mon Sep 17 00:00:00 2001
From: Steffen Maier <maier@linux.ibm.com>
Date: Tue, 16 Jul 2024 10:22:55 +0200
Subject: [PATCH 7/7] DASDDevice: dracut_setup_args() without deprecated
dasd.conf (#1802482,#1937049)
Implements the dasd part of referenced bugs.
Depends on
ibm-s390-linux/s390-tools@689b894
("zdev: add helper to convert from zdev config to dasd_mod.dasd").
The spec file update reflects the new dependency on `zdev-to-dasd_mod.dasd`
in the new v2.31.0 of the s390 architecture specific sub-package
s390utils-core.
Delegate the generation of rd.dasd statements to a helper tool from
s390-tools, which gets its low-level config information from the
consolidated persistent configuration mechanism using chzdev.
Signed-off-by: Steffen Maier <maier@linux.ibm.com>
---
blivet/devices/disk.py | 56 +++-----------------------------
blivet/populator/helpers/disk.py | 3 --
python-blivet.spec | 3 +-
3 files changed, 6 insertions(+), 56 deletions(-)
diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py
index edbf41c4..a849e7ac 100644
--- a/blivet/devices/disk.py
+++ b/blivet/devices/disk.py
@@ -530,67 +530,19 @@ class DASDDevice(DiskDevice):
:type format: :class:`~.formats.DeviceFormat` or a subclass of it
:keyword str wwn: the disk's WWN
:keyword busid: bus ID
- :keyword opts: options
- :type opts: dict with option name keys and option value values
"""
self.busid = kwargs.pop('busid')
- self.opts = kwargs.pop('opts')
DiskDevice.__init__(self, device, **kwargs)
@property
def description(self):
return "DASD device %s" % self.busid
- def get_opts(self):
- return ["%s=%s" % (k, v) for k, v in self.opts.items() if v == '1']
-
def dracut_setup_args(self):
- conf = "/etc/dasd.conf"
- line = None
- if os.path.isfile(conf):
- f = open(conf)
- # grab the first line that starts with our bus_id
- for l in f.readlines():
- if l.startswith(self.busid):
- line = l.rstrip()
- break
-
- f.close()
-
- # See if we got a line. If not, grab our get_opts
- if not line:
- line = self.busid
- for devopt in self.get_opts():
- line += " %s" % devopt
-
- # Create a translation mapping from dasd.conf format to module format
- translate = {'use_diag': 'diag',
- 'readonly': 'ro',
- 'erplog': 'erplog',
- 'failfast': 'failfast'}
-
- # this is a really awkward way of determining if the
- # feature found is actually desired (1, not 0), plus
- # translating that feature into the actual kernel module
- # value
- opts = []
- parts = line.split()
- for chunk in parts[1:]:
- try:
- feat, val = chunk.split('=')
- if int(val):
- opts.append(translate[feat])
- except (ValueError, KeyError):
- # If we don't know what the feature is (feat not in translate
- # or if we get a val that doesn't cleanly convert to an int
- # we can't do anything with it.
- log.warning("failed to parse dasd feature %s", chunk)
-
- if opts:
- return set(["rd.dasd=%s(%s)" % (self.busid,
- ":".join(opts))])
- else:
- return set(["rd.dasd=%s" % self.busid])
+ devspec = util.capture_output(["/lib/s390-tools/zdev-to-dasd_mod.dasd",
+ "persistent", self.busid]).strip()
+ # strip to remove trailing newline, which must not appear in zipl BLS
+ return set(["rd.dasd=%s" % devspec])
NVMeController = namedtuple("NVMeController", ["name", "serial", "nvme_ver", "id", "subsysnqn",
diff --git a/blivet/populator/helpers/disk.py b/blivet/populator/helpers/disk.py
index 3ac3f408..fc47f62a 100644
--- a/blivet/populator/helpers/disk.py
+++ b/blivet/populator/helpers/disk.py
@@ -204,9 +204,6 @@ class DASDDevicePopulator(DiskDevicePopulator):
def _get_kwargs(self):
kwargs = super(DASDDevicePopulator, self)._get_kwargs()
kwargs["busid"] = udev.device_get_dasd_bus_id(self.data)
- kwargs["opts"] = {}
- for attr in ['readonly', 'use_diag', 'erplog', 'failfast']:
- kwargs["opts"][attr] = udev.device_get_dasd_flag(self.data, attr)
log.info("%s is a dasd device", udev.device_get_name(self.data))
return kwargs
diff --git a/python-blivet.spec b/python-blivet.spec
index ac8d2841..81177020 100644
--- a/python-blivet.spec
+++ b/python-blivet.spec
@@ -21,6 +21,7 @@ Source1: http://github.com/storaged-project/blivet/archive/%{realname}-%{realver
%global libblockdevver 3.0
%global libbytesizever 0.3
%global pyudevver 0.18
+%global s390utilscorever 2.31.0
BuildArch: noarch
@@ -70,7 +71,7 @@ Recommends: libblockdev-swap >= %{libblockdevver}
%ifarch s390 s390x
Recommends: libblockdev-s390 >= %{libblockdevver}
-Requires: s390utils-core
+Requires: s390utils-core >= %{s390utilscorever}
%endif
Requires: python3-bytesize >= %{libbytesizever}
--
2.45.2

@ -1,45 +0,0 @@
From 7931a74e691979dd23a16e7a017b4ef5bc296b79 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 18 Oct 2022 12:28:37 +0200
Subject: [PATCH] Fix potential AttributeError when getting stratis blockdev
info
---
blivet/static_data/stratis_info.py | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/blivet/static_data/stratis_info.py b/blivet/static_data/stratis_info.py
index bd1c5a18..42f230ee 100644
--- a/blivet/static_data/stratis_info.py
+++ b/blivet/static_data/stratis_info.py
@@ -124,20 +124,22 @@ class StratisInfo(object):
log.error("Failed to get DBus properties of '%s'", blockdev_path)
return None
+ blockdev_uuid = str(uuid.UUID(properties["Uuid"]))
+
pool_path = properties["Pool"]
if pool_path == "/":
pool_name = ""
+ return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid,
+ pool_name="", pool_uuid="", object_path=blockdev_path)
else:
pool_info = self._get_pool_info(properties["Pool"])
if not pool_info:
return None
pool_name = pool_info.name
- blockdev_uuid = str(uuid.UUID(properties["Uuid"]))
-
- return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid,
- pool_name=pool_name, pool_uuid=pool_info.uuid,
- object_path=blockdev_path)
+ return StratisBlockdevInfo(path=properties["Devnode"], uuid=blockdev_uuid,
+ pool_name=pool_name, pool_uuid=pool_info.uuid,
+ object_path=blockdev_path)
def _get_locked_pools_info(self):
locked_pools = []
--
2.37.3

@ -0,0 +1,23 @@
From a21c4fa61f75f6c900f152651308ac9b457a62da Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 23 May 2024 15:31:47 +0200
Subject: [PATCH] Remove support for the MD linear RAID level
The md-linear kernel module is deprecated and will be removed in
the future.
---
blivet/devicelibs/mdraid.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py
index 3b60c87c4..0ef3d0a4f 100644
--- a/blivet/devicelibs/mdraid.py
+++ b/blivet/devicelibs/mdraid.py
@@ -45,6 +45,6 @@ def is_raid_level(cls, level):
hasattr(level, 'get_size')
-raid_levels = MDRaidLevels(["raid0", "raid1", "raid4", "raid5", "raid6", "raid10", "linear"])
+raid_levels = MDRaidLevels(["raid0", "raid1", "raid4", "raid5", "raid6", "raid10"])
EXTERNAL_DEPENDENCIES = [availability.BLOCKDEV_MDRAID_PLUGIN]

@ -0,0 +1,27 @@
From 7677fc312b821a9c67750220f2494d06f2357780 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 18 Sep 2024 15:30:05 +0200
Subject: [PATCH] Fix checking for NVMe plugin availability
---
blivet/nvme.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/blivet/nvme.py b/blivet/nvme.py
index 4309dea3..72a47070 100644
--- a/blivet/nvme.py
+++ b/blivet/nvme.py
@@ -76,6 +76,10 @@ class NVMe(object):
return False
if not hasattr(blockdev.NVMETech, "FABRICS"):
return False
+ try:
+ blockdev.nvme.is_tech_avail(blockdev.NVMETech.FABRICS, 0) # pylint: disable=no-member
+ except (blockdev.BlockDevNotImplementedError, blockdev.NVMEError):
+ return False
return True
def startup(self):
--
2.46.1

@ -1,27 +0,0 @@
From b747c4ed07937f54a546ffb2f2c8c95e0797dd6c Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 20 Oct 2022 15:19:29 +0200
Subject: [PATCH] tests: Skip XFS resize test on CentOS/RHEL 9
Partitions on loop devices are broken on CentOS/RHEL 9.
---
tests/skip.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tests/skip.yml b/tests/skip.yml
index 568c3fff..66b34493 100644
--- a/tests/skip.yml
+++ b/tests/skip.yml
@@ -29,3 +29,9 @@
- distro: "centos"
version: "9"
reason: "Creating RAID 1 LV on CentOS/RHEL 9 causes a system deadlock"
+
+- test: storage_tests.formats_test.fs_test.XFSTestCase.test_resize
+ skip_on:
+ - distro: ["centos", "enterprise_linux"]
+ version: "9"
+ reason: "Creating partitions on loop devices is broken on CentOS/RHEL 9 latest kernel"
--
2.37.3

@ -0,0 +1,30 @@
From ad7966a456224f22729c55616f2c8c73321654c7 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 24 Oct 2024 12:18:58 +0200
Subject: [PATCH] Align sizes up for growable LVs
Growable LVs usually start at minimum size so adjusting it down
can change the size below allowed minimum.
Resolves: RHEL-45180
Resolves: RHEL-45181
---
blivet/devices/lvm.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
index 661881ea..661dc6e0 100644
--- a/blivet/devices/lvm.py
+++ b/blivet/devices/lvm.py
@@ -2673,7 +2673,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
if not isinstance(newsize, Size):
raise AttributeError("new size must be of type Size")
- newsize = self.vg.align(newsize)
+ newsize = self.vg.align(newsize, roundup=self.growable)
log.debug("trying to set lv %s size to %s", self.name, newsize)
# Don't refuse to set size if we think there's not enough space in the
# VG for an existing LV, since it's existence proves there is enough
--
2.47.0

@ -1,160 +0,0 @@
From 9618b84f94187efddc7316c2546bed923a91ecf9 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 3 Nov 2022 08:36:27 +0100
Subject: [PATCH 1/2] Revert "Set XFS minimal size to 300 MiB"
This reverts commit 307d49833771d161314bae50c68e70dc35c3bb36.
---
blivet/formats/fs.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py
index 8c346aa5..33922f3a 100644
--- a/blivet/formats/fs.py
+++ b/blivet/formats/fs.py
@@ -1091,7 +1091,7 @@ class XFS(FS):
_modules = ["xfs"]
_labelfs = fslabeling.XFSLabeling()
_uuidfs = fsuuid.XFSUUID()
- _min_size = Size("300 MiB")
+ _min_size = Size("16 MiB")
_max_size = Size("16 EiB")
_formattable = True
_linux_native = True
--
2.38.1
From 24d94922d6879baa85aaa101f6b21efa568a9cbc Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 3 Nov 2022 08:36:39 +0100
Subject: [PATCH 2/2] Revert "tests: Create bigger devices for XFS testing"
This reverts commit 467cb8024010b2cabb1e92d9e64f6d3cbe949ad9.
---
tests/storage_tests/formats_test/fs_test.py | 7 +++----
tests/storage_tests/formats_test/fslabeling.py | 4 +---
tests/storage_tests/formats_test/fsuuid.py | 4 +---
tests/storage_tests/formats_test/labeling_test.py | 2 --
tests/storage_tests/formats_test/uuid_test.py | 3 ---
5 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py
index cf8fb441..97f4cbbe 100644
--- a/tests/storage_tests/formats_test/fs_test.py
+++ b/tests/storage_tests/formats_test/fs_test.py
@@ -54,7 +54,6 @@ class ReiserFSTestCase(fstesting.FSAsRoot):
class XFSTestCase(fstesting.FSAsRoot):
_fs_class = fs.XFS
- _DEVICE_SIZE = Size("500 MiB")
def can_resize(self, an_fs):
resize_tasks = (an_fs._resize, an_fs._size_info)
@@ -96,12 +95,12 @@ class XFSTestCase(fstesting.FSAsRoot):
self.assertFalse(an_fs.resizable)
# Not resizable, so can not do resizing actions.
with self.assertRaises(DeviceFormatError):
- an_fs.target_size = Size("300 MiB")
+ an_fs.target_size = Size("64 MiB")
with self.assertRaises(DeviceFormatError):
an_fs.do_resize()
else:
disk = DiskDevice(os.path.basename(self.loop_devices[0]))
- part = self._create_partition(disk, Size("300 MiB"))
+ part = self._create_partition(disk, Size("50 MiB"))
an_fs = self._fs_class()
an_fs.device = part.path
self.assertIsNone(an_fs.create())
@@ -114,7 +113,7 @@ class XFSTestCase(fstesting.FSAsRoot):
part = self._create_partition(disk, size=part.size + Size("40 MiB"))
# Try a reasonable target size
- TARGET_SIZE = Size("325 MiB")
+ TARGET_SIZE = Size("64 MiB")
an_fs.target_size = TARGET_SIZE
self.assertEqual(an_fs.target_size, TARGET_SIZE)
self.assertNotEqual(an_fs._size, TARGET_SIZE)
diff --git a/tests/storage_tests/formats_test/fslabeling.py b/tests/storage_tests/formats_test/fslabeling.py
index ebe0b70a..0e0dc261 100644
--- a/tests/storage_tests/formats_test/fslabeling.py
+++ b/tests/storage_tests/formats_test/fslabeling.py
@@ -21,10 +21,8 @@ class LabelingAsRoot(loopbackedtestcase.LoopBackedTestCase):
_invalid_label = abc.abstractproperty(
doc="A label which is invalid for this filesystem.")
- _DEVICE_SIZE = Size("100 MiB")
-
def __init__(self, methodName='run_test'):
- super(LabelingAsRoot, self).__init__(methodName=methodName, device_spec=[self._DEVICE_SIZE])
+ super(LabelingAsRoot, self).__init__(methodName=methodName, device_spec=[Size("100 MiB")])
def setUp(self):
an_fs = self._fs_class()
diff --git a/tests/storage_tests/formats_test/fsuuid.py b/tests/storage_tests/formats_test/fsuuid.py
index 0b9762fd..16aa19a6 100644
--- a/tests/storage_tests/formats_test/fsuuid.py
+++ b/tests/storage_tests/formats_test/fsuuid.py
@@ -23,11 +23,9 @@ class SetUUID(loopbackedtestcase.LoopBackedTestCase):
_invalid_uuid = abc.abstractproperty(
doc="An invalid UUID for this filesystem.")
- _DEVICE_SIZE = Size("100 MiB")
-
def __init__(self, methodName='run_test'):
super(SetUUID, self).__init__(methodName=methodName,
- device_spec=[self._DEVICE_SIZE])
+ device_spec=[Size("100 MiB")])
def setUp(self):
an_fs = self._fs_class()
diff --git a/tests/storage_tests/formats_test/labeling_test.py b/tests/storage_tests/formats_test/labeling_test.py
index 0702260a..d24e6619 100644
--- a/tests/storage_tests/formats_test/labeling_test.py
+++ b/tests/storage_tests/formats_test/labeling_test.py
@@ -1,7 +1,6 @@
import unittest
from blivet.formats import device_formats
-from blivet.size import Size
import blivet.formats.fs as fs
import blivet.formats.swap as swap
@@ -62,7 +61,6 @@ class InitializationTestCase(unittest.TestCase):
class XFSTestCase(fslabeling.CompleteLabelingAsRoot):
_fs_class = fs.XFS
_invalid_label = "root filesystem"
- _DEVICE_SIZE = Size("500 MiB")
class FATFSTestCase(fslabeling.CompleteLabelingAsRoot):
diff --git a/tests/storage_tests/formats_test/uuid_test.py b/tests/storage_tests/formats_test/uuid_test.py
index af35c0ee..ee8d452e 100644
--- a/tests/storage_tests/formats_test/uuid_test.py
+++ b/tests/storage_tests/formats_test/uuid_test.py
@@ -2,7 +2,6 @@ import unittest
import blivet.formats.fs as fs
import blivet.formats.swap as swap
-from blivet.size import Size
from . import fsuuid
@@ -53,14 +52,12 @@ class XFSTestCase(fsuuid.SetUUIDWithMkFs):
_fs_class = fs.XFS
_invalid_uuid = "abcdefgh-ijkl-mnop-qrst-uvwxyz123456"
_valid_uuid = "97e3d40f-dca8-497d-8b86-92f257402465"
- _DEVICE_SIZE = Size("500 MiB")
class XFSAfterTestCase(fsuuid.SetUUIDAfterMkFs):
_fs_class = fs.XFS
_invalid_uuid = "abcdefgh-ijkl-mnop-qrst-uvwxyz123456"
_valid_uuid = "97e3d40f-dca8-497d-8b86-92f257402465"
- _DEVICE_SIZE = Size("500 MiB")
class FATFSTestCase(fsuuid.SetUUIDWithMkFs):
--
2.38.1

@ -1,55 +0,0 @@
From fed62af06eb1584adbacd821dfe79c2df52c6aa4 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 2 Nov 2022 12:14:28 +0100
Subject: [PATCH] Catch BlockDevNotImplementedError for btrfs plugin calls
This is a workaround for RHEL where the btrfs plugin is not
available and where we might still try to call some libblockdev
functions to gather information about preexisting btrfs devices.
---
blivet/devices/btrfs.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py
index 0e029715..1ae6a04d 100644
--- a/blivet/devices/btrfs.py
+++ b/blivet/devices/btrfs.py
@@ -362,7 +362,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice):
try:
subvols = blockdev.btrfs.list_subvolumes(mountpoint,
snapshots_only=snapshots_only)
- except blockdev.BtrfsError as e:
+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e:
log.debug("failed to list subvolumes: %s", e)
else:
self._get_default_subvolume_id()
@@ -400,7 +400,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice):
with self._do_temp_mount() as mountpoint:
try:
subvolid = blockdev.btrfs.get_default_subvolume_id(mountpoint)
- except blockdev.BtrfsError as e:
+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e:
log.debug("failed to get default subvolume id: %s", e)
self._default_subvolume_id = subvolid
@@ -413,7 +413,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice):
with self._do_temp_mount() as mountpoint:
try:
blockdev.btrfs.set_default_subvolume(mountpoint, vol_id)
- except blockdev.BtrfsError as e:
+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e:
log.error("failed to set new default subvolume id (%s): %s",
vol_id, e)
# The only time we set a new default subvolume is so we can remove
@@ -471,7 +471,7 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice):
if not self.format.vol_uuid:
try:
bd_info = blockdev.btrfs.filesystem_info(self.parents[0].path)
- except blockdev.BtrfsError as e:
+ except (blockdev.BtrfsError, blockdev.BlockDevNotImplementedError) as e:
log.error("failed to get filesystem info for new btrfs volume %s", e)
else:
self.format.vol_uuid = bd_info.uuid
--
2.38.1

@ -0,0 +1,32 @@
From c2177aa362d20278a0ebd5c25a776f952d83e5b1 Mon Sep 17 00:00:00 2001
From: Jan Pokorny <japokorn@redhat.com>
Date: Fri, 11 Oct 2024 17:17:41 +0200
Subject: [PATCH] Modified passphrase in stratis test
FIPS requires at least 8 chars long passphrase. Dummy passphrase used
in stratis test was too short causing encryption
tests with FIPS enabled to fail.
Changed passphrase.
fixes RHEL-45173, RHEL-8029
---
tests/storage_tests/devices_test/stratis_test.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/storage_tests/devices_test/stratis_test.py b/tests/storage_tests/devices_test/stratis_test.py
index 5aaa12d4..21c4d0f5 100644
--- a/tests/storage_tests/devices_test/stratis_test.py
+++ b/tests/storage_tests/devices_test/stratis_test.py
@@ -230,7 +230,7 @@ class StratisTestCaseClevis(StratisTestCaseBase):
blivet.partitioning.do_partitioning(self.storage)
pool = self.storage.new_stratis_pool(name="blivetTestPool", parents=[bd],
- encrypted=True, passphrase="abcde",
+ encrypted=True, passphrase="fipsneeds8chars",
clevis=StratisClevisConfig(pin="tang",
tang_url=self._tang_server,
tang_thumbprint=None))
--
2.45.0

@ -1,590 +0,0 @@
From 9383855c8a15e6d7c4033cd8d7ae8310b462d166 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 18 Oct 2022 10:38:00 +0200
Subject: [PATCH 1/3] Add a basic support for NVMe and NVMe Fabrics devices
This adds two new device types: NVMeNamespaceDevice and
NVMeFabricsNamespaceDevice mostly to allow to differentiate
between "local" and "remote" NVMe devices. The new libblockdev
NVMe plugin is required for full functionality.
---
blivet/__init__.py | 6 +-
blivet/devices/__init__.py | 2 +-
blivet/devices/disk.py | 101 ++++++++++++++++++++++
blivet/devices/lib.py | 1 +
blivet/populator/helpers/__init__.py | 2 +-
blivet/populator/helpers/disk.py | 64 ++++++++++++++
blivet/udev.py | 33 +++++++
blivet/util.py | 9 ++
tests/unit_tests/populator_test.py | 124 +++++++++++++++++++++++++++
9 files changed, 339 insertions(+), 3 deletions(-)
diff --git a/blivet/__init__.py b/blivet/__init__.py
index bbc7ea3a..3b9e659e 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -67,6 +67,10 @@ if arch.is_s390():
else:
_REQUESTED_PLUGIN_NAMES = set(("swap", "crypto", "loop", "mdraid", "mpath", "dm", "nvdimm"))
+# nvme plugin is not generally available
+if hasattr(blockdev.Plugin, "NVME"):
+ _REQUESTED_PLUGIN_NAMES.add("nvme")
+
_requested_plugins = blockdev.plugin_specs_from_names(_REQUESTED_PLUGIN_NAMES)
# XXX force non-dbus LVM plugin
lvm_plugin = blockdev.PluginSpec()
@@ -74,7 +78,7 @@ lvm_plugin.name = blockdev.Plugin.LVM
lvm_plugin.so_name = "libbd_lvm.so.2"
_requested_plugins.append(lvm_plugin)
try:
- # do not check for dependencies during libblockdev initializtion, do runtime
+ # do not check for dependencies during libblockdev initialization, do runtime
# checks instead
blockdev.switch_init_checks(False)
succ_, avail_plugs = blockdev.try_reinit(require_plugins=_requested_plugins, reload=False, log_func=log_bd_message)
diff --git a/blivet/devices/__init__.py b/blivet/devices/__init__.py
index 8bb0a979..4d16466e 100644
--- a/blivet/devices/__init__.py
+++ b/blivet/devices/__init__.py
@@ -22,7 +22,7 @@
from .lib import device_path_to_name, device_name_to_disk_by_path, ParentList
from .device import Device
from .storage import StorageDevice
-from .disk import DiskDevice, DiskFile, DMRaidArrayDevice, MultipathDevice, iScsiDiskDevice, FcoeDiskDevice, DASDDevice, ZFCPDiskDevice, NVDIMMNamespaceDevice
+from .disk import DiskDevice, DiskFile, DMRaidArrayDevice, MultipathDevice, iScsiDiskDevice, FcoeDiskDevice, DASDDevice, ZFCPDiskDevice, NVDIMMNamespaceDevice, NVMeNamespaceDevice, NVMeFabricsNamespaceDevice
from .partition import PartitionDevice
from .dm import DMDevice, DMLinearDevice, DMCryptDevice, DMIntegrityDevice, DM_MAJORS
from .luks import LUKSDevice, IntegrityDevice
diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py
index bc4a1b5e..b5e25939 100644
--- a/blivet/devices/disk.py
+++ b/blivet/devices/disk.py
@@ -22,10 +22,13 @@
import gi
gi.require_version("BlockDev", "2.0")
+gi.require_version("GLib", "2.0")
from gi.repository import BlockDev as blockdev
+from gi.repository import GLib
import os
+from collections import namedtuple
from .. import errors
from .. import util
@@ -725,3 +728,101 @@ class NVDIMMNamespaceDevice(DiskDevice):
@property
def sector_size(self):
return self._sector_size
+
+
+NVMeController = namedtuple("NVMeController", ["name", "serial", "nvme_ver", "id", "subsysnqn"])
+
+
+class NVMeNamespaceDevice(DiskDevice):
+
+ """ NVMe namespace """
+ _type = "nvme"
+ _packages = ["nvme-cli"]
+
+ def __init__(self, device, **kwargs):
+ """
+ :param name: the device name (generally a device node's basename)
+ :type name: str
+ :keyword exists: does this device exist?
+ :type exists: bool
+ :keyword size: the device's size
+ :type size: :class:`~.size.Size`
+ :keyword parents: a list of parent devices
+ :type parents: list of :class:`StorageDevice`
+ :keyword format: this device's formatting
+ :type format: :class:`~.formats.DeviceFormat` or a subclass of it
+ :keyword nsid: namespace ID
+ :type nsid: int
+ """
+ self.nsid = kwargs.pop("nsid", 0)
+
+ DiskDevice.__init__(self, device, **kwargs)
+
+ self._clear_local_tags()
+ self.tags.add(Tags.local)
+ self.tags.add(Tags.nvme)
+
+ self._controllers = None
+
+ @property
+ def controllers(self):
+ if self._controllers is not None:
+ return self._controllers
+
+ self._controllers = []
+ if not hasattr(blockdev.Plugin, "NVME"):
+ # the nvme plugin is not generally available
+ log.debug("Failed to get controllers for %s: libblockdev NVME plugin is not available", self.name)
+ return self._controllers
+
+ try:
+ controllers = blockdev.nvme_find_ctrls_for_ns(self.sysfs_path)
+ except GLib.GError as err:
+ log.debug("Failed to get controllers for %s: %s", self.name, str(err))
+ return self._controllers
+
+ for controller in controllers:
+ try:
+ cpath = util.get_path_by_sysfs_path(controller, "char")
+ except RuntimeError as err:
+ log.debug("Failed to find controller %s: %s", controller, str(err))
+ continue
+ try:
+ cinfo = blockdev.nvme_get_controller_info(cpath)
+ except GLib.GError as err:
+ log.debug("Failed to get controller info for %s: %s", cpath, str(err))
+ continue
+ self._controllers.append(NVMeController(name=os.path.basename(cpath),
+ serial=cinfo.serial_number,
+ nvme_ver=cinfo.nvme_ver,
+ id=cinfo.ctrl_id,
+ subsysnqn=cinfo.subsysnqn))
+
+ return self._controllers
+
+
+class NVMeFabricsNamespaceDevice(NVMeNamespaceDevice, NetworkStorageDevice):
+
+ """ NVMe fabrics namespace """
+ _type = "nvme-fabrics"
+ _packages = ["nvme-cli"]
+
+ def __init__(self, device, **kwargs):
+ """
+ :param name: the device name (generally a device node's basename)
+ :type name: str
+ :keyword exists: does this device exist?
+ :type exists: bool
+ :keyword size: the device's size
+ :type size: :class:`~.size.Size`
+ :keyword parents: a list of parent devices
+ :type parents: list of :class:`StorageDevice`
+ :keyword format: this device's formatting
+ :type format: :class:`~.formats.DeviceFormat` or a subclass of it
+ """
+ NVMeNamespaceDevice.__init__(self, device, **kwargs)
+ NetworkStorageDevice.__init__(self)
+
+ self._clear_local_tags()
+ self.tags.add(Tags.remote)
+ self.tags.add(Tags.nvme)
diff --git a/blivet/devices/lib.py b/blivet/devices/lib.py
index 1bda0bab..b3c4c5b0 100644
--- a/blivet/devices/lib.py
+++ b/blivet/devices/lib.py
@@ -32,6 +32,7 @@ class Tags(str, Enum):
"""Tags that describe various classes of disk."""
local = 'local'
nvdimm = 'nvdimm'
+ nvme = 'nvme'
remote = 'remote'
removable = 'removable'
ssd = 'ssd'
diff --git a/blivet/populator/helpers/__init__.py b/blivet/populator/helpers/__init__.py
index c5ac412f..50ab4de8 100644
--- a/blivet/populator/helpers/__init__.py
+++ b/blivet/populator/helpers/__init__.py
@@ -6,7 +6,7 @@ from .formatpopulator import FormatPopulator
from .btrfs import BTRFSFormatPopulator
from .boot import AppleBootFormatPopulator, EFIFormatPopulator, MacEFIFormatPopulator
-from .disk import DiskDevicePopulator, iScsiDevicePopulator, FCoEDevicePopulator, MDBiosRaidDevicePopulator, DASDDevicePopulator, ZFCPDevicePopulator, NVDIMMNamespaceDevicePopulator
+from .disk import DiskDevicePopulator, iScsiDevicePopulator, FCoEDevicePopulator, MDBiosRaidDevicePopulator, DASDDevicePopulator, ZFCPDevicePopulator, NVDIMMNamespaceDevicePopulator, NVMeNamespaceDevicePopulator, NVMeFabricsNamespaceDevicePopulator
from .disklabel import DiskLabelFormatPopulator
from .dm import DMDevicePopulator
from .dmraid import DMRaidFormatPopulator
diff --git a/blivet/populator/helpers/disk.py b/blivet/populator/helpers/disk.py
index 9db7b810..9ed1eebe 100644
--- a/blivet/populator/helpers/disk.py
+++ b/blivet/populator/helpers/disk.py
@@ -22,13 +22,16 @@
import gi
gi.require_version("BlockDev", "2.0")
+gi.require_version("GLib", "2.0")
from gi.repository import BlockDev as blockdev
+from gi.repository import GLib
from ... import udev
from ... import util
from ...devices import DASDDevice, DiskDevice, FcoeDiskDevice, iScsiDiskDevice
from ...devices import MDBiosRaidArrayDevice, ZFCPDiskDevice, NVDIMMNamespaceDevice
+from ...devices import NVMeNamespaceDevice, NVMeFabricsNamespaceDevice
from ...devices import device_path_to_name
from ...storage_log import log_method_call
from .devicepopulator import DevicePopulator
@@ -251,3 +254,64 @@ class NVDIMMNamespaceDevicePopulator(DiskDevicePopulator):
log.info("%s is an NVDIMM namespace device", udev.device_get_name(self.data))
return kwargs
+
+
+class NVMeNamespaceDevicePopulator(DiskDevicePopulator):
+ priority = 20
+
+ _device_class = NVMeNamespaceDevice
+
+ @classmethod
+ def match(cls, data):
+ return (super(NVMeNamespaceDevicePopulator, NVMeNamespaceDevicePopulator).match(data) and
+ udev.device_is_nvme_namespace(data) and not udev.device_is_nvme_fabrics(data))
+
+ def _get_kwargs(self):
+ kwargs = super(NVMeNamespaceDevicePopulator, self)._get_kwargs()
+
+ log.info("%s is an NVMe local namespace device", udev.device_get_name(self.data))
+
+ if not hasattr(blockdev.Plugin, "NVME"):
+ # the nvme plugin is not generally available
+ return kwargs
+
+ path = udev.device_get_devname(self.data)
+ try:
+ ninfo = blockdev.nvme_get_namespace_info(path)
+ except GLib.GError as err:
+ log.debug("Failed to get namespace info for %s: %s", path, str(err))
+ else:
+ kwargs["nsid"] = ninfo.nsid
+
+ log.info("%s is an NVMe local namespace device", udev.device_get_name(self.data))
+ return kwargs
+
+
+class NVMeFabricsNamespaceDevicePopulator(DiskDevicePopulator):
+ priority = 20
+
+ _device_class = NVMeFabricsNamespaceDevice
+
+ @classmethod
+ def match(cls, data):
+ return (super(NVMeFabricsNamespaceDevicePopulator, NVMeFabricsNamespaceDevicePopulator).match(data) and
+ udev.device_is_nvme_namespace(data) and udev.device_is_nvme_fabrics(data))
+
+ def _get_kwargs(self):
+ kwargs = super(NVMeFabricsNamespaceDevicePopulator, self)._get_kwargs()
+
+ log.info("%s is an NVMe fabrics namespace device", udev.device_get_name(self.data))
+
+ if not hasattr(blockdev.Plugin, "NVME"):
+ # the nvme plugin is not generally available
+ return kwargs
+
+ path = udev.device_get_devname(self.data)
+ try:
+ ninfo = blockdev.nvme_get_namespace_info(path)
+ except GLib.GError as err:
+ log.debug("Failed to get namespace info for %s: %s", path, str(err))
+ else:
+ kwargs["nsid"] = ninfo.nsid
+
+ return kwargs
diff --git a/blivet/udev.py b/blivet/udev.py
index efbc53d6..533a1edc 100644
--- a/blivet/udev.py
+++ b/blivet/udev.py
@@ -1023,6 +1023,39 @@ def device_is_nvdimm_namespace(info):
return ninfo is not None
+def device_is_nvme_namespace(info):
+ if info.get("DEVTYPE") != "disk":
+ return False
+
+ if not info.get("SYS_PATH"):
+ return False
+
+ device = pyudev.Devices.from_sys_path(global_udev, info.get("SYS_PATH"))
+ while device:
+ if device.subsystem and device.subsystem.startswith("nvme"):
+ return True
+ device = device.parent
+
+ return False
+
+
+def device_is_nvme_fabrics(info):
+ if not device_is_nvme_namespace(info):
+ return False
+
+ if not hasattr(blockdev.Plugin, "NVME") or not blockdev.is_plugin_available(blockdev.Plugin.NVME): # pylint: disable=no-member
+ # nvme plugin is not available -- even if this is an nvme fabrics device we
+ # don't have tools to work with it, so we should pretend it's just a normal nvme
+ return False
+
+ controllers = blockdev.nvme_find_ctrls_for_ns(info.get("SYS_PATH", ""))
+ if not controllers:
+ return False
+
+ transport = util.get_sysfs_attr(controllers[0], "transport")
+ return transport in ("rdma", "fc", "tcp", "loop")
+
+
def device_is_hidden(info):
sysfs_path = device_get_sysfs_path(info)
hidden = util.get_sysfs_attr(sysfs_path, "hidden")
diff --git a/blivet/util.py b/blivet/util.py
index 0e578aea..3040ee5a 100644
--- a/blivet/util.py
+++ b/blivet/util.py
@@ -432,6 +432,15 @@ def get_sysfs_path_by_name(dev_node, class_name="block"):
"for '%s' (it is not at '%s')" % (dev_node, dev_path))
+def get_path_by_sysfs_path(sysfs_path, dev_type="block"):
+ """ Return device path for a given device sysfs path. """
+
+ dev = get_sysfs_attr(sysfs_path, "dev")
+ if not dev or not os.path.exists("/dev/%s/%s" % (dev_type, dev)):
+ raise RuntimeError("get_path_by_sysfs_path: Could not find device for %s" % sysfs_path)
+ return os.path.realpath("/dev/%s/%s" % (dev_type, dev))
+
+
def get_cow_sysfs_path(dev_path, dev_sysfsPath):
""" Return sysfs path of cow device for a given device.
"""
diff --git a/tests/unit_tests/populator_test.py b/tests/unit_tests/populator_test.py
index 369fe878..1ee29b57 100644
--- a/tests/unit_tests/populator_test.py
+++ b/tests/unit_tests/populator_test.py
@@ -13,6 +13,7 @@ from gi.repository import BlockDev as blockdev
from blivet.devices import DiskDevice, DMDevice, FileDevice, LoopDevice
from blivet.devices import MDRaidArrayDevice, MultipathDevice, OpticalDevice
from blivet.devices import PartitionDevice, StorageDevice, NVDIMMNamespaceDevice
+from blivet.devices import NVMeNamespaceDevice, NVMeFabricsNamespaceDevice
from blivet.devicelibs import lvm
from blivet.devicetree import DeviceTree
from blivet.formats import get_device_format_class, get_format, DeviceFormat
@@ -21,6 +22,7 @@ from blivet.populator.helpers import DiskDevicePopulator, DMDevicePopulator, Loo
from blivet.populator.helpers import LVMDevicePopulator, MDDevicePopulator, MultipathDevicePopulator
from blivet.populator.helpers import OpticalDevicePopulator, PartitionDevicePopulator
from blivet.populator.helpers import LVMFormatPopulator, MDFormatPopulator, NVDIMMNamespaceDevicePopulator
+from blivet.populator.helpers import NVMeNamespaceDevicePopulator, NVMeFabricsNamespaceDevicePopulator
from blivet.populator.helpers import get_format_helper, get_device_helper
from blivet.populator.helpers.boot import AppleBootFormatPopulator, EFIFormatPopulator, MacEFIFormatPopulator
from blivet.populator.helpers.formatpopulator import FormatPopulator
@@ -591,6 +593,128 @@ class NVDIMMNamespaceDevicePopulatorTestCase(PopulatorHelperTestCase):
self.assertTrue(device in devicetree.devices)
+class NVMeNamespaceDevicePopulatorTestCase(PopulatorHelperTestCase):
+ helper_class = NVMeNamespaceDevicePopulator
+
+ @patch("os.path.join")
+ @patch("blivet.udev.device_is_cdrom", return_value=False)
+ @patch("blivet.udev.device_is_dm", return_value=False)
+ @patch("blivet.udev.device_is_loop", return_value=False)
+ @patch("blivet.udev.device_is_md", return_value=False)
+ @patch("blivet.udev.device_is_partition", return_value=False)
+ @patch("blivet.udev.device_is_disk", return_value=True)
+ @patch("blivet.udev.device_is_nvme_fabrics", return_value=False)
+ @patch("blivet.udev.device_is_nvme_namespace", return_value=True)
+ def test_match(self, *args):
+ """Test matching of NVMe namespace device populator."""
+ device_is_nvme_namespace = args[0]
+ self.assertTrue(self.helper_class.match(None))
+ device_is_nvme_namespace.return_value = False
+ self.assertFalse(self.helper_class.match(None))
+
+ @patch("os.path.join")
+ @patch("blivet.udev.device_is_cdrom", return_value=False)
+ @patch("blivet.udev.device_is_dm", return_value=False)
+ @patch("blivet.udev.device_is_loop", return_value=False)
+ @patch("blivet.udev.device_is_md", return_value=False)
+ @patch("blivet.udev.device_is_partition", return_value=False)
+ @patch("blivet.udev.device_is_disk", return_value=True)
+ @patch("blivet.udev.device_is_nvme_fabrics", return_value=False)
+ @patch("blivet.udev.device_is_nvme_namespace", return_value=True)
+ def test_get_helper(self, *args):
+ """Test get_device_helper for NVMe namespaces."""
+ device_is_nvme_namespace = args[0]
+ data = {}
+ self.assertEqual(get_device_helper(data), self.helper_class)
+
+ # verify that setting one of the required True return values to False prevents success
+ device_is_nvme_namespace.return_value = False
+ self.assertNotEqual(get_device_helper(data), self.helper_class)
+ device_is_nvme_namespace.return_value = True
+
+ @patch("blivet.udev.device_get_name")
+ def test_run(self, *args):
+ """Test disk device populator."""
+ device_get_name = args[0]
+
+ devicetree = DeviceTree()
+
+ # set up some fake udev data to verify handling of specific entries
+ data = {'SYS_PATH': 'dummy', 'DEVNAME': 'dummy', 'ID_PATH': 'dummy'}
+
+ device_name = "nop"
+ device_get_name.return_value = device_name
+ helper = self.helper_class(devicetree, data)
+
+ device = helper.run()
+
+ self.assertIsInstance(device, NVMeNamespaceDevice)
+ self.assertTrue(device.exists)
+ self.assertTrue(device.is_disk)
+ self.assertTrue(device in devicetree.devices)
+
+
+class NVMeFabricsNamespaceDevicePopulatorTestCase(PopulatorHelperTestCase):
+ helper_class = NVMeFabricsNamespaceDevicePopulator
+
+ @patch("os.path.join")
+ @patch("blivet.udev.device_is_cdrom", return_value=False)
+ @patch("blivet.udev.device_is_dm", return_value=False)
+ @patch("blivet.udev.device_is_loop", return_value=False)
+ @patch("blivet.udev.device_is_md", return_value=False)
+ @patch("blivet.udev.device_is_partition", return_value=False)
+ @patch("blivet.udev.device_is_disk", return_value=True)
+ @patch("blivet.udev.device_is_nvme_namespace", return_value=True)
+ @patch("blivet.udev.device_is_nvme_fabrics", return_value=True)
+ def test_match(self, *args):
+ """Test matching of NVMe namespace device populator."""
+ device_is_nvme_fabrics = args[0]
+ self.assertTrue(self.helper_class.match(None))
+ device_is_nvme_fabrics.return_value = False
+ self.assertFalse(self.helper_class.match(None))
+
+ @patch("os.path.join")
+ @patch("blivet.udev.device_is_cdrom", return_value=False)
+ @patch("blivet.udev.device_is_dm", return_value=False)
+ @patch("blivet.udev.device_is_loop", return_value=False)
+ @patch("blivet.udev.device_is_md", return_value=False)
+ @patch("blivet.udev.device_is_partition", return_value=False)
+ @patch("blivet.udev.device_is_disk", return_value=True)
+ @patch("blivet.udev.device_is_nvme_namespace", return_value=True)
+ @patch("blivet.udev.device_is_nvme_fabrics", return_value=True)
+ def test_get_helper(self, *args):
+ """Test get_device_helper for NVMe namespaces."""
+ device_is_nvme_fabrics = args[0]
+ data = {}
+ self.assertEqual(get_device_helper(data), self.helper_class)
+
+ # verify that setting one of the required True return values to False prevents success
+ device_is_nvme_fabrics.return_value = False
+ self.assertNotEqual(get_device_helper(data), self.helper_class)
+ device_is_nvme_fabrics.return_value = True
+
+ @patch("blivet.udev.device_get_name")
+ def test_run(self, *args):
+ """Test disk device populator."""
+ device_get_name = args[0]
+
+ devicetree = DeviceTree()
+
+ # set up some fake udev data to verify handling of specific entries
+ data = {'SYS_PATH': 'dummy', 'DEVNAME': 'dummy', 'ID_PATH': 'dummy'}
+
+ device_name = "nop"
+ device_get_name.return_value = device_name
+ helper = self.helper_class(devicetree, data)
+
+ device = helper.run()
+
+ self.assertIsInstance(device, NVMeFabricsNamespaceDevice)
+ self.assertTrue(device.exists)
+ self.assertTrue(device.is_disk)
+ self.assertTrue(device in devicetree.devices)
+
+
class MDDevicePopulatorTestCase(PopulatorHelperTestCase):
helper_class = MDDevicePopulator
--
2.38.1
From af6ad7ff2f08180672690910d453158bcd463936 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 2 Dec 2022 12:20:47 +0100
Subject: [PATCH 2/3] Add transport and address to NVMeController info
---
blivet/devices/disk.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py
index b5e25939..796b5b03 100644
--- a/blivet/devices/disk.py
+++ b/blivet/devices/disk.py
@@ -730,7 +730,8 @@ class NVDIMMNamespaceDevice(DiskDevice):
return self._sector_size
-NVMeController = namedtuple("NVMeController", ["name", "serial", "nvme_ver", "id", "subsysnqn"])
+NVMeController = namedtuple("NVMeController", ["name", "serial", "nvme_ver", "id", "subsysnqn",
+ "transport", "transport_address"])
class NVMeNamespaceDevice(DiskDevice):
@@ -792,11 +793,15 @@ class NVMeNamespaceDevice(DiskDevice):
except GLib.GError as err:
log.debug("Failed to get controller info for %s: %s", cpath, str(err))
continue
+ ctrans = util.get_sysfs_attr(controller, "transport")
+ ctaddr = util.get_sysfs_attr(controller, "address")
self._controllers.append(NVMeController(name=os.path.basename(cpath),
serial=cinfo.serial_number,
nvme_ver=cinfo.nvme_ver,
id=cinfo.ctrl_id,
- subsysnqn=cinfo.subsysnqn))
+ subsysnqn=cinfo.subsysnqn,
+ transport=ctrans,
+ transport_address=ctaddr))
return self._controllers
--
2.38.1
From a04538936ff62958c272b5e2b2657d177df1ef13 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 8 Dec 2022 13:15:33 +0100
Subject: [PATCH 3/3] Add additional identifiers to NVMeNamespaceDevice
---
blivet/devices/disk.py | 2 ++
blivet/populator/helpers/disk.py | 3 +++
2 files changed, 5 insertions(+)
diff --git a/blivet/devices/disk.py b/blivet/devices/disk.py
index 796b5b03..8842b4dc 100644
--- a/blivet/devices/disk.py
+++ b/blivet/devices/disk.py
@@ -756,6 +756,8 @@ class NVMeNamespaceDevice(DiskDevice):
:type nsid: int
"""
self.nsid = kwargs.pop("nsid", 0)
+ self.eui64 = kwargs.pop("eui64", "")
+ self.nguid = kwargs.pop("nguid", "")
DiskDevice.__init__(self, device, **kwargs)
diff --git a/blivet/populator/helpers/disk.py b/blivet/populator/helpers/disk.py
index 9ed1eebe..cf20d302 100644
--- a/blivet/populator/helpers/disk.py
+++ b/blivet/populator/helpers/disk.py
@@ -282,6 +282,9 @@ class NVMeNamespaceDevicePopulator(DiskDevicePopulator):
log.debug("Failed to get namespace info for %s: %s", path, str(err))
else:
kwargs["nsid"] = ninfo.nsid
+ kwargs["uuid"] = ninfo.uuid
+ kwargs["eui64"] = ninfo.eui64
+ kwargs["nguid"] = ninfo.nguid
log.info("%s is an NVMe local namespace device", udev.device_get_name(self.data))
return kwargs
--
2.38.1

@ -0,0 +1,58 @@
From cd9e137a2e33165a8af3a7e4a3d2615adcabf659 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 8 Nov 2024 09:19:45 +0100
Subject: [PATCH 1/2] Fix "Modified passphrase in stratis test"
Follow up for 68708e347ef7b2f98312c76aa80366091dd4aade, two more
places where the passphrase is too short for FIPS mode.
Resolves: RHEL-45173
---
tests/storage_tests/devices_test/stratis_test.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/storage_tests/devices_test/stratis_test.py b/tests/storage_tests/devices_test/stratis_test.py
index 21c4d0f50..9792e0618 100644
--- a/tests/storage_tests/devices_test/stratis_test.py
+++ b/tests/storage_tests/devices_test/stratis_test.py
@@ -105,7 +105,7 @@ def test_stratis_encrypted(self):
blivet.partitioning.do_partitioning(self.storage)
pool = self.storage.new_stratis_pool(name="blivetTestPool", parents=[bd],
- encrypted=True, passphrase="abcde")
+ encrypted=True, passphrase="fipsneeds8chars")
self.storage.create_device(pool)
self.storage.do_it()
@@ -260,7 +260,7 @@ def test_stratis_encrypted_clevis_tpm(self):
blivet.partitioning.do_partitioning(self.storage)
pool = self.storage.new_stratis_pool(name="blivetTestPool", parents=[bd],
- encrypted=True, passphrase="abcde",
+ encrypted=True, passphrase="fipsneeds8chars",
clevis=StratisClevisConfig(pin="tpm2"))
self.storage.create_device(pool)
From ed10d97a5257c0f4fe8a2f53b0b2f787de91c355 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 8 Nov 2024 10:02:47 +0100
Subject: [PATCH 2/2] tests: Fix writing key file for LUKS tests
Related: RHEL-45173
---
tests/storage_tests/formats_test/luks_test.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/storage_tests/formats_test/luks_test.py b/tests/storage_tests/formats_test/luks_test.py
index 93c8d7524..b8ec229ba 100644
--- a/tests/storage_tests/formats_test/luks_test.py
+++ b/tests/storage_tests/formats_test/luks_test.py
@@ -99,6 +99,7 @@ def test_setup_keyfile(self):
with tempfile.NamedTemporaryFile(prefix="blivet_test") as temp:
temp.write(b"password2")
+ temp.flush()
# create the luks format with both passphrase and keyfile
self.fmt._key_file = temp.name

@ -1,57 +0,0 @@
From 2aba050e74dc5df483da022dcf436b101c7a4301 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 11 Jan 2023 14:59:24 +0100
Subject: [PATCH] Default to encryption sector size 512 for LUKS devices
We are currently letting cryptsetup decide the optimal encryption
sector size for LUKS. The problem is that for disks with physical
sector size 4096 cryptsetup will default to 4096 encryption sector
size even if the drive logical sector size is 512 which means
these disks cannot be combined with other 512 logical sector size
disks in LVM. This requires a more sophisticated solution in the
future, but for now just default to 512 if not specified by the
user otherwise.
Resolves: rhbz#2103800
---
blivet/formats/luks.py | 10 +++++++---
tests/unit_tests/formats_tests/luks_test.py | 2 +-
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/blivet/formats/luks.py b/blivet/formats/luks.py
index 8de4911f..2637e0c5 100644
--- a/blivet/formats/luks.py
+++ b/blivet/formats/luks.py
@@ -166,9 +166,13 @@ class LUKS(DeviceFormat):
if self.pbkdf_args.type == "pbkdf2" and self.pbkdf_args.max_memory_kb:
log.warning("Memory limit is not used for pbkdf2 and it will be ignored.")
- self.luks_sector_size = kwargs.get("luks_sector_size") or 0
- if self.luks_sector_size and self.luks_version != "luks2":
- raise ValueError("Sector size argument is valid only for LUKS version 2.")
+ self.luks_sector_size = kwargs.get("luks_sector_size")
+ if self.luks_version == "luks2":
+ if self.luks_sector_size is None:
+ self.luks_sector_size = 512 # XXX we don't want cryptsetup choose automatically here so fallback to 512
+ else:
+ if self.luks_sector_size:
+ raise ValueError("Sector size argument is valid only for LUKS version 2.")
def __repr__(self):
s = DeviceFormat.__repr__(self)
diff --git a/tests/unit_tests/formats_tests/luks_test.py b/tests/unit_tests/formats_tests/luks_test.py
index 5ae6acfe..ec7b7592 100644
--- a/tests/unit_tests/formats_tests/luks_test.py
+++ b/tests/unit_tests/formats_tests/luks_test.py
@@ -53,7 +53,7 @@ class LUKSNodevTestCase(unittest.TestCase):
def test_sector_size(self):
fmt = LUKS()
- self.assertEqual(fmt.luks_sector_size, 0)
+ self.assertEqual(fmt.luks_sector_size, 512)
with self.assertRaises(ValueError):
fmt = LUKS(luks_version="luks1", luks_sector_size=4096)
--
2.39.0

@ -0,0 +1,122 @@
From c8eff25e4c25183a76e97108d4607455cfc96ae2 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 14 Nov 2024 14:53:28 +0100
Subject: [PATCH] Make GPT default label type on all architectures
Exceptions are DASD drives on s390 and 32bit ARM. Everywhere else
GPT will be default.
Resolves: RHEL-52200
---
blivet/formats/disklabel.py | 11 +++++-----
.../formats_tests/disklabel_test.py | 20 +++++++++----------
2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/blivet/formats/disklabel.py b/blivet/formats/disklabel.py
index f2857f07..8b39dc79 100644
--- a/blivet/formats/disklabel.py
+++ b/blivet/formats/disklabel.py
@@ -220,12 +220,13 @@ class DiskLabel(DeviceFormat):
@classmethod
def get_platform_label_types(cls):
- label_types = ["msdos", "gpt"]
+ # always prefer gpt except for configurations below
+ label_types = ["gpt", "msdos"]
if arch.is_pmac():
label_types = ["mac"]
- # always prefer gpt on aarch64, x86_64, and EFI plats except 32-bit ARM
- elif arch.is_aarch64() or arch.is_x86(bits=64) or (arch.is_efi() and not arch.is_arm()):
- label_types = ["gpt", "msdos"]
+ # prefet msdos on 32-bit ARM
+ elif arch.is_arm():
+ label_types = ["msdos", "gpt"]
elif arch.is_s390():
label_types += ["dasd"]
@@ -254,7 +255,7 @@ class DiskLabel(DeviceFormat):
if arch.is_s390():
if blockdev.s390.dasd_is_fba(self.device):
# the device is FBA DASD
- return "msdos"
+ return "gpt"
elif self.parted_device.type == parted.DEVICE_DASD:
# the device is DASD
return "dasd"
diff --git a/tests/unit_tests/formats_tests/disklabel_test.py b/tests/unit_tests/formats_tests/disklabel_test.py
index 9f6e4542..823a3663 100644
--- a/tests/unit_tests/formats_tests/disklabel_test.py
+++ b/tests/unit_tests/formats_tests/disklabel_test.py
@@ -71,7 +71,7 @@ class DiskLabelTestCase(unittest.TestCase):
arch.is_pmac.return_value = False
arch.is_x86.return_value = False
- self.assertEqual(disklabel_class.get_platform_label_types(), ["msdos", "gpt"])
+ self.assertEqual(disklabel_class.get_platform_label_types(), ["gpt", "msdos"])
arch.is_pmac.return_value = True
self.assertEqual(disklabel_class.get_platform_label_types(), ["mac"])
@@ -100,7 +100,7 @@ class DiskLabelTestCase(unittest.TestCase):
arch.is_efi.return_value = False
arch.is_s390.return_value = True
- self.assertEqual(disklabel_class.get_platform_label_types(), ["msdos", "gpt", "dasd"])
+ self.assertEqual(disklabel_class.get_platform_label_types(), ["gpt", "msdos", "dasd"])
arch.is_s390.return_value = False
def test_label_type_size_check(self):
@@ -121,14 +121,14 @@ class DiskLabelTestCase(unittest.TestCase):
with patch.object(blivet.formats.disklabel.DiskLabel, "parted_device", new=PropertyMock(return_value=None)):
# no parted device -> no passing size check
- self.assertEqual(dl._label_type_size_check("msdos"), False)
+ self.assertEqual(dl._label_type_size_check("gpt"), False)
@patch("blivet.formats.disklabel.arch")
def test_best_label_type(self, arch):
"""
1. is always in _disklabel_types
2. is the default unless the device is too long for the default
- 3. is msdos for fba dasd on S390
+ 3. is gpt for fba dasd on S390
4. is dasd for non-fba dasd on S390
"""
dl = blivet.formats.disklabel.DiskLabel()
@@ -144,17 +144,17 @@ class DiskLabelTestCase(unittest.TestCase):
arch.is_x86.return_value = False
with patch.object(dl, '_label_type_size_check') as size_check:
- # size check passes for first type ("msdos")
+ # size check passes for first type ("gpt")
size_check.return_value = True
- self.assertEqual(dl._get_best_label_type(), "msdos")
+ self.assertEqual(dl._get_best_label_type(), "gpt")
# size checks all fail -> label type is None
size_check.return_value = False
self.assertEqual(dl._get_best_label_type(), None)
- # size check passes on second call -> label type is "gpt" (second in platform list)
+ # size check passes on second call -> label type is "msdos" (second in platform list)
size_check.side_effect = [False, True]
- self.assertEqual(dl._get_best_label_type(), "gpt")
+ self.assertEqual(dl._get_best_label_type(), "msdos")
arch.is_pmac.return_value = True
with patch.object(dl, '_label_type_size_check') as size_check:
@@ -175,10 +175,10 @@ class DiskLabelTestCase(unittest.TestCase):
size_check.return_value = True
with patch("blivet.formats.disklabel.blockdev.s390") as _s390:
_s390.dasd_is_fba.return_value = False
- self.assertEqual(dl._get_best_label_type(), "msdos")
+ self.assertEqual(dl._get_best_label_type(), "gpt")
_s390.dasd_is_fba.return_value = True
- self.assertEqual(dl._get_best_label_type(), "msdos")
+ self.assertEqual(dl._get_best_label_type(), "gpt")
_s390.dasd_is_fba.return_value = False
dl._parted_device.type = parted.DEVICE_DASD
--
2.47.0

@ -1,205 +0,0 @@
From 7a86d4306e3022b73035e21f66d515174264700e Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 9 Mar 2023 13:18:42 +0100
Subject: [PATCH 1/2] Add support for specifying stripe size for RAID LVs
---
blivet/devices/lvm.py | 28 +++++++++++++++++---
tests/storage_tests/devices_test/lvm_test.py | 12 +++++++--
tests/unit_tests/devices_test/lvm_test.py | 27 +++++++++++++++++++
3 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
index b8595d63..41358e9b 100644
--- a/blivet/devices/lvm.py
+++ b/blivet/devices/lvm.py
@@ -659,7 +659,8 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
def __init__(self, name, parents=None, size=None, uuid=None, seg_type=None,
fmt=None, exists=False, sysfs_path='', grow=None, maxsize=None,
- percent=None, cache_request=None, pvs=None, from_lvs=None):
+ percent=None, cache_request=None, pvs=None, from_lvs=None,
+ stripe_size=0):
if not exists:
if seg_type not in [None, "linear", "thin", "thin-pool", "cache", "vdo-pool", "vdo", "cache-pool"] + lvm.raid_seg_types:
@@ -756,6 +757,15 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
if self._pv_specs:
self._assign_pv_space()
+ self._stripe_size = stripe_size
+ if not self.exists and self._stripe_size:
+ if self.seg_type not in lvm.raid_seg_types:
+ raise errors.DeviceError("Stripe size can be specified only for RAID volumes")
+ if self.seg_type in ("raid1", "RAID1", "1", 1, "mirror"):
+ raise errors.DeviceError("Specifying stripe size is not allowed for RAID1 or mirror")
+ if self.cache:
+ raise errors.DeviceError("Creating cached LVs with custom stripe size is not supported")
+
def _assign_pv_space(self):
if not self.is_raid_lv:
# nothing to do for non-RAID (and thus non-striped) LVs here
@@ -2295,7 +2305,7 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
parent_lv=None, int_type=None, origin=None, vorigin=False,
metadata_size=None, chunk_size=None, profile=None, from_lvs=None,
compression=False, deduplication=False, index_memory=0,
- write_policy=None, cache_mode=None, attach_to=None):
+ write_policy=None, cache_mode=None, attach_to=None, stripe_size=0):
"""
:param name: the device name (generally a device node's basename)
:type name: str
@@ -2375,6 +2385,11 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
be attached to when created
:type attach_to: :class:`LVMLogicalVolumeDevice`
+ For RAID LVs only:
+
+ :keyword stripe_size: size of the RAID stripe
+ :type stripe_size: :class:`~.size.Size`
+
"""
if isinstance(parents, (list, ParentList)):
@@ -2395,7 +2410,8 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
LVMCachePoolMixin.__init__(self, metadata_size, cache_mode, attach_to)
LVMLogicalVolumeBase.__init__(self, name, parents, size, uuid, seg_type,
fmt, exists, sysfs_path, grow, maxsize,
- percent, cache_request, pvs, from_lvs)
+ percent, cache_request, pvs, from_lvs,
+ stripe_size)
LVMVDOPoolMixin.__init__(self, compression, deduplication, index_memory,
write_policy)
LVMVDOLogicalVolumeMixin.__init__(self)
@@ -2651,8 +2667,12 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
pvs = [spec.pv.path for spec in self._pv_specs]
pvs = pvs or None
+ extra = dict()
+ if self._stripe_size:
+ extra["stripesize"] = str(int(self._stripe_size.convert_to("KiB")))
+
blockdev.lvm.lvcreate(self.vg.name, self._name, self.size,
- type=self.seg_type, pv_list=pvs)
+ type=self.seg_type, pv_list=pvs, **extra)
else:
fast_pvs = [pv.path for pv in self.cache.fast_pvs]
diff --git a/tests/storage_tests/devices_test/lvm_test.py b/tests/storage_tests/devices_test/lvm_test.py
index a055fc27..97ef1c4b 100644
--- a/tests/storage_tests/devices_test/lvm_test.py
+++ b/tests/storage_tests/devices_test/lvm_test.py
@@ -1,4 +1,5 @@
import os
+import subprocess
from ..storagetestcase import StorageTestCase
@@ -127,7 +128,7 @@ class LVMTestCase(StorageTestCase):
self.assertTrue(snap.is_snapshot_lv)
self.assertEqual(snap.origin, thinlv)
- def _test_lvm_raid(self, seg_type, raid_level):
+ def _test_lvm_raid(self, seg_type, raid_level, stripe_size=0):
disk1 = self.storage.devicetree.get_device_by_path(self.vdevs[0])
self.assertIsNotNone(disk1)
self.storage.initialize_disk(disk1)
@@ -151,7 +152,7 @@ class LVMTestCase(StorageTestCase):
raidlv = self.storage.new_lv(fmt_type="ext4", size=blivet.size.Size("50 MiB"),
parents=[vg], name="blivetTestRAIDLV",
- seg_type=seg_type, pvs=[pv1, pv2])
+ seg_type=seg_type, pvs=[pv1, pv2], stripe_size=stripe_size)
self.storage.create_device(raidlv)
self.storage.do_it()
@@ -163,9 +164,16 @@ class LVMTestCase(StorageTestCase):
self.assertEqual(raidlv.raid_level, raid_level)
self.assertEqual(raidlv.seg_type, seg_type)
+ if stripe_size:
+ out = subprocess.check_output(["lvs", "-o", "stripe_size", "--noheadings", "--nosuffix", "--units=b", raidlv.vg.name + "/" + raidlv.lvname])
+ self.assertEqual(out.decode().strip(), str(int(stripe_size.convert_to())))
+
def test_lvm_raid_raid0(self):
self._test_lvm_raid("raid0", blivet.devicelibs.raid.RAID0)
+ def test_lvm_raid_raid0_stripe_size(self):
+ self._test_lvm_raid("raid0", blivet.devicelibs.raid.RAID0, stripe_size=blivet.size.Size("1 MiB"))
+
def test_lvm_raid_striped(self):
self._test_lvm_raid("striped", blivet.devicelibs.raid.Striped)
diff --git a/tests/unit_tests/devices_test/lvm_test.py b/tests/unit_tests/devices_test/lvm_test.py
index 995c2da4..d7b55224 100644
--- a/tests/unit_tests/devices_test/lvm_test.py
+++ b/tests/unit_tests/devices_test/lvm_test.py
@@ -363,6 +363,33 @@ class LVMDeviceTest(unittest.TestCase):
self.assertEqual(pv.format.free, Size("264 MiB"))
self.assertEqual(pv2.format.free, Size("256 MiB"))
+ def test_lvm_logical_volume_raid_stripe_size(self):
+ pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"),
+ size=Size("1025 MiB"))
+ pv2 = StorageDevice("pv2", fmt=blivet.formats.get_format("lvmpv"),
+ size=Size("513 MiB"))
+ vg = LVMVolumeGroupDevice("testvg", parents=[pv, pv2])
+
+ with self.assertRaises(blivet.errors.DeviceError):
+ # non-raid LV
+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"),
+ fmt=blivet.formats.get_format("xfs"),
+ exists=False, stripe_size=Size("1 MiB"))
+
+ with self.assertRaises(blivet.errors.DeviceError):
+ # raid1 LV
+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"),
+ fmt=blivet.formats.get_format("xfs"),
+ exists=False, seg_type="raid1", pvs=[pv, pv2],
+ stripe_size=Size("1 MiB"))
+
+ lv = LVMLogicalVolumeDevice("testlv", parents=[vg], size=Size("1 GiB"),
+ fmt=blivet.formats.get_format("xfs"),
+ exists=False, seg_type="raid0", pvs=[pv, pv2],
+ stripe_size=Size("1 MiB"))
+
+ self.assertEqual(lv._stripe_size, Size("1 MiB"))
+
def test_target_size(self):
pv = StorageDevice("pv1", fmt=blivet.formats.get_format("lvmpv"),
size=Size("1 GiB"))
--
2.40.1
From bbfd1a70abe8271f5fe3d29fe2be3bb8a1c6ecbc Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 3 May 2023 08:55:31 +0200
Subject: [PATCH 2/2] Revert "tests: Skip test_lvcreate_type on CentOS/RHEL 9"
This reverts commit 16b90071145d2d0f19a38f3003561a0cc9d6e281.
The kernel issue was resolved, we no longer need to skip the test.
---
tests/skip.yml | 6 ------
1 file changed, 6 deletions(-)
diff --git a/tests/skip.yml b/tests/skip.yml
index 66b34493..c0ca0eaf 100644
--- a/tests/skip.yml
+++ b/tests/skip.yml
@@ -24,12 +24,6 @@
---
-- test: storage_tests.devices_test.lvm_test.LVMTestCase.test_lvm_raid
- skip_on:
- - distro: "centos"
- version: "9"
- reason: "Creating RAID 1 LV on CentOS/RHEL 9 causes a system deadlock"
-
- test: storage_tests.formats_test.fs_test.XFSTestCase.test_resize
skip_on:
- distro: ["centos", "enterprise_linux"]
--
2.40.1

@ -0,0 +1,108 @@
From 041b320003687fb6c740f429a079dd7b7c8f7f6f Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 5 Dec 2024 14:28:21 +0100
Subject: [PATCH 1/2] Fix ppc64le name in devicelibs/gpt.py
Resolves: RHEL-70153
---
blivet/devicelibs/gpt.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/blivet/devicelibs/gpt.py b/blivet/devicelibs/gpt.py
index 4a6d364d7..c6dbf7b23 100644
--- a/blivet/devicelibs/gpt.py
+++ b/blivet/devicelibs/gpt.py
@@ -66,7 +66,7 @@
"parisc": uuid.UUID("1aacdb3b-5444-4138-bd9e-e5c2239b2346"),
"ppc": uuid.UUID("1de3f1ef-fa98-47b5-8dcd-4a860a654d78"),
"ppc64": uuid.UUID("912ade1d-a839-4913-8964-a10eee08fbd2"),
- "ppc64el": uuid.UUID("c31c45e6-3f39-412e-80fb-4809c4980599"),
+ "ppc64le": uuid.UUID("c31c45e6-3f39-412e-80fb-4809c4980599"),
"riscv32": uuid.UUID("60d5a7fe-8e7d-435c-b714-3dd8162144e1"),
"riscv64": uuid.UUID("72ec70a6-cf74-40e6-bd49-4bda08e8f224"),
"s390": uuid.UUID("08a7acea-624c-4a20-91e8-6e0fa67d23f9"),
@@ -87,7 +87,7 @@
"parisc": uuid.UUID("d212a430-fbc5-49f9-a983-a7feef2b8d0e"),
"ppc": uuid.UUID("98cfe649-1588-46dc-b2f0-add147424925"),
"ppc64": uuid.UUID("9225a9a3-3c19-4d89-b4f6-eeff88f17631"),
- "ppc64el": uuid.UUID("906bd944-4589-4aae-a4e4-dd983917446a"),
+ "ppc64le": uuid.UUID("906bd944-4589-4aae-a4e4-dd983917446a"),
"riscv32": uuid.UUID("ae0253be-1167-4007-ac68-43926c14c5de"),
"riscv64": uuid.UUID("b6ed5582-440b-4209-b8da-5ff7c419ea3d"),
"s390": uuid.UUID("7ac63b47-b25c-463b-8df8-b4a94e6c90e1"),
@@ -108,7 +108,7 @@
"parisc": uuid.UUID("15de6170-65d3-431c-916e-b0dcd8393f25"),
"ppc": uuid.UUID("1b31b5aa-add9-463a-b2ed-bd467fc857e7"),
"ppc64": uuid.UUID("f5e2c20c-45b2-4ffa-bce9-2a60737e1aaf"),
- "ppc64el": uuid.UUID("d4a236e7-e873-4c07-bf1d-bf6cf7f1c3c6"),
+ "ppc64le": uuid.UUID("d4a236e7-e873-4c07-bf1d-bf6cf7f1c3c6"),
"riscv32": uuid.UUID("3a112a75-8729-4380-b4cf-764d79934448"),
"riscv64": uuid.UUID("efe0f087-ea8d-4469-821a-4c2a96a8386a"),
"s390": uuid.UUID("3482388e-4254-435a-a241-766a065f9960"),
@@ -129,7 +129,7 @@
"parisc": uuid.UUID("dc4a4480-6917-4262-a4ec-db9384949f25"),
"ppc": uuid.UUID("7d14fec5-cc71-415d-9d6c-06bf0b3c3eaf"),
"ppc64": uuid.UUID("2c9739e2-f068-46b3-9fd0-01c5a9afbcca"),
- "ppc64el": uuid.UUID("15bb03af-77e7-4d4a-b12b-c0d084f7491c"),
+ "ppc64le": uuid.UUID("15bb03af-77e7-4d4a-b12b-c0d084f7491c"),
"riscv32": uuid.UUID("b933fb22-5c3f-4f91-af90-e2bb0fa50702"),
"riscv64": uuid.UUID("beaec34b-8442-439b-a40b-984381ed097d"),
"s390": uuid.UUID("cd0f869b-d0fb-4ca0-b141-9ea87cc78d66"),
@@ -150,7 +150,7 @@
"parisc": uuid.UUID("5843d618-ec37-48d7-9f12-cea8e08768b2"),
"ppc": uuid.UUID("df765d00-270e-49e5-bc75-f47bb2118b09"),
"ppc64": uuid.UUID("bdb528a5-a259-475f-a87d-da53fa736a07"),
- "ppc64el": uuid.UUID("ee2b9983-21e8-4153-86d9-b6901a54d1ce"),
+ "ppc64le": uuid.UUID("ee2b9983-21e8-4153-86d9-b6901a54d1ce"),
"riscv32": uuid.UUID("cb1ee4e3-8cd0-4136-a0a4-aa61a32e8730"),
"riscv64": uuid.UUID("8f1056be-9b05-47c4-81d6-be53128e5b54"),
"s390": uuid.UUID("b663c618-e7bc-4d6d-90aa-11b756bb1797"),
@@ -171,7 +171,7 @@
"parisc": uuid.UUID("450dd7d1-3224-45ec-9cf2-a43a346d71ee"),
"ppc": uuid.UUID("7007891d-d371-4a80-86a4-5cb875b9302e"),
"ppc64": uuid.UUID("0b888863-d7f8-4d9e-9766-239fce4d58af"),
- "ppc64el": uuid.UUID("c8bfbd1e-268e-4521-8bba-bf314c399557"),
+ "ppc64le": uuid.UUID("c8bfbd1e-268e-4521-8bba-bf314c399557"),
"riscv32": uuid.UUID("c3836a13-3137-45ba-b583-b16c50fe5eb4"),
"riscv64": uuid.UUID("d2f9000a-7a18-453f-b5cd-4d32f77a7b32"),
"s390": uuid.UUID("17440e4f-a8d0-467f-a46e-3912ae6ef2c5"),
From 22740da280258990d557eb45ac90d86c4f821c05 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 5 Dec 2024 14:31:15 +0100
Subject: [PATCH 2/2] Do not crash when we fail to get discoverable GPT type
UUID
No need to raise an exception if we fail to get the type UUID for
whatever reason.
Related: RHEL-70153
---
blivet/devices/partition.py | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py
index 2d67be81f..89470d9fb 100644
--- a/blivet/devices/partition.py
+++ b/blivet/devices/partition.py
@@ -365,10 +365,16 @@ def part_type_uuid_req(self):
hasattr(parted.Partition, "type_uuid"))
if discoverable:
- parttype = gpt_part_uuid_for_mountpoint(self._mountpoint)
- log.debug("Discovered partition type UUID %s for mount '%s'",
- parttype, self._mountpoint)
- return parttype
+ try:
+ parttype = gpt_part_uuid_for_mountpoint(self._mountpoint)
+ except errors.GPTVolUUIDError as e:
+ log.error("Failed to get partition type UUID for mount '%s': %s",
+ self._mountpoint, str(e))
+ return None
+ else:
+ log.debug("Discovered partition type UUID %s for mount '%s'",
+ parttype, self._mountpoint)
+ return parttype
return None
@property

@ -1,68 +0,0 @@
From 1af0d3c37a93e431790e641a329a7f34dabf291a Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 2 Mar 2023 12:34:42 +0100
Subject: [PATCH] Fix setting kickstart data
When changing our code to PEP8 compliant we also changed some
pykickstart properties like onPart by accident. This PR fixes this.
Resolves: rhbz#2174296
---
blivet/devices/btrfs.py | 4 ++--
blivet/devices/lvm.py | 2 +-
blivet/devices/partition.py | 6 +++---
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py
index 1ae6a04d..3f56624e 100644
--- a/blivet/devices/btrfs.py
+++ b/blivet/devices/btrfs.py
@@ -498,8 +498,8 @@ class BTRFSVolumeDevice(BTRFSDevice, ContainerDevice, RaidDevice):
def populate_ksdata(self, data):
super(BTRFSVolumeDevice, self).populate_ksdata(data)
- data.data_level = self.data_level.name if self.data_level else None
- data.metadata_level = self.metadata_level.name if self.metadata_level else None
+ data.dataLevel = self.data_level.name if self.data_level else None
+ data.metaDataLevel = self.metadata_level.name if self.metadata_level else None
data.devices = ["btrfs.%d" % p.id for p in self.parents]
data.preexist = self.exists
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
index 41358e9b..c3132457 100644
--- a/blivet/devices/lvm.py
+++ b/blivet/devices/lvm.py
@@ -1161,7 +1161,7 @@ class LVMLogicalVolumeBase(DMDevice, RaidDevice):
if self.req_grow:
# base size could be literal or percentage
- data.max_size_mb = self.req_max_size.convert_to(MiB)
+ data.maxSizeMB = self.req_max_size.convert_to(MiB)
elif data.resize:
data.size = self.target_size.convert_to(MiB)
diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py
index 89d907c2..0e9250ce 100644
--- a/blivet/devices/partition.py
+++ b/blivet/devices/partition.py
@@ -982,14 +982,14 @@ class PartitionDevice(StorageDevice):
data.size = self.req_base_size.round_to_nearest(MiB, rounding=ROUND_DOWN).convert_to(spec=MiB)
data.grow = self.req_grow
if self.req_grow:
- data.max_size_mb = self.req_max_size.convert_to(MiB)
+ data.maxSizeMB = self.req_max_size.convert_to(MiB)
# data.disk = self.disk.name # by-id
if self.req_disks and len(self.req_disks) == 1:
data.disk = self.disk.name
- data.prim_only = self.req_primary
+ data.primOnly = self.req_primary
else:
- data.on_part = self.name # by-id
+ data.onPart = self.name # by-id
if data.resize:
# on s390x in particular, fractional sizes are reported, which
--
2.40.1

@ -1,133 +0,0 @@
From c2b06150df0b876c7d442097b6c9ca90c9ca2ecc Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 4 May 2023 11:35:44 +0200
Subject: [PATCH] Do not set memory limit for LUKS2 when running in FIPS mode
With FIPS enabled LUKS uses pbkdf and not argon so the memory
limit is not a valid parameter.
Resolves: rhbz#2193096
---
blivet/devicelibs/crypto.py | 11 +++++++
blivet/formats/luks.py | 12 ++++----
tests/unit_tests/formats_tests/luks_test.py | 30 +++++++++++++++++++
.../unit_tests/formats_tests/methods_test.py | 3 +-
4 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/blivet/devicelibs/crypto.py b/blivet/devicelibs/crypto.py
index f0caf0f7..68e68db1 100644
--- a/blivet/devicelibs/crypto.py
+++ b/blivet/devicelibs/crypto.py
@@ -21,6 +21,7 @@
#
import hashlib
+import os
import gi
gi.require_version("BlockDev", "2.0")
@@ -100,3 +101,13 @@ def calculate_integrity_metadata_size(device_size, algorithm=DEFAULT_INTEGRITY_A
jsize = (jsize / SECTOR_SIZE + 1) * SECTOR_SIZE # round up to sector
return msize + jsize
+
+
+def is_fips_enabled():
+ if not os.path.exists("/proc/sys/crypto/fips_enabled"):
+ # if the file doesn't exist, we are definitely not in FIPS mode
+ return False
+
+ with open("/proc/sys/crypto/fips_enabled", "r") as f:
+ enabled = f.read()
+ return enabled.strip() == "1"
diff --git a/blivet/formats/luks.py b/blivet/formats/luks.py
index 2637e0c5..adf3c711 100644
--- a/blivet/formats/luks.py
+++ b/blivet/formats/luks.py
@@ -303,11 +303,13 @@ class LUKS(DeviceFormat):
if luks_data.pbkdf_args:
self.pbkdf_args = luks_data.pbkdf_args
else:
- mem_limit = crypto.calculate_luks2_max_memory()
- if mem_limit:
- self.pbkdf_args = LUKS2PBKDFArgs(max_memory_kb=int(mem_limit.convert_to(KiB)))
- luks_data.pbkdf_args = self.pbkdf_args
- log.info("PBKDF arguments for LUKS2 not specified, using defaults with memory limit %s", mem_limit)
+ # argon is not used with FIPS so we don't need to adjust the memory when in FIPS mode
+ if not crypto.is_fips_enabled():
+ mem_limit = crypto.calculate_luks2_max_memory()
+ if mem_limit:
+ self.pbkdf_args = LUKS2PBKDFArgs(max_memory_kb=int(mem_limit.convert_to(KiB)))
+ luks_data.pbkdf_args = self.pbkdf_args
+ log.info("PBKDF arguments for LUKS2 not specified, using defaults with memory limit %s", mem_limit)
if self.pbkdf_args:
pbkdf = blockdev.CryptoLUKSPBKDF(type=self.pbkdf_args.type,
diff --git a/tests/unit_tests/formats_tests/luks_test.py b/tests/unit_tests/formats_tests/luks_test.py
index ec7b7592..1127e968 100644
--- a/tests/unit_tests/formats_tests/luks_test.py
+++ b/tests/unit_tests/formats_tests/luks_test.py
@@ -6,9 +6,14 @@ except ImportError:
import unittest
from blivet.formats.luks import LUKS
+from blivet.size import Size
+from blivet.static_data import luks_data
class LUKSNodevTestCase(unittest.TestCase):
+ def setUp(self):
+ luks_data.pbkdf_args = None
+
def test_create_discard_option(self):
# flags.discard_new=False --> no discard
fmt = LUKS(exists=False)
@@ -51,6 +56,31 @@ class LUKSNodevTestCase(unittest.TestCase):
fmt = LUKS(cipher="aes-cbc-plain64")
self.assertEqual(fmt.key_size, 0)
+ def test_luks2_pbkdf_memory_fips(self):
+ fmt = LUKS()
+ with patch("blivet.formats.luks.blockdev.crypto") as bd:
+ # fips enabled, pbkdf memory should not be set
+ with patch("blivet.formats.luks.crypto") as crypto:
+ attrs = {"is_fips_enabled.return_value": True,
+ "get_optimal_luks_sector_size.return_value": 0,
+ "calculate_luks2_max_memory.return_value": Size("256 MiB")}
+ crypto.configure_mock(**attrs)
+
+ fmt._create()
+ crypto.calculate_luks2_max_memory.assert_not_called()
+ self.assertEqual(bd.luks_format.call_args[1]["extra"].pbkdf.max_memory_kb, 0)
+
+ # fips disabled, pbkdf memory should be set
+ with patch("blivet.formats.luks.crypto") as crypto:
+ attrs = {"is_fips_enabled.return_value": False,
+ "get_optimal_luks_sector_size.return_value": 0,
+ "calculate_luks2_max_memory.return_value": Size("256 MiB")}
+ crypto.configure_mock(**attrs)
+
+ fmt._create()
+ crypto.calculate_luks2_max_memory.assert_called()
+ self.assertEqual(bd.luks_format.call_args[1]["extra"].pbkdf.max_memory_kb, 256 * 1024)
+
def test_sector_size(self):
fmt = LUKS()
self.assertEqual(fmt.luks_sector_size, 512)
diff --git a/tests/unit_tests/formats_tests/methods_test.py b/tests/unit_tests/formats_tests/methods_test.py
index 2743b7db..5d30c260 100644
--- a/tests/unit_tests/formats_tests/methods_test.py
+++ b/tests/unit_tests/formats_tests/methods_test.py
@@ -366,7 +366,8 @@ class LUKSMethodsTestCase(FormatMethodsTestCase):
def _test_create_backend(self):
self.format.exists = False
- self.format.create()
+ with patch("blivet.devicelibs.crypto.is_fips_enabled", return_value=False):
+ self.format.create()
self.assertTrue(self.patches["blockdev"].crypto.luks_format.called) # pylint: disable=no-member
def _test_setup_backend(self):
--
2.40.1

@ -1,265 +0,0 @@
From eb16230427fc1081f8515e6ad69ccf99ca521e5d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 4 Apr 2023 13:31:40 +0200
Subject: [PATCH 1/2] Add support for filesystem online resize
Resolves: rhbz#2168680
---
blivet/devices/lvm.py | 13 ++++++++-----
blivet/devices/partition.py | 11 ++++++-----
blivet/flags.py | 3 +++
blivet/formats/fs.py | 32 ++++++++++++++++++++++++++++----
blivet/formats/fslib.py | 7 +++++++
5 files changed, 52 insertions(+), 14 deletions(-)
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
index c3132457..ca45c4b5 100644
--- a/blivet/devices/lvm.py
+++ b/blivet/devices/lvm.py
@@ -42,6 +42,7 @@ from .. import errors
from .. import util
from ..storage_log import log_method_call
from .. import udev
+from ..flags import flags
from ..size import Size, KiB, MiB, ROUND_UP, ROUND_DOWN
from ..static_data.lvm_info import lvs_info
from ..tasks import availability
@@ -2729,12 +2730,14 @@ class LVMLogicalVolumeDevice(LVMLogicalVolumeBase, LVMInternalLogicalVolumeMixin
# Setup VG parents (in case they are dmraid partitions for example)
self.vg.setup_parents(orig=True)
- if self.original_format.exists:
- self.original_format.teardown()
- if self.format.exists:
- self.format.teardown()
+ if not flags.allow_online_fs_resize:
+ if self.original_format.exists:
+ self.original_format.teardown()
+ if self.format.exists:
+ self.format.teardown()
+
+ udev.settle()
- udev.settle()
blockdev.lvm.lvresize(self.vg.name, self._name, self.size)
@type_specific
diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py
index 0e9250ce..6ae4b8d3 100644
--- a/blivet/devices/partition.py
+++ b/blivet/devices/partition.py
@@ -745,11 +745,12 @@ class PartitionDevice(StorageDevice):
if not self.exists:
raise errors.DeviceError("device has not been created")
- # don't teardown when resizing luks
- if self.format.type == "luks" and self.children:
- self.children[0].format.teardown()
- else:
- self.teardown()
+ if not flags.allow_online_fs_resize:
+ # don't teardown when resizing luks
+ if self.format.type == "luks" and self.children:
+ self.children[0].format.teardown()
+ else:
+ self.teardown()
if not self.sysfs_path:
return
diff --git a/blivet/flags.py b/blivet/flags.py
index 6364164d..ecfa7ad7 100644
--- a/blivet/flags.py
+++ b/blivet/flags.py
@@ -91,6 +91,9 @@ class Flags(object):
self.debug_threads = False
+ # Allow online filesystem resizes
+ self.allow_online_fs_resize = False
+
def get_boot_cmdline(self):
with open("/proc/cmdline") as f:
buf = f.read().strip()
diff --git a/blivet/formats/fs.py b/blivet/formats/fs.py
index 33922f3a..3f553eb0 100644
--- a/blivet/formats/fs.py
+++ b/blivet/formats/fs.py
@@ -56,7 +56,7 @@ from ..i18n import N_
from .. import udev
from ..mounts import mounts_cache
-from .fslib import kernel_filesystems
+from .fslib import kernel_filesystems, FSResize
import logging
log = logging.getLogger("blivet")
@@ -88,6 +88,9 @@ class FS(DeviceFormat):
# value is already unpredictable and can change in the future...
_metadata_size_factor = 1.0
+ # support for resize: grow/shrink, online/offline
+ _resize_support = 0
+
config_actions_map = {"label": "write_label"}
def __init__(self, **kwargs):
@@ -436,12 +439,27 @@ class FS(DeviceFormat):
self.write_uuid()
def _pre_resize(self):
- # file systems need a check before being resized
- self.do_check()
+ if self.status:
+ if flags.allow_online_fs_resize:
+ if self.target_size > self.size and not self._resize_support & FSResize.ONLINE_GROW:
+ raise FSError("This filesystem doesn't support online growing")
+ if self.target_size < self.size and not self._resize_support & FSResize.ONLINE_SHRINK:
+ raise FSError("This filesystem doesn't support online shrinking")
+ else:
+ raise FSError("Resizing of mounted filesystems is disabled")
+
+ if self.status:
+ # fsck tools in general don't allow checks on mounted filesystems
+ log.debug("Filesystem on %s is mounted, not checking", self.device)
+ else:
+ # file systems need a check before being resized
+ self.do_check()
+
super(FS, self)._pre_resize()
def _post_resize(self):
- self.do_check()
+ if not self.status:
+ self.do_check()
super(FS, self)._post_resize()
def do_check(self):
@@ -838,6 +856,7 @@ class Ext2FS(FS):
_formattable = True
_supported = True
_resizable = True
+ _resize_support = FSResize.ONLINE_GROW | FSResize.OFFLINE_GROW | FSResize.OFFLINE_SHRINK
_linux_native = True
_max_size = Size("8 TiB")
_dump = True
@@ -1097,6 +1116,7 @@ class XFS(FS):
_linux_native = True
_supported = True
_resizable = True
+ _resize_support = FSResize.ONLINE_GROW | FSResize.OFFLINE_GROW
_packages = ["xfsprogs"]
_fsck_class = fsck.XFSCK
_info_class = fsinfo.XFSInfo
@@ -1247,6 +1267,7 @@ class NTFS(FS):
_labelfs = fslabeling.NTFSLabeling()
_uuidfs = fsuuid.NTFSUUID()
_resizable = True
+ _resize_support = FSResize.OFFLINE_GROW | FSResize.OFFLINE_SHRINK
_formattable = True
_supported = True
_min_size = Size("1 MiB")
@@ -1490,6 +1511,9 @@ class TmpFS(NoDevFS):
# same, nothing actually needs to be set
pass
+ def _pre_resize(self):
+ self.do_check()
+
def do_resize(self):
# Override superclass method to record whether mount options
# should include an explicit size specification.
diff --git a/blivet/formats/fslib.py b/blivet/formats/fslib.py
index ea93b1fd..8722e942 100644
--- a/blivet/formats/fslib.py
+++ b/blivet/formats/fslib.py
@@ -36,3 +36,10 @@ def update_kernel_filesystems():
update_kernel_filesystems()
+
+
+class FSResize():
+ OFFLINE_SHRINK = 1 << 1
+ OFFLINE_GROW = 1 << 2
+ ONLINE_SHRINK = 1 << 3
+ ONLINE_GROW = 1 << 4
--
2.40.1
From 3fce5d0bfd7b09a976ff49feed15077477c6a425 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 6 Apr 2023 14:02:11 +0200
Subject: [PATCH 2/2] Add a test case for filesystem online resize
Related: rhbz#2168680
---
tests/storage_tests/formats_test/fs_test.py | 43 ++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/tests/storage_tests/formats_test/fs_test.py b/tests/storage_tests/formats_test/fs_test.py
index 97f4cbbe..1d42dc21 100644
--- a/tests/storage_tests/formats_test/fs_test.py
+++ b/tests/storage_tests/formats_test/fs_test.py
@@ -6,9 +6,10 @@ import parted
import blivet.formats.fs as fs
from blivet.size import Size, ROUND_DOWN
-from blivet.errors import DeviceFormatError
+from blivet.errors import DeviceFormatError, FSError
from blivet.formats import get_format
from blivet.devices import PartitionDevice, DiskDevice
+from blivet.flags import flags
from .loopbackedtestcase import LoopBackedTestCase
@@ -26,6 +27,46 @@ class Ext3FSTestCase(Ext2FSTestCase):
class Ext4FSTestCase(Ext3FSTestCase):
_fs_class = fs.Ext4FS
+ def test_online_resize(self):
+ an_fs = self._fs_class()
+ if not an_fs.formattable:
+ self.skipTest("can not create filesystem %s" % an_fs.name)
+ an_fs.device = self.loop_devices[0]
+ self.assertIsNone(an_fs.create())
+ an_fs.update_size_info()
+
+ if not self.can_resize(an_fs):
+ self.skipTest("filesystem is not resizable")
+
+ # shrink offline first (ext doesn't support online shrinking)
+ TARGET_SIZE = Size("64 MiB")
+ an_fs.target_size = TARGET_SIZE
+ self.assertEqual(an_fs.target_size, TARGET_SIZE)
+ self.assertNotEqual(an_fs._size, TARGET_SIZE)
+ self.assertIsNone(an_fs.do_resize())
+
+ with tempfile.TemporaryDirectory() as mountpoint:
+ an_fs.mount(mountpoint=mountpoint)
+
+ # grow back when mounted
+ TARGET_SIZE = Size("100 MiB")
+ an_fs.target_size = TARGET_SIZE
+ self.assertEqual(an_fs.target_size, TARGET_SIZE)
+ self.assertNotEqual(an_fs._size, TARGET_SIZE)
+
+ # should fail, online resize disabled by default
+ with self.assertRaisesRegex(FSError, "Resizing of mounted filesystems is disabled"):
+ an_fs.do_resize()
+
+ # enable online resize
+ flags.allow_online_fs_resize = True
+ an_fs.do_resize()
+ flags.allow_online_fs_resize = False
+ self._test_sizes(an_fs)
+ self.assertEqual(an_fs.system_mountpoint, mountpoint)
+
+ an_fs.unmount()
+
class FATFSTestCase(fstesting.FSAsRoot):
_fs_class = fs.FATFS
--
2.40.1

@ -1,383 +0,0 @@
From 2d26f69abc2d793e753c0cddb3086264ca2b4e71 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 6 Mar 2023 10:51:42 +0100
Subject: [PATCH 1/5] Allow changing iSCSI initiator name after setting it
Resolves: rhbz#2221935
---
blivet/iscsi.py | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/blivet/iscsi.py b/blivet/iscsi.py
index 86451db3..0d063f2a 100644
--- a/blivet/iscsi.py
+++ b/blivet/iscsi.py
@@ -212,14 +212,23 @@ class iSCSI(object):
@initiator.setter
@storaged_iscsi_required(critical=True, eval_mode=util.EvalMode.onetime)
def initiator(self, val):
- if self.initiator_set and val != self._initiator:
- raise ValueError(_("Unable to change iSCSI initiator name once set"))
if len(val) == 0:
raise ValueError(_("Must provide an iSCSI initiator name"))
+ active = self._get_active_sessions()
+ if active:
+ raise errors.ISCSIError(_("Cannot change initiator name with an active session"))
+
log.info("Setting up iSCSI initiator name %s", self.initiator)
args = GLib.Variant("(sa{sv})", (val, None))
self._call_initiator_method("SetInitiatorName", args)
+
+ if self.initiator_set and val != self._initiator:
+ log.info("Restarting iscsid after initiator name change")
+ rc = util.run_program(["systemctl", "restart", "iscsid"])
+ if rc != 0:
+ raise errors.ISCSIError(_("Failed to restart iscsid after initiator name change"))
+
self._initiator = val
def active_nodes(self, target=None):
--
2.40.1
From 7c226ed0e14efcdd6e562e357d8f3465ad43ef33 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 6 Mar 2023 15:10:28 +0100
Subject: [PATCH 2/5] Add a basic test case for the iscsi module
Related: rhbz#2221935
---
misc/install-test-dependencies.yml | 3 +
tests/storage_tests/__init__.py | 2 +
tests/storage_tests/iscsi_test.py | 157 +++++++++++++++++++++++++++++
3 files changed, 162 insertions(+)
create mode 100644 tests/storage_tests/iscsi_test.py
diff --git a/tests/storage_tests/__init__.py b/tests/storage_tests/__init__.py
index 3b2a6cc4..e69fcc34 100644
--- a/tests/storage_tests/__init__.py
+++ b/tests/storage_tests/__init__.py
@@ -3,3 +3,5 @@ from .formats_test import *
from .partitioning_test import *
from .unsupported_disklabel_test import *
+
+from .iscsi_test import *
diff --git a/tests/storage_tests/iscsi_test.py b/tests/storage_tests/iscsi_test.py
new file mode 100644
index 00000000..00cc7c36
--- /dev/null
+++ b/tests/storage_tests/iscsi_test.py
@@ -0,0 +1,157 @@
+import glob
+import os
+import re
+import shutil
+import subprocess
+import unittest
+
+from contextlib import contextmanager
+
+from .storagetestcase import create_sparse_tempfile
+
+
+def read_file(filename, mode="r"):
+ with open(filename, mode) as f:
+ content = f.read()
+ return content
+
+
+@contextmanager
+def udev_settle():
+ try:
+ yield
+ finally:
+ os.system("udevadm settle")
+
+
+def _delete_backstore(name):
+ status = subprocess.call(["targetcli", "/backstores/fileio/ delete %s" % name],
+ stdout=subprocess.DEVNULL)
+ if status != 0:
+ raise RuntimeError("Failed to delete the '%s' fileio backstore" % name)
+
+
+def delete_iscsi_target(iqn, backstore=None):
+ status = subprocess.call(["targetcli", "/iscsi delete %s" % iqn],
+ stdout=subprocess.DEVNULL)
+ if status != 0:
+ raise RuntimeError("Failed to delete the '%s' iscsi device" % iqn)
+
+ if backstore is not None:
+ _delete_backstore(backstore)
+
+
+def create_iscsi_target(fpath, initiator_name=None):
+ """
+ Creates a new iSCSI target (using targetcli) on top of the
+ :param:`fpath` backing file.
+
+ :param str fpath: path of the backing file
+ :returns: iSCSI IQN, backstore name
+ :rtype: tuple of str
+
+ """
+
+ # "register" the backing file as a fileio backstore
+ store_name = os.path.basename(fpath)
+ status = subprocess.call(["targetcli", "/backstores/fileio/ create %s %s" % (store_name, fpath)], stdout=subprocess.DEVNULL)
+ if status != 0:
+ raise RuntimeError("Failed to register '%s' as a fileio backstore" % fpath)
+
+ out = subprocess.check_output(["targetcli", "/backstores/fileio/%s info" % store_name])
+ out = out.decode("utf-8")
+ store_wwn = None
+ for line in out.splitlines():
+ if line.startswith("wwn: "):
+ store_wwn = line[5:]
+ if store_wwn is None:
+ raise RuntimeError("Failed to determine '%s' backstore's wwn" % store_name)
+
+ # create a new iscsi device
+ out = subprocess.check_output(["targetcli", "/iscsi create"])
+ out = out.decode("utf-8")
+ match = re.match(r'Created target (.*).', out)
+ if match:
+ iqn = match.groups()[0]
+ else:
+ _delete_backstore(store_name)
+ raise RuntimeError("Failed to create a new iscsi target")
+
+ if initiator_name:
+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL)
+ if status != 0:
+ delete_iscsi_target(iqn, store_name)
+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn)
+
+ with udev_settle():
+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/luns create /backstores/fileio/%s" % (iqn, store_name)], stdout=subprocess.DEVNULL)
+ if status != 0:
+ delete_iscsi_target(iqn, store_name)
+ raise RuntimeError("Failed to create a new LUN for '%s' using '%s'" % (iqn, store_name))
+
+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1 set attribute generate_node_acls=1" % iqn], stdout=subprocess.DEVNULL)
+ if status != 0:
+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn)
+
+ return iqn, store_name
+
+
+@unittest.skipUnless(os.geteuid() == 0, "requires root privileges")
+@unittest.skipUnless(os.environ.get("JENKINS_HOME"), "jenkins only test")
+@unittest.skipUnless(shutil.which("iscsiadm"), "iscsiadm not available")
+class ISCSITestCase(unittest.TestCase):
+
+ _disk_size = 512 * 1024**2
+ initiator = 'iqn.1994-05.com.redhat:iscsi-test'
+
+ def setUp(self):
+ self.addCleanup(self._clean_up)
+
+ self._dev_file = None
+ self.dev = None
+
+ self._dev_file = create_sparse_tempfile("blivet_test", self._disk_size)
+ try:
+ self.dev, self.backstore = create_iscsi_target(self._dev_file, self.initiator)
+ except RuntimeError as e:
+ raise RuntimeError("Failed to setup targetcli device for testing: %s" % e)
+
+ def _force_logout(self):
+ subprocess.call(["iscsiadm", "--mode", "node", "--logout", "--name", self.dev], stdout=subprocess.DEVNULL)
+
+ def _clean_up(self):
+ self._force_logout()
+ delete_iscsi_target(self.dev, self.backstore)
+ os.unlink(self._dev_file)
+
+ def test_discover_login(self):
+ from blivet.iscsi import iscsi, has_iscsi
+
+ if not has_iscsi():
+ self.skipTest("iSCSI not available, skipping")
+
+ iscsi.initiator = self.initiator
+ nodes = iscsi.discover("127.0.0.1")
+ self.assertTrue(nodes)
+
+ if len(nodes) > 1:
+ self.skipTest("Discovered more than one iSCSI target on localhost, skipping")
+
+ self.assertEqual(nodes[0].address, "127.0.0.1")
+ self.assertEqual(nodes[0].port, 3260)
+ self.assertEqual(nodes[0].name, self.dev)
+
+ # change the initiator name
+ iscsi.initiator = self.initiator + "_1"
+ self.assertEqual(iscsi.initiator, self.initiator + "_1")
+
+ # try to login
+ ret, err = iscsi.log_into_node(nodes[0])
+ self.assertTrue(ret, "Login failed: %s" % err)
+
+ # check the session for initiator name
+ sessions = glob.glob("/sys/class/iscsi_session/*/")
+ self.assertTrue(sessions)
+ self.assertEqual(len(sessions), 1)
+ initiator = read_file(sessions[0] + "initiatorname").strip()
+ self.assertEqual(initiator, iscsi.initiator)
--
2.40.1
From dfd0c59a901f54ecfd8f538a2bb004a2e5ab6eec Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 6 Mar 2023 15:14:40 +0100
Subject: [PATCH 3/5] tests: Use blivet-specific prefix for targetcli backing
files
The code is originally from libblockdev hence the "bd" prefix, we
should use a different prefix for blivet to be able to identify
which test suite failed to clean the files.
Related: rhbz#2221935
---
tests/storage_tests/storagetestcase.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/storage_tests/storagetestcase.py b/tests/storage_tests/storagetestcase.py
index 35d57ce9..9f859977 100644
--- a/tests/storage_tests/storagetestcase.py
+++ b/tests/storage_tests/storagetestcase.py
@@ -39,7 +39,7 @@ def create_sparse_tempfile(name, size):
:param size: the file size (in bytes)
:returns: the path to the newly created file
"""
- (fd, path) = tempfile.mkstemp(prefix="bd.", suffix="-%s" % name)
+ (fd, path) = tempfile.mkstemp(prefix="blivet.", suffix="-%s" % name)
os.close(fd)
create_sparse_file(path, size)
return path
--
2.40.1
From 492fc9b8dfc2d4aa7cb44baa4408570babcb5e96 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 19 Jul 2023 13:57:39 +0200
Subject: [PATCH 4/5] iscsi: Save firmware initiator name to
/etc/iscsi/initiatorname.iscsi
Resolves: rhbz#2221932
---
blivet/iscsi.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/blivet/iscsi.py b/blivet/iscsi.py
index 0d063f2a..8080a671 100644
--- a/blivet/iscsi.py
+++ b/blivet/iscsi.py
@@ -160,6 +160,11 @@ class iSCSI(object):
self._initiator = initiatorname
except Exception as e: # pylint: disable=broad-except
log.info("failed to get initiator name from iscsi firmware: %s", str(e))
+ else:
+ # write the firmware initiator to /etc/iscsi/initiatorname.iscsi
+ log.info("Setting up firmware iSCSI initiator name %s", self.initiator)
+ args = GLib.Variant("(sa{sv})", (initiatorname, None))
+ self._call_initiator_method("SetInitiatorName", args)
# So that users can write iscsi() to get the singleton instance
def __call__(self):
--
2.40.1
From 768d90815b7f95d0d6d278397fd6fd12a0490b5d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 19 Jul 2023 10:38:45 +0200
Subject: [PATCH 5/5] tests: Improve iscsi_test.ISCSITestCase
Changed how we create the initiator name ACLs based on RTT test
case for rhbz#2084043 and also improved the test case itself.
Related: rhbz#2221935
---
tests/storage_tests/iscsi_test.py | 36 +++++++++++++++++++++----------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/tests/storage_tests/iscsi_test.py b/tests/storage_tests/iscsi_test.py
index 00cc7c36..6cc83a59 100644
--- a/tests/storage_tests/iscsi_test.py
+++ b/tests/storage_tests/iscsi_test.py
@@ -77,21 +77,17 @@ def create_iscsi_target(fpath, initiator_name=None):
_delete_backstore(store_name)
raise RuntimeError("Failed to create a new iscsi target")
- if initiator_name:
- status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL)
- if status != 0:
- delete_iscsi_target(iqn, store_name)
- raise RuntimeError("Failed to set ACLs for '%s'" % iqn)
-
with udev_settle():
status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/luns create /backstores/fileio/%s" % (iqn, store_name)], stdout=subprocess.DEVNULL)
if status != 0:
delete_iscsi_target(iqn, store_name)
raise RuntimeError("Failed to create a new LUN for '%s' using '%s'" % (iqn, store_name))
- status = subprocess.call(["targetcli", "/iscsi/%s/tpg1 set attribute generate_node_acls=1" % iqn], stdout=subprocess.DEVNULL)
- if status != 0:
- raise RuntimeError("Failed to set ACLs for '%s'" % iqn)
+ if initiator_name:
+ status = subprocess.call(["targetcli", "/iscsi/%s/tpg1/acls create %s" % (iqn, initiator_name)], stdout=subprocess.DEVNULL)
+ if status != 0:
+ delete_iscsi_target(iqn, store_name)
+ raise RuntimeError("Failed to set ACLs for '%s'" % iqn)
return iqn, store_name
@@ -130,6 +126,7 @@ class ISCSITestCase(unittest.TestCase):
if not has_iscsi():
self.skipTest("iSCSI not available, skipping")
+ # initially set the initiator to the correct/allowed one
iscsi.initiator = self.initiator
nodes = iscsi.discover("127.0.0.1")
self.assertTrue(nodes)
@@ -141,11 +138,28 @@ class ISCSITestCase(unittest.TestCase):
self.assertEqual(nodes[0].port, 3260)
self.assertEqual(nodes[0].name, self.dev)
- # change the initiator name
+ # change the initiator name to a wrong one
iscsi.initiator = self.initiator + "_1"
self.assertEqual(iscsi.initiator, self.initiator + "_1")
- # try to login
+ # check the change made it to /etc/iscsi/initiatorname.iscsi
+ initiator_file = read_file("/etc/iscsi/initiatorname.iscsi").strip()
+ self.assertEqual(initiator_file, "InitiatorName=%s" % self.initiator + "_1")
+
+ # try to login (should fail)
+ ret, err = iscsi.log_into_node(nodes[0])
+ self.assertFalse(ret)
+ self.assertIn("authorization failure", err)
+
+ # change the initiator name back to the correct one
+ iscsi.initiator = self.initiator
+ self.assertEqual(iscsi.initiator, self.initiator)
+
+ # check the change made it to /etc/iscsi/initiatorname.iscsi
+ initiator_file = read_file("/etc/iscsi/initiatorname.iscsi").strip()
+ self.assertEqual(initiator_file, "InitiatorName=%s" % self.initiator)
+
+ # try to login (should work now)
ret, err = iscsi.log_into_node(nodes[0])
self.assertTrue(ret, "Login failed: %s" % err)
--
2.40.1

@ -1,58 +1,40 @@
%define is_rhel 0%{?rhel} != 0
# python3 is not available on RHEL <=7
%if %{is_rhel} && 0%{?rhel} <= 7
# disable python3 by default
%bcond_with python3
%else
%bcond_without python3
%endif
# python2 is not available on RHEL > 7 and not needed on Fedora > 28
%if 0%{?rhel} > 7 || 0%{?fedora} > 28
# disable python2 by default
%bcond_with python2
%else
%bcond_without python2
%endif
Summary: A python module for system storage configuration
Name: python-blivet
Url: https://storageapis.wordpress.com/projects/blivet
Version: 3.6.0
Version: 3.10.0
#%%global prerelease .b2
# prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2
Release: 9%{?prerelease}%{?dist}
Release: 14%{?prerelease}%{?dist}
Epoch: 1
License: LGPLv2+
License: LGPL-2.1-or-later
%global realname blivet
%global realversion %{version}%{?prerelease}
Source0: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}.tar.gz
Source1: http://github.com/storaged-project/blivet/archive/%{realname}-%{realversion}-tests.tar.gz
Patch0: 0001-force-lvm-cli-plugin.patch
Patch1: 0002-remove-btrfs-plugin.patch
Patch2: 0003-Revert-More-consistent-lvm-errors.patch
Patch3: 0004-DDF-RAID-support-using-mdadm.patch
Patch4: 0005-Revert-Remove-the-Blivet.roots-attribute.patch
Patch5: 0006-Fix-potential-AttributeError-when-getting-stratis-bl.patch
Patch6: 0007-tests-Skip-XFS-resize-test-on-CentOS-RHEL-9.patch
Patch7: 0008-Revert-Adjust-to-new-XFS-min-size.patch
Patch8: 0009-Catch-BlockDevNotImplementedError-for-btrfs-plugin-c.patch
Patch9: 0010-Add-basic-support-for-NVMe-and-NVMe-Fabrics-devices.patch
Patch10: 0011-Default-to-encryption-sector-size-512-for-LUKS-devic.patch
Patch11: 0012-Add-support-for-specifying-stripe-size-for-RAID-LVs.patch
Patch12: 0013-Fix-setting-kickstart-data.patch
Patch13: 0014-Do-not-set-memory-limit-for-LUKS2-when-running-in-FI.patch
Patch14: 0015-Add-support-for-filesystem-online-resize.patch
Patch15: 0016-Backport-iSCSI-initiator-name-related-fixes.patch
%if 0%{?rhel} >= 9
Patch0: 0001-remove-btrfs-plugin.patch
%endif
Patch1: 0002-Fix-skipping-btrfs-calls-when-libblockdev-btrfs-plugin-is-missing.patch
Patch2: 0003-XFS-resize-test-fix.patch
Patch3: 0004-Run-mkfs-xfs-with-force-option-by-default.patch
Patch4: 0005-consolidated-s390-device-configuration.patch
Patch5: 0006-Remove-support-for-the-MD-linear-RAID-level.patch
Patch6: 0007-Fix-checking-for-NVMe-plugin-availability.patch
Patch7: 0008-Align-sizes-up-for-growable-LVs.patch
Patch8: 0009-mod_pass_in_stratis_test.patch
Patch9: 0010-Fix_running_tests_in_FIPS_mode.patch
Patch10: 0011-Make-GPT-default-label-type-on-all-architectures.patch
Patch11: 0012-Fix-crash-on-ppc64le-with-GPT.patch
# Versions of required components (done so we make sure the buildrequires
# match the requires versions of things).
%global partedver 3.2
%global partedver 1.8.1
%global pypartedver 3.10.4
%global utillinuxver 2.15.1
%global libblockdevver 2.24
%global libblockdevver 3.0
%global libbytesizever 0.3
%global pyudevver 0.18
@ -75,7 +57,6 @@ Conflicts: python3-blivet < 1:2.0.0
The %{realname}-data package provides data files required by the %{realname}
python module.
%if %{with python3}
%package -n python3-%{realname}
Summary: A python3 package for examining and modifying storage configuration.
@ -85,26 +66,25 @@ BuildRequires: gettext
BuildRequires: python3-devel
BuildRequires: python3-setuptools
%{?__python3:Requires: %{__python3}}
Requires: python3-six
Requires: python3
Requires: python3-pyudev >= %{pyudevver}
Requires: parted >= %{partedver}
Requires: python3-pyparted >= %{pypartedver}
Requires: libselinux-python3
Requires: python3-libmount
Requires: python3-blockdev >= %{libblockdevver}
Recommends: libblockdev-btrfs >= %{libblockdevver}
Recommends: libblockdev-crypto >= %{libblockdevver}
Recommends: libblockdev-dm >= %{libblockdevver}
Recommends: libblockdev-fs >= %{libblockdevver}
Recommends: libblockdev-kbd >= %{libblockdevver}
Recommends: libblockdev-loop >= %{libblockdevver}
Recommends: libblockdev-lvm >= %{libblockdevver}
Recommends: libblockdev-mdraid >= %{libblockdevver}
Recommends: libblockdev-mpath >= %{libblockdevver}
Recommends: libblockdev-nvdimm >= %{libblockdevver}
Recommends: libblockdev-part >= %{libblockdevver}
Recommends: libblockdev-nvme >= %{libblockdevver}
Recommends: libblockdev-swap >= %{libblockdevver}
Recommends: libblockdev-s390 >= %{libblockdevver}
Requires: python3-bytesize >= %{libbytesizever}
Requires: util-linux >= %{utillinuxver}
Requires: lsof
@ -114,77 +94,19 @@ Requires: %{realname}-data = %{epoch}:%{version}-%{release}
Obsoletes: blivet-data < 1:2.0.0
%if %{without python2}
Obsoletes: python2-blivet < 1:2.0.2-2
Obsoletes: python-blivet < 1:2.0.2-2
%else
Obsoletes: python-blivet < 1:2.0.0
%endif
%description -n python3-%{realname}
The python3-%{realname} is a python3 package for examining and modifying storage
configuration.
%endif
%if %{with python2}
%package -n python2-%{realname}
Summary: A python2 package for examining and modifying storage configuration.
%{?python_provide:%python_provide python2-%{realname}}
BuildRequires: gettext
BuildRequires: python2-devel
BuildRequires: python2-setuptools
Requires: python2
Requires: python2-six
Requires: python2-pyudev >= %{pyudevver}
Requires: parted >= %{partedver}
Requires: python2-pyparted >= %{pypartedver}
Requires: python2-libselinux
Requires: python2-blockdev >= %{libblockdevver}
Recommends: libblockdev-btrfs >= %{libblockdevver}
Recommends: libblockdev-crypto >= %{libblockdevver}
Recommends: libblockdev-dm >= %{libblockdevver}
Recommends: libblockdev-fs >= %{libblockdevver}
Recommends: libblockdev-kbd >= %{libblockdevver}
Recommends: libblockdev-loop >= %{libblockdevver}
Recommends: libblockdev-lvm >= %{libblockdevver}
Recommends: libblockdev-mdraid >= %{libblockdevver}
Recommends: libblockdev-mpath >= %{libblockdevver}
Recommends: libblockdev-nvdimm >= %{libblockdevver}
Recommends: libblockdev-nvme >= %{libblockdevver}
Recommends: libblockdev-part >= %{libblockdevver}
Recommends: libblockdev-swap >= %{libblockdevver}
Recommends: libblockdev-s390 >= %{libblockdevver}
Requires: python2-bytesize >= %{libbytesizever}
Requires: util-linux >= %{utillinuxver}
Requires: lsof
Requires: python2-hawkey
Requires: %{realname}-data = %{epoch}:%{version}-%{release}
Requires: systemd-udev
Requires: python2-gobject-base
Obsoletes: blivet-data < 1:2.0.0
Obsoletes: python-blivet < 1:2.0.0
%description -n python2-%{realname}
The python2-%{realname} is a python2 package for examining and modifying storage
configuration.
%endif
%prep
%autosetup -n %{realname}-%{realversion} -N
%autosetup -n %{realname}-%{realversion} -b1 -p1
%build
%{?with_python2:make PYTHON=%{__python2}}
%{?with_python3:make PYTHON=%{__python3}}
make
%install
%{?with_python2:make PYTHON=%{__python2} DESTDIR=%{buildroot} install}
%{?with_python3:make PYTHON=%{__python3} DESTDIR=%{buildroot} install}
make DESTDIR=%{buildroot} install
%find_lang %{realname}
@ -194,163 +116,623 @@ configuration.
%{_libexecdir}/*
%{_unitdir}/*
%if %{with python2}
%files -n python2-%{realname}
%license COPYING
%doc README.md ChangeLog examples
%{python2_sitelib}/*
%endif
%if %{with python3}
%files -n python3-%{realname}
%license COPYING
%doc README.md ChangeLog examples
%{python3_sitelib}/*
%endif
%changelog
* Mon Jul 24 2023 Jan Pokorny <japokorn@redhat.com> - 3.6.0-9
Backport iSCSI initiator name related fixes:
- Allow changing iSCSI initiator name after setting it
Resolves: rhbz#2221935
- Add a basic test case for the iscsi module
Resolves: rhbz#2221935
- tests: Use blivet-specific prefix for targetcli backing files
Resolves: rhbz#2221935
- iscsi: Save firmware initiator name to /etc/iscsi/initiatorname.iscsi
Resolves: rhbz#2221932
- tests: Improve iscsi_test.ISCSITestCase
Resolves: rhbz#2221935
* Wed May 24 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-8
* Thu Dec 05 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-14
- Fix crash on ppc64le with GPT
Resolves: RHEL-70153
* Tue Nov 19 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-13
- Make GPT default label type on all architectures
Resolves: RHEL-52200
* Tue Nov 12 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-12
- Fix running tests in FIPS mode
Resolves: RHEL-45173
* Fri Nov 1 2024 Jan Pokorny <japokorn@redhat.com> - 3.10.0-11
- Modified passphrase in stratis test
Resolves: RHEL-45173
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 1:3.10.0-10
- Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018
* Thu Oct 24 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-9
- Align sizes up for growable LVs
Resolves: RHEL-45180
Resolves: RHEL-45181
* Wed Oct 09 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-8
- Fix dependency on libblockdev-s390
Resolves: RHEL-61187
* Mon Sep 30 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-7
- Fix checking for NVMe plugin availability
Resolves: RHEL-45179
* Mon Sep 09 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-6
- Remove support for the MD linear RAID level
Resolves: RHEL-38386
* Tue Jul 16 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-5
- Consolidated Device Configuration for RHEL 10
Resolves: RHEL-39381
* Thu Jun 27 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-4
- tests: Try waiting after partition creation for XFS resize test
Resolves: RHEL-45177
- Run mkfs.xfs with the force (-f) option by default
Resolves: RHEL-39384
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 1:3.10.0-3
- Bump release for June 2024 mass rebuild
* Tue May 14 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-2
- Fix skipping btrfs calls when libblockdev btrfs plugin is missing
Resolves: RHEL-36190
* Fri May 10 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.10.0-1
- Added support for PV grow (japokorn)
- misc: Add stratis-cli and stratisd to test dependencies (vtrefny)
- tests: Add a base class for stratis tests (vtrefny)
- Add a Stratis example with pool encryption using Clevis/Tang (vtrefny)
- Clear VG UUID from PVs after removing the PV (#2278058) (vtrefny)
- Use longer timeout for Stratis DBus calls (vtrefny)
- safe-dbus: Allow using custom timeouts for the DBus calls (vtrefny)
- Catch JSONDecodeError when parsing Stratis Clevis info (vtrefny)
- Add support for unlocking locked Stratis pools with Clevis (vtrefny)
- Add support for creating encrypted Stratis pool with Clevis (vtrefny)
- Round Stratis Filesystem size down to the nearest sector (vtrefny)
- Make sure to include stderr when gathering output of stratis tools (vtrefny)
- Add support for adding new members to existing Stratis pool (vtrefny)
- Base StratisPoolDevice on ContainerDevice instead of StorageDevice (vtrefny)
- Ignore invalid/empty UUIDs for NVMe namespaces (vtrefny)
- lvm: Use more generic exception for inconsistent PV sector sizes (vtrefny)
- Do not allow creating stratis pools with different sector sizes (vtrefny)
- availability: Fix starting DBus services (vtrefny)
- fstab: Use 'mount_type' when writing filesystem type to fstab (vtrefny)
- Add basic support for BitLocker devices (vtrefny)
- nvme: Skip startup/write when NVMe plugin isn't available (vtrefny)
- Fix scanning partitions on RAID arrays (#2269133) (vtrefny)
- Add a test case with DDF BIOS RAID array (vtrefny)
- tests: Try to get distro and version from /etc/os-release (vtrefny)
- availability: Fix checking for DBus service availability (vtrefny)
- ci: Update packit configuration for 3.10-devel (vtrefny)
- Remove vim formatting comments (vtrefny)
- tests: Do not ignore entire test files in pylint (vtrefny)
- tests: Do not try to import mock and patch from mock (vtrefny)
- Remove util.stringize and unicodeize functions (vtrefny)
- Remove Python SIX usage (vtrefny)
- Remove unused flags and do not read flags from boot command line (vtrefny)
* Mon Feb 12 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.9.0-3
- Fix UnboundLocalError in MD populator (#2263668)
* Tue Feb 06 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.9.0-2
- Fix crash when scanning degraded/not fully assembled MD arrays
* Wed Jan 31 2024 Vojtech Trefny <vtrefny@redhat.com> - 3.9.0-1
- Fix getting default LVM cache metadata size from libblockdev (vtrefny)
- Fix checking for segment type for cache pools (vtrefny)
- tests: Enable GFS2 tests (vtrefny)
- tests: Move 'test_labels' to unit tests (vtrefny)
- Add a new function to check if a filesystem is empty (vtrefny)
- tests: Wait for array resync in MD tests (vtrefny)
- misc: Vagrantfile update (vtrefny)
- tests: Add a simple unit test for the NVMe module (vtrefny)
- tests: Add a test case with multiple devices with the same name (vtrefny)
- tests: Add basic unit tests for device_id (vtrefny)
- tests: Add a simple test for DeviceTree.get_device_by_device_id (vtrefny)
- Use get_device_by_device_id instead of _by_name in populator (vtrefny)
- Add a function to get a device by device ID (vtrefny)
- Add "device ID" that could be used as a unique device identifier (vtrefny)
- Fix adding new members to array with redundancy (vtrefny)
- Correctly set md_uuid when adding/removing member to/from array (vtrefny)
- tests: Add storage test case for MD RAID (vtrefny)
- Remove unused pylintcodediff helper script (vtrefny)
- tests: Add a simple unit test for Btrfs (vtrefny)
- Generate UUID for newly created btrfs volumes (vtrefny)
- nvme: Retrieve HostNQN from a first active fabrics connection (tbzatek)
- ci: Set custom release number for Packit (vtrefny)
- Support partitioning of hybrid boot disks (vponcova)
- Fix checking PV free space when removing it from a VG (#2232328) (vtrefny)
- tests: run_tests script enhancements (vtrefny)
- Add a BTRFS example (vtrefny)
- tests: Add a storage test case for BTRFS (vtrefny)
- Remove support for NVDIMM namespaces (vtrefny)
- Fix passing extra mkfs arguments to libblockdev (vtrefny)
- ci: Add a GH action to run blivet-gui test suite on PRs (vtrefny)
- ci: Add a Dockerfile for building a CI container (vtrefny)
- ci: Allow installing only build dependencies without test deps (vtrefny)
- Fix failing tests when running as a non-root user (vtrefny)
- Add flag to control LVM devices file support (vtrefny)
- Use libblockdev to check for kernel modules availability (vtrefny)
- Use libblockdev to remove filesystems instead of calling wipefs (vtrefny)
- swap: Use libblockdev to check label and UUID format (vtrefny)
- fs_test: Enable NTFS test case (vtrefny)
- availability: Remove the unused "lvmdevices" application (vtrefny)
- availability: Cleanup applications (vtrefny)
- Remove support for Apple HFS format (vtrefny)
- Fix raising FormatCreateError in FS._create (vtrefny)
- Use libblockdev for filesystem mount operation (vtrefny)
- Use os.statvfs instead of df to get tmpfs size (vtrefny)
- Use libblockdev to create supported filesystems (vtrefny)
- Use libblockdev for reading filesystem label (vtrefny)
- Use libblockdev for getting filesystem info and size (vtrefny)
- Use libblockdev for filesystem resizing (vtrefny)
- Use libblockdev for setting and checking filesystem label and UUID (vtrefny)
- swap: Simplify creating swap with UUID (vtrefny)
- Use libblockdev for the filesystem sync operation (vtrefny)
- Add libblockdev filesystem plugin to the list of required plugins (vtrefny)
- availability: Remove unused "mlabel" application (vtrefny)
- availability: Simplify checks for LVM VDO and shared LVM support (vtrefny)
- availability: Do not check e2fsprogs version (vtrefny)
- Remove JFS support (vtrefny)
- Remove support for ReiserFS (vtrefny)
- ci: Update default branch for Packit to 3.9-devel/release (vtrefny)
- fcoe/iscsi: Use libblockdev to load modules instead of modprobe (vtrefny)
- Added missing fstab object to SwapSpace (japokorn)
- misc: Update test dependencies ansible playbook (vtrefny)
- misc: Simplify the makebumpver script (vtrefny)
- Do not fail when kpartx is not available (vtrefny)
- Move kpartx dependency from DMDevice to MultipathDevice (vtrefny)
- ci: Update default branch for Packit to 3.9-devel/release (vtrefny)
- Include btrfs volumes names/labels in DeviceTreeBase.names (vtrefny)
- fixed fstab.read issue (japokorn)
- Added support for user defined values in fstab (japokorn)
- Incorporated review comments (japokorn)
- Fstab support (japokorn)
- add udev-builtin-path_id property to zfcp-attached SCSI disks (maier)
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.8.2-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.8.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Wed Dec 13 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.8.2-2
- add udev-builtin-path_id property to zfcp-attached SCSI disks
* Thu Oct 12 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.8.2-1
- tests: Ignore new pylint false positive with pylint 3.0 (vtrefny)
- pylint: Use 'exit' instead of 'do_exit' for pylint.lint.Run (vtrefny)
- Revert "When creating a shared LVM VG skip pvcreate" (vtrefny)
- Revert "Force command line based libblockdev LVM plugin" (vtrefny)
- ci: Bump actions/checkout from v2/3 to v4 (vtrefny)
- spec: Add libblockdev-nvme as weak dependency (vtrefny)
- Always require NVMe plugin (vtrefny)
- Enable LVM logging only in debug mode (vtrefny)
- nvme: Require additional rpms for dracut (tbzatek)
- Force command line based libblockdev LVM plugin (vtrefny)
- When creating a shared LVM VG skip pvcreate (vtrefny)
- Add support for creating shared LVM setups (vtrefny)
- nvme: Align HostNQN and HostID format to TP4126 (tbzatek)
- README: Fix typo (vtrefny)
- README: Update Debian dependencies for libblockdev 3.0 (vtrefny)
* Thu Aug 03 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.8.1-1
- Ignore new false positives with the latest pylint (vtrefny)
- iscsi: Rename storaged to udisks (tbzatek)
- iscsi: Rework UDisks iscsi module activation (tbzatek)
- iscsi: Make sure to modprobe iscsi_ibft (tbzatek)
- iscsi: Downgrade default CHAP auth algs to SHA1,MD5 (tbzatek)
- iscsi: Save firmware initiator name to /etc/iscsi/initiatorname.iscsi (vtrefny)
- spec: Bump release to 99 to be always ahead of Fedora in nightly (vtrefny)
- tests: Improve iscsi_test.ISCSITestCase (vtrefny)
- Make sure that LUKS.has_key always returns a boolean value (vtrefny)
- Squashed 'translation-canary/' changes from d6a40985..5bb81253 (vtrefny)
- Add btrfs subvolume specification to devicetree.resolve_device (vtrefny)
- Revert "Makefile cleanup" (vtrefny)
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.8.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jun 29 2023 Python Maint <python-maint@redhat.com> - 1:3.8.0-2
- Rebuilt for Python 3.12
* Thu Jun 29 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.8.0-1
- Revert "Makefile cleanup" (blivet-ci)
- Require libblockdev 3.0 when importing from GI (vtrefny)
- spec: Bump required version of libblockdev to 3.0 (vtrefny)
- md: Adapt libblockdev 3.0 mdraid bitmap arg changes (tbzatek)
- spec: Bump release to 99 to be always ahead of Fedora in nightly (vtrefny)
- ci: Run GH actions tests in a Fedora container (vtrefny)
- Add new LUKS tests for add/remove key and key file usage (vtrefny)
- Adjust to the new libblockdev 3.0 crypto API (vtrefny)
- Adjust to libblockdev 3.0 API changes (vtrefny)
- blivet: Enable the extended node bitmap for F2FS (akoskovich)
- Remove all state-dependent objects when resetting Blivet DBus object. (dlehman)
- Run callbacks when pruning actions. (dlehman)
- Always prefer GPT disk labels on x86_64 (and clean up the logic) (awilliam)
- Do not add new PVs to the LVM devices file if it doesn't exist and VGs are present (vtrefny)
- Add RISCV64 architecture helper [is_riscv64()] for arch module. (48907457+nirousseau)
- iscsi: Extend allowed CHAP auth algorithms (tbzatek)
- Fix checking FIPS mode when /proc/sys/crypto/fips_enabled doesn't exist (vtrefny)
- Fix creating LUKS1 on disks with mixed sector size (#2188785) (vtrefny)
- Do not set memory limit for LUKS2 when running in FIPS mode (vtrefny)
- Revert "tests: Skip test_lvcreate_type on CentOS/RHEL 9" (vtrefny)
- DBus: remove extra callback invocations (dlehman)
- Add a test case for filesystem online resize (vtrefny)
- Add support for filesystem online resize (vtrefny)
- iscsi: Use UDisks instead of storaged in the availability message (vtrefny)
- tests: Fix skipping iSCSI tests if UDisks iSCSI isn't available (vtrefny)
- Add ChangeLog to .gitignore (vtrefny)
- Makefile cleanup (vtrefny)
- ci: Use Packit for daily builds in Copr (vtrefny)
- Avoid raising libblockdev exceptions from our code (vtrefny)
- ci: Fix Packit configuration (vtrefny)
- Add support for specifying stripe size for RAID LVs (vtrefny)
- tests: Use blivet-specific prefix for targetcli backing files (vtrefny)
- Add a basic test case for the iscsi module (vtrefny)
- Allow changing iSCSI initiator name after setting it (vtrefny)
- Prefer UUID for fstab spec for DM devices too (vtrefny)
- Remove support for Python 2 from spec and Makefile (vtrefny)
* Tue Jun 13 2023 Python Maint <python-maint@redhat.com> - 1:3.7.1-5
- Rebuilt for Python 3.12
* Wed May 31 2023 Vojtech Trefny <@trefny@redhat.com> - 3.7.1-4
- Always prefer GPT disk labels on x86_64
* Tue May 23 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.7.1-3
- Add support for filesystem online resize
Resolves: RHEL-326
* Thu May 18 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-7
- Fix setting kickstart data
Resolves: rhbz#2174296
- Do not set memory limit for LUKS2 when running in FIPS mode
Resolves: rhbz#2193096
* Tue May 02 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-6
* Thu May 04 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.7.1-2
- Add support for specifying stripe size for RAID LVs
Resolves: RHEL-327
* Thu Jan 19 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-5
- Default to encryption sector size 512 for LUKS devices
Resolves: rhbz#2103800
* Tue Dec 13 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-4
- Add basic support for NVMe and NVMe Fabrics devices
Resolves: rhbz#2123337
* Thu Nov 03 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-3
- Catch BlockDevNotImplementedError for btrfs plugin calls
Resolves: rhbz#2139166
- Revert "Adjust to new XFS min size"
Resolves: rhbz#2139189
* Thu Oct 20 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-2
- Fix potential AttributeError when getting stratis blockdev info
Related: rhbz#2123711
- tests: Skip XFS resize test on CentOS/RHEL 9
Related: rhbz#2123711
* Thu Oct 13 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-1
- Rebase to the latest upstream release 3.6.0
Resolves: rhbz#2123711
* Thu Aug 18 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-16
- DDF RAID support using mdadm
Resolves: rhbz#2109030
* Mon Jun 20 2022 Jan Pokorny <japokorn@redhat.com> - 3.4.0-15
- Add a very simple NVMe module
Resolves: rhbz#2073008
* Thu Mar 16 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.7.1-1
- Fix the get_mount_device function (vponcova)
- Prefer using UUID for the kickstart --onpart argument (vtrefny)
- Fix setting kickstart data (vtrefny)
- pylint: Remove the "EXCEPTIONS" section from pylintrc (vtrefny)
- Add "microsoft" to list of recognized VM environments (vtrefny)
- ci: Add action to run unit tests in GH actions (vtrefny)
- tests: Make sure that unit tests can run without root privileges (vtrefny)
- doc: Link to the LVM VDO documentation from the index page (vtrefny)
- Ignore missing parted disk in ActionList._post_process (#2102960) (vtrefny)
* Wed Feb 08 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.7.0-1
- Remove unused BLOCKDEV_DM_RAID technology from tasks (vtrefny)
- tests: Force remove LVM VG /dev/ entry not removed by vgremove (vtrefny)
- Mark LUKS2 integrity devices as always controllable (vtrefny)
- Ignore parent dependencies during action execute (vtrefny)
- tests: Patch checking stratis pool metadata size (vtrefny)
- Remove support for DMRAID devices (vtrefny)
- Do not read DDF RAID UUID from udev (vtrefny)
- Check physical and logical block size when creating a LUKS format (vtrefny)
- Add separate properties for logical and physical block size (vtrefny)
- Use DMI product_name for t2 mac detection. (83884198+sharpenedblade)
- vmtests: add a --logs arg to capture blivet.log from failed tests (berrange)
- examples: illustrate GPT GUID usage in partitioning example (berrange)
- vmtests: add test for GPT part type UUID validation (berrange)
- blivet: allow 'mountpoint' to be passed to PartitionDevice (berrange)
- deviceaction: retain explicit part type UUID when formatting (berrange)
- devices/partition: add ability to auto apply a GPT UUID (berrange)
- gpt: add helper API for discoverable partition UUIDs (berrange)
- devices/partition: allow passing partition type UUID (berrange)
- formats/disklabel: allow passing partition type UUID (berrange)
- Add a forced delay to udev settle in chroot environments (vlad.bespalov)
- Update public API documentation (vtrefny)
- tests/README: Clarify various test classes (vtrefny)
- Rename unit_tests.storagetestcase to unit_tests.blivettestcase (vtrefny)
- Add additional identifiers to NVMeNamespaceDevice (vtrefny)
- Add transport and address to NVMeController info (vtrefny)
- Make sure we close the streams when reading a file (vtrefny)
- Style changes. (sharpenedblade)
- Do not report mactel on T2 macs. (sharpenedblade)
- Add function to check for T2 apple macs. (sharpenedblade)
- Add a basic read-only support for UDF filesystem (vtrefny)
- add loongarch support (mahailiang)
- Add a basic support for NVMe and NVMe Fabrics devices (vtrefny)
* Thu Feb 02 2023 Vojtech Trefny <vtrefny@redhat.com> - 3.6.1-3
- Use mdadm to support BIOS RAID devices (#2158574)
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.6.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Mon Nov 28 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.1-1
- misc: Remove "warn: false" from Ansible "command" (vtrefny)
- spec: Change license string to the SPDX format required by Fedora (vtrefny)
- Catch BlockDevNotImplementedError for btrfs plugin calls (vtrefny)
- tests: document how to use the VM tests (berrange)
- tests: allow filtering tests to run in VM (berrange)
- tests: don't start/stop VM if it was already running (berrange)
- tests: use correct password arg for SSH to VM (berrange)
- tests: add logging to runvmtests.py (berrange)
- Fix potential AttributeError when getting stratis blockdev info (vtrefny)
- spec: Fix recommended libblockdev plugins (vtrefny)
- tests: remove unused global variables (berrange)
- Backport total_memory improvements from anaconda (vslavik)
- Fix regex for checking e2fsprogs version (vtrefny)
* Fri Nov 11 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-2
- Change license string to the SPDX format required by Fedora
* Tue Sep 20 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.6.0-1
- pylint: Explicitly allow loading the _ped module from pyparted (vtrefny)
- ci: Run static analysis on Ubuntu 22.04 (vtrefny)
- tests: Create bigger devices for XFS testing (vtrefny)
- Set XFS minimal size to 300 MiB (vtrefny)
- Fix missing whitespaces around not keyword (vtrefny)
- Remove the Blivet.roots attribute (vponcova)
- packit: Set downstream_package_name to python-blivet (vtrefny)
- packit: Add srpm_build_deps for SRPM builds in Copr (vtrefny)
- tests: Fix message when skipping stratis tests (vtrefny)
- tests: Tell pytest to ignore symlinks when gathering test cases (vtrefny)
- Configure ids for Mock devices in populator_test (vtrefny)
- Add storage tests for Stratis (vtrefny)
- ci: Fix installing targetcli on Debian/Ubuntu (vtrefny)
- tests: Add test for creating and attaching cache pools (vtrefny)
- tests: Add storage tests for more LVM RAID levels (vtrefny)
- tests: Add test for ActionAddMember/ActionRemoveMember (vtrefny)
- tests: Add a test for creating and attaching a cache pool (vtrefny)
- Mark LVM cache pool format as immutable (vtrefny)
- tests: Skip test_lvcreate_type on CentOS/RHEL 9 (vtrefny)
- Add a YAML config for skipping tests on specified distributions (vtrefny)
- Add targetcli to the test dependencies playbook (vtrefny)
- Add a simple LVM test case that uses real storage (vtrefny)
- Add a test case that creates targetcli disks to run tests on (vtrefny)
- Allow running action_test even if some dependencies are missing (vtrefny)
- Use "fake" names for disks in DeviceTreeTestCase (vtrefny)
- Change how we import LoopBackedTestCase in fs_test (vtrefny)
- Add information about the new test suites to tests/README.rst (vtrefny)
- Makefile: Add targets to run the two new test suites separately (vtrefny)
- Fix typo in name of test_new_encrypted_stratis (vtrefny)
- Patch access to lvs in stratis tests (vtrefny)
- Fix pylint issues in the tests/pylint scripts (vtrefny)
- Make sure LVM unit tests can run without dependencies (vtrefny)
- Patch _pre_create in StorageDeviceMethodsTestCase.test_create (vtrefny)
- Assure that tests that set LVM devices filter can run without root (vtrefny)
- Fix running StratisFactoryTestCase as a non-root user (vtrefny)
- Split the test suite into "unit" and "storage" tests (vtrefny)
- Add support for attaching and creating LVM writecached LVs (vtrefny)
- Add support for enabling/disabling compression/deduplication (vtrefny)
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.5.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Tue Jul 19 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.5.0-1
- tests: Fix patching NVDIMM static data in populator_test (vtrefny)
- Ignore pylint false positives about missing methods in Gio and GLib (vtrefny)
- Ignore pylint warning about missing inspect.getargspec (vtrefny)
- Rename class ZFCPDevice to ZFCPDeviceFullPath (jstodola)
- Move _is_associated_with_fcp() implementation to the derived class (jstodola)
- Improve naming of zfcp classes/methods/functions (jstodola)
- Correct zfcp comments and strings (jstodola)
- Fix checking for stratis pool free space when adding a new filesystem (vtrefny)
- tests: Add a VM test case for Stratis (vtrefny)
- Use libblockdev to check for DBus service availability (vtrefny)
- Allow specifying size for stratis filesystems (vtrefny)
- tests: Skip Stratis DeviceFactory tests if missing dependencies (vtrefny)
- Use availability checks in devicelibs.stratis (vtrefny)
- Add external dependencies for Stratis devices classes (vtrefny)
- Add availability checks for Stratis dependencies (vtrefny)
- availability: Add a method to check for DBus service availability (vtrefny)
- Use the new Stratis tool to predict pool and fs used size (vtrefny)
- misc: Vagrantfile update (vtrefny)
- Add CentOS 9 Stream to the install-test-dependencies playbook (vtrefny)
- ci: Run static analysis checks in GitHub actions (vtrefny)
- doc: Add LVMWriteCache and LVMCachePoolMixin to public API (vtrefny)
- pylint: Remove deprecated pylint warnings from pylintrc and code (vtrefny)
- Add option to attach a newly created cache pool to existing LV (vtrefny)
- Add support for LVM RAID raid0 level (vtrefny)
- Do not fail when we can't get LVM cache information (#2086310) (vtrefny)
- Add a very simple NVMe module (vtrefny)
- Do not check for "problematic" disks in ActionList._pre_process (vtrefny)
- Change label_format_ok and uuid_format_ok to class methods (vtrefny)
- Generate correct dracut boot arguments for NPIV devices (jstodola)
- Add new class for NPIV-enabled devices (jstodola)
- LUN and WWPN should not be used for NPIV zFCP devices (jstodola)
- Add a function for reading the value of a kernel module parameter (jstodola)
- Allow to delete more than one SCSI device (jstodola)
- Move offline_scsi_device() to the base class (jstodola)
- Refactor the ZFCPDevice class (jstodola)
- misc: Vagrantfile update (vtrefny)
- Do not crash when a disk populator doesn't return kwargs (vtrefny)
- Disable Fedora ELN builds in packit (vtrefny)
- Fix raising exception when trying to resize internal LVs (vtrefny)
- Create loop devices for tests with --partscan (vtrefny)
- Make sure configure actions obsolete only actions with same attribute (vtrefny)
- Fix exception message when trying to format an non-existing device (vtrefny)
- Add default arguments for mkntfs (vtrefny)
- Mark NTFS as supported (vtrefny)
- Do no try to read cache MD size for inactive LVs from cache stats (vtrefny)
- Show better error when using unitialized disk in do_partitioning (vtrefny)
- Exclude unusable disks from PartitionFactory (vtrefny)
- Mark StratisXFS format as unsupported (vtrefny)
- Adjust to Stratis 3.0 API (vtrefny)
- lvm: Use blivet static data when checking if the VG is active (vtrefny)
- examples: Add LVM cache pool example (vtrefny)
- Add suport for creating LVM cache pools (vtrefny)
- Do not run pvcreate with --devices and list of PVs (vtrefny)
- Fix object type for ActionConfigureDevice (vtrefny)
- Use subvolume mountpoints when listing btrfs subvolumes (vtrefny)
- Squashed 'translation-canary/' changes from 4d4e65b8..d6a40985 (vtrefny)
- Fix log message for the LVM devices filter (vtrefny)
- Add support for creating standalone integrity devices (vtrefny)
- Use bigger chunk size for thinpools bigger than ~15.88 TiB (vtrefny)
- Fix removing zFCP SCSI devices (jstodola)
- Add public functions to add/remove PV to/from the LVM system.devices (vtrefny)
- Ignore errors for LVM devices file actions (vtrefny)
- Make sure PVs are added/deleted to/from the LVM device file (vtrefny)
- Use LVM devices for filtering LVM devices with LVM >= 2.02.13 (vtrefny)
- Switch LVM devices filter from "reject" to "accept" by default (vtrefny)
- tests: Mark "fake" disks in test_get_related_disks as non-existing (vtrefny)
- Set correct map name for existing LUKS devices (vtrefny)
- Do not raise deprecated IOError from iscsi and fcoe modules (vtrefny)
- Remove unused flag multipath (vtrefny)
- Do not add device name as a parameter for errors.DeviceError (vtrefny)
- Add stratis filesystem metadata size and pool free space (vtrefny)
- Fix parameters differ from overridden in StratisPoolDevice (vtrefny)
- Fix/unify importing mock module in stratis tests (vtrefny)
- Add fstab options for Stratis Filesystem devices (vtrefny)
- Add MountClass for StratisXFS filesystem (vtrefny)
- Add Stratis devices and formats to the public API documentation (vtrefny)
- Hide the private LUKS device for unlockded Stratis pools (vtrefny)
- Add property with list of Stratis block devices to StratisPoolDevice (vtrefny)
- Set pool info on the block devices when adding/removing Stratis pool (vtrefny)
- Set the StratisBlockdev format status based on whether it has a pool or not (vtrefny)
- Add more tests for creating Stratis devices (vtrefny)
- Add support for creating encrypted Stratis devices with DeviceFactory (vtrefny)
- Add support for working with locked Stratis pools (vtrefny)
- Add support for creating encrypted Stratis pools (vtrefny)
- Add Stratis device factory (vtrefny)
- Mark format on Stratis pool devices as immutable (vtrefny)
- Add Stratis example (vtrefny)
- Add simple test case for Stratis (vtrefny)
- Add basic support for creating Stratis devices (vtrefny)
- Add a special "XFS Stratis" filesystem for Stratis filesystem devices (vtrefny)
- Avoid circular depency when in static_data/stratis_info.py (vtrefny)
- Add dracut setup args for Stratis devices (vtrefny)
- Add support for removing Stratis devices using DBus API (vtrefny)
- Add basic support for Stratis devices (vtrefny)
- Ignore all "private" devices during populate (vtrefny)
- safe_dbus: Add function to get all properties for an interface (vtrefny)
- Add support for renaming devices using ActionConfigureDevice (vtrefny)
* Mon Jun 20 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.4.4-3
- Add support for NPIV-enabled zFCP devices
Resolves: rhbz#1937030
- Fix removing zFCP SCSI devices
Related: rhbz#1937030
- tests: Mark "fake" disks in test_get_related_disks as non-existing
Resolves: rhbz#2062690
* Thu Jun 02 2022 Jan Pokorny <japokorn@redhat.com> - 3.4.0-14
- Release version increase to fix RHEL upgrade path
Related: rhbz#2081278
* Thu Jun 02 2022 Jan Pokorny <japokorn@redhat.com> - 3.4.0-13
- Fix getting PV info in LVMPhysicalVolume from the cache
Resolves: rhbz#2079221
- Do not crash when changing disklabel on disks with active devices
Resolves: rhbz#2078803
- ActionDestroyDevice should not obsolete ActionRemoveMember
Resolves: rhbz#2076956
- Correctly set vg_name after adding/removing a PV from a VG
Resolves: rhbz#2081278
- Add support for creating LVM cache pools
Resolves: rhbz#2055200
- Use LVM PV format current_size in LVMVolumeGroupDevice._remove
Related: rhbz#2081278
* Tue Feb 01 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-12
- Fix log message for the LVM devices filter
Resolves: rhbz#2034277
- Exclude unusable disks from PartitionFactory
Resolves: rhbz#2017432
* Tue Dec 14 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-11
- Replace all log_exception_info calls with log.info
Resolves: rhbz#2028391
* Thu Dec 09 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-10
- Use LVM devices file instead of filter regex
Resolves: rhbz#1967212
* Tue Nov 30 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-9
- Rebuild with higher release number to fix errata
Related: rhbz#2012121
* Fri Nov 26 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-8
- Improve error message printed for missing dependecies
Resolves: rhbz#2012121
- Use bigger chunk size for thinpools bigger than ~15.88 TiB
Resolves: rhbz#1971516
* Tue Aug 17 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-7
- Fix script for running tests in gating
Resolves: rhbz#1990237
* Wed Aug 11 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-6
- Remove "Revert Terminology cleanups" patch
Resolves: rhbz#1990982
- Fix running tests in gating
Resolves: rhbz#1990237
- Opt out from using LVM devices file in 9 Beta
Resolves: rhbz#1984851
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 1:3.4.0-5
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Mon Aug 2 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-4
- Do not set chunk size for RAID 1
Resolves: rhbz#1987176
* Sat Jul 17 2021 Neal Gompa <ngompa@centosproject.org> - 3.4.0-3
- Fix resolving devices with names that look like BIOS drive number
Resolves: rhbz#1983310
* Wed Jul 7 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-2
- Fix activating old style LVM snapshots
Resolves: rhbz#1961944
* Wed Jun 9 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-1
- Rebase to latest upstream release 3.4.0
Resolves: rhbz#1964341
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 1:3.3.3-2
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Mon Jun 13 2022 Python Maint <python-maint@redhat.com> - 1:3.4.4-2
- Rebuilt for Python 3.11
* Mon May 16 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.4.4-1
- Use LVM PV format current_size in LVMVolumeGroupDevice._remove (vtrefny)
- Correctly set vg_name after adding/removing a PV from a VG (vtrefny)
- Do not crash when changing disklabel on disks with active devices (vtrefny)
- ActionDestroyDevice should not obsolete ActionRemoveMember (vtrefny)
- Correctly set compression and deduplication for existing VDO pools (vtrefny)
- Correctly cancel configure actions in cancel() (vtrefny)
- Set partition flags after setting parted filesystem (#2033875) (vtrefny)
* Tue Feb 15 2022 Jan Pokorny <japokorn@redhat.com> - 3.4.3-2
- Set partition flags after setting parted filesystem (#2033875) (vtrefny)
* Tue Feb 01 2022 Vojtech Trefny <vtrefny@redhat.com> - 3.4.3-1
- Make sure we mount the top level subvolume when mounting btrfs (vtrefny)
- README: Fix API documentation link (vtrefny)
- iscsi: Replace all log_exception_info calls with log.info (vtrefny)
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.4.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Thu Sep 30 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.2-1
- pylint: Remove pdb breakpoint in device_properties_test (vtrefny)
- pylint: Fix exception string in get_cow_sysfs_path (vtrefny)
- pylint: Remove redundant 'u' prefixes for strings in doc/conf.py (vtrefny)
- pylint: Ignore the "redundant-u-string-prefix" warning in i18n.py (vtrefny)
- pylint: Ignore the new warning W1514 "unspecified-encoding" (vtrefny)
- pylint: Fix multuple unused variables 'e' in exceptions (vtrefny)
- Makefile: Specify weblate repository branch for the potfile target (vtrefny)
- flags: Fix leaking file descriptor (vtrefny)
- README: Add info about our openSUSE/Mageia/OpenMandriva Copr repo (vtrefny)
- Fix checking for LVM VDO support with libblockdev 2.23 and older (vtrefny)
- tasks: Allow specifying custom error message for UnavailableMethod (vtrefny)
- Use setuptools instead of distutils in setup.py (vtrefny)
- Use shutil.which instead of distutils.spawn.find_executable (vtrefny)
- Do not use FS.mount for btrfs temporary mounts (vtrefny)
* Thu Aug 19 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.1-1
- pylint: Ignore deprecation warning about threading.currentThread (vtrefny)
- Fix getting PV info in LVMPhysicalVolume from the cache (vtrefny)
- Fix ActionRemoveMember requires check (#1993655) (vtrefny)
- util: Ignore false positive assignment-from-no-return warning in ObjectID (vtrefny)
- tasks: Ignore pylint arguments-differ warning for do_tasks (vtrefny)
- Remove unused __save_passphrase member from LUKS_Data (vtrefny)
- size: Ignore new pylint warning "arguments-renamed" (vtrefny)
- Do not use deprecated (vtrefny)
- Remove unused member __names from DeviceFactory (vtrefny)
- Improve error message printed for missing dependecies (vtrefny)
- tests: Print version and blivet location when running tests (vtrefny)
- tests: Allow running tests without the tests directory in PYTHONPATH (vtrefny)
- edd_test: Locate the edd_data based on the test file location (vtrefny)
- Run Anaconda tests on blivet pull requests (jkonecny)
- Do not set chunk size for RAID 1 (vtrefny)
- When sorting devices make sure partitions are sorted correctly (vtrefny)
- Make sure LVM config is updated before running pvcreate (vtrefny)
- Tell LVM to ignore the new devices file for now (vtrefny)
- Revert "Use PARTITION_ESP flag for EFIFS partitions (#1930486)" (vtrefny)
- Fix resolving devices with names that look like BIOS drive number (vtrefny)
- Ignore pylint false positive no-member warning (vtrefny)
- Fix util.virt_detect on Xen (vtrefny)
- Fix/unify importing mock module in tests (vtrefny)
- Convert LVM filter lists to sets (vtrefny)
- Remove action device from LVM reject list (vtrefny)
- Fix activating old style LVM snapshots (vtrefny)
- Make sure the device is setup before configuring its format (vtrefny)
- Remove RHEL 9 specific patch from SPEC (vtrefny)
- Use package list instead of cycle in our dependencies Ansible playbook (vtrefny)
- Add vagrant file for running tests and development in a VM (vtrefny)
- Update our playbook for installing test dependencies (vtrefny)
- Add example for working with actions (vtrefny)
- Add LUKS encrypted LV to LVM example (vtrefny)
- Add example for LVM thin provisioning (vtrefny)
- Squashed 'translation-canary/' changes from 3bc2ad68..4d4e65b8 (vtrefny)
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.4.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Wed Jul 21 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-4
- Revert "Use PARTITION_ESP flag for EFIFS partitions" (#1975375)
* Wed Jun 30 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-3
- Fix resolving devices with names that look like BIOS drive number (#1960798)
* Thu Jun 03 2021 Python Maint <python-maint@redhat.com> - 1:3.4.0-2
- Rebuilt for Python 3.10
* Fri May 07 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.4.0-1
- Fix setting SELinux flag in SELinuxContextTestCase (vtrefny)
- Allow running blivet without Python SELinux module (vtrefny)
- Adapt to dosfstools 4.2 FAT label changes (vtrefny)
- Add LVM VDO to public API (vtrefny)
- Add a special exception type for LVM inconsistent sector sizes (vtrefny)
- Remove the "encryption_passphrase" attribute from Blivet class (vtrefny)
- Use PARTITION_ESP flag for EFIFS partitions (#1930486) (vtrefny)
- Provide better error message for LVM with inconsistent sector sizes (vtrefny)
- Avoid AttributeError for DiskLabel formats without disklabel type (vtrefny)
- Ignore ArithmeticError when trying to align partition size down (vtrefny)
- Do not log entire exception when trying to get ISCSI initiator name (vtrefny)
- Fix running BlivetLVMVDODependenciesTest test case as non-root (vtrefny)
- Remove EDD test logs after the tests finish (vtrefny)
- Replace IOError with OSError around file operations (vslavik)
- spec: Add 'make' to BuildRequires (vtrefny)
- Fix usage of assert_called_with in lvm_test (vtrefny)
- apply directory's SELinux context to freshly created mount points (rmetrich)
- Try to get Btrfs volume UUID using libblockdev if UDev lookup fails (vtrefny)
- Allow removing LVM VDO devices without VDO support (vtrefny)
- Sync spec with downstream (vtrefny)
- Use real paths to Python site packages (vponcova)
- Fix excessive logging in udev.__is_ignored_blockdev (vtrefny)
- Make sure we use size >= LVM VDO min size in test_lv_unique_name (vtrefny)
- Replace pocketlint by a custom script (vtrefny)
- Fix pylint errors in translation canary (jkonecny)
- Bump required libblockdev version to 2.24 (vtrefny)
- Fix external dependencies for LVM VDO devices (vtrefny)
- Use better description for libblockdev plugins in tasks.availability (vtrefny)
- Set minimum size for LVM VDO pool devices (vtrefny)
- Add LVM VDO documentation (vtrefny)
- Add LVM VDO example (vtrefny)
- Add nodiscard option by default when creating VDO logical volumes (vtrefny)
- Allow adding nodiscard option when running mkfs (vtrefny)
- Add VM test for LVM VDO (vtrefny)
- Add LVM VDO device factory (vtrefny)
- Allow creating LVM VDO pools and volumes using "blivet.new_lv" (vtrefny)
- Add support for creating LVM VDO pools and LVM VDO volumes (vtrefny)
- Add "vdo_lv" property to LVMVDOPoolMixin (vtrefny)
- Read the LVM VDO pool current size from the internal data LV (vtrefny)
- Add availability functions for LVM VDO (vtrefny)
- Add VDO pool data LV to internal LVs during populate (vtrefny)
- Fix type of LVM VDO logical volumes (vtrefny)
* Mon Apr 12 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.3.3-2
- Avoid AttributeError for DiskLabel formats without disklabel type (#1945914)
* Thu Feb 18 2021 Vojtech Trefny <vtrefny@redhat.com> - 3.3.3-1
- apply compression settings from blivet.flags.btrfs_compression (#1926892) (michel)

Loading…
Cancel
Save