diff --git a/proliantutils/redfish/resources/system/storage/smart_storage.py b/proliantutils/redfish/resources/system/storage/smart_storage.py index 679fa6e4..d5e48a3a 100644 --- a/proliantutils/redfish/resources/system/storage/smart_storage.py +++ b/proliantutils/redfish/resources/system/storage/smart_storage.py @@ -61,9 +61,7 @@ class HPESmartStorage(base.ResourceBase): """ if self._logical_drives_maximum_size_mib is None: self._logical_drives_maximum_size_mib = ( - utils.max_safe( - [member.logical_drives.maximum_size_mib - for member in self.array_controllers.get_members()])) + self.array_controllers.logical_drives_maximum_size_mib) return self._logical_drives_maximum_size_mib @property @@ -74,9 +72,7 @@ class HPESmartStorage(base.ResourceBase): """ if self._physical_drives_maximum_size_mib is None: self._physical_drives_maximum_size_mib = ( - utils.max_safe( - [member.physical_drives.maximum_size_mib - for member in self.array_controllers.get_members()])) + self.array_controllers.physical_drives_maximum_size_mib) return self._physical_drives_maximum_size_mib @property @@ -84,11 +80,7 @@ class HPESmartStorage(base.ResourceBase): """Return true if any of the drive under ArrayControllers is ssd""" if self._has_ssd is None: - self._has_ssd = False - for member in self.array_controllers.get_members(): - if member.physical_drives.has_ssd: - self._has_ssd = True - break + self._has_ssd = self.array_controllers.has_ssd return self._has_ssd @property @@ -96,11 +88,8 @@ class HPESmartStorage(base.ResourceBase): """Return true if any of the drive under ArrayControllers is HDD""" if self._has_rotational is None: - self._has_rotational = False - for member in self.array_controllers.get_members(): - if member.physical_drives.has_rotational: - self._has_rotational = True - break + self._has_rotational = ( + self.array_controllers.has_rotational) return self._has_rotational @property @@ -110,10 +99,8 @@ class HPESmartStorage(base.ResourceBase): :returns the set of list of raid levels configured. """ if self._logical_raid_levels is None: - self._logical_raid_levels = set() - for member in self.array_controllers.get_members(): - self._logical_raid_levels.update( - member.logical_drives.logical_raid_levels) + self._logical_raid_levels = ( + self.array_controllers.logical_raid_levels) return self._logical_raid_levels @property @@ -121,10 +108,8 @@ class HPESmartStorage(base.ResourceBase): """Gets the list of rotational speed of the HDD drives""" if self._drive_rotational_speed_rpm is None: - self._drive_rotational_speed_rpm = set() - for member in self.array_controllers.get_members(): - self._drive_rotational_speed_rpm.update( - member.physical_drives.drive_rotational_speed_rpm) + self._drive_rotational_speed_rpm = ( + self.array_controllers.drive_rotational_speed_rpm) return self._drive_rotational_speed_rpm def refresh(self): diff --git a/proliantutils/tests/redfish/json_samples/logical_drive.json b/proliantutils/tests/redfish/json_samples/logical_drive.json index 61b94888..a80d6d66 100644 --- a/proliantutils/tests/redfish/json_samples/logical_drive.json +++ b/proliantutils/tests/redfish/json_samples/logical_drive.json @@ -1,4 +1,5 @@ { + "logical_drive1": { "@odata.context": "/redfish/v1/$metadata#Systems/Members/1/SmartStorage/ArrayControllers/Members/0/LogicalDrives/Members/$entity", "@odata.etag": "W/\"21D690E9\"", "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/", @@ -26,4 +27,34 @@ }, "StripeSizeBytes": 262144, "VolumeUniqueIdentifier": "600508B1001CC8EF62AC74E1ABD407C1" + }, + "logical_drive2": { + "@odata.context": "/redfish/v1/$metadata#Systems/Members/1/SmartStorage/ArrayControllers/Members/0/LogicalDrives/Members/$entity", + "@odata.etag": "W/\"21D690E9\"", + "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/", + "@odata.type": "#HpeSmartStorageLogicalDrive.v2_1_0.HpeSmartStorageLogicalDrive", + "CapacityMiB": 953837, + "Description": "HPE Smart Storage Logical Drive View", + "Id": "1", + "InterfaceType": "SATA", + "LegacyBootPriority": "None", + "Links": { + "DataDrives": { + "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/DataDrives/" + } + }, + "LogicalDriveEncryption": false, + "LogicalDriveName": "019D4217PWDRE0XRH57093 7DA4", + "LogicalDriveNumber": 2, + "LogicalDriveType": "Data", + "MediaType": "HDD", + "Name": "HpeSmartStorageLogicalDrive", + "Raid": "1", + "Status": { + "Health": "OK", + "State": "Enabled" + }, + "StripeSizeBytes": 262144, + "VolumeUniqueIdentifier": "600508B1001CC8EF62AC74E1ABD407C1" + } } diff --git a/proliantutils/tests/redfish/json_samples/logical_drive_collection.json b/proliantutils/tests/redfish/json_samples/logical_drive_collection.json index 6d401cf3..60d06a08 100644 --- a/proliantutils/tests/redfish/json_samples/logical_drive_collection.json +++ b/proliantutils/tests/redfish/json_samples/logical_drive_collection.json @@ -7,8 +7,11 @@ "Members": [ { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/" + }, + { + "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/2/" } ], - "Members@odata.count": 1, + "Members@odata.count": 2, "Name": "HpeSmartStorageLogicalDrives" } diff --git a/proliantutils/tests/redfish/resources/system/storage/test_array_controller.py b/proliantutils/tests/redfish/resources/system/storage/test_array_controller.py index e4bc21ad..efb83610 100644 --- a/proliantutils/tests/redfish/resources/system/storage/test_array_controller.py +++ b/proliantutils/tests/redfish/resources/system/storage/test_array_controller.py @@ -50,7 +50,9 @@ class HPEArrayControllerTestCase(testtools.TestCase): with open('proliantutils/tests/redfish/' 'json_samples/logical_drive.json') as f: log_dr = json.loads(f.read()) - self.conn.get.return_value.json.side_effect = [log_coll, log_dr] + self.conn.get.return_value.json.side_effect = ( + [log_coll, log_dr['logical_drive1'], + log_dr['logical_drive2']]) actual_log_dr = self.sys_stor.logical_drives self.conn.get.return_value.json.reset_mock() self.assertIs(actual_log_dr, @@ -132,7 +134,9 @@ class HPEArrayControllerCollectionTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - val.append(json.loads(f.read())) + f_data = json.loads(f.read()) + val.append(f_data['logical_drive1']) + val.append(f_data['logical_drive2']) self.conn.get.return_value.json.side_effect = val expected = 953837 actual = self.sys_stor_col.logical_drives_maximum_size_mib @@ -153,9 +157,11 @@ class HPEArrayControllerCollectionTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - val.append(json.loads(f.read())) + f_data = json.loads(f.read()) + val.append(f_data['logical_drive1']) + val.append(f_data['logical_drive2']) self.conn.get.return_value.json.side_effect = val - expected = set(['0']) + expected = set(['0', '1']) actual = self.sys_stor_col.logical_raid_levels self.assertEqual(expected, actual) diff --git a/proliantutils/tests/redfish/resources/system/storage/test_logical_drive.py b/proliantutils/tests/redfish/resources/system/storage/test_logical_drive.py index 5b1a76ed..d2b8f242 100644 --- a/proliantutils/tests/redfish/resources/system/storage/test_logical_drive.py +++ b/proliantutils/tests/redfish/resources/system/storage/test_logical_drive.py @@ -59,7 +59,9 @@ class HPELogicalDriveCollectionTestCase(testtools.TestCase): self.assertEqual('HpeSmartStorageLogicalDrives', self.sys_stor_col.name) path = ('/redfish/v1/Systems/1/SmartStorage/' - 'ArrayControllers/0/LogicalDrives/1',) + 'ArrayControllers/0/LogicalDrives/1', + '/redfish/v1/Systems/1/SmartStorage/' + 'ArrayControllers/0/LogicalDrives/2',) self.assertEqual(path, self.sys_stor_col.members_identities) @mock.patch.object(logical_drive, 'HPELogicalDrive', autospec=True) @@ -76,15 +78,19 @@ class HPELogicalDriveCollectionTestCase(testtools.TestCase): @mock.patch.object(logical_drive, 'HPELogicalDrive', autospec=True) def test_get_members(self, mock_eth): members = self.sys_stor_col.get_members() - path = ("/redfish/v1/Systems/1/SmartStorage/ArrayControllers/" - "0/LogicalDrives/1") + path1 = ("/redfish/v1/Systems/1/SmartStorage/ArrayControllers/" + "0/LogicalDrives/1") + path2 = ("/redfish/v1/Systems/1/SmartStorage/ArrayControllers/" + "0/LogicalDrives/2") calls = [ - mock.call(self.sys_stor_col._conn, path, + mock.call(self.sys_stor_col._conn, path1, + redfish_version=self.sys_stor_col.redfish_version), + mock.call(self.sys_stor_col._conn, path2, redfish_version=self.sys_stor_col.redfish_version), ] mock_eth.assert_has_calls(calls) self.assertIsInstance(members, list) - self.assertEqual(1, len(members)) + self.assertEqual(2, len(members)) def test_maximum_size_mib(self): self.assertIsNone(self.sys_stor_col._maximum_size_mib) @@ -92,7 +98,9 @@ class HPELogicalDriveCollectionTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - self.conn.get.return_value.json.return_value = json.loads(f.read()) + val = json.loads(f.read()) + self.conn.get.return_value.json.side_effect = ( + [val['logical_drive1'], val['logical_drive2']]) expected = 953837 actual = self.sys_stor_col.maximum_size_mib self.assertEqual(expected, actual) @@ -103,7 +111,9 @@ class HPELogicalDriveCollectionTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - self.conn.get.return_value.json.return_value = json.loads(f.read()) - expected = set(['0']) + val = json.loads(f.read()) + self.conn.get.return_value.json.side_effect = ( + [val['logical_drive1'], val['logical_drive2']]) + expected = set(['0', '1']) actual = self.sys_stor_col.logical_raid_levels self.assertEqual(expected, actual) diff --git a/proliantutils/tests/redfish/resources/system/storage/test_smart_storage.py b/proliantutils/tests/redfish/resources/system/storage/test_smart_storage.py index 0e98d04d..93cbe5c6 100644 --- a/proliantutils/tests/redfish/resources/system/storage/test_smart_storage.py +++ b/proliantutils/tests/redfish/resources/system/storage/test_smart_storage.py @@ -75,7 +75,9 @@ class HPESmartStorageTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - val.append(json.loads(f.read())) + logical_drive = json.loads(f.read()) + val.append(logical_drive['logical_drive1']) + val.append(logical_drive['logical_drive2']) self.conn.get.return_value.json.side_effect = val expected = 953837 actual = self.sys_stor.logical_drives_maximum_size_mib @@ -100,9 +102,11 @@ class HPESmartStorageTestCase(testtools.TestCase): path = ('proliantutils/tests/redfish/json_samples/' 'logical_drive.json') with open(path, 'r') as f: - val.append(json.loads(f.read())) + logical_drive = json.loads(f.read()) + val.append(logical_drive['logical_drive1']) + val.append(logical_drive['logical_drive2']) self.conn.get.return_value.json.side_effect = val - expected = set(['0']) + expected = set(['0', '1']) actual = self.sys_stor.logical_raid_levels self.assertEqual(expected, actual)