← Back to team overview

curtin-dev team mailing list archive

[Merge] ~mwhudson/curtin:fix-DasdPartitionTable into curtin:master

 

Michael Hudson-Doyle has proposed merging ~mwhudson/curtin:fix-DasdPartitionTable into curtin:master.

Commit message:
fix construction of DasdPartitionTable from fdasd output

DasdPartition had an extra argument in its constructor that should not
have been there. Add some tests.


Requested reviews:
  curtin developers (curtin-dev)

For more details, see:
https://code.launchpad.net/~mwhudson/curtin/+git/curtin/+merge/394985
-- 
Your team curtin developers is requested to review the proposed merge of ~mwhudson/curtin:fix-DasdPartitionTable into curtin:master.
diff --git a/curtin/block/dasd.py b/curtin/block/dasd.py
index 7450300..327c301 100644
--- a/curtin/block/dasd.py
+++ b/curtin/block/dasd.py
@@ -10,7 +10,7 @@ Dasdvalue = collections.namedtuple('Dasdvalue', ['hex', 'dec', 'txt'])
 
 
 class DasdPartition:
-    def __init__(self, table, device, start, end, length, id, system):
+    def __init__(self, device, start, end, length, id, system):
         self.device = device
         self.start = int(start)
         self.end = int(end)
@@ -34,6 +34,35 @@ class DasdPartitionTable:
         return ((size_in_bytes - 1) // self.bytes_per_track) + 1
 
     @classmethod
+    def from_fdasd_output(cls, devname, output):
+        line_iter = iter(output.splitlines())
+        for line in line_iter:
+            if line.startswith("Disk"):
+                break
+        kw = {'devname': devname}
+        label_to_attr = {
+            'blocks per track': 'blocks_per_track',
+            'bytes per block': 'bytes_per_block'
+            }
+        for line in line_iter:
+            if '--- tracks ---' in line:
+                break
+            if ':' in line:
+                label, value = line.split(':', 1)
+                label = label.strip(' .')
+                value = value.strip()
+                if label in label_to_attr:
+                    kw[label_to_attr[label]] = int(value)
+        table = cls(**kw)
+        for line in line_iter:
+            if line.startswith('exiting'):
+                break
+            vals = line.split(maxsplit=5)
+            if vals[0].startswith('/dev/'):
+                table.partitions.append(DasdPartition(*vals))
+        return table
+
+    @classmethod
     def from_fdasd(cls, devname):
         """Use fdasd to construct a DasdPartitionTable.
 
@@ -61,32 +90,8 @@ class DasdPartitionTable:
         """
         cmd = ['fdasd', '--table', devname]
         out, _err = util.subp(cmd, capture=True)
-        line_iter = iter(out.splitlines())
-        for line in line_iter:
-            if line.startswith("Disk"):
-                break
-        kw = {'devname': devname}
-        label_to_attr = {
-            'blocks per track': 'blocks_per_track',
-            'bytes per block': 'bytes_per_block'
-            }
-        for line in line_iter:
-            if '--- tracks ---' in line:
-                break
-            if ':' in line:
-                label, value = line.split(':', 1)
-                label = label.strip(' .')
-                value = value.strip()
-                if label in label_to_attr:
-                    kw[label_to_attr[label]] = int(value)
-        table = cls(**kw)
-        for line in line_iter:
-            if line.startswith('exiting'):
-                break
-            vals = line.split(maxsplit=5)
-            if vals[0].startswith('/dev/'):
-                table.partitions.append(DasdPartition(*vals))
-        return table
+        LOG.debug("from_fdasd output:\n---\n%s\n---\n", out)
+        return cls.from_fdasd_output(devname, out)
 
 
 def dasdinfo(device_id):
diff --git a/tests/unittests/test_block_dasd.py b/tests/unittests/test_block_dasd.py
index dfd62d3..450ca16 100644
--- a/tests/unittests/test_block_dasd.py
+++ b/tests/unittests/test_block_dasd.py
@@ -15,6 +15,47 @@ def random_device_id():
                            random.randint(1, 0x10000 - 1))
 
 
+FDASD_OUTPUT = '''
+reading volume label ..: VOL1
+reading vtoc ..........: ok
+
+
+Disk /dev/dasda:
+  cylinders ............: 10016
+  tracks per cylinder ..: 15
+  blocks per track .....: 12
+  bytes per block ......: 4096
+  volume label .........: VOL1
+  volume serial ........: 0X0200
+  max partitions .......: 3
+
+ ------------------------------- tracks -------------------------------
+               Device      start      end   length   Id  System
+          /dev/dasda1          2    21847    21846    1  Linux native
+                           21848   150239   128392       unused
+exiting...
+ '''
+
+
+class TestDasdPartitionTable(CiTestCase):
+
+    def test_from_dasd_output(self):
+        devname = self.random_string()
+        dasd_pt = dasd.DasdPartitionTable.from_fdasd_output(
+            devname, FDASD_OUTPUT)
+        self.assertEqual(dasd_pt.devname, devname)
+        self.assertEqual(dasd_pt.blocks_per_track, 12)
+        self.assertEqual(dasd_pt.bytes_per_block, 4096)
+        self.assertEqual(len(dasd_pt.partitions), 1)
+        part = dasd_pt.partitions[0]
+        self.assertEqual(part.device, '/dev/dasda1')
+        self.assertEqual(part.start, 2)
+        self.assertEqual(part.end, 21847)
+        self.assertEqual(part.length, 21846)
+        self.assertEqual(part.id, '1')
+        self.assertEqual(part.system, 'Linux native')
+
+
 class TestDasdValidDeviceId(CiTestCase):
 
     nonhex = [letter for letter in string.ascii_lowercase

Follow ups