← Back to team overview

curtin-dev team mailing list archive

[Merge] ~mwhudson/curtin:v2-skeleton into curtin:master

 

Michael Hudson-Doyle has proposed merging ~mwhudson/curtin:v2-skeleton into curtin:master.

Commit message:
support version 2 curtin storage configs

effectively identical to version 1 for now



Requested reviews:
  curtin developers (curtin-dev)

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

Does this structure look OK? Maybe it makes sense to put the v1 handlers in a separate file too? (maybe not even a file in the curtin.commands package??)
-- 
Your team curtin developers is requested to review the proposed merge of ~mwhudson/curtin:v2-skeleton into curtin:master.
diff --git a/curtin/commands/block_meta.py b/curtin/commands/block_meta.py
index 1913cb4..d470ffc 100644
--- a/curtin/commands/block_meta.py
+++ b/curtin/commands/block_meta.py
@@ -2004,6 +2004,17 @@ def meta_custom(args):
 
     storage_config_dict = extract_storage_ordered_dict(cfg)
 
+    version = cfg['storage']['version']
+    if version > 1:
+        from curtin.commands.block_meta_v2 import (
+            disk_handler_v2,
+            partition_handler_v2,
+            )
+        command_handlers.update({
+            'disk': disk_handler_v2,
+            'partition': partition_handler_v2,
+            })
+
     storage_config_dict = zfsroot_update_storage_config(storage_config_dict)
 
     # set up reportstack
diff --git a/curtin/commands/block_meta_v2.py b/curtin/commands/block_meta_v2.py
new file mode 100644
index 0000000..25f777b
--- /dev/null
+++ b/curtin/commands/block_meta_v2.py
@@ -0,0 +1,17 @@
+# This file is part of curtin. See LICENSE file for copyright and license info.
+
+from curtin.commands.block_meta import (
+    disk_handler as disk_handler_v1,
+    partition_handler as partition_handler_v1,
+    )
+
+
+def disk_handler_v2(info, storage_config, handlers):
+    disk_handler_v1(info, storage_config, handlers)
+
+
+def partition_handler_v2(info, storage_config, handlers):
+    partition_handler_v1(info, storage_config, handlers)
+
+
+# vi: ts=4 expandtab syntax=python
diff --git a/curtin/storage_config.py b/curtin/storage_config.py
index 405a1e2..89ab544 100644
--- a/curtin/storage_config.py
+++ b/curtin/storage_config.py
@@ -79,7 +79,7 @@ STORAGE_CONFIG_SCHEMA = {
     'required': ['version', 'config'],
     'definitions': schemas.definitions,
     'properties': {
-        'version': {'type': 'integer', 'enum': [1]},
+        'version': {'type': 'integer', 'enum': [1, 2]},
         'config': {
             'type': 'array',
             'items': {
@@ -1315,7 +1315,7 @@ def extract_storage_config(probe_data, strict=False):
     ordered = (dasd + disk + part + format + lvols + lparts + raids +
                dmcrypts + mounts + bcache + zpool + zfs)
 
-    final_config = {'storage': {'version': 1, 'config': ordered}}
+    final_config = {'storage': {'version': 2, 'config': ordered}}
     try:
         LOG.info('Validating extracted storage config components')
         validate_config(final_config['storage'])
@@ -1346,7 +1346,7 @@ def extract_storage_config(probe_data, strict=False):
 
     LOG.debug("Merging storage config dependencies")
     merged_config = {
-        'version': 1,
+        'version': 2,
         'config': merge_config_trees_to_list(ctrees)
     }
     LOG.debug("Merged storage config:\n%s",
diff --git a/tests/integration/test_block_meta.py b/tests/integration/test_block_meta.py
index bd602b2..62ede6b 100644
--- a/tests/integration/test_block_meta.py
+++ b/tests/integration/test_block_meta.py
@@ -39,7 +39,8 @@ def summarize_partitions(dev):
 
 class StorageConfigBuilder:
 
-    def __init__(self):
+    def __init__(self, *, version):
+        self.version = version
         self.config = []
         self.cur_image = None
 
@@ -47,6 +48,7 @@ class StorageConfigBuilder:
         return {
             'storage': {
                 'config': self.config,
+                'version': self.version,
                 },
             }
 
@@ -102,10 +104,10 @@ class TestBlockMeta(IntegrationTestCase):
             ]
         util.subp(cmd, env=cmd_env, **kwargs)
 
-    def _test_default_offsets(self, ptable):
+    def _test_default_offsets(self, ptable, version):
         psize = 40 << 20
         img = self.tmp_path('image.img')
-        config = StorageConfigBuilder()
+        config = StorageConfigBuilder(version=version)
         config.add_image(path=img, size='100M', ptable=ptable)
         config.add_part(size=psize, number=1)
         config.add_part(size=psize, number=2)
@@ -120,16 +122,22 @@ class TestBlockMeta(IntegrationTestCase):
                         number=2, offset=(1 << 20) + psize, size=psize),
                 ])
 
-    def test_default_offsets_gpt(self):
-        self._test_default_offsets('gpt')
+    def test_default_offsets_gpt_v1(self):
+        self._test_default_offsets('gpt', 1)
 
-    def test_default_offsets_msdos(self):
-        self._test_default_offsets('msdos')
+    def test_default_offsets_msdos_v1(self):
+        self._test_default_offsets('msdos', 1)
+
+    def test_default_offsets_gpt_v2(self):
+        self._test_default_offsets('gpt', 2)
+
+    def test_default_offsets_msdos_v2(self):
+        self._test_default_offsets('msdos', 2)
 
     def _test_non_default_numbering(self, ptable):
         psize = 40 << 20
         img = self.tmp_path('image.img')
-        config = StorageConfigBuilder()
+        config = StorageConfigBuilder(version=1)
         config.add_image(path=img, size='100M', ptable=ptable)
         config.add_part(size=psize, number=1)
         config.add_part(size=psize, number=4)
@@ -152,7 +160,7 @@ class TestBlockMeta(IntegrationTestCase):
 
     def test_logical(self):
         img = self.tmp_path('image.img')
-        config = StorageConfigBuilder()
+        config = StorageConfigBuilder(version=1)
         config.add_image(path=img, size='100M', ptable='msdos')
         config.add_part(size='50M', number=1, flag='extended')
         config.add_part(size='10M', number=5, flag='logical')
@@ -175,7 +183,7 @@ class TestBlockMeta(IntegrationTestCase):
 
     def test_raw_image(self):
         img = self.tmp_path('image.img')
-        config = StorageConfigBuilder()
+        config = StorageConfigBuilder(version=1)
         config.add_image(path=img, size='2G', ptable='gpt', create=True)
 
         curtin_cfg = config.render()

Follow ups