From 69906919ee2e351b7de117517ef8fac264797d39 Mon Sep 17 00:00:00 2001 From: Rachit7194 Date: Thu, 12 Sep 2019 05:04:09 -0400 Subject: [PATCH] Fix for clear_foreign_config() unsupported on some controllers iDRAC driver fails to clear foreign drives on some controllers and returns message_id ``STOR058`` which means controllers does not support clear_foreign_config operation. Change-Id: I7df2d30242e7a490dfdce04d7f6ce98c68e9f0ed (cherry picked from commit 8394938d2f72dbadb4ebf7a95c1973216cd8dd3a) --- dracclient/resources/raid.py | 9 ++++--- dracclient/tests/test_raid.py | 26 +++++++++++++++++++ dracclient/tests/utils.py | 2 ++ ...oke-clear_foreign_config-not_supported.xml | 18 +++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 dracclient/tests/wsman_mocks/raid_service-invoke-clear_foreign_config-not_supported.xml diff --git a/dracclient/resources/raid.py b/dracclient/resources/raid.py index cfe7673..e648efd 100644 --- a/dracclient/resources/raid.py +++ b/dracclient/resources/raid.py @@ -95,7 +95,8 @@ VirtualDisk = collections.namedtuple( 'status', 'raid_status', 'span_depth', 'span_length', 'pending_operations', 'physical_disks']) -NO_FOREIGN_DRIVE = "STOR018" + +NO_FOREIGN_DRIVES = ["STOR058", "STOR018"] class RAIDManagement(object): @@ -849,10 +850,12 @@ class RAIDManagement(object): 'MessageID', uris.DCIM_RAIDService).text - # A MessageID 'STOR018' indicates no foreign drive was + # A MessageID 'STOR018'/'STOR058' indicates no foreign drive was # detected. Return a value which informs the caller nothing # further needs to be done. - if message_id == NO_FOREIGN_DRIVE: + no_foreign_drives_detected = any( + stor_id == message_id for stor_id in NO_FOREIGN_DRIVES) + if no_foreign_drives_detected: is_commit_required_value = False is_reboot_required_value = constants.RebootRequired.false else: diff --git a/dracclient/tests/test_raid.py b/dracclient/tests/test_raid.py index 0057d5c..071c6d7 100644 --- a/dracclient/tests/test_raid.py +++ b/dracclient/tests/test_raid.py @@ -37,6 +37,7 @@ class ClientRAIDManagementTestCase(base.BaseTest): self.drac_client = dracclient.client.DRACClient( **test_utils.FAKE_ENDPOINT) self.raid_controller_fqdd = "RAID.Integrated.1-1" + self.boss_controller_fqdd = "AHCI.Slot.3-1" cntl_dict = {'RAID.Integrated.1-1': ['Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1', 'Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1'], @@ -676,6 +677,31 @@ class ClientRAIDManagementTestCase(base.BaseTest): expected_selectors, expected_properties, check_return_value=False) + @mock.patch.object(dracclient.client.WSManClient, 'invoke', + spec_set=True, autospec=True) + def test_clear_foreign_config_with_operation_not_supported(self, + mock_requests, + mock_invoke): + expected_selectors = {'SystemCreationClassName': 'DCIM_ComputerSystem', + 'CreationClassName': 'DCIM_RAIDService', + 'SystemName': 'DCIM:ComputerSystem', + 'Name': 'DCIM:RAIDService'} + expected_properties = {'Target': self.boss_controller_fqdd} + mock_invoke.return_value = lxml.etree.fromstring( + test_utils.RAIDInvocations[uris.DCIM_RAIDService][ + 'ClearForeignConfig']['foreign_drive_operation_not_supported']) + + result = self.drac_client.clear_foreign_config( + self.boss_controller_fqdd) + self.assertEqual({'is_commit_required': False, + 'is_reboot_required': + constants.RebootRequired.false}, + result) + mock_invoke.assert_called_once_with( + mock.ANY, uris.DCIM_RAIDService, 'ClearForeignConfig', + expected_selectors, expected_properties, + check_return_value=False) + @mock.patch.object(dracclient.client.WSManClient, 'wait_until_idrac_is_ready', spec_set=True, autospec=True) diff --git a/dracclient/tests/utils.py b/dracclient/tests/utils.py index 0ac622b..f20349c 100644 --- a/dracclient/tests/utils.py +++ b/dracclient/tests/utils.py @@ -283,6 +283,8 @@ RAIDInvocations = { 'raid_service-invoke-clear_foreign_config-no_foreign_drive'), 'invalid_controller_id': load_wsman_xml( 'raid_service-invoke-clear_foreign_config-invalid_controller'), + 'foreign_drive_operation_not_supported': load_wsman_xml( + 'raid_service-invoke-clear_foreign_config-not_supported'), } } } diff --git a/dracclient/tests/wsman_mocks/raid_service-invoke-clear_foreign_config-not_supported.xml b/dracclient/tests/wsman_mocks/raid_service-invoke-clear_foreign_config-not_supported.xml new file mode 100644 index 0000000..898e739 --- /dev/null +++ b/dracclient/tests/wsman_mocks/raid_service-invoke-clear_foreign_config-not_supported.xml @@ -0,0 +1,18 @@ + + + http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous + http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDService/ClearForeignConfigResponse + uuid:473f8ede-9a1a-441a-aaf6-699c1476aa97 + uuid:55d91de0-90a1-10a1-8147-8c0c498fd94c + + + + The operation cannot be completed either because the operation is not supported on the target device, + or the RAIDType of "MD Software RAID" does not allow the operation. + STOR058 + 2 + + +