import python-blivet-3.4.0-11.el9
This commit is contained in:
parent
aa433253a1
commit
783475b3fc
774
SOURCES/0014-LVM-devices-file-support.patch
Normal file
774
SOURCES/0014-LVM-devices-file-support.patch
Normal file
@ -0,0 +1,774 @@
|
||||
From 43c5a6ef094e5f333a6dd47c467a1516488e2097 Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Mon, 24 May 2021 13:35:39 +0200
|
||||
Subject: [PATCH 1/7] Remove action device from LVM reject list
|
||||
|
||||
Because the device doesn't depend on itself the existing code
|
||||
won't remove the device we are trying to modify from the list.
|
||||
|
||||
Resolves: rhbz#1955942
|
||||
---
|
||||
blivet/actionlist.py | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/blivet/actionlist.py b/blivet/actionlist.py
|
||||
index d03e32b9..2de3fed3 100644
|
||||
--- a/blivet/actionlist.py
|
||||
+++ b/blivet/actionlist.py
|
||||
@@ -260,6 +260,7 @@ class ActionList(object):
|
||||
log.debug("action: %s", action)
|
||||
|
||||
# Remove lvm filters for devices we are operating on
|
||||
+ lvm.lvm_cc_removeFilterRejectRegexp(action.device.name)
|
||||
for device in (d for d in devices if d.depends_on(action.device)):
|
||||
lvm.lvm_cc_removeFilterRejectRegexp(device.name)
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 2db8aa0aa6ea03c182f7e8e08cd1371ded13b71c Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Mon, 24 May 2021 14:49:12 +0200
|
||||
Subject: [PATCH 2/7] Convert LVM filter lists to sets
|
||||
|
||||
To prevent devices being added multiple times and removed only
|
||||
once.
|
||||
|
||||
Related: rhbz#1955942
|
||||
---
|
||||
blivet/devicelibs/lvm.py | 12 ++++++------
|
||||
tests/devicetree_test.py | 6 +++---
|
||||
2 files changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/blivet/devicelibs/lvm.py b/blivet/devicelibs/lvm.py
|
||||
index 121797ce..9e396cca 100644
|
||||
--- a/blivet/devicelibs/lvm.py
|
||||
+++ b/blivet/devicelibs/lvm.py
|
||||
@@ -72,8 +72,8 @@ safe_name_characters = "0-9a-zA-Z._-"
|
||||
# Theoretically we can handle all that can be handled with the LVM --config
|
||||
# argument. For every time we call an lvm_cc (lvm compose config) funciton
|
||||
# we regenerate the config_args with all global info.
|
||||
-config_args_data = {"filterRejects": [], # regular expressions to reject.
|
||||
- "filterAccepts": []} # regexp to accept
|
||||
+config_args_data = {"filterRejects": set(), # regular expressions to reject.
|
||||
+ "filterAccepts": set()} # regexp to accept
|
||||
|
||||
|
||||
def _set_global_config():
|
||||
@@ -125,7 +125,7 @@ def needs_config_refresh(fn):
|
||||
def lvm_cc_addFilterRejectRegexp(regexp):
|
||||
""" Add a regular expression to the --config string."""
|
||||
log.debug("lvm filter: adding %s to the reject list", regexp)
|
||||
- config_args_data["filterRejects"].append(regexp)
|
||||
+ config_args_data["filterRejects"].add(regexp)
|
||||
|
||||
|
||||
@needs_config_refresh
|
||||
@@ -134,15 +134,15 @@ def lvm_cc_removeFilterRejectRegexp(regexp):
|
||||
log.debug("lvm filter: removing %s from the reject list", regexp)
|
||||
try:
|
||||
config_args_data["filterRejects"].remove(regexp)
|
||||
- except ValueError:
|
||||
+ except KeyError:
|
||||
log.debug("%s wasn't in the reject list", regexp)
|
||||
return
|
||||
|
||||
|
||||
@needs_config_refresh
|
||||
def lvm_cc_resetFilter():
|
||||
- config_args_data["filterRejects"] = []
|
||||
- config_args_data["filterAccepts"] = []
|
||||
+ config_args_data["filterRejects"] = set()
|
||||
+ config_args_data["filterAccepts"] = set()
|
||||
|
||||
|
||||
def determine_parent_lv(internal_lv, lvs, lv_info):
|
||||
diff --git a/tests/devicetree_test.py b/tests/devicetree_test.py
|
||||
index d1f4d8f3..ef163c0a 100644
|
||||
--- a/tests/devicetree_test.py
|
||||
+++ b/tests/devicetree_test.py
|
||||
@@ -125,7 +125,7 @@ class DeviceTreeTestCase(unittest.TestCase):
|
||||
dt.actions._actions.append(Mock(name="fake action"))
|
||||
|
||||
lvm.lvm_cc_addFilterRejectRegexp("xxx")
|
||||
- lvm.config_args_data["filterAccepts"].append("yyy")
|
||||
+ lvm.config_args_data["filterAccepts"].add("yyy")
|
||||
|
||||
dt.ignored_disks.append(names[0])
|
||||
dt.exclusive_disks.append(names[1])
|
||||
@@ -144,8 +144,8 @@ class DeviceTreeTestCase(unittest.TestCase):
|
||||
|
||||
self.assertEqual(dt._hidden, empty_list)
|
||||
|
||||
- self.assertEqual(lvm.config_args_data["filterAccepts"], empty_list)
|
||||
- self.assertEqual(lvm.config_args_data["filterRejects"], empty_list)
|
||||
+ self.assertEqual(lvm.config_args_data["filterAccepts"], set())
|
||||
+ self.assertEqual(lvm.config_args_data["filterRejects"], set())
|
||||
|
||||
self.assertEqual(dt.exclusive_disks, empty_list)
|
||||
self.assertEqual(dt.ignored_disks, empty_list)
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From e2540422945586ca45848a663e391a91b2fdd714 Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Tue, 27 Jul 2021 14:07:05 +0200
|
||||
Subject: [PATCH 3/7] Switch LVM devices filter from "reject" to "accept" by
|
||||
default
|
||||
|
||||
We currently use the LVM reject filter to filter out hidden and
|
||||
ignored devices, this commit changes the behaviour to reject all
|
||||
devices by default and accept only physical volumes that are not
|
||||
hidden or ignored. This is preparation for the switch from the
|
||||
existing lvm.conf based filtering to the new devices file based
|
||||
filtering introduced in LVM 2.03.12 which allows only listing
|
||||
"accepted" devices. This allows us to support both the "old" and
|
||||
"new" style filtering using the same code.
|
||||
---
|
||||
blivet/actionlist.py | 5 +--
|
||||
blivet/devicelibs/lvm.py | 62 +++++++++++----------------
|
||||
blivet/devices/lvm.py | 4 +-
|
||||
blivet/devicetree.py | 8 ++--
|
||||
blivet/formats/lvmpv.py | 2 +
|
||||
blivet/populator/helpers/lvm.py | 6 +++
|
||||
blivet/populator/helpers/partition.py | 8 ----
|
||||
blivet/populator/populator.py | 4 +-
|
||||
tests/devicetree_test.py | 37 ++++++++++++++--
|
||||
tests/populator_test.py | 6 ++-
|
||||
10 files changed, 81 insertions(+), 61 deletions(-)
|
||||
|
||||
diff --git a/blivet/actionlist.py b/blivet/actionlist.py
|
||||
index 2de3fed3..f3977401 100644
|
||||
--- a/blivet/actionlist.py
|
||||
+++ b/blivet/actionlist.py
|
||||
@@ -259,10 +259,9 @@ class ActionList(object):
|
||||
for action in self._actions:
|
||||
log.debug("action: %s", action)
|
||||
|
||||
- # Remove lvm filters for devices we are operating on
|
||||
- lvm.lvm_cc_removeFilterRejectRegexp(action.device.name)
|
||||
for device in (d for d in devices if d.depends_on(action.device)):
|
||||
- lvm.lvm_cc_removeFilterRejectRegexp(device.name)
|
||||
+ if device.format.type == "lvmpv":
|
||||
+ lvm.lvm_devices_add(device.path)
|
||||
|
||||
def _post_process(self, devices=None):
|
||||
""" Clean up relics from action queue execution. """
|
||||
diff --git a/blivet/devicelibs/lvm.py b/blivet/devicelibs/lvm.py
|
||||
index 9e396cca..96d037b8 100644
|
||||
--- a/blivet/devicelibs/lvm.py
|
||||
+++ b/blivet/devicelibs/lvm.py
|
||||
@@ -67,40 +67,29 @@ LVMETAD_SOCKET_PATH = "/run/lvm/lvmetad.socket"
|
||||
|
||||
safe_name_characters = "0-9a-zA-Z._-"
|
||||
|
||||
-# Start config_args handling code
|
||||
-#
|
||||
-# Theoretically we can handle all that can be handled with the LVM --config
|
||||
-# argument. For every time we call an lvm_cc (lvm compose config) funciton
|
||||
-# we regenerate the config_args with all global info.
|
||||
-config_args_data = {"filterRejects": set(), # regular expressions to reject.
|
||||
- "filterAccepts": set()} # regexp to accept
|
||||
+# list of devices that LVM is allowed to use
|
||||
+# with LVM >= 2.0.13 we'll use this for the --devices option and when creating
|
||||
+# the /etc/lvm/devices/system.devices file
|
||||
+# with older versions of LVM we will use this for the --config based filtering
|
||||
+_lvm_devices = set()
|
||||
|
||||
|
||||
def _set_global_config():
|
||||
"""lvm command accepts lvm.conf type arguments preceded by --config. """
|
||||
|
||||
- filter_string = ""
|
||||
- rejects = config_args_data["filterRejects"]
|
||||
- for reject in rejects:
|
||||
- filter_string += ("\"r|/%s$|\"," % reject)
|
||||
+ device_string = ""
|
||||
+
|
||||
+ # now explicitly "accept" all LVM devices
|
||||
+ for device in _lvm_devices:
|
||||
+ device_string += "\"a|%s$|\"," % device
|
||||
|
||||
- if filter_string:
|
||||
- filter_string = "filter=[%s]" % filter_string.strip(",")
|
||||
+ # now add all devices to the "reject" filter
|
||||
+ device_string += "\"r|.*|\""
|
||||
|
||||
- # XXX consider making /tmp/blivet.lvm.XXXXX, writing an lvm.conf there, and
|
||||
- # setting LVM_SYSTEM_DIR
|
||||
- devices_string = 'preferred_names=["^/dev/mapper/", "^/dev/md/", "^/dev/sd"]'
|
||||
- if filter_string:
|
||||
- devices_string += " %s" % filter_string
|
||||
+ filter_string = "filter=[%s]" % device_string
|
||||
|
||||
- # for now ignore the LVM devices file and rely on our filters
|
||||
- if availability.LVMDEVICES.available:
|
||||
- devices_string += " use_devicesfile=0"
|
||||
+ config_string = " devices { %s } " % filter_string
|
||||
|
||||
- # devices_string can have (inside the brackets) "dir", "scan",
|
||||
- # "preferred_names", "filter", "cache_dir", "write_cache_state",
|
||||
- # "types", "sysfs_scan", "md_component_detection". see man lvm.conf.
|
||||
- config_string = " devices { %s } " % (devices_string) # strings can be added
|
||||
if not flags.lvm_metadata_backup:
|
||||
config_string += "backup {backup=0 archive=0} "
|
||||
if flags.debug:
|
||||
@@ -122,27 +111,26 @@ def needs_config_refresh(fn):
|
||||
|
||||
|
||||
@needs_config_refresh
|
||||
-def lvm_cc_addFilterRejectRegexp(regexp):
|
||||
- """ Add a regular expression to the --config string."""
|
||||
- log.debug("lvm filter: adding %s to the reject list", regexp)
|
||||
- config_args_data["filterRejects"].add(regexp)
|
||||
+def lvm_devices_add(path):
|
||||
+ """ Add a device (PV) to the list of devices LVM is allowed to use """
|
||||
+ log.debug("lvm filter: device %s added to the list of allowed devices")
|
||||
+ _lvm_devices.add(path)
|
||||
|
||||
|
||||
@needs_config_refresh
|
||||
-def lvm_cc_removeFilterRejectRegexp(regexp):
|
||||
- """ Remove a regular expression from the --config string."""
|
||||
- log.debug("lvm filter: removing %s from the reject list", regexp)
|
||||
+def lvm_devices_remove(path):
|
||||
+ """ Remove a device (PV) to the list of devices LVM is allowed to use """
|
||||
+ log.debug("lvm filter: device %s removed from the list of allowed devices")
|
||||
try:
|
||||
- config_args_data["filterRejects"].remove(regexp)
|
||||
+ _lvm_devices.remove(path)
|
||||
except KeyError:
|
||||
- log.debug("%s wasn't in the reject list", regexp)
|
||||
+ log.debug("%s wasn't in the devices list", path)
|
||||
return
|
||||
|
||||
|
||||
@needs_config_refresh
|
||||
-def lvm_cc_resetFilter():
|
||||
- config_args_data["filterRejects"] = set()
|
||||
- config_args_data["filterAccepts"] = set()
|
||||
+def lvm_devices_reset():
|
||||
+ _lvm_devices.clear()
|
||||
|
||||
|
||||
def determine_parent_lv(internal_lv, lvs, lv_info):
|
||||
diff --git a/blivet/devices/lvm.py b/blivet/devices/lvm.py
|
||||
index c61eeb4b..9c230f1b 100644
|
||||
--- a/blivet/devices/lvm.py
|
||||
+++ b/blivet/devices/lvm.py
|
||||
@@ -273,8 +273,8 @@ class LVMVolumeGroupDevice(ContainerDevice):
|
||||
log_method_call(self, self.name, status=self.status)
|
||||
if not self.complete:
|
||||
for pv in self.pvs:
|
||||
- # Remove the PVs from the ignore filter so we can wipe them.
|
||||
- lvm.lvm_cc_removeFilterRejectRegexp(pv.name)
|
||||
+ # add PVS to the list of LVM devices so we can wipe them.
|
||||
+ lvm.lvm_devices_add(pv.path)
|
||||
|
||||
# Don't run vgremove or vgreduce since there may be another VG with
|
||||
# the same name that we want to keep/use.
|
||||
diff --git a/blivet/devicetree.py b/blivet/devicetree.py
|
||||
index f4ae1968..c6c1b440 100644
|
||||
--- a/blivet/devicetree.py
|
||||
+++ b/blivet/devicetree.py
|
||||
@@ -96,7 +96,7 @@ class DeviceTreeBase(object):
|
||||
|
||||
self._hidden = []
|
||||
|
||||
- lvm.lvm_cc_resetFilter()
|
||||
+ lvm.lvm_devices_reset()
|
||||
|
||||
self.exclusive_disks = exclusive_disks or []
|
||||
self.ignored_disks = ignored_disks or []
|
||||
@@ -879,7 +879,8 @@ class DeviceTreeBase(object):
|
||||
self._remove_device(device, force=True, modparent=False)
|
||||
|
||||
self._hidden.append(device)
|
||||
- lvm.lvm_cc_addFilterRejectRegexp(device.name)
|
||||
+ if device.format.type == "lvmpv":
|
||||
+ lvm.lvm_devices_remove(device.path)
|
||||
|
||||
def unhide(self, device):
|
||||
""" Restore a device's visibility.
|
||||
@@ -905,7 +906,8 @@ class DeviceTreeBase(object):
|
||||
self._hidden.remove(hidden)
|
||||
self._devices.append(hidden)
|
||||
hidden.add_hook(new=False)
|
||||
- lvm.lvm_cc_removeFilterRejectRegexp(hidden.name)
|
||||
+ if hidden.format.type == "lvmpv":
|
||||
+ lvm.lvm_devices_add(hidden.path)
|
||||
|
||||
def expand_taglist(self, taglist):
|
||||
""" Expands tags in input list into devices.
|
||||
diff --git a/blivet/formats/lvmpv.py b/blivet/formats/lvmpv.py
|
||||
index ea84e9e4..3b00951f 100644
|
||||
--- a/blivet/formats/lvmpv.py
|
||||
+++ b/blivet/formats/lvmpv.py
|
||||
@@ -124,6 +124,7 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
def _create(self, **kwargs):
|
||||
log_method_call(self, device=self.device,
|
||||
type=self.type, status=self.status)
|
||||
+ lvm.lvm_devices_add(self.device)
|
||||
|
||||
lvm._set_global_config()
|
||||
|
||||
@@ -138,6 +139,7 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
except blockdev.LVMError:
|
||||
DeviceFormat._destroy(self, **kwargs)
|
||||
finally:
|
||||
+ lvm.lvm_devices_remove(self.device)
|
||||
udev.settle()
|
||||
|
||||
@property
|
||||
diff --git a/blivet/populator/helpers/lvm.py b/blivet/populator/helpers/lvm.py
|
||||
index c7adfa4e..9e7e4630 100644
|
||||
--- a/blivet/populator/helpers/lvm.py
|
||||
+++ b/blivet/populator/helpers/lvm.py
|
||||
@@ -87,6 +87,12 @@ class LVMFormatPopulator(FormatPopulator):
|
||||
def _get_kwargs(self):
|
||||
kwargs = super(LVMFormatPopulator, self)._get_kwargs()
|
||||
|
||||
+ # new PV, add it to the LVM devices list and re-run pvs/lvs/vgs
|
||||
+ lvm.lvm_devices_add(self.device.path)
|
||||
+ pvs_info.drop_cache()
|
||||
+ vgs_info.drop_cache()
|
||||
+ lvs_info.drop_cache()
|
||||
+
|
||||
pv_info = pvs_info.cache.get(self.device.path, None)
|
||||
|
||||
name = udev.device_get_name(self.data)
|
||||
diff --git a/blivet/populator/helpers/partition.py b/blivet/populator/helpers/partition.py
|
||||
index f00323d1..8659bd48 100644
|
||||
--- a/blivet/populator/helpers/partition.py
|
||||
+++ b/blivet/populator/helpers/partition.py
|
||||
@@ -24,7 +24,6 @@ import copy
|
||||
import six
|
||||
|
||||
from ... import udev
|
||||
-from ...devicelibs import lvm
|
||||
from ...devices import PartitionDevice
|
||||
from ...errors import DeviceError
|
||||
from ...formats import get_format
|
||||
@@ -66,7 +65,6 @@ class PartitionDevicePopulator(DevicePopulator):
|
||||
if disk is None:
|
||||
# if the disk is still not in the tree something has gone wrong
|
||||
log.error("failure finding disk for %s", name)
|
||||
- lvm.lvm_cc_addFilterRejectRegexp(name)
|
||||
return
|
||||
|
||||
if not disk.partitioned or not disk.format.supported:
|
||||
@@ -78,12 +76,6 @@ class PartitionDevicePopulator(DevicePopulator):
|
||||
# and instantiate a PartitionDevice so our view of the layout is
|
||||
# complete.
|
||||
if not disk.partitionable or disk.format.type == "iso9660" or disk.format.hidden:
|
||||
- # there's no need to filter partitions on members of multipaths or
|
||||
- # fwraid members from lvm since multipath and dmraid are already
|
||||
- # active and lvm should therefore know to ignore them
|
||||
- if not disk.format.hidden:
|
||||
- lvm.lvm_cc_addFilterRejectRegexp(name)
|
||||
-
|
||||
log.debug("ignoring partition %s on %s", name, disk.format.type)
|
||||
return
|
||||
|
||||
diff --git a/blivet/populator/populator.py b/blivet/populator/populator.py
|
||||
index 75bb1741..958593ec 100644
|
||||
--- a/blivet/populator/populator.py
|
||||
+++ b/blivet/populator/populator.py
|
||||
@@ -317,10 +317,10 @@ class PopulatorMixin(object):
|
||||
continue
|
||||
|
||||
# Make sure lvm doesn't get confused by PVs that belong to
|
||||
- # incomplete VGs. We will remove the PVs from the reject list when/if
|
||||
+ # incomplete VGs. We will add the PVs to the accept list when/if
|
||||
# the time comes to remove the incomplete VG and its PVs.
|
||||
for pv in vg.pvs:
|
||||
- lvm.lvm_cc_addFilterRejectRegexp(pv.name)
|
||||
+ lvm.lvm_devices_remove(pv.path)
|
||||
|
||||
def set_disk_images(self, images):
|
||||
""" Set the disk images and reflect them in exclusive_disks.
|
||||
diff --git a/tests/devicetree_test.py b/tests/devicetree_test.py
|
||||
index ef163c0a..3be4d572 100644
|
||||
--- a/tests/devicetree_test.py
|
||||
+++ b/tests/devicetree_test.py
|
||||
@@ -124,8 +124,7 @@ class DeviceTreeTestCase(unittest.TestCase):
|
||||
|
||||
dt.actions._actions.append(Mock(name="fake action"))
|
||||
|
||||
- lvm.lvm_cc_addFilterRejectRegexp("xxx")
|
||||
- lvm.config_args_data["filterAccepts"].add("yyy")
|
||||
+ lvm.lvm_devices_add("xxx")
|
||||
|
||||
dt.ignored_disks.append(names[0])
|
||||
dt.exclusive_disks.append(names[1])
|
||||
@@ -144,8 +143,7 @@ class DeviceTreeTestCase(unittest.TestCase):
|
||||
|
||||
self.assertEqual(dt._hidden, empty_list)
|
||||
|
||||
- self.assertEqual(lvm.config_args_data["filterAccepts"], set())
|
||||
- self.assertEqual(lvm.config_args_data["filterRejects"], set())
|
||||
+ self.assertEqual(lvm._lvm_devices, set())
|
||||
|
||||
self.assertEqual(dt.exclusive_disks, empty_list)
|
||||
self.assertEqual(dt.ignored_disks, empty_list)
|
||||
@@ -438,6 +436,37 @@ class DeviceTreeTestCase(unittest.TestCase):
|
||||
self.assertEqual(tree.get_related_disks(sda), set([sda, sdb]))
|
||||
self.assertEqual(tree.get_related_disks(sdb), set([sda, sdb]))
|
||||
|
||||
+ def test_lvm_filter_hide_unhide(self):
|
||||
+ tree = DeviceTree()
|
||||
+
|
||||
+ sda = DiskDevice("sda", size=Size("30 GiB"))
|
||||
+ sdb = DiskDevice("sdb", size=Size("30 GiB"))
|
||||
+
|
||||
+ tree._add_device(sda)
|
||||
+ tree._add_device(sdb)
|
||||
+
|
||||
+ self.assertTrue(sda in tree.devices)
|
||||
+ self.assertTrue(sdb in tree.devices)
|
||||
+
|
||||
+ sda.format = get_format("lvmpv", device=sda.path)
|
||||
+ sdb.format = get_format("lvmpv", device=sdb.path)
|
||||
+
|
||||
+ # LVMPhysicalVolume._create would do this
|
||||
+ lvm.lvm_devices_add(sda.path)
|
||||
+ lvm.lvm_devices_add(sdb.path)
|
||||
+
|
||||
+ self.assertSetEqual(lvm._lvm_devices, {sda.path, sdb.path})
|
||||
+
|
||||
+ tree.hide(sda)
|
||||
+ self.assertSetEqual(lvm._lvm_devices, {sdb.path})
|
||||
+ tree.hide(sdb)
|
||||
+ self.assertSetEqual(lvm._lvm_devices, set())
|
||||
+
|
||||
+ tree.unhide(sda)
|
||||
+ self.assertSetEqual(lvm._lvm_devices, {sda.path})
|
||||
+ tree.unhide(sdb)
|
||||
+ self.assertSetEqual(lvm._lvm_devices, {sda.path, sdb.path})
|
||||
+
|
||||
|
||||
class DeviceTreeIgnoredExclusiveMultipathTestCase(unittest.TestCase):
|
||||
|
||||
diff --git a/tests/populator_test.py b/tests/populator_test.py
|
||||
index 2a8532f0..dd36c16a 100644
|
||||
--- a/tests/populator_test.py
|
||||
+++ b/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.devicelibs import lvm
|
||||
from blivet.devicetree import DeviceTree
|
||||
from blivet.formats import get_device_format_class, get_format, DeviceFormat
|
||||
from blivet.formats.disklabel import DiskLabel
|
||||
@@ -393,8 +394,7 @@ class PartitionDevicePopulatorTestCase(PopulatorHelperTestCase):
|
||||
@patch.object(DiskLabel, "parted_disk")
|
||||
@patch.object(DiskLabel, "parted_device")
|
||||
@patch.object(PartitionDevice, "probe")
|
||||
- # TODO: fix the naming of the lvm filter functions
|
||||
- @patch("blivet.devicelibs.lvm.lvm_cc_addFilterRejectRegexp")
|
||||
+ @patch("blivet.devicelibs.lvm.lvm_devices_add")
|
||||
@patch("blivet.udev.device_get_major", return_value=88)
|
||||
@patch("blivet.udev.device_get_minor", return_value=19)
|
||||
@patch.object(DeviceTree, "get_device_by_name")
|
||||
@@ -973,6 +973,8 @@ class LVMFormatPopulatorTestCase(FormatPopulatorTestCase):
|
||||
self.assertTrue(vg_device is not None)
|
||||
devicetree._remove_device(vg_device)
|
||||
|
||||
+ self.assertIn(device.path, lvm._lvm_devices)
|
||||
+
|
||||
get_device_by_uuid.reset_mock()
|
||||
|
||||
# pv belongs to a valid vg not in the tree with two lvs
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 15a63b01bd2b6e7fe197fade849f28b83407c166 Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Fri, 30 Jul 2021 14:01:04 +0200
|
||||
Subject: [PATCH 4/7] Use LVM devices for filtering LVM devices with LVM >=
|
||||
2.02.13
|
||||
|
||||
---
|
||||
blivet/devicelibs/lvm.py | 38 +++++++++++++++++++++++++++++---------
|
||||
tests/populator_test.py | 9 ++++-----
|
||||
2 files changed, 33 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/blivet/devicelibs/lvm.py b/blivet/devicelibs/lvm.py
|
||||
index 96d037b8..3ab1540b 100644
|
||||
--- a/blivet/devicelibs/lvm.py
|
||||
+++ b/blivet/devicelibs/lvm.py
|
||||
@@ -67,6 +67,16 @@ LVMETAD_SOCKET_PATH = "/run/lvm/lvmetad.socket"
|
||||
|
||||
safe_name_characters = "0-9a-zA-Z._-"
|
||||
|
||||
+if hasattr(blockdev.LVMTech, "DEVICES"):
|
||||
+ try:
|
||||
+ blockdev.lvm.is_tech_avail(blockdev.LVMTech.DEVICES, 0) # pylint: disable=no-member
|
||||
+ except blockdev.LVMError:
|
||||
+ HAVE_LVMDEVICES = False
|
||||
+ else:
|
||||
+ HAVE_LVMDEVICES = True
|
||||
+else:
|
||||
+ HAVE_LVMDEVICES = False
|
||||
+
|
||||
# list of devices that LVM is allowed to use
|
||||
# with LVM >= 2.0.13 we'll use this for the --devices option and when creating
|
||||
# the /etc/lvm/devices/system.devices file
|
||||
@@ -79,25 +89,34 @@ def _set_global_config():
|
||||
|
||||
device_string = ""
|
||||
|
||||
- # now explicitly "accept" all LVM devices
|
||||
- for device in _lvm_devices:
|
||||
- device_string += "\"a|%s$|\"," % device
|
||||
+ if not HAVE_LVMDEVICES:
|
||||
+ # now explicitly "accept" all LVM devices
|
||||
+ for device in _lvm_devices:
|
||||
+ device_string += "\"a|%s$|\"," % device
|
||||
|
||||
- # now add all devices to the "reject" filter
|
||||
- device_string += "\"r|.*|\""
|
||||
+ # now add all devices to the "reject" filter
|
||||
+ device_string += "\"r|.*|\""
|
||||
|
||||
- filter_string = "filter=[%s]" % device_string
|
||||
+ filter_string = "filter=[%s]" % device_string
|
||||
|
||||
- config_string = " devices { %s } " % filter_string
|
||||
+ config_string = " devices { %s } " % filter_string
|
||||
+ else:
|
||||
+ config_string = " "
|
||||
|
||||
if not flags.lvm_metadata_backup:
|
||||
config_string += "backup {backup=0 archive=0} "
|
||||
- if flags.debug:
|
||||
- config_string += "log {level=7 file=/tmp/lvm.log syslog=0}"
|
||||
+ config_string += "log {level=7 file=/tmp/lvm.log syslog=0}"
|
||||
|
||||
blockdev.lvm.set_global_config(config_string)
|
||||
|
||||
|
||||
+def _set_lvm_devices():
|
||||
+ if not HAVE_LVMDEVICES:
|
||||
+ return
|
||||
+
|
||||
+ blockdev.lvm.set_devices_filter(list(_lvm_devices))
|
||||
+
|
||||
+
|
||||
def needs_config_refresh(fn):
|
||||
if not availability.BLOCKDEV_LVM_PLUGIN.available:
|
||||
return lambda *args, **kwargs: None
|
||||
@@ -105,6 +124,7 @@ def needs_config_refresh(fn):
|
||||
def fn_with_refresh(*args, **kwargs):
|
||||
ret = fn(*args, **kwargs)
|
||||
_set_global_config()
|
||||
+ _set_lvm_devices()
|
||||
return ret
|
||||
|
||||
return fn_with_refresh
|
||||
diff --git a/tests/populator_test.py b/tests/populator_test.py
|
||||
index dd36c16a..a9584319 100644
|
||||
--- a/tests/populator_test.py
|
||||
+++ b/tests/populator_test.py
|
||||
@@ -897,6 +897,7 @@ class LVMFormatPopulatorTestCase(FormatPopulatorTestCase):
|
||||
device = Mock()
|
||||
device.parents = []
|
||||
device.size = Size("10g")
|
||||
+ device.path = "/dev/sda1"
|
||||
devicetree._add_device(device)
|
||||
|
||||
# pylint: disable=attribute-defined-outside-init
|
||||
@@ -924,15 +925,13 @@ class LVMFormatPopulatorTestCase(FormatPopulatorTestCase):
|
||||
pv_info.pe_start = 0
|
||||
pv_info.pv_free = 0
|
||||
|
||||
- device.path = sentinel.pv_path
|
||||
-
|
||||
vg_device = Mock()
|
||||
vg_device.parents = []
|
||||
vg_device.lvs = []
|
||||
get_device_by_uuid.return_value = vg_device
|
||||
|
||||
with patch("blivet.static_data.lvm_info.PVsInfo.cache", new_callable=PropertyMock) as mock_pvs_cache:
|
||||
- mock_pvs_cache.return_value = {sentinel.pv_path: pv_info}
|
||||
+ mock_pvs_cache.return_value = {device.path: pv_info}
|
||||
with patch("blivet.udev.device_get_format", return_value=self.udev_type):
|
||||
helper = self.helper_class(devicetree, data, device)
|
||||
self.assertFalse(device in vg_device.parents)
|
||||
@@ -957,7 +956,7 @@ class LVMFormatPopulatorTestCase(FormatPopulatorTestCase):
|
||||
pv_info.vg_pv_count = 1
|
||||
|
||||
with patch("blivet.static_data.lvm_info.PVsInfo.cache", new_callable=PropertyMock) as mock_pvs_cache:
|
||||
- mock_pvs_cache.return_value = {sentinel.pv_path: pv_info}
|
||||
+ mock_pvs_cache.return_value = {device.path: pv_info}
|
||||
with patch("blivet.static_data.lvm_info.VGsInfo.cache", new_callable=PropertyMock) as mock_vgs_cache:
|
||||
mock_vgs_cache.return_value = {pv_info.vg_uuid: Mock()}
|
||||
with patch("blivet.udev.device_get_format", return_value=self.udev_type):
|
||||
@@ -1007,7 +1006,7 @@ class LVMFormatPopulatorTestCase(FormatPopulatorTestCase):
|
||||
get_device_by_uuid.side_effect = gdbu
|
||||
|
||||
with patch("blivet.static_data.lvm_info.PVsInfo.cache", new_callable=PropertyMock) as mock_pvs_cache:
|
||||
- mock_pvs_cache.return_value = {sentinel.pv_path: pv_info}
|
||||
+ mock_pvs_cache.return_value = {device.path: pv_info}
|
||||
with patch("blivet.static_data.lvm_info.VGsInfo.cache", new_callable=PropertyMock) as mock_vgs_cache:
|
||||
mock_vgs_cache.return_value = {pv_info.vg_uuid: Mock()}
|
||||
with patch("blivet.static_data.lvm_info.LVsInfo.cache", new_callable=PropertyMock) as mock_lvs_cache:
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From d4e1395de3691f30196b6b0e3b2c82e83b27afaf Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Fri, 30 Jul 2021 14:01:43 +0200
|
||||
Subject: [PATCH 5/7] Make sure PVs are added/deleted to/from the LVM device
|
||||
file
|
||||
|
||||
We are using the --devices option when running LVM commands which
|
||||
mean the newly created PV won't be added to the device list by
|
||||
pvcreate so we need to do that manually.
|
||||
---
|
||||
blivet/formats/lvmpv.py | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/blivet/formats/lvmpv.py b/blivet/formats/lvmpv.py
|
||||
index 3b00951f..71ec699f 100644
|
||||
--- a/blivet/formats/lvmpv.py
|
||||
+++ b/blivet/formats/lvmpv.py
|
||||
@@ -131,6 +131,9 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
ea_yes = blockdev.ExtraArg.new("-y", "")
|
||||
blockdev.lvm.pvcreate(self.device, data_alignment=self.data_alignment, extra=[ea_yes])
|
||||
|
||||
+ if lvm.HAVE_LVMDEVICES:
|
||||
+ blockdev.lvm.devices_add(self.device)
|
||||
+
|
||||
def _destroy(self, **kwargs):
|
||||
log_method_call(self, device=self.device,
|
||||
type=self.type, status=self.status)
|
||||
@@ -141,6 +144,8 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
finally:
|
||||
lvm.lvm_devices_remove(self.device)
|
||||
udev.settle()
|
||||
+ if lvm.HAVE_LVMDEVICES:
|
||||
+ blockdev.lvm.devices_delete(self.device)
|
||||
|
||||
@property
|
||||
def destroyable(self):
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From c221d313bde21fb2cba701b93fe0c57336cba8ec Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Thu, 14 Oct 2021 15:32:24 +0200
|
||||
Subject: [PATCH 6/7] Ignore errors for LVM devices file actions
|
||||
|
||||
The LVM devices file feature might be disabled either locally or
|
||||
globally by LVM config.
|
||||
---
|
||||
blivet/formats/lvmpv.py | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/blivet/formats/lvmpv.py b/blivet/formats/lvmpv.py
|
||||
index 71ec699f..b27213cc 100644
|
||||
--- a/blivet/formats/lvmpv.py
|
||||
+++ b/blivet/formats/lvmpv.py
|
||||
@@ -132,7 +132,10 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
blockdev.lvm.pvcreate(self.device, data_alignment=self.data_alignment, extra=[ea_yes])
|
||||
|
||||
if lvm.HAVE_LVMDEVICES:
|
||||
- blockdev.lvm.devices_add(self.device)
|
||||
+ try:
|
||||
+ blockdev.lvm.devices_add(self.device)
|
||||
+ except blockdev.LVMError as e:
|
||||
+ log.debug("Failed to add newly created PV %s to the LVM devices file: %s", self.device, str(e))
|
||||
|
||||
def _destroy(self, **kwargs):
|
||||
log_method_call(self, device=self.device,
|
||||
@@ -145,7 +148,10 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
lvm.lvm_devices_remove(self.device)
|
||||
udev.settle()
|
||||
if lvm.HAVE_LVMDEVICES:
|
||||
- blockdev.lvm.devices_delete(self.device)
|
||||
+ try:
|
||||
+ blockdev.lvm.devices_delete(self.device)
|
||||
+ except blockdev.LVMError as e:
|
||||
+ log.debug("Failed to remove PV %s from the LVM devices file: %s", self.device, str(e))
|
||||
|
||||
@property
|
||||
def destroyable(self):
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
||||
From 6b96d4ead6890fffd95840b8935f71ecd9e310ef Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Tue, 19 Oct 2021 14:27:05 +0200
|
||||
Subject: [PATCH 7/7] Add public functions to add/remove PV to/from the LVM
|
||||
system.devices
|
||||
|
||||
Anaconda needs to be able to add preexisting PVs to the file
|
||||
during installation.
|
||||
---
|
||||
blivet/formats/lvmpv.py | 28 ++++++++++++++++++++--------
|
||||
1 file changed, 20 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/blivet/formats/lvmpv.py b/blivet/formats/lvmpv.py
|
||||
index b27213cc..3fef667e 100644
|
||||
--- a/blivet/formats/lvmpv.py
|
||||
+++ b/blivet/formats/lvmpv.py
|
||||
@@ -121,6 +121,24 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
def supported(self):
|
||||
return super(LVMPhysicalVolume, self).supported and self._plugin.available
|
||||
|
||||
+ def lvmdevices_add(self):
|
||||
+ if not lvm.HAVE_LVMDEVICES:
|
||||
+ raise PhysicalVolumeError("LVM devices file feature is not supported")
|
||||
+
|
||||
+ try:
|
||||
+ blockdev.lvm.devices_add(self.device)
|
||||
+ except blockdev.LVMError as e:
|
||||
+ log.debug("Failed to add PV %s to the LVM devices file: %s", self.device, str(e))
|
||||
+
|
||||
+ def lvmdevices_remove(self):
|
||||
+ if not lvm.HAVE_LVMDEVICES:
|
||||
+ raise PhysicalVolumeError("LVM devices file feature is not supported")
|
||||
+
|
||||
+ try:
|
||||
+ blockdev.lvm.devices_delete(self.device)
|
||||
+ except blockdev.LVMError as e:
|
||||
+ log.debug("Failed to remove PV %s from the LVM devices file: %s", self.device, str(e))
|
||||
+
|
||||
def _create(self, **kwargs):
|
||||
log_method_call(self, device=self.device,
|
||||
type=self.type, status=self.status)
|
||||
@@ -132,10 +150,7 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
blockdev.lvm.pvcreate(self.device, data_alignment=self.data_alignment, extra=[ea_yes])
|
||||
|
||||
if lvm.HAVE_LVMDEVICES:
|
||||
- try:
|
||||
- blockdev.lvm.devices_add(self.device)
|
||||
- except blockdev.LVMError as e:
|
||||
- log.debug("Failed to add newly created PV %s to the LVM devices file: %s", self.device, str(e))
|
||||
+ self.lvmdevices_add()
|
||||
|
||||
def _destroy(self, **kwargs):
|
||||
log_method_call(self, device=self.device,
|
||||
@@ -148,10 +163,7 @@ class LVMPhysicalVolume(DeviceFormat):
|
||||
lvm.lvm_devices_remove(self.device)
|
||||
udev.settle()
|
||||
if lvm.HAVE_LVMDEVICES:
|
||||
- try:
|
||||
- blockdev.lvm.devices_delete(self.device)
|
||||
- except blockdev.LVMError as e:
|
||||
- log.debug("Failed to remove PV %s from the LVM devices file: %s", self.device, str(e))
|
||||
+ self.lvmdevices_remove()
|
||||
|
||||
@property
|
||||
def destroyable(self):
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,53 @@
|
||||
From 23b7573557e69d9b4dccdd6d52e82b82d8dba115 Mon Sep 17 00:00:00 2001
|
||||
From: Vojtech Trefny <vtrefny@redhat.com>
|
||||
Date: Wed, 1 Dec 2021 16:28:15 +0100
|
||||
Subject: [PATCH] iscsi: Replace all log_exception_info calls with log.info
|
||||
|
||||
We don't get any useful information from the exception, it's
|
||||
always the same traceback from a failed DBus call and we only use
|
||||
these when a called failed because firmware ISCSI is not supported.
|
||||
The resulting log message also looks like a failure with the
|
||||
traceback logged and not just as a debug information.
|
||||
|
||||
Resolves: rhbz#2028134
|
||||
---
|
||||
blivet/iscsi.py | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/blivet/iscsi.py b/blivet/iscsi.py
|
||||
index 5ee2082b..bc77ca62 100644
|
||||
--- a/blivet/iscsi.py
|
||||
+++ b/blivet/iscsi.py
|
||||
@@ -22,7 +22,6 @@ from . import udev
|
||||
from . import util
|
||||
from .flags import flags
|
||||
from .i18n import _
|
||||
-from .storage_log import log_exception_info
|
||||
from . import safe_dbus
|
||||
import os
|
||||
import re
|
||||
@@ -277,8 +276,8 @@ class iSCSI(object):
|
||||
'org.freedesktop.DBus.ObjectManager',
|
||||
'GetManagedObjects',
|
||||
None)[0]
|
||||
- except safe_dbus.DBusCallError:
|
||||
- log_exception_info(log.info, "iscsi: Failed to get active sessions.")
|
||||
+ except safe_dbus.DBusCallError as e:
|
||||
+ log.info("iscsi: Failed to get active sessions: %s", str(e))
|
||||
return []
|
||||
|
||||
sessions = (obj for obj in objects.keys() if re.match(r'.*/iscsi/session[0-9]+$', obj))
|
||||
@@ -302,8 +301,8 @@ class iSCSI(object):
|
||||
args = GLib.Variant("(a{sv})", ([], ))
|
||||
try:
|
||||
found_nodes, _n_nodes = self._call_initiator_method("DiscoverFirmware", args)
|
||||
- except safe_dbus.DBusCallError:
|
||||
- log_exception_info(log.info, "iscsi: No IBFT info found.")
|
||||
+ except safe_dbus.DBusCallError as e:
|
||||
+ log.info("iscsi: No IBFT info found: %s", str(e))
|
||||
# an exception here means there is no ibft firmware, just return
|
||||
return
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -23,7 +23,7 @@ Version: 3.4.0
|
||||
|
||||
#%%global prerelease .b2
|
||||
# prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2
|
||||
Release: 9%{?prerelease}%{?dist}
|
||||
Release: 11%{?prerelease}%{?dist}
|
||||
Epoch: 1
|
||||
License: LGPLv2+
|
||||
%global realname blivet
|
||||
@ -42,6 +42,8 @@ Patch8: 0010-Fix-running-tests-in-gating.patch
|
||||
Patch9: 0011-Tell-LVM-to-ignore-the-new-devices-file-for-now.patch
|
||||
Patch10: 0012-Improve-error-message-printed-for-missing-dependecie.patch
|
||||
Patch11: 0013-Use-bigger-chunk-size-for-thinpools-bigger-than-15.8.patch
|
||||
Patch12: 0014-LVM-devices-file-support.patch
|
||||
Patch13: 0015-iscsi-Replace-all-log_exception_info-calls-with-log.patch
|
||||
|
||||
# Versions of required components (done so we make sure the buildrequires
|
||||
# match the requires versions of things).
|
||||
@ -204,6 +206,14 @@ configuration.
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* 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
|
||||
|
Loading…
Reference in New Issue
Block a user