diff --git a/rsd_lib/resources/v2_1/chassis/chassis.py b/rsd_lib/resources/v2_1/chassis/chassis.py index 9271ea1..9a40d1a 100644 --- a/rsd_lib/resources/v2_1/chassis/chassis.py +++ b/rsd_lib/resources/v2_1/chassis/chassis.py @@ -14,6 +14,9 @@ # under the License. from sushy.resources import base +from sushy import utils + +from rsd_lib import utils as rsd_lib_utils class StatusField(base.CompositeField): @@ -22,6 +25,60 @@ class StatusField(base.CompositeField): health_rollup = base.Field('HealthRollup') +class LinksField(base.CompositeField): + contains = base.Field('Contains', adapter=utils.get_members_identities) + """Any other chassis that this chassis has in it""" + + contained_by = base.Field('ContainedBy', + adapter=rsd_lib_utils.get_resource_identity) + """The resource that represents the chassis that contains this chassis + and shall be of type Chassis + """ + + computer_systems = base.Field('ComputerSystems', + adapter=utils.get_members_identities) + """The computer systems contained in this chassis""" + + managed_by = base.Field('ManagedBy', adapter=utils.get_members_identities) + """The managers contained in this chassis""" + + managers_in_chassis = base.Field('ManagersInChassis', + adapter=utils.get_members_identities) + """The managers located in this chassis""" + + switches = base.Field(['Oem', 'Intel_RackScale', 'Switches'], + adapter=utils.get_members_identities) + """The Ethernet switches contained in this chassis""" + + +class LocationField(base.CompositeField): + identity = base.Field('Id') + """The location ID of the chassis""" + + parent_id = base.Field('ParentId') + """The location ID of parent chassis""" + + +class OemField(base.CompositeField): + location = LocationField('Location') + """Property that shows this chassis ID and its parent""" + + rmm_present = base.Field('RMMPresent', adapter=bool) + """RMM presence in a rack""" + + rack_supports_disaggregated_power_cooling = base.Field( + 'RackSupportsDisaggregatedPowerCooling', adapter=bool) + """Indicates if Rack support is disaggregated (shared) power and cooling + capabilities + """ + + uuid = base.Field('UUID') + """Chassis unique ID""" + + geo_tag = base.Field('GeoTag') + """Provides info about the geographical location of this chassis""" + + class Chassis(base.ResourceBase): identity = base.Field('Id', required=True) """The chassis identity string""" @@ -38,6 +95,12 @@ class Chassis(base.ResourceBase): name = base.Field('Name') """The chassis name""" + model = base.Field('Model') + """The chassis Model""" + + indicator_led = base.Field('IndicatorLED') + """The state of the indicator LED, used to identify the chassis""" + part_number = base.Field('PartNumber') """The chassis part number""" @@ -53,8 +116,11 @@ class Chassis(base.ResourceBase): chassis_type = base.Field('ChassisType') """The chassis type""" - oem = base.Field('Oem') - """The chassis oem options values (dict)""" + oem = OemField(['Oem', 'Intel_RackScale']) + """The chassis oem object""" + + links = LinksField('Links') + """The link section of chassis""" def __init__(self, connector, identity, redfish_version=None): """A class representing a Chassis diff --git a/rsd_lib/tests/unit/json_samples/v2_1/chassis.json b/rsd_lib/tests/unit/json_samples/v2_1/chassis.json index 8ffc965..8e102a2 100644 --- a/rsd_lib/tests/unit/json_samples/v2_1/chassis.json +++ b/rsd_lib/tests/unit/json_samples/v2_1/chassis.json @@ -1,13 +1,55 @@ { "@odata.context": "/redfish/v1/$metadata#Chassis/Members/$entity", - "@odata.id": "/redfish/v1/Chassis/Chassis1", - "@odata.type": "#Chassis.1.0.0.Chassis", + "@odata.id": "/redfish/v1/Chassis/1", + "@odata.type": "#Chassis.v1_3_0.Chassis", + "Id": "1", + "ChassisType": "RackMount", + "Name": "name-as-string", + "Description": "description-as-string", + "Manufacturer": "Intel Corporation", + "Model": "model-as-string", + "SKU": "sku-as-string", + "SerialNumber": "serial-number-as-string", + "PartNumber": "part-number-as-string", "AssetTag": "FlexChassis1", - "ChassisType": "Drawer", - "Description": "this is a chassis", - "Id": "Chassis1", - "IndicatorLED": "On", + "IndicatorLED": "Unknown", + "Status": { + "State": "Enabled", + "Health": "OK" + }, + "Oem": { + "Intel_RackScale": { + "@odata.type": "#Intel.Oem.RackChassis", + "Location": { + "Id": "Rack1", + "ParentId": "Pod1" + }, + "RMMPresent": true, + "RackSupportsDisaggregatedPowerCooling": true, + "UUID": "Unique ID", + "GeoTag": "54.348103, 18.645172" + } + }, + "ThermalZones": { + "@odata.id": "/redfish/v1/Chassis/Rack1/ThermalZones" + }, + "PowerZones": { + "@odata.id": "/redfish/v1/Chassis/Rack1/PowerZones" + }, + "Thermal": { + "@odata.id": "/redfish/v1/Chassis/Rack1/Thermal" + }, + "Power": { + "@odata.id": "/redfish/v1/Chassis/Rack1/Power" + }, "Links": { + "@odata.type": "#Chassis.v1_2_0.Links", + "Contains": [ + { + "@odata.id": "/redfish/v1/Chassis/Drawer1" + } + ], + "ContainedBy": null, "ComputerSystems": [ { "@odata.id": "/redfish/v1/Systems/system1" @@ -22,52 +64,21 @@ "@odata.id": "/redfish/v1/Systems/system4" } ], - "ContainedBy": { - "@odata.id": "/redfish/v1/Chassis/Rack1" - }, - "Contains": [ - { - "@odata.id": "/redfish/v1/Chassis/Chassis1" - } - ], "ManagedBy": [ { - "@odata.id": "/redfish/v1/Managers/manager1" + "@odata.id": "/redfish/v1/Managers/RMM" } ], - "ManagersIn": [ + "ManagersInChassis": [ { - "@odata.id": "/redfish/v1/Managers/manager1" + "@odata.id": "/redfish/v1/Managers/RMM" } ], - "Oem": { }, - "Switches": [ - { - "@odata.id": "/redfish/v1/EthernetSwitches/switch1" + "Oem": { + "Intel_RackScale": { + "@odata.type": "#Intel.Oem.ChassisLinks", + "Switches": [] } - ] - }, - "Manufacturer": "Intel Corporaion", - "Model": "Lenovo FLEX 8731", - "Name": "FLEX-1", - "Oem": { - "Intel:RackScale": { - "@odata.type": "#Intel.Oem.Chassis", - "Location": { - "Rack": "Rack1", - "UHeight": "10 U", - "ULocation": "25 U", - "UWidth": "1 U" - }, - "UUID": "e1c2d764-5c72-36d6-9945-a78255edab51" } - }, - "PartNumber": "5c72-36d6", - "SKU": "e1c2d764-5c72", - "SerialNumber": "a78255edab51", - "Status": { - "Health": "OK", - "HealthRollup": "OK", - "State": "Enabled" } } \ No newline at end of file diff --git a/rsd_lib/tests/unit/resources/v2_1/chassis/__init__.py b/rsd_lib/tests/unit/resources/v2_1/chassis/__init__.py new file mode 100644 index 0000000..e69de29 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 78e1c5b..5072db6 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 @@ -37,19 +37,45 @@ class TestChassis(base.TestCase): self.chassis_inst._parse_attributes() self.assertEqual('1.0.2', self.chassis_inst.redfish_version) self.assertEqual('FlexChassis1', self.chassis_inst.asset_tag) - self.assertEqual('Drawer', self.chassis_inst.chassis_type) - self.assertEqual('this is a chassis', self.chassis_inst.description) - self.assertEqual('Chassis1', self.chassis_inst.identity) - self.assertEqual('Intel Corporaion', self.chassis_inst.manufacturer) - self.assertEqual('FLEX-1', self.chassis_inst.name) - self.assertEqual('5c72-36d6', self.chassis_inst.part_number) - self.assertEqual('a78255edab51', self.chassis_inst.serial_number) - self.assertEqual('e1c2d764-5c72', self.chassis_inst.sku) - self.assertEqual('e1c2d764-5c72-36d6-9945-a78255edab51', - self.chassis_inst.oem['Intel:RackScale']['UUID']) + self.assertEqual('RackMount', self.chassis_inst.chassis_type) + self.assertEqual( + 'description-as-string', self.chassis_inst.description) + self.assertEqual('1', self.chassis_inst.identity) + self.assertEqual('Intel Corporation', self.chassis_inst.manufacturer) + self.assertEqual('name-as-string', self.chassis_inst.name) + self.assertEqual( + 'part-number-as-string', self.chassis_inst.part_number) + self.assertEqual( + 'serial-number-as-string', self.chassis_inst.serial_number) + self.assertEqual('sku-as-string', self.chassis_inst.sku) + self.assertEqual('model-as-string', self.chassis_inst.model) + self.assertEqual('Unknown', self.chassis_inst.indicator_led) self.assertEqual('Enabled', self.chassis_inst.status.state) self.assertEqual('OK', self.chassis_inst.status.health) - self.assertEqual('OK', self.chassis_inst.status.health_rollup) + self.assertEqual(None, self.chassis_inst.status.health_rollup) + # chassis links section + self.assertEqual( + ('/redfish/v1/Chassis/Drawer1',), self.chassis_inst.links.contains) + self.assertEqual(None, self.chassis_inst.links.contained_by) + self.assertEqual( + ('/redfish/v1/Systems/system1', '/redfish/v1/Systems/system2', + '/redfish/v1/Systems/system3', '/redfish/v1/Systems/system4'), + self.chassis_inst.links.computer_systems) + self.assertEqual( + ('/redfish/v1/Managers/RMM',), self.chassis_inst.links.managed_by) + self.assertEqual( + ('/redfish/v1/Managers/RMM',), + self.chassis_inst.links.managers_in_chassis) + self.assertEqual((), self.chassis_inst.links.switches) + # chassis oem section + self.assertEqual('Rack1', self.chassis_inst.oem.location.identity) + self.assertEqual('Pod1', self.chassis_inst.oem.location.parent_id) + self.assertEqual(True, self.chassis_inst.oem.rmm_present) + self.assertEqual( + True, + self.chassis_inst.oem.rack_supports_disaggregated_power_cooling) + self.assertEqual('Unique ID', self.chassis_inst.oem.uuid) + self.assertEqual('54.348103, 18.645172', self.chassis_inst.oem.geo_tag) class TestChassisCollection(base.TestCase):