diff --git a/rsd_lib/resources/v2_2/__init__.py b/rsd_lib/resources/v2_2/__init__.py index 67c69cb..798e903 100644 --- a/rsd_lib/resources/v2_2/__init__.py +++ b/rsd_lib/resources/v2_2/__init__.py @@ -17,6 +17,7 @@ from sushy.resources import base from rsd_lib.resources import v2_1 from rsd_lib.resources.v2_2.ethernet_switch import ethernet_switch +from rsd_lib.resources.v2_2.fabric import fabric from rsd_lib.resources.v2_2.node import node from rsd_lib.resources.v2_2.system import system from rsd_lib.resources.v2_2.telemetry import telemetry @@ -125,3 +126,26 @@ class RSDLibV2_2(v2_1.RSDLibV2_1): self._update_service_path, redfish_version=self.redfish_version, ) + + def get_fabric_collection(self): + """Get the FabricCollection object + + :raises: MissingAttributeError, if the collection attribute is + not found + :returns: a FabricCollection object + """ + return fabric.FabricCollection( + self._conn, + self._fabrics_path, + redfish_version=self.redfish_version, + ) + + def get_fabric(self, identity): + """Given the identity return a Fabric object + + :param identity: The identity of the Fabric resource + :returns: The Fabric object + """ + return fabric.Fabric( + self._conn, identity, redfish_version=self.redfish_version + ) diff --git a/rsd_lib/resources/v2_2/fabric/fabric.py b/rsd_lib/resources/v2_2/fabric/fabric.py new file mode 100644 index 0000000..7150bfe --- /dev/null +++ b/rsd_lib/resources/v2_2/fabric/fabric.py @@ -0,0 +1,48 @@ +# Copyright 2019 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 import utils + +from rsd_lib import base as rsd_lib_base +from rsd_lib.resources.v2_1.fabric import fabric +from rsd_lib.resources.v2_2.fabric import switch + + +class Fabric(fabric.Fabric): + """Fabric resource class + + Fabric contains properties describing a simple fabric consisting of one + or more switches, zero or more endpoints, and zero or more zones. + """ + + @property + @utils.cache_it + def switches(self): + """Property to provide reference to `SwitchCollection` instance + + It is calculated once when it is queried for the first time. On + refresh, this property is reset. + """ + return switch.SwitchCollection( + self._conn, + utils.get_sub_resource_path_by(self, "Switches"), + redfish_version=self.redfish_version, + ) + + +class FabricCollection(rsd_lib_base.ResourceCollectionBase): + @property + def _resource_type(self): + return Fabric diff --git a/rsd_lib/resources/v2_2/fabric/port.py b/rsd_lib/resources/v2_2/fabric/port.py index 6626e37..bdcd2c3 100644 --- a/rsd_lib/resources/v2_2/fabric/port.py +++ b/rsd_lib/resources/v2_2/fabric/port.py @@ -15,24 +15,64 @@ import logging -from rsd_lib.resources.v2_1.fabric import port as v2_1_port +from sushy.resources import base +from sushy import utils + +from rsd_lib import base as rsd_lib_base +from rsd_lib.resources.v2_1.fabric import port +from rsd_lib.resources.v2_2.fabric import port_metrics from rsd_lib import utils as rsd_lib_utils -from sushy.resources import base LOG = logging.getLogger(__name__) class IntelRackScaleField(base.CompositeField): - metrics = base.Field("Metrics", - adapter=rsd_lib_utils.get_resource_identity) + + pc_ie_connection_id = base.Field("PCIeConnectionId") + """An array of references to the PCIe connection identifiers (e.g. cable + ID). + """ + + metrics = base.Field( + "Metrics", adapter=rsd_lib_utils.get_resource_identity + ) + """A reference to the Metrics associated with this Port""" class OemField(base.CompositeField): - intel_rackScale = IntelRackScaleField("Intel_RackScale") - """The oem intel rack scale""" + + intel_rackscale = IntelRackScaleField("Intel_RackScale") + """Intel Rack Scale Design specific properties.""" -class Port(v2_1_port.Port): +class Port(port.Port): + """Port resource class + + Port contains properties describing a port of a switch. + """ + oem = OemField("Oem") - """The port oem""" + """Oem specific properties.""" + + @property + @utils.cache_it + def metrics(self): + """Property to provide reference to `Metrics` instance + + It is calculated once the first time it is queried. On refresh, + this property is reset. + """ + return port_metrics.PortMetrics( + self._conn, + utils.get_sub_resource_path_by( + self, ["Oem", "Intel_RackScale", "Metrics"] + ), + redfish_version=self.redfish_version, + ) + + +class PortCollection(rsd_lib_base.ResourceCollectionBase): + @property + def _resource_type(self): + return Port diff --git a/rsd_lib/resources/v2_2/fabric/port_metrics.py b/rsd_lib/resources/v2_2/fabric/port_metrics.py new file mode 100644 index 0000000..66dfcae --- /dev/null +++ b/rsd_lib/resources/v2_2/fabric/port_metrics.py @@ -0,0 +1,28 @@ +# Copyright 2019 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 rsd_lib import base as rsd_lib_base + + +class PortMetrics(rsd_lib_base.ResourceBase): + """PortMetrics resource class + + Contains usage and health statistics of a Fabric Port. + """ + + health = base.Field("Health") + """Port health as a discrete sensor reading""" diff --git a/rsd_lib/resources/v2_2/fabric/switch.py b/rsd_lib/resources/v2_2/fabric/switch.py new file mode 100644 index 0000000..62ebee8 --- /dev/null +++ b/rsd_lib/resources/v2_2/fabric/switch.py @@ -0,0 +1,47 @@ +# Copyright 2019 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 import utils + +from rsd_lib import base as rsd_lib_base +from rsd_lib.resources.v2_1.fabric import switch +from rsd_lib.resources.v2_2.fabric import port + + +class Switch(switch.Switch): + """Switch resource class + + Switch contains properties describing a simple fabric switch. + """ + + @property + @utils.cache_it + def ports(self): + """Property to provide reference to `PortCollection` instance + + It is calculated once when it is queried for the first time. On + refresh, this property is reset. + """ + return port.PortCollection( + self._conn, + utils.get_sub_resource_path_by(self, "Ports"), + redfish_version=self.redfish_version, + ) + + +class SwitchCollection(rsd_lib_base.ResourceCollectionBase): + @property + def _resource_type(self): + return Switch diff --git a/rsd_lib/tests/unit/resources/v2_2/fabric/test_port.py b/rsd_lib/tests/unit/resources/v2_2/fabric/test_port.py index 6448d7f..163e876 100644 --- a/rsd_lib/tests/unit/resources/v2_2/fabric/test_port.py +++ b/rsd_lib/tests/unit/resources/v2_2/fabric/test_port.py @@ -38,4 +38,4 @@ class PortTestCase(testtools.TestCase): self.port_inst._parse_attributes() self.assertEqual('/redfish/v1/Fabrics/PCIe/Switches/1/' 'Ports/Up1/Metrics', - self.port_inst.oem.intel_rackScale.metrics) + self.port_inst.oem.intel_rackscale.metrics) diff --git a/rsd_lib/tests/unit/resources/v2_2/test_rsdlib_v2_2.py b/rsd_lib/tests/unit/resources/v2_2/test_rsdlib_v2_2.py index af29e4b..5dc154b 100644 --- a/rsd_lib/tests/unit/resources/v2_2/test_rsdlib_v2_2.py +++ b/rsd_lib/tests/unit/resources/v2_2/test_rsdlib_v2_2.py @@ -20,7 +20,6 @@ import testtools from rsd_lib.resources.v2_1.chassis import chassis as v2_1_chassis from rsd_lib.resources.v2_1.event_service import event_service \ as v2_1_event_service -from rsd_lib.resources.v2_1.fabric import fabric as v2_1_fabric from rsd_lib.resources.v2_1.manager import manager as v2_1_manager from rsd_lib.resources.v2_1.node import node as v2_1_node from rsd_lib.resources.v2_1.registries import message_registry_file \ @@ -31,6 +30,7 @@ from rsd_lib.resources.v2_1.task import task_service as v2_1_task_service from rsd_lib.resources import v2_2 from rsd_lib.resources.v2_2.ethernet_switch import ethernet_switch \ as v2_2_ethernet_switch +from rsd_lib.resources.v2_2.fabric import fabric as v2_2_fabric from rsd_lib.resources.v2_2.node import node as v2_2_node from rsd_lib.resources.v2_2.system import system as v2_2_system from rsd_lib.resources.v2_2.telemetry import telemetry as v2_2_telemetry @@ -111,7 +111,7 @@ class RSDLibV2_2TestCase(testtools.TestCase): redfish_version=self.rsd.redfish_version, ) - @mock.patch.object(v2_1_fabric, "FabricCollection", autospec=True) + @mock.patch.object(v2_2_fabric, "FabricCollection", autospec=True) def test_get_fabric_collection(self, mock_fabric_collection): self.rsd.get_fabric_collection() mock_fabric_collection.assert_called_once_with( @@ -120,7 +120,7 @@ class RSDLibV2_2TestCase(testtools.TestCase): redfish_version=self.rsd.redfish_version, ) - @mock.patch.object(v2_1_fabric, "Fabric", autospec=True) + @mock.patch.object(v2_2_fabric, "Fabric", autospec=True) def test_get_fabric(self, mock_fabric): self.rsd.get_fabric("fake-fabric-id") mock_fabric.assert_called_once_with(