diff --git a/rsd_lib/resources/v2_1/chassis/pcie_device.py b/rsd_lib/resources/v2_1/chassis/pcie_device.py new file mode 100644 index 0000000..e56dce1 --- /dev/null +++ b/rsd_lib/resources/v2_1/chassis/pcie_device.py @@ -0,0 +1,87 @@ +# Copyright 2018 Intel, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from sushy.resources import base +from sushy import utils + + +class StatusField(base.CompositeField): + state = base.Field('State') + health = base.Field('Health') + health_rollup = base.Field('HealthRollup') + + +class LinksField(base.CompositeField): + chassis = base.Field('Chassis', adapter=utils.get_members_identities) + """The value of this property shall reference a resource of type Chassis + that represents the physical container associated with this resource. + """ + + pcie_functions = base.Field( + 'PCIeFunctions', adapter=utils.get_members_identities) + """The value of this property shall be a reference to the resources that + this device exposes and shall reference a resource of type PCIeFunction. + """ + + +class PCIeDevice(base.ResourceBase): + identity = base.Field('Id', required=True) + """The PCIe device identity string""" + + name = base.Field('Name') + """The PCIe device name""" + + description = base.Field('Description') + """The PCIe device description""" + + manufacturer = base.Field('Manufacturer') + """The PCIe device manufacturer""" + + model = base.Field('Model') + """The PCIe device Model""" + + sku = base.Field('SKU') + """The PCIe device stock-keeping unit""" + + serial_number = base.Field('SerialNumber') + """The PCIe device serial number""" + + part_number = base.Field('PartNumber') + """The PCIe device part number""" + + asset_tag = base.Field('AssetTag') + """The user assigned asset tag for this PCIe device""" + + device_type = base.Field('DeviceType') + """The device type for this PCIe device""" + + firmware_version = base.Field('FirmwareVersion') + """The version of firmware for this PCIe device""" + + status = StatusField('Status') + """The PCIe device status""" + + links = LinksField('Links') + """The link section of PCIe device""" + + def update(self, asset_tag=None): + """Update AssetTag properties + + :param asset_tag: The user assigned asset tag for this PCIe device + """ + + data = {'AssetTag': asset_tag} + + self._conn.patch(self.path, data=data) diff --git a/rsd_lib/tests/unit/json_samples/v2_1/pcie_device.json b/rsd_lib/tests/unit/json_samples/v2_1/pcie_device.json new file mode 100644 index 0000000..ab88ddd --- /dev/null +++ b/rsd_lib/tests/unit/json_samples/v2_1/pcie_device.json @@ -0,0 +1,35 @@ +{ + "@odata.context": "/redfish/v1/$metadata#PCIeDevice.PCIeDevice", + "@odata.id": "/redfish/v1/Chassis/1/PCIeDevices/Device1", + "@odata.type": "#PCIeDevice.v1_0_0.PCIeDevice", + "Id": "Device1", + "Name": "NVMe SSD Drive", + "Description": "Simple NVMe Drive", + "AssetTag": "free form asset tag", + "Manufacturer": "Intel", + "Model": "Model Name", + "SKU": "sku string", + "SerialNumber": "SN123456", + "PartNumber": "partnumber string", + "DeviceType": "SingleFunction", + "FirmwareVersion": "XYZ1234", + "Status": { + "State": "Enabled", + "Health": "OK", + "HealthRollup": "OK" + }, + "Links": { + "Chassis": [ + { + "@odata.id": "/redfish/v1/Chassis/1" + } + ], + "PCIeFunctions": [ + { + "@odata.id": "/redfish/v1/Chassis/1/PCIeDevices/Device1/Functions/1" + } + ], + "Oem": {} + }, + "Oem": {} +} \ No newline at end of file diff --git a/rsd_lib/tests/unit/resources/v2_1/chassis/test_pcie_device.py b/rsd_lib/tests/unit/resources/v2_1/chassis/test_pcie_device.py new file mode 100644 index 0000000..fd9637a --- /dev/null +++ b/rsd_lib/tests/unit/resources/v2_1/chassis/test_pcie_device.py @@ -0,0 +1,67 @@ +# Copyright 2018 Intel, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import json +import mock +import testtools + +from rsd_lib.resources.v2_1.chassis import pcie_device + + +class PCIeDeviceTestCase(testtools.TestCase): + + def setUp(self): + super(PCIeDeviceTestCase, self).setUp() + self.conn = mock.Mock() + with open('rsd_lib/tests/unit/json_samples/v2_1/' + 'pcie_device.json', 'r') as f: + self.conn.get.return_value.json.return_value = json.loads(f.read()) + + self.pcie_device_inst = pcie_device.PCIeDevice( + self.conn, '/redfish/v1/Chassis/1/PCIeDevices/Device1', + redfish_version='1.1.0') + + def test__parse_attributes(self): + self.pcie_device_inst._parse_attributes() + self.assertEqual('Device1', self.pcie_device_inst.identity) + self.assertEqual('NVMe SSD Drive', self.pcie_device_inst.name) + self.assertEqual('Simple NVMe Drive', + self.pcie_device_inst.description) + self.assertEqual( + 'Enabled', self.pcie_device_inst.status.state) + self.assertEqual('OK', self.pcie_device_inst.status.health) + self.assertEqual( + 'OK', self.pcie_device_inst.status.health_rollup) + self.assertEqual('Intel', self.pcie_device_inst.manufacturer) + self.assertEqual('Model Name', self.pcie_device_inst.model) + self.assertEqual('sku string', self.pcie_device_inst.sku) + self.assertEqual('SN123456', self.pcie_device_inst.serial_number) + self.assertEqual( + 'partnumber string', self.pcie_device_inst.part_number) + self.assertEqual( + 'free form asset tag', self.pcie_device_inst.asset_tag) + self.assertEqual('SingleFunction', self.pcie_device_inst.device_type) + self.assertEqual('XYZ1234', self.pcie_device_inst.firmware_version) + self.assertEqual( + ('/redfish/v1/Chassis/1',), self.pcie_device_inst.links.chassis) + self.assertEqual( + ('/redfish/v1/Chassis/1/PCIeDevices/Device1/Functions/1',), + self.pcie_device_inst.links.pcie_functions) + + def test_update(self): + self.pcie_device_inst.update(asset_tag='Rack#1') + self.pcie_device_inst._conn.patch.assert_called_once_with( + '/redfish/v1/Chassis/1/PCIeDevices/Device1', + data={"AssetTag": "Rack#1"})