← Back to team overview

curtin-dev team mailing list archive

[Merge] ~slyon/curtin:slyon/lp1895192-2 into curtin:master

 

Lukas Märdian has proposed merging ~slyon/curtin:slyon/lp1895192-2 into curtin:master.

Commit message:
block:lvm: search encrypted volumes for LVM

Allow booting off fully encrypted multipath devices by whitelisting encrypted
volumes in addition to the multipath devices themselves for LVM discovery.

Fixes LP: #1895192

Requested reviews:
  Michael Hudson-Doyle (mwhudson)
Related bugs:
  Bug #1895192 in curtin: "Optimistic approach of using zkey for encrypted installations on s390x not working"
  https://bugs.launchpad.net/curtin/+bug/1895192

For more details, see:
https://code.launchpad.net/~slyon/curtin/+git/curtin/+merge/406530

block:lvm: search encrypted volumes for LVM

Allow booting off fully encrypted multipath devices by whitelisting encrypted
volumes in addition to the multipath devices themselves for LVM discovery.

Fixes LP: #1895192
-- 
Your team curtin developers is subscribed to branch curtin:master.
diff --git a/curtin/block/lvm.py b/curtin/block/lvm.py
index bd0f1aa..333b46f 100644
--- a/curtin/block/lvm.py
+++ b/curtin/block/lvm.py
@@ -81,7 +81,7 @@ def activate_volgroups(multipath=False):
     """
     cmd = ['vgchange', '--activate=y']
     if multipath:
-        # only operate on mp devices
+        # only operate on mp devices or encrypted volumes
         mp_filter = generate_multipath_dev_mapper_filter()
         cmd.extend(['--config', 'devices{ %s }' % mp_filter])
 
@@ -100,12 +100,14 @@ def _generate_multipath_filter(accept=None):
 
 
 def generate_multipath_dev_mapper_filter():
-    return _generate_multipath_filter(accept=['/dev/mapper/mpath.*'])
+    return _generate_multipath_filter(
+        accept=['/dev/mapper/mpath.*', '/dev/mapper/dm_crypt-.*'])
 
 
 def generate_multipath_dm_uuid_filter():
-    return _generate_multipath_filter(
-        accept=['/dev/disk/by-id/dm-uuid-.*mpath-.*'])
+    return _generate_multipath_filter(accept=[
+        '/dev/disk/by-id/dm-uuid-.*mpath-.*',
+        '/dev/disk/by-id/.*dm_crypt-.*'])
 
 
 def lvm_scan(activate=True, multipath=False):
@@ -126,8 +128,9 @@ def lvm_scan(activate=True, multipath=False):
         release = 'xenial'
 
     if multipath:
-        # only operate on mp devices
-        mponly = 'devices{ filter = [ "a|/dev/mapper/mpath.*|", "r|.*|" ] }'
+        # only operate on mp devices or encrypted volumes
+        mponly = 'devices{ filter = [ "a|%s|", "a|%s|", "r|.*|" ] }' % (
+            '/dev/mapper/mpath.*', '/dev/mapper/dm_crypt-.*')
 
     for cmd in [['pvscan'], ['vgscan']]:
         if release != 'precise' and lvmetad_running():
diff --git a/tests/unittests/test_block_lvm.py b/tests/unittests/test_block_lvm.py
index ff58b30..fc6130a 100644
--- a/tests/unittests/test_block_lvm.py
+++ b/tests/unittests/test_block_lvm.py
@@ -106,7 +106,8 @@ class TestBlockLvm(CiTestCase):
         lvm.lvm_scan(multipath=True)
         cmd_filter = [
             '--config',
-            'devices{ filter = [ "a|/dev/mapper/mpath.*|", "r|.*|" ] }'
+            'devices{ filter = [ "a|%s|", "a|%s|", "r|.*|" ] }' % (
+                '/dev/mapper/mpath.*', '/dev/mapper/dm_crypt-.*')
         ]
         expected = [cmd + cmd_filter for cmd in cmds]
         calls = [mock.call(cmd, capture=True) for cmd in expected]
@@ -117,12 +118,15 @@ class TestBlockLvm(CiTestCase):
 class TestBlockLvmMultipathFilter(CiTestCase):
 
     def test_generate_multipath_dev_mapper_filter(self):
-        expected = 'filter = [ "a|/dev/mapper/mpath.*|", "r|.*|" ]'
+        expected = 'filter = [ "a|%s|", "a|%s|", "r|.*|" ]' % (
+            '/dev/mapper/mpath.*', '/dev/mapper/dm_crypt-.*')
         self.assertEqual(expected, lvm.generate_multipath_dev_mapper_filter())
 
     def test_generate_multipath_dm_uuid_filter(self):
         expected = (
-            'filter = [ "a|/dev/disk/by-id/dm-uuid-.*mpath-.*|", "r|.*|" ]')
+            'filter = [ "a|%s|", "a|%s|", "r|.*|" ]' % (
+                '/dev/disk/by-id/dm-uuid-.*mpath-.*',
+                '/dev/disk/by-id/.*dm_crypt-.*'))
         self.assertEqual(expected, lvm.generate_multipath_dm_uuid_filter())
 
 

Follow ups