debian-forge/test/mod
Christian Kellner 7e2bb524a4 devices: add custom udev rule inhibitor mechanism
Certain udev rules for block devices are problematic for osbuild.
One prominent example is LVM2 related rules that would trigger
a scan and auto-activation of logical volumes. This rules are
triggered for new block devices or when the backing file of an
loop devices changes. The rules will lead to a `lvm pvscan
--cache --activate ay` via the `lvm2-pvscan@.service` systemd
service. This will auto-activate all LVM2 logical volumes and
thus interfering with our own device handling in `devices/
org.osbuild.lvm2.lv`, where we only want to activate a single
logical volume.
Also, if the lvm2 devices get activated after the manual metadata
change done in `org.osbuild.lvm2.metadata` the volume group names
might conflict which results in all lvm2 based tooling to be very,
ver sad and also said stage to hang since the loopback device can
not be detached since the activate logical volumes keep it open.

To work-around this we therefore implement a udev rule inhibition
mechanism: on the osbuild side a lock file is created via the new
class called `UdevInhibitor` in `utils/udev.py`. A custom set of
udev rules in `10-osbuild-inhibitor.rules` is then acting on the
existence of that lock file and if present will opt-out of certain
further processing. See the udev rules file for more details.

In fact, we want this custom inhibition mechanism, for all block
devices that are under osbuild's control, since these rules are
there to provide automatisms and integrations with the host,
something we never want.

NB: this should not affect the detection of devices, since lvm2
does do a scan of devices when we call `lvdisplay` in `lvm2.lv`.
The call chain as of lvm2 git rev f773040:

  _lvdisplay_single           [tools/lvdisplay.c
    process_each_lv           [tools/toollib.c
      lvmcache_label_scan     [lib/cache/lvmcache.c
        label_scan            [ibidem, here is the device detection!
      lvdisplay_full          [lib/display/display.c
2021-12-09 00:44:21 +00:00
..
__init__.py test: '{. -> ./mod}/test_util_selinux.py' 2020-04-24 15:50:44 +02:00
test_api.py api: remove host side arguments facility 2021-07-08 15:01:33 +01:00
test_buildroot.py test/buildroot: test timeout at the run level 2021-12-07 09:47:01 +00:00
test_fmt_v1.py osbuild: on-demand building of pipelines 2021-12-02 12:51:30 +00:00
test_fmt_v2.py device: add support for parent devices 2021-08-13 12:20:54 +02:00
test_host.py test/host: checks for invalid fd handling 2021-09-24 12:14:04 +01:00
test_loop.py test/loop: check for data integrity 2021-08-13 17:35:32 +02:00
test_monitor.py formats/v1: remove implicit assembler export 2021-12-02 12:51:30 +00:00
test_objectstore.py objectstore: sub-tree support for read_at 2021-06-09 18:37:47 +01:00
test_osbuild.py test/osbuild: add order check for on_demand 2021-12-03 17:09:33 +00:00
test_util_checksum.py test/mod: add checks for util.test_util 2021-05-12 14:26:16 +02:00
test_util_ctx.py util/ctx: extract suppress_oserror() 2020-05-11 18:05:12 +02:00
test_util_jsoncomm.py util/jsoncomm: add send_and_recv helper 2021-06-09 18:37:47 +01:00
test_util_linux.py test: convert to shared helpers 2020-05-13 14:26:05 +02:00
test_util_lorax.py test/util_lorax: add basic checks 2021-02-19 14:42:32 +00:00
test_util_lvm2.py test/lvm2: use LoopControl.loop_for_fd 2021-11-12 17:40:00 +01:00
test_util_osrelease.py test: make TestBase inherit unittest.TestCase 2020-06-05 09:27:40 +02:00
test_util_ostree.py stages: add org.osbuild.ostree.passwd 2021-08-17 13:53:00 +02:00
test_util_path.py test/util_path: add basic utility function test 2021-06-28 19:07:42 +02:00
test_util_rhsm.py sources/curl: Implement new way of getting RHSM secrets 2021-06-04 18:23:05 +01:00
test_util_rmrf.py test: convert to shared helpers 2020-05-13 14:26:05 +02:00
test_util_selinux.py test: '{. -> ./mod}/test_util_selinux.py' 2020-04-24 15:50:44 +02:00
test_util_udev.py devices: add custom udev rule inhibitor mechanism 2021-12-09 00:44:21 +00:00