curtin-dev team mailing list archive
-
curtin-dev team
-
Mailing list archive
-
Message #01156
[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