From 73f81f298218b394e8e8be23d5ec59da809613c2 Mon Sep 17 00:00:00 2001 From: Naohiro Tamura Date: Wed, 3 Feb 2016 11:23:49 +0900 Subject: [PATCH] Fix vfd mount for capitalized device name This patch enables virtual media deploy even if the expected virtual floppy device name "/dev/disk/by-label/ir-vfd-dev" is capitalized to "/dev/disk/by-label/IR-VFD-DEV". This change is necessary because some bare metal hardware such as FUJITSU RX1330 series create the capitalized virtual floppy device name. Change-Id: I436b3f9524a83814e082f8dd421df3e53b33f792 Closes-Bug: #1541167 --- ironic_python_agent/tests/unit/test_utils.py | 43 ++++++++++++++++--- ironic_python_agent/utils.py | 9 +++- ...italized-device-name-db7f519e900f4e22.yaml | 4 ++ 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 releasenotes/notes/fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml diff --git a/ironic_python_agent/tests/unit/test_utils.py b/ironic_python_agent/tests/unit/test_utils.py index bf8533733..694fbb93a 100644 --- a/ironic_python_agent/tests/unit/test_utils.py +++ b/ironic_python_agent/tests/unit/test_utils.py @@ -223,15 +223,15 @@ class GetAgentParamsTestCase(test_base.BaseTestCase): @mock.patch.object(os.path, 'exists') @mock.patch.object(os, 'mkdir') @mock.patch.object(utils, 'execute') - def test__get_vmedia_params_by_label(self, execute_mock, mkdir_mock, - exists_mock, read_params_mock, - mkdtemp_mock, rmtree_mock): + def test__get_vmedia_params_by_label_lower_case( + self, execute_mock, mkdir_mock, exists_mock, read_params_mock, + mkdtemp_mock, rmtree_mock): mkdtemp_mock.return_value = "/tempdir" null_output = ["", ""] expected_params = {'a': 'b'} read_params_mock.return_value = expected_params - exists_mock.return_value = True + exists_mock.side_effect = [True, False] execute_mock.side_effect = [null_output, null_output] returned_params = utils._get_vmedia_params() @@ -245,6 +245,36 @@ class GetAgentParamsTestCase(test_base.BaseTestCase): mkdtemp_mock.assert_called_once_with() rmtree_mock.assert_called_once_with("/tempdir") + @mock.patch.object(shutil, 'rmtree', autospec=True) + @mock.patch.object(tempfile, 'mkdtemp', autospec=True) + @mock.patch.object(utils, '_read_params_from_file') + @mock.patch.object(os.path, 'exists') + @mock.patch.object(os, 'mkdir') + @mock.patch.object(utils, 'execute') + def test__get_vmedia_params_by_label_upper_case( + self, execute_mock, mkdir_mock, exists_mock, read_params_mock, + mkdtemp_mock, rmtree_mock): + mkdtemp_mock.return_value = "/tempdir" + + null_output = ["", ""] + expected_params = {'a': 'b'} + read_params_mock.return_value = expected_params + exists_mock.side_effect = [False, True] + execute_mock.side_effect = [null_output, null_output] + + returned_params = utils._get_vmedia_params() + + execute_mock.assert_any_call('mount', "/dev/disk/by-label/IR-VFD-DEV", + "/tempdir") + read_params_mock.assert_called_once_with("/tempdir/parameters.txt") + exists_mock.assert_has_calls( + [mock.call("/dev/disk/by-label/ir-vfd-dev"), + mock.call("/dev/disk/by-label/IR-VFD-DEV")]) + execute_mock.assert_any_call('umount', "/tempdir") + self.assertEqual(expected_params, returned_params) + mkdtemp_mock.assert_called_once_with() + rmtree_mock.assert_called_once_with("/tempdir") + @mock.patch.object(shutil, 'rmtree', autospec=True) @mock.patch.object(tempfile, 'mkdtemp', autospec=True) @mock.patch.object(utils, '_get_vmedia_device') @@ -261,12 +291,15 @@ class GetAgentParamsTestCase(test_base.BaseTestCase): null_output = ["", ""] expected_params = {'a': 'b'} read_params_mock.return_value = expected_params - exists_mock.return_value = False + exists_mock.side_effect = [False, False] execute_mock.side_effect = [null_output, null_output] get_device_mock.return_value = "sda" returned_params = utils._get_vmedia_params() + exists_mock.assert_has_calls( + [mock.call("/dev/disk/by-label/ir-vfd-dev"), + mock.call("/dev/disk/by-label/IR-VFD-DEV")]) execute_mock.assert_any_call('mount', "/dev/sda", "/tempdir") read_params_mock.assert_called_once_with("/tempdir/parameters.txt") diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py index 99d217e67..49ee02b38 100644 --- a/ironic_python_agent/utils.py +++ b/ironic_python_agent/utils.py @@ -132,8 +132,13 @@ def _get_vmedia_params(): """ parameters_file = "parameters.txt" - vmedia_device_file = "/dev/disk/by-label/ir-vfd-dev" - if not os.path.exists(vmedia_device_file): + vmedia_device_file_lower_case = "/dev/disk/by-label/ir-vfd-dev" + vmedia_device_file_upper_case = "/dev/disk/by-label/IR-VFD-DEV" + if os.path.exists(vmedia_device_file_lower_case): + vmedia_device_file = vmedia_device_file_lower_case + elif os.path.exists(vmedia_device_file_upper_case): + vmedia_device_file = vmedia_device_file_upper_case + else: # TODO(rameshg87): This block of code is there only for compatibility # reasons (so that newer agent can work with older Ironic). Remove diff --git a/releasenotes/notes/fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml b/releasenotes/notes/fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml new file mode 100644 index 000000000..37e9657d0 --- /dev/null +++ b/releasenotes/notes/fix-vfd-mount-for-capitalized-device-name-db7f519e900f4e22.yaml @@ -0,0 +1,4 @@ +fixes: + - This enables virtual media deploy even if virtual floppy device + name is capitalized to "/dev/disk/by-label/IR-VFD-DEV". see + https://bugs.launchpad.net/ironic/+bug/1541167 for details.