From c4175f3ef1c1f7aed881196acd97e4228da53583 Mon Sep 17 00:00:00 2001 From: Christopher Dearborn Date: Thu, 18 Apr 2019 16:05:08 -0400 Subject: [PATCH] Consider a BOSS card a RAID controller This fixes the is_raid_controller method so that it returns true for a BOSS controller in addition to normal RAID controllers. Change-Id: Iedd3179b8b2b6e3815709cc1acfd6a3059e42399 (cherry picked from commit caff41164f361ad69dc08979882fba47cc3e7bda) --- dracclient/client.py | 14 +++++++++++--- dracclient/resources/raid.py | 14 ++++++++++---- dracclient/tests/test_raid.py | 22 +++++++++++++++++++++- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/dracclient/client.py b/dracclient/client.py index 5c957b2..fe18e13 100644 --- a/dracclient/client.py +++ b/dracclient/client.py @@ -977,15 +977,23 @@ class DRACClient(object): """ return self._raid_mgmt.is_jbod_capable(raid_controller_fqdd) - def is_raid_controller(self, raid_controller_fqdd): - """Find out if object's fqdd is for a raid controller or not + def is_raid_controller(self, raid_controller_fqdd, raid_controllers=None): + """Determine if the given controller is a RAID controller + + Since a BOSS controller is a type of RAID controller, this method will + return True for both BOSS and RAID controllers. :param raid_controller_fqdd: The object's fqdd we are testing to see if it is a raid controller or not. + :param raid_controllers: A list of RAIDControllers used to check for + the presence of BOSS cards. If None, the + iDRAC will be queried for the list of + controllers. :returns: boolean, True if the device is a RAID controller, False if not. """ - return self._raid_mgmt.is_raid_controller(raid_controller_fqdd) + return self._raid_mgmt.is_raid_controller(raid_controller_fqdd, + raid_controllers) def is_boss_controller(self, raid_controller_fqdd, raid_controllers=None): """Find out if a RAID controller a BOSS card or not diff --git a/dracclient/resources/raid.py b/dracclient/resources/raid.py index def511f..11c5c9a 100644 --- a/dracclient/resources/raid.py +++ b/dracclient/resources/raid.py @@ -581,15 +581,20 @@ class RAIDManagement(object): return is_jbod_capable - def is_raid_controller(self, raid_controller_fqdd): + def is_raid_controller(self, raid_controller_fqdd, raid_controllers=None): """Find out if object's fqdd is for a raid controller or not :param raid_controller_fqdd: The object's fqdd we are testing to see if it is a raid controller or not. + :param raid_controllers: A list of RAIDControllers used to check for + the presence of BOSS cards. If None, the + iDRAC will be queried for the list of + controllers. :returns: boolean, True if the device is a RAID controller, False if not. """ - return raid_controller_fqdd.startswith('RAID.') + return raid_controller_fqdd.startswith('RAID.') or \ + self.is_boss_controller(raid_controller_fqdd, raid_controllers) def is_boss_controller(self, raid_controller_fqdd, raid_controllers=None): """Find out if a RAID controller a BOSS card or not @@ -734,10 +739,11 @@ class RAIDManagement(object): if not controllers_to_physical_disk_ids: controllers_to_physical_disk_ids = collections.defaultdict(list) + all_controllers = self.list_raid_controllers() for physical_d in physical_disks: # Weed out disks that are not attached to a RAID controller - if (self.is_raid_controller(physical_d.controller) - or self.is_boss_controller(physical_d.controller)): + if self.is_raid_controller(physical_d.controller, + all_controllers): physical_disk_ids = controllers_to_physical_disk_ids[ physical_d.controller] diff --git a/dracclient/tests/test_raid.py b/dracclient/tests/test_raid.py index a414eda..5939c93 100644 --- a/dracclient/tests/test_raid.py +++ b/dracclient/tests/test_raid.py @@ -806,9 +806,29 @@ class ClientRAIDManagementTestCase(base.BaseTest): exceptions.DRACOperationFailed, self.drac_client.is_jbod_capable, self.raid_controller_fqdd) - def test_is_raid_controller(self, mock_requests): + def test_is_raid_controller_raid(self, mock_requests): self.assertTrue(self.drac_client .is_raid_controller("RAID.Integrated.1-1")) + + @mock.patch.object(dracclient.client.WSManClient, + 'wait_until_idrac_is_ready', spec_set=True, + autospec=True) + def test_is_raid_controller_boss(self, mock_requests, + mock_wait_until_idrac_is_ready): + mock_requests.post( + 'https://1.2.3.4:443/wsman', + text=test_utils.RAIDEnumerations[uris.DCIM_ControllerView]['ok']) + self.assertTrue(self.drac_client + .is_raid_controller("AHCI.Integrated.1-1")) + + @mock.patch.object(dracclient.client.WSManClient, + 'wait_until_idrac_is_ready', spec_set=True, + autospec=True) + def test_is_raid_controller_fail(self, mock_requests, + mock_wait_until_idrac_is_ready): + mock_requests.post( + 'https://1.2.3.4:443/wsman', + text=test_utils.RAIDEnumerations[uris.DCIM_ControllerView]['ok']) self.assertFalse(self.drac_client .is_raid_controller("notRAID.Integrated.1-1"))