From f03d72019a9e1bd51d52fb7cb4b5d77a29e44658 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Wed, 29 Jul 2020 10:10:18 +0200 Subject: [PATCH] Return the final RAID configuration from apply_configuration AgentRAID expects it and fails with TypeError if it's not provided. Change-Id: Id84ac129bba97540338e25f0027aa0a0f51bde52 Story: #2006963 --- ironic_python_agent/hardware.py | 2 +- .../tests/unit/test_hardware.py | 63 +++++++++++++++++++ .../notes/apply-raid-aeca7848c6320d6b.yaml | 6 ++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/apply-raid-aeca7848c6320d6b.yaml diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index ea06bb401..031e20ee6 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -1614,7 +1614,7 @@ class GenericHardwareManager(HardwareManager): self.validate_configuration(raid_config, node) if delete_existing: self.delete_configuration(node, ports) - self._do_create_configuration(node, ports, raid_config) + return self._do_create_configuration(node, ports, raid_config) def create_configuration(self, node, ports): """Create a RAID configuration. diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 63ccb1d08..3555310f1 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -2791,6 +2791,69 @@ class TestGenericHardwareManager(base.IronicAgentTest): self.hardware.validate_configuration, self.node, []) + @mock.patch.object(hardware.GenericHardwareManager, + '_do_create_configuration', autospec=True) + @mock.patch.object(hardware.GenericHardwareManager, + 'delete_configuration', autospec=True) + @mock.patch.object(hardware.GenericHardwareManager, + 'validate_configuration', autospec=True) + def test_apply_configuration(self, mocked_validate, mocked_delete, + mocked_create): + raid_config = { + "logical_disks": [ + { + "size_gb": "10", + "raid_level": "1", + "controller": "software", + }, + { + "size_gb": "MAX", + "raid_level": "0", + "controller": "software", + }, + ] + } + + result = self.hardware.apply_configuration(self.node, [], raid_config) + self.assertIs(result, mocked_create.return_value) + mocked_validate.assert_called_once_with(self.hardware, raid_config, + self.node) + mocked_delete.assert_called_once_with(self.hardware, self.node, []) + mocked_create.assert_called_once_with(self.hardware, self.node, [], + raid_config) + + @mock.patch.object(hardware.GenericHardwareManager, + '_do_create_configuration', autospec=True) + @mock.patch.object(hardware.GenericHardwareManager, + 'delete_configuration', autospec=True) + @mock.patch.object(hardware.GenericHardwareManager, + 'validate_configuration', autospec=True) + def test_apply_configuration_no_delete(self, mocked_validate, + mocked_delete, mocked_create): + raid_config = { + "logical_disks": [ + { + "size_gb": "10", + "raid_level": "1", + "controller": "software", + }, + { + "size_gb": "MAX", + "raid_level": "0", + "controller": "software", + }, + ] + } + + result = self.hardware.apply_configuration(self.node, [], raid_config, + delete_existing=False) + self.assertIs(result, mocked_create.return_value) + mocked_validate.assert_called_once_with(self.hardware, raid_config, + self.node) + self.assertFalse(mocked_delete.called) + mocked_create.assert_called_once_with(self.hardware, self.node, [], + raid_config) + @mock.patch.object(disk_utils, 'list_partitions', autospec=True) @mock.patch.object(utils, 'execute', autospec=True) @mock.patch.object(os.path, 'isdir', autospec=True, return_value=False) diff --git a/releasenotes/notes/apply-raid-aeca7848c6320d6b.yaml b/releasenotes/notes/apply-raid-aeca7848c6320d6b.yaml new file mode 100644 index 000000000..aa7c233f1 --- /dev/null +++ b/releasenotes/notes/apply-raid-aeca7848c6320d6b.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixes the return value of the ``apply_configuration`` deploy step: the + ``agent`` RAID interface expects the final RAID configuration to be + returned.