From 879ec9adbd06a18d9b09b72aaef08895d88e4546 Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Mon, 17 Dec 2018 22:37:46 -0800 Subject: [PATCH] Add ThermalZone reference instance in chassis Change-Id: Ie91278c04e4f0ea27881f01961138574a236a2cc --- rsd_lib/resources/v2_1/chassis/chassis.py | 17 ++++++ .../resources/v2_1/chassis/test_chassis.py | 60 ++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/rsd_lib/resources/v2_1/chassis/chassis.py b/rsd_lib/resources/v2_1/chassis/chassis.py index 1a86b88..01693e5 100644 --- a/rsd_lib/resources/v2_1/chassis/chassis.py +++ b/rsd_lib/resources/v2_1/chassis/chassis.py @@ -17,6 +17,7 @@ from sushy.resources import base from sushy import utils from rsd_lib.resources.v2_1.chassis import power_zone +from rsd_lib.resources.v2_1.chassis import thermal_zone from rsd_lib import utils as rsd_lib_utils @@ -149,6 +150,22 @@ class Chassis(base.ResourceBase): self._conn, self._get_power_zone_collection_path(), redfish_version=self.redfish_version) + def _get_thermal_zone_collection_path(self): + """Helper function to find the ThermalZoneCollection path""" + return utils.get_sub_resource_path_by(self, 'ThermalZones') + + @property + @utils.cache_it + def thermal_zones(self): + """Property to provide reference to `ThermalZoneCollection` instance + + It is calculated once when it is queried for the first time. On + refresh, this property is reset. + """ + return thermal_zone.ThermalZoneCollection( + self._conn, self._get_thermal_zone_collection_path(), + redfish_version=self.redfish_version) + def update(self, asset_tag=None, location_id=None): """Update AssetTag and Location->Id properties diff --git a/rsd_lib/tests/unit/resources/v2_1/chassis/test_chassis.py b/rsd_lib/tests/unit/resources/v2_1/chassis/test_chassis.py index 7d8a941..6006e15 100644 --- a/rsd_lib/tests/unit/resources/v2_1/chassis/test_chassis.py +++ b/rsd_lib/tests/unit/resources/v2_1/chassis/test_chassis.py @@ -18,6 +18,7 @@ from sushy.tests.unit import base from rsd_lib.resources.v2_1.chassis import chassis from rsd_lib.resources.v2_1.chassis import power_zone +from rsd_lib.resources.v2_1.chassis import thermal_zone class TestChassis(base.TestCase): @@ -83,7 +84,7 @@ class TestChassis(base.TestCase): result = self.chassis_inst._get_power_zone_collection_path() self.assertEqual(expected, result) - def test__get_power_zone_collection_path_missing_processors_attr(self): + def test__get_power_zone_collection_path_missing_power_zone_attr(self): self.chassis_inst._json.pop('PowerZones') self.assertRaisesRegex( exceptions.MissingAttributeError, 'attribute PowerZones', @@ -135,6 +136,63 @@ class TestChassis(base.TestCase): self.assertIsInstance(self.chassis_inst.power_zones, power_zone.PowerZoneCollection) + def test__get_thermal_zone_collection_path(self): + expected = '/redfish/v1/Chassis/Rack1/ThermalZones' + result = self.chassis_inst._get_thermal_zone_collection_path() + self.assertEqual(expected, result) + + def test__get_thermal_zone_collection_path_missing_thermal_zone_attr(self): + self.chassis_inst._json.pop('ThermalZones') + self.assertRaisesRegex( + exceptions.MissingAttributeError, 'attribute ThermalZones', + self.chassis_inst._get_thermal_zone_collection_path) + + def test_thermal_zones(self): + # | GIVEN | + self.conn.get.return_value.json.reset_mock() + with open('rsd_lib/tests/unit/json_samples/v2_1/' + 'thermal_zone_collection.json', 'r') as f: + self.conn.get.return_value.json.return_value = json.loads(f.read()) + # | WHEN | + actual_thermal_zones = self.chassis_inst.thermal_zones + # | THEN | + self.assertIsInstance(actual_thermal_zones, + thermal_zone.ThermalZoneCollection) + self.conn.get.return_value.json.assert_called_once_with() + + # reset mock + self.conn.get.return_value.json.reset_mock() + # | WHEN & THEN | + # tests for same object on invoking subsequently + self.assertIs(actual_thermal_zones, + self.chassis_inst.thermal_zones) + self.conn.get.return_value.json.assert_not_called() + + def test_thermal_zones_on_refresh(self): + # | GIVEN | + with open('rsd_lib/tests/unit/json_samples/v2_1/' + 'thermal_zone_collection.json', 'r') as f: + self.conn.get.return_value.json.return_value = json.loads(f.read()) + # | WHEN & THEN | + self.assertIsInstance(self.chassis_inst.thermal_zones, + thermal_zone.ThermalZoneCollection) + + # On refreshing the chassis instance... + with open('rsd_lib/tests/unit/json_samples/v2_1/' + 'chassis.json', 'r') as f: + self.conn.get.return_value.json.return_value = json.loads(f.read()) + + self.chassis_inst.invalidate() + self.chassis_inst.refresh(force=False) + + # | GIVEN | + with open('rsd_lib/tests/unit/json_samples/v2_1/' + 'thermal_zone_collection.json', 'r') as f: + self.conn.get.return_value.json.return_value = json.loads(f.read()) + # | WHEN & THEN | + self.assertIsInstance(self.chassis_inst.thermal_zones, + thermal_zone.ThermalZoneCollection) + def test_update(self): self.chassis_inst.update(asset_tag='Rack#1', location_id='1234') self.chassis_inst._conn.patch.assert_called_once_with(