Merge ~mwhudson/curtin:partition-verify-refactor into curtin:master

Proposed by Michael Hudson-Doyle
Status: Merged
Approved by: Michael Hudson-Doyle
Approved revision: 99470e340fc2a024f57f6dda52a66880be4940c3
Merge reported by: Server Team CI bot
Merged at revision: not available
Proposed branch: ~mwhudson/curtin:partition-verify-refactor
Merge into: curtin:master
Diff against target: 245 lines (+55/-74)
2 files modified
curtin/commands/block_meta.py (+15/-26)
tests/unittests/test_commands_block_meta.py (+40/-48)
Reviewer Review Type Date Requested Status
Dan Bungert Approve
Server Team CI bot continuous-integration Approve
Review via email: mp+412495@code.launchpad.net

Commit message

block_meta: refactor partition verification slightly

I want to call these functions from the new partitioning code and this
tweaking makes this easier.

To post a comment you must log in.
Revision history for this message
Server Team CI bot (server-team-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Dan Bungert (dbungert) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/curtin/commands/block_meta.py b/curtin/commands/block_meta.py
2index 5c3226d..f5f20f6 100644
3--- a/curtin/commands/block_meta.py
4+++ b/curtin/commands/block_meta.py
5@@ -765,12 +765,7 @@ def verify_exists(devpath):
6 raise RuntimeError("Device %s does not exist" % devpath)
7
8
9-def verify_size(devpath, expected_size_bytes, sfdisk_info=None):
10- if not sfdisk_info:
11- sfdisk_info = block.sfdisk_info(devpath)
12-
13- part_info = block.get_partition_sfdisk_info(devpath,
14- sfdisk_info=sfdisk_info)
15+def verify_size(devpath, expected_size_bytes, part_info):
16 (found_type, _code) = ptable_uuid_to_flag_entry(part_info.get('type'))
17 if found_type == 'extended':
18 found_size_bytes = int(part_info['size']) * 512
19@@ -784,30 +779,25 @@ def verify_size(devpath, expected_size_bytes, sfdisk_info=None):
20 raise RuntimeError(msg)
21
22
23-def verify_ptable_flag(devpath, expected_flag, sfdisk_info=None):
24+def verify_ptable_flag(devpath, expected_flag, label, part_info):
25 if (expected_flag not in SGDISK_FLAGS.keys()) and (expected_flag not in
26 MSDOS_FLAGS.keys()):
27 raise RuntimeError(
28 'Cannot verify unknown partition flag: %s' % expected_flag)
29
30- if not sfdisk_info:
31- sfdisk_info = block.sfdisk_info(devpath)
32-
33- entry = block.get_partition_sfdisk_info(devpath, sfdisk_info=sfdisk_info)
34- LOG.debug("Device %s ptable entry: %s", devpath, util.json_dumps(entry))
35 found_flag = None
36- if (sfdisk_info['label'] in ('dos', 'msdos')):
37+ if (label in ('dos', 'msdos')):
38 if expected_flag == 'boot':
39- found_flag = 'boot' if entry.get('bootable') is True else None
40+ found_flag = 'boot' if part_info.get('bootable') is True else None
41 elif expected_flag == 'extended':
42- (found_flag, _code) = ptable_uuid_to_flag_entry(entry['type'])
43+ (found_flag, _code) = ptable_uuid_to_flag_entry(part_info['type'])
44 elif expected_flag == 'logical':
45 (_parent, partnumber) = block.get_blockdev_for_partition(devpath)
46 found_flag = 'logical' if int(partnumber) > 4 else None
47
48 # gpt and msdos primary partitions look up flag by entry['type']
49 if found_flag is None:
50- (found_flag, _code) = ptable_uuid_to_flag_entry(entry['type'])
51+ (found_flag, _code) = ptable_uuid_to_flag_entry(part_info['type'])
52 msg = (
53 'Verifying %s partition flag, expecting %s, found %s' % (
54 devpath, expected_flag, found_flag))
55@@ -816,16 +806,13 @@ def verify_ptable_flag(devpath, expected_flag, sfdisk_info=None):
56 raise RuntimeError(msg)
57
58
59-def partition_verify_sfdisk(devpath, info):
60- verify_exists(devpath)
61- sfdisk_info = block.sfdisk_info(devpath)
62- if not sfdisk_info:
63- raise RuntimeError('Failed to extract sfdisk info from %s' % devpath)
64- verify_size(devpath, int(util.human2bytes(info['size'])),
65- sfdisk_info=sfdisk_info)
66- expected_flag = info.get('flag')
67+def partition_verify_sfdisk(part_action, label, sfdisk_part_info):
68+ devpath = sfdisk_part_info['node']
69+ verify_size(
70+ devpath, int(util.human2bytes(part_action['size'])), sfdisk_part_info)
71+ expected_flag = part_action.get('flag')
72 if expected_flag:
73- verify_ptable_flag(devpath, info['flag'], sfdisk_info=sfdisk_info)
74+ verify_ptable_flag(devpath, expected_flag, label, sfdisk_part_info)
75
76
77 def partition_verify_fdasd(disk_path, partnumber, info):
78@@ -937,7 +924,9 @@ def partition_handler(info, storage_config):
79 if disk_ptable == 'vtoc':
80 partition_verify_fdasd(disk, partnumber, info)
81 else:
82- partition_verify_sfdisk(part_path, info)
83+ sfdisk_info = block.sfdisk_info(disk)
84+ part_info = block.get_partition_sfdisk_info(part_path, sfdisk_info)
85+ partition_verify_sfdisk(info, sfdisk_info['label'], part_info)
86 LOG.debug(
87 '%s partition %s already present, skipping create',
88 disk, partnumber)
89diff --git a/tests/unittests/test_commands_block_meta.py b/tests/unittests/test_commands_block_meta.py
90index c3f8d14..4dad39d 100644
91--- a/tests/unittests/test_commands_block_meta.py
92+++ b/tests/unittests/test_commands_block_meta.py
93@@ -2570,8 +2570,6 @@ class TestPartitionVerifySfdisk(CiTestCase):
94 def setUp(self):
95 super(TestPartitionVerifySfdisk, self).setUp()
96 base = 'curtin.commands.block_meta.'
97- self.add_patch(base + 'verify_exists', 'm_verify_exists')
98- self.add_patch(base + 'block.sfdisk_info', 'm_block_sfdisk_info')
99 self.add_patch(base + 'verify_size', 'm_verify_size')
100 self.add_patch(base + 'verify_ptable_flag', 'm_verify_ptable_flag')
101 self.info = {
102@@ -2586,34 +2584,29 @@ class TestPartitionVerifySfdisk(CiTestCase):
103 self.devpath = self.random_string()
104
105 def test_partition_verify_sfdisk(self):
106- block_meta.partition_verify_sfdisk(self.devpath, self.info)
107- self.assertEqual(
108- [call(self.devpath)],
109- self.m_verify_exists.call_args_list)
110- self.assertEqual(
111- [call(self.devpath)],
112- self.m_block_sfdisk_info.call_args_list)
113+ devpath = self.random_string()
114+ sfdisk_part_info = {
115+ 'node': devpath,
116+ }
117+ label = self.random_string()
118+ block_meta.partition_verify_sfdisk(self.info, label, sfdisk_part_info)
119 self.assertEqual(
120- [call(self.devpath, self.part_size,
121- sfdisk_info=self.m_block_sfdisk_info.return_value)],
122+ [call(devpath, self.part_size, sfdisk_part_info)],
123 self.m_verify_size.call_args_list)
124 self.assertEqual(
125- [call(self.devpath, self.info['flag'],
126- sfdisk_info=self.m_block_sfdisk_info.return_value)],
127+ [call(devpath, self.info['flag'], label, sfdisk_part_info)],
128 self.m_verify_ptable_flag.call_args_list)
129
130 def test_partition_verify_skips_ptable_no_flag(self):
131 del self.info['flag']
132- block_meta.partition_verify_sfdisk(self.devpath, self.info)
133- self.assertEqual(
134- [call(self.devpath)],
135- self.m_verify_exists.call_args_list)
136- self.assertEqual(
137- [call(self.devpath)],
138- self.m_block_sfdisk_info.call_args_list)
139+ devpath = self.random_string()
140+ sfdisk_part_info = {
141+ 'node': devpath,
142+ }
143+ label = self.random_string()
144+ block_meta.partition_verify_sfdisk(self.info, label, sfdisk_part_info)
145 self.assertEqual(
146- [call(self.devpath, self.part_size,
147- sfdisk_info=self.m_block_sfdisk_info.return_value)],
148+ [call(devpath, self.part_size, sfdisk_part_info)],
149 self.m_verify_size.call_args_list)
150 self.assertEqual([], self.m_verify_ptable_flag.call_args_list)
151
152@@ -2741,15 +2734,17 @@ class TestVerifyPtableFlag(CiTestCase):
153 def test_verify_ptable_flag_finds_boot_on_gpt(self):
154 devpath = '/dev/vda15'
155 expected_flag = 'boot'
156- block_meta.verify_ptable_flag(devpath, expected_flag,
157- sfdisk_info=self.sfdisk_info_gpt)
158+ block_meta.verify_ptable_flag(
159+ devpath, expected_flag, 'gpt',
160+ self.sfdisk_info_gpt['partitions'][2])
161
162 def test_verify_ptable_flag_raises_exception_missing_flag(self):
163 devpath = '/dev/vda1'
164 expected_flag = 'boot'
165 with self.assertRaises(RuntimeError):
166- block_meta.verify_ptable_flag(devpath, expected_flag,
167- sfdisk_info=self.sfdisk_info_gpt)
168+ block_meta.verify_ptable_flag(
169+ devpath, expected_flag, 'gpt',
170+ self.sfdisk_info_gpt['partitions'][0])
171
172 def test_verify_ptable_flag_raises_exception_invalid_flag(self):
173 devpath = '/dev/vda1'
174@@ -2757,52 +2752,49 @@ class TestVerifyPtableFlag(CiTestCase):
175 self.assertNotIn(expected_flag, block_meta.SGDISK_FLAGS.keys())
176 self.assertNotIn(expected_flag, block_meta.MSDOS_FLAGS.keys())
177 with self.assertRaises(RuntimeError):
178- block_meta.verify_ptable_flag(devpath, expected_flag,
179- sfdisk_info=self.sfdisk_info_gpt)
180+ block_meta.verify_ptable_flag(
181+ devpath, expected_flag, 'gpt',
182+ self.sfdisk_info_gpt['partitions'][0])
183
184 def test_verify_ptable_flag_checks_bootable_not_table_type(self):
185 devpath = '/dev/vdb1'
186 expected_flag = 'boot'
187- del self.sfdisk_info_dos['partitions'][0]['bootable']
188+ partinfo = self.sfdisk_info_dos['partitions'][0]
189+ del partinfo['bootable']
190 self.sfdisk_info_dos['partitions'][0]['type'] = '0x80'
191 with self.assertRaises(RuntimeError):
192- block_meta.verify_ptable_flag(devpath, expected_flag,
193- sfdisk_info=self.sfdisk_info_dos)
194-
195- def test_verify_ptable_flag_calls_block_sfdisk_if_info_none(self):
196- devpath = '/dev/vda15'
197- expected_flag = 'boot'
198- self.m_block_sfdisk_info.return_value = self.sfdisk_info_gpt
199- block_meta.verify_ptable_flag(devpath, expected_flag, sfdisk_info=None)
200- self.assertEqual(
201- [call(devpath)],
202- self.m_block_sfdisk_info.call_args_list)
203+ block_meta.verify_ptable_flag(
204+ devpath, expected_flag, 'dos', partinfo)
205
206 def test_verify_ptable_flag_finds_boot_on_msdos(self):
207 devpath = '/dev/vdb1'
208 expected_flag = 'boot'
209- block_meta.verify_ptable_flag(devpath, expected_flag,
210- sfdisk_info=self.sfdisk_info_dos)
211+ block_meta.verify_ptable_flag(
212+ devpath, expected_flag, 'dos',
213+ self.sfdisk_info_dos['partitions'][0])
214
215 def test_verify_ptable_flag_finds_linux_on_dos_primary_partition(self):
216 devpath = '/dev/vdb2'
217 expected_flag = 'linux'
218- block_meta.verify_ptable_flag(devpath, expected_flag,
219- sfdisk_info=self.sfdisk_info_dos)
220+ block_meta.verify_ptable_flag(
221+ devpath, expected_flag, 'dos',
222+ self.sfdisk_info_dos['partitions'][1])
223
224 def test_verify_ptable_flag_finds_dos_extended_partition(self):
225 devpath = '/dev/vdb3'
226 expected_flag = 'extended'
227- block_meta.verify_ptable_flag(devpath, expected_flag,
228- sfdisk_info=self.sfdisk_info_dos)
229+ block_meta.verify_ptable_flag(
230+ devpath, expected_flag, 'dos',
231+ self.sfdisk_info_dos['partitions'][2])
232
233 def test_verify_ptable_flag_finds_dos_logical_partition(self):
234 devpath = '/dev/vdb5'
235 expected_flag = 'logical'
236 self.m_block_get_blockdev_for_partition.return_value = (
237 ('/dev/vdb', '5'))
238- block_meta.verify_ptable_flag(devpath, expected_flag,
239- sfdisk_info=self.sfdisk_info_dos)
240+ block_meta.verify_ptable_flag(
241+ devpath, expected_flag, 'dos',
242+ self.sfdisk_info_dos['partitions'][4])
243
244
245 class TestGetDevicePathsFromStorageConfig(CiTestCase):

Subscribers

People subscribed via source and target branches