From 4ec49be8e219581159a57bd41566d23ce806e5dc Mon Sep 17 00:00:00 2001 From: Nisha Agarwal Date: Tue, 22 Mar 2016 12:39:18 +0000 Subject: [PATCH] Add disk_label support for partition images This commit adds the disk_label support for partition images. It also fixes the node_uuid info passed to the ironic_lib. Partial-Bug: 1560560 Change-Id: I8b8ef20787468c1b8dc6fbc0b8905abd285325e1 --- ironic_python_agent/extensions/standby.py | 6 +- .../tests/unit/extensions/test_standby.py | 59 +++++++++++++++++-- .../disk-label-fix-536897e41a4d817f.yaml | 5 ++ 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/disk-label-fix-536897e41a4d817f.yaml diff --git a/ironic_python_agent/extensions/standby.py b/ironic_python_agent/extensions/standby.py index fc718d903..42f12af07 100644 --- a/ironic_python_agent/extensions/standby.py +++ b/ironic_python_agent/extensions/standby.py @@ -49,11 +49,12 @@ def _path_to_script(script): def _write_partition_image(image, image_info, device): """Call disk_util to create partition and write the partition image.""" - node_uuid = image_info['id'] + node_uuid = image_info.get('node_uuid') preserve_ep = image_info['preserve_ephemeral'] configdrive = image_info['configdrive'] boot_option = image_info.get('boot_option', 'netboot') boot_mode = image_info.get('deploy_boot_mode', 'bios') + disk_label = image_info.get('disk_label', 'msdos') image_mb = disk_utils.get_image_mb(image) root_mb = image_info['root_mb'] if image_mb > int(root_mb): @@ -70,7 +71,8 @@ def _write_partition_image(image, image_info, device): preserve_ephemeral=preserve_ep, configdrive=configdrive, boot_option=boot_option, - boot_mode=boot_mode) + boot_mode=boot_mode, + disk_label=disk_label) except processutils.ProcessExecutionError as e: raise errors.ImageWriteError(device, e.exit_code, e.stdout, e.stderr) diff --git a/ironic_python_agent/tests/unit/extensions/test_standby.py b/ironic_python_agent/tests/unit/extensions/test_standby.py index fd493374c..c4951150d 100644 --- a/ironic_python_agent/tests/unit/extensions/test_standby.py +++ b/ironic_python_agent/tests/unit/extensions/test_standby.py @@ -38,6 +38,7 @@ def _build_fake_partition_image_info(): 'urls': [ 'http://example.org', ], + 'node_uuid': 'node_uuid', 'checksum': 'abc123', 'root_mb': '10', 'swap_mb': '10', @@ -47,6 +48,7 @@ def _build_fake_partition_image_info(): 'configdrive': 'configdrive', 'image_type': 'partition', 'boot_option': 'netboot', + 'disk_label': 'msdos', 'deploy_boot_mode': 'bios'} @@ -146,11 +148,12 @@ class TestStandbyExtension(test_base.BaseTestCase): swap_mb = image_info['swap_mb'] ephemeral_mb = image_info['ephemeral_mb'] ephemeral_format = image_info['ephemeral_format'] - node_uuid = image_info['id'] + node_uuid = image_info['node_uuid'] pr_ep = image_info['preserve_ephemeral'] configdrive = image_info['configdrive'] boot_mode = image_info['deploy_boot_mode'] boot_option = image_info['boot_option'] + disk_label = image_info['disk_label'] image_path = standby._image_location(image_info) @@ -170,7 +173,53 @@ class TestStandbyExtension(test_base.BaseTestCase): configdrive=configdrive, preserve_ephemeral=pr_ep, boot_mode=boot_mode, - boot_option=boot_option) + boot_option=boot_option, + disk_label=disk_label) + + @mock.patch('six.moves.builtins.open', autospec=True) + @mock.patch('ironic_python_agent.utils.execute', autospec=True) + @mock.patch('ironic_lib.disk_utils.get_image_mb', autospec=True) + @mock.patch('ironic_lib.disk_utils.work_on_disk', autospec=True) + def test_write_partition_image_no_node_uuid(self, work_on_disk_mock, + image_mb_mock, + execute_mock, open_mock): + image_info = _build_fake_partition_image_info() + image_info['node_uuid'] = None + device = '/dev/sda' + root_mb = image_info['root_mb'] + swap_mb = image_info['swap_mb'] + ephemeral_mb = image_info['ephemeral_mb'] + ephemeral_format = image_info['ephemeral_format'] + node_uuid = image_info.get('node_uuid') + pr_ep = image_info['preserve_ephemeral'] + configdrive = image_info['configdrive'] + boot_mode = image_info['deploy_boot_mode'] + boot_option = image_info['boot_option'] + disk_label = image_info['disk_label'] + + image_path = standby._image_location(image_info) + + image_mb_mock.return_value = 1 + uuids = {'root uuid': 'root_uuid'} + expected_uuid = {'root uuid': 'root_uuid'} + image_mb_mock.return_value = 1 + work_on_disk_mock.return_value = uuids + + standby._write_image(image_info, device) + image_mb_mock.assert_called_once_with(image_path) + work_on_disk_mock.assert_called_once_with(device, root_mb, swap_mb, + ephemeral_mb, + ephemeral_format, + image_path, + node_uuid, + configdrive=configdrive, + preserve_ephemeral=pr_ep, + boot_mode=boot_mode, + boot_option=boot_option, + disk_label=disk_label) + + self.assertEqual(expected_uuid, work_on_disk_mock.return_value) + self.assertIsNone(node_uuid) @mock.patch('six.moves.builtins.open', autospec=True) @mock.patch('ironic_python_agent.utils.execute', autospec=True) @@ -205,11 +254,12 @@ class TestStandbyExtension(test_base.BaseTestCase): swap_mb = image_info['swap_mb'] ephemeral_mb = image_info['ephemeral_mb'] ephemeral_format = image_info['ephemeral_format'] - node_uuid = image_info['id'] + node_uuid = image_info['node_uuid'] pr_ep = image_info['preserve_ephemeral'] configdrive = image_info['configdrive'] boot_mode = image_info['deploy_boot_mode'] boot_option = image_info['boot_option'] + disk_label = image_info['disk_label'] image_path = standby._image_location(image_info) uuids = {'root uuid': 'root_uuid'} @@ -227,7 +277,8 @@ class TestStandbyExtension(test_base.BaseTestCase): configdrive=configdrive, preserve_ephemeral=pr_ep, boot_mode=boot_mode, - boot_option=boot_option) + boot_option=boot_option, + disk_label=disk_label) self.assertEqual(expected_uuid, work_on_disk_mock.return_value) diff --git a/releasenotes/notes/disk-label-fix-536897e41a4d817f.yaml b/releasenotes/notes/disk-label-fix-536897e41a4d817f.yaml new file mode 100644 index 000000000..3f032d26f --- /dev/null +++ b/releasenotes/notes/disk-label-fix-536897e41a4d817f.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - Fixes bug where the user specified disk_label + is ignored with partition images in agent + drivers.