diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-08-27 13:28:41 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-11-18 13:49:51 +0100 |
commit | 89bc73aa0105850c6ae44428642e31802bba3b20 (patch) | |
tree | ba07ae4d1f4c9430d6448d07b7527ab74c2a979a | |
parent | 36d4a18fbc7afd873035930a558e971ad4cec12f (diff) | |
download | ironic-python-agent-89bc73aa0105850c6ae44428642e31802bba3b20.tar.gz |
Use two more functions from disk_utils
Change-Id: If01c9cd7f95b4495509369786360741b731161db
-rw-r--r-- | ironic_python_agent/efi_utils.py | 3 | ||||
-rw-r--r-- | ironic_python_agent/extensions/image.py | 5 | ||||
-rw-r--r-- | ironic_python_agent/tests/unit/extensions/test_image.py | 20 | ||||
-rw-r--r-- | ironic_python_agent/tests/unit/test_efi_utils.py | 4 | ||||
-rw-r--r-- | ironic_python_agent/tests/unit/test_utils.py | 85 | ||||
-rw-r--r-- | ironic_python_agent/utils.py | 41 |
6 files changed, 18 insertions, 140 deletions
diff --git a/ironic_python_agent/efi_utils.py b/ironic_python_agent/efi_utils.py index 3e91d2b8..6f6b103c 100644 --- a/ironic_python_agent/efi_utils.py +++ b/ironic_python_agent/efi_utils.py @@ -15,6 +15,7 @@ import re import shutil import tempfile +from ironic_lib import disk_utils from oslo_concurrency import processutils from oslo_log import log @@ -48,7 +49,7 @@ def manage_uefi(device, efi_system_part_uuid=None): local_path = tempfile.mkdtemp() # Trust the contents on the disk in the event of a whole disk image. - efi_partition = utils.get_efi_part_on_device(device) + efi_partition = disk_utils.find_efi_partition(device) if not efi_partition and efi_system_part_uuid: # _get_partition returns <device>+<partition> and we only need the # partition number diff --git a/ironic_python_agent/extensions/image.py b/ironic_python_agent/extensions/image.py index 2d44df7e..cd86b91b 100644 --- a/ironic_python_agent/extensions/image.py +++ b/ironic_python_agent/extensions/image.py @@ -18,6 +18,7 @@ import re import shutil import tempfile +from ironic_lib import disk_utils from ironic_lib import utils as ilib_utils from oslo_concurrency import processutils from oslo_config import cfg @@ -136,7 +137,7 @@ def _prepare_boot_partitions_for_softraid(device, holders, efi_part, # Let's try to scan for esp on the root softraid device. If not # found, it's fine in most cases to just create an empty esp and # let grub handle the magic. - efi_part = utils.get_efi_part_on_device(device) + efi_part = disk_utils.find_efi_partition(device) if efi_part: efi_part = '{}p{}'.format(device, efi_part) @@ -198,7 +199,7 @@ def _prepare_boot_partitions_for_softraid(device, holders, efi_part, elif target_boot_mode == 'bios': partlabel_prefix = 'bios-boot-part-' for number, holder in enumerate(holders): - label = utils.scan_partition_table_type(holder) + label = disk_utils.get_partition_table_type(holder) if label == 'gpt': LOG.debug("Creating bios boot partition on disk holder %s", holder) diff --git a/ironic_python_agent/tests/unit/extensions/test_image.py b/ironic_python_agent/tests/unit/extensions/test_image.py index 2564ea12..0c2844a1 100644 --- a/ironic_python_agent/tests/unit/extensions/test_image.py +++ b/ironic_python_agent/tests/unit/extensions/test_image.py @@ -18,6 +18,7 @@ import shutil import tempfile from unittest import mock +from ironic_lib import disk_utils from ironic_lib import utils as ilib_utils from oslo_concurrency import processutils @@ -27,7 +28,6 @@ from ironic_python_agent.extensions import image from ironic_python_agent import hardware from ironic_python_agent import partition_utils from ironic_python_agent.tests.unit import base -from ironic_python_agent import utils @mock.patch.object(hardware, 'dispatch_to_managers', autospec=True) @@ -215,7 +215,7 @@ class TestImageExtension(base.IronicAgentTest): @mock.patch.object(os.path, 'exists', lambda *_: False) @mock.patch.object(efi_utils, '_get_efi_bootloaders', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=False) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=False) @mock.patch.object(os, 'makedirs', autospec=True) def test__uefi_bootloader_given_partition( self, mkdir_mock, mock_utils_efi_part, mock_partition, @@ -263,7 +263,7 @@ class TestImageExtension(base.IronicAgentTest): @mock.patch.object(os.path, 'exists', lambda *_: False) @mock.patch.object(efi_utils, '_get_efi_bootloaders', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) @mock.patch.object(os, 'makedirs', autospec=True) def test__uefi_bootloader_find_partition( self, mkdir_mock, mock_utils_efi_part, mock_partition, @@ -310,7 +310,7 @@ class TestImageExtension(base.IronicAgentTest): @mock.patch.object(os.path, 'exists', lambda *_: False) @mock.patch.object(efi_utils, '_get_efi_bootloaders', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) @mock.patch.object(os, 'makedirs', autospec=True) def test__uefi_bootloader_with_entry_removal( self, mkdir_mock, mock_utils_efi_part, mock_partition, @@ -367,7 +367,7 @@ Boot0002 VENDMAGIC FvFile(9f3c6294-bf9b-4208-9808-be45dfc34b51) @mock.patch.object(os.path, 'exists', lambda *_: False) @mock.patch.object(efi_utils, '_get_efi_bootloaders', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) @mock.patch.object(os, 'makedirs', autospec=True) def test__uefi_bootloader_with_entry_removal_lenovo( self, mkdir_mock, mock_utils_efi_part, mock_partition, @@ -429,7 +429,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 @mock.patch.object(os.path, 'exists', lambda *_: False) @mock.patch.object(efi_utils, '_get_efi_bootloaders', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) @mock.patch.object(os, 'makedirs', autospec=True) def test__add_multi_bootloaders( self, mkdir_mock, mock_utils_efi_part, mock_partition, @@ -1653,7 +1653,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 uuid=self.fake_root_uuid) self.assertFalse(mock_dispatch.called) - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) def test__prepare_boot_partitions_for_softraid_uefi_gpt( self, mock_efi_part, mock_execute, mock_dispatch): mock_efi_part.return_value = '12' @@ -1702,7 +1702,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 mock_execute.assert_has_calls(expected, any_order=False) self.assertEqual(efi_part, '/dev/md/esp') - @mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) + @mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) @mock.patch.object(ilib_utils, 'mkfs', autospec=True) def test__prepare_boot_partitions_for_softraid_uefi_gpt_esp_not_found( self, mock_mkfs, mock_efi_part, mock_execute, mock_dispatch): @@ -1794,7 +1794,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 mock_execute.assert_has_calls(expected, any_order=False) self.assertEqual(efi_part, '/dev/md/esp') - @mock.patch.object(utils, 'scan_partition_table_type', autospec=True, + @mock.patch.object(disk_utils, 'get_partition_table_type', autospec=True, return_value='msdos') def test__prepare_boot_partitions_for_softraid_bios_msdos( self, mock_label_scan, mock_execute, mock_dispatch): @@ -1810,7 +1810,7 @@ Boot0004* ironic1 HD(1,GPT,55db8d03-c8f6-4a5b-9155-790dddc348fa,0x800,0x640 mock_label_scan.assert_has_calls(expected, any_order=False) self.assertIsNone(efi_part) - @mock.patch.object(utils, 'scan_partition_table_type', autospec=True, + @mock.patch.object(disk_utils, 'get_partition_table_type', autospec=True, return_value='gpt') def test__prepare_boot_partitions_for_softraid_bios_gpt( self, mock_label_scan, mock_execute, mock_dispatch): diff --git a/ironic_python_agent/tests/unit/test_efi_utils.py b/ironic_python_agent/tests/unit/test_efi_utils.py index f41a3af0..da5122c2 100644 --- a/ironic_python_agent/tests/unit/test_efi_utils.py +++ b/ironic_python_agent/tests/unit/test_efi_utils.py @@ -15,6 +15,8 @@ import shutil import tempfile from unittest import mock +from ironic_lib import disk_utils + from ironic_python_agent import efi_utils from ironic_python_agent import errors from ironic_python_agent import partition_utils @@ -128,7 +130,7 @@ class TestRunEfiBootmgr(base.IronicAgentTest): @mock.patch.object(utils, 'rescan_device', autospec=True) @mock.patch.object(utils, 'execute', autospec=True) @mock.patch.object(partition_utils, 'get_partition', autospec=True) -@mock.patch.object(utils, 'get_efi_part_on_device', autospec=True) +@mock.patch.object(disk_utils, 'find_efi_partition', autospec=True) class TestManageUefi(base.IronicAgentTest): fake_dev = '/dev/fake' diff --git a/ironic_python_agent/tests/unit/test_utils.py b/ironic_python_agent/tests/unit/test_utils.py index 2cf2a20b..96d31688 100644 --- a/ironic_python_agent/tests/unit/test_utils.py +++ b/ironic_python_agent/tests/unit/test_utils.py @@ -23,7 +23,6 @@ import tarfile import tempfile from unittest import mock -from ironic_lib import disk_utils from ironic_lib import utils as ironic_utils from oslo_concurrency import processutils from oslo_serialization import base64 @@ -35,18 +34,6 @@ from ironic_python_agent import hardware from ironic_python_agent.tests.unit import base as ironic_agent_base from ironic_python_agent import utils -PARTED_OUTPUT_UNFORMATTED = '''Model: whatever -Disk /dev/sda: 450GB -Sector size (logical/physical): 512B/512B -Partition Table: {} -Disk Flags: - -Number Start End Size File system Name Flags -14 1049kB 5243kB 4194kB bios_grub -15 5243kB 116MB 111MB fat32 boot, esp - 1 116MB 2361MB 2245MB ext4 -''' - class ExecuteTestCase(ironic_agent_base.IronicAgentTest): # This test case does call utils.execute(), so don't block access to the @@ -818,36 +805,6 @@ class TestUtils(ironic_agent_base.IronicAgentTest): self.assertEqual('gpt', label) mock_boot_mode.assert_has_calls([]) - @mock.patch.object(utils, 'execute', autospec=True) - def test_scan_partition_table_type_gpt(self, mocked_execute): - self._test_scan_partition_table_by_type(mocked_execute, 'gpt', 'gpt') - - @mock.patch.object(utils, 'execute', autospec=True) - def test_scan_partition_table_type_msdos(self, mocked_execute): - self._test_scan_partition_table_by_type(mocked_execute, 'msdos', - 'msdos') - - @mock.patch.object(utils, 'execute', autospec=True) - def test_scan_partition_table_type_unknown(self, mocked_execute): - self._test_scan_partition_table_by_type(mocked_execute, 'whatever', - 'unknown') - - def _test_scan_partition_table_by_type(self, mocked_execute, - table_type_output, - expected_table_type): - - parted_ret = PARTED_OUTPUT_UNFORMATTED.format(table_type_output) - - mocked_execute.side_effect = [ - (parted_ret, None), - ] - - ret = utils.scan_partition_table_type('hello') - mocked_execute.assert_has_calls( - [mock.call('parted', '-s', 'hello', '--', 'print')] - ) - self.assertEqual(expected_table_type, ret) - class TestRemoveKeys(testtools.TestCase): def test_remove_keys(self): @@ -942,48 +899,6 @@ class TestClockSyncUtils(ironic_agent_base.IronicAgentTest): self.assertEqual(0, mock_execute.call_count) -@mock.patch.object(disk_utils, 'list_partitions', autospec=True) -@mock.patch.object(utils, 'scan_partition_table_type', autospec=True) -class TestGetEfiPart(testtools.TestCase): - - def test_get_efi_part_on_device(self, mocked_type, mocked_parts): - mocked_parts.return_value = [ - {'number': '1', 'flags': ''}, - {'number': '14', 'flags': 'bios_grub'}, - {'number': '15', 'flags': 'esp, boot'}, - ] - ret = utils.get_efi_part_on_device('/dev/sda') - self.assertEqual('15', ret) - - def test_get_efi_part_on_device_only_boot_flag_gpt(self, mocked_type, - mocked_parts): - mocked_type.return_value = 'gpt' - mocked_parts.return_value = [ - {'number': '1', 'flags': ''}, - {'number': '14', 'flags': 'bios_grub'}, - {'number': '15', 'flags': 'boot'}, - ] - ret = utils.get_efi_part_on_device('/dev/sda') - self.assertEqual('15', ret) - - def test_get_efi_part_on_device_only_boot_flag_mbr(self, mocked_type, - mocked_parts): - mocked_type.return_value = 'msdos' - mocked_parts.return_value = [ - {'number': '1', 'flags': ''}, - {'number': '14', 'flags': 'bios_grub'}, - {'number': '15', 'flags': 'boot'}, - ] - self.assertIsNone(utils.get_efi_part_on_device('/dev/sda')) - - def test_get_efi_part_on_device_not_found(self, mocked_type, mocked_parts): - mocked_parts.return_value = [ - {'number': '1', 'flags': ''}, - {'number': '14', 'flags': 'bios_grub'}, - ] - self.assertIsNone(utils.get_efi_part_on_device('/dev/sda')) - - @mock.patch.object(utils, '_booted_from_vmedia', autospec=True) @mock.patch.object(utils, '_check_vmedia_device', autospec=True) @mock.patch.object(utils, '_find_vmedia_device_by_labels', autospec=True) diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py index e13e1afc..71e29d16 100644 --- a/ironic_python_agent/utils.py +++ b/ironic_python_agent/utils.py @@ -26,7 +26,6 @@ import sys import tarfile import time -from ironic_lib import disk_utils from ironic_lib import utils as ironic_utils from oslo_concurrency import processutils from oslo_config import cfg @@ -75,8 +74,6 @@ COLLECT_LOGS_COMMANDS = { DEVICE_EXTRACTOR = re.compile(r'^(?:(.*\d)p|(.*\D))(?:\d+)$') -PARTED_TABLE_TYPE_REGEX = re.compile(r'^.*partition\s+table\s*:\s*(gpt|msdos)', - re.IGNORECASE) _EARLY_LOG_BUFFER = [] @@ -733,44 +730,6 @@ def get_partition_table_type_from_specs(node): return 'gpt' if disk_label == 'gpt' else 'msdos' -def scan_partition_table_type(device): - """Get partition table type, msdos or gpt. - - :param device_name: the name of the device - :return: msdos, gpt or unknown - """ - out, _u = execute('parted', '-s', device, '--', 'print') - out = out.splitlines() - - for line in out: - m = PARTED_TABLE_TYPE_REGEX.match(line) - if m: - return m.group(1) - - LOG.warning("Unable to get partition table type for device %s.", - device) - - return 'unknown' - - -def get_efi_part_on_device(device): - """Looks for the efi partition on a given device. - - A boot partition on a GPT disk is assumed to be an EFI partition as well. - - :param device: lock device upon which to check for the efi partition - :return: the efi partition or None - """ - is_gpt = scan_partition_table_type(device) == 'gpt' - for part in disk_utils.list_partitions(device): - flags = {x.strip() for x in part['flags'].split(',')} - if 'esp' in flags or ('boot' in flags and is_gpt): - LOG.debug("Found EFI partition %s on device %s.", part, device) - return part['number'] - else: - LOG.debug("No efi partition found on device %s", device) - - _LARGE_KEYS = frozenset(['configdrive', 'system_logs']) |