Add network interface in RSD 2.1 System instance

Change-Id: I6f88d6cc275d360c6ce1a1ef9d982863f6964712
This commit is contained in:
Lin Yang 2019-02-06 14:15:35 -08:00
parent b742b61230
commit e662db24ae
11 changed files with 128 additions and 44 deletions

View File

@ -121,8 +121,8 @@ class Manager(base.ResourceBase):
"""Helper function to find the network protocol path""" """Helper function to find the network protocol path"""
return utils.get_sub_resource_path_by(self, 'NetworkProtocol') return utils.get_sub_resource_path_by(self, 'NetworkProtocol')
def _get_ethernet_interface_path(self): def _get_ethernet_interfaces_path(self):
"""Helper function to find the Ethernet Interface path""" """Helper function to find the Ethernet Interfaces path"""
return utils.get_sub_resource_path_by(self, 'EthernetInterfaces') return utils.get_sub_resource_path_by(self, 'EthernetInterfaces')
@property @property
@ -146,7 +146,7 @@ class Manager(base.ResourceBase):
refresh, this property is reset. refresh, this property is reset.
""" """
return ethernet_interface.EthernetInterfaceCollection( return ethernet_interface.EthernetInterfaceCollection(
self._conn, self._get_ethernet_interface_path(), self._conn, self._get_ethernet_interfaces_path(),
redfish_version=self.redfish_version) redfish_version=self.redfish_version)

View File

@ -18,6 +18,7 @@ from sushy import utils
from rsd_lib.resources.v2_1.system import ethernet_interface from rsd_lib.resources.v2_1.system import ethernet_interface
from rsd_lib.resources.v2_1.system import memory from rsd_lib.resources.v2_1.system import memory
from rsd_lib.resources.v2_1.system import network_interface
from rsd_lib.resources.v2_1.system import storage_subsystem from rsd_lib.resources.v2_1.system import storage_subsystem
@ -55,20 +56,36 @@ class System(system.System):
self._conn, self._get_storage_subsystem_collection_path(), self._conn, self._get_storage_subsystem_collection_path(),
redfish_version=self.redfish_version) redfish_version=self.redfish_version)
def _get_ethernet_interface_collection_path(self): def _get_ethernet_interfaces_collection_path(self):
"""Helper function to find the network interface path""" """Helper function to find the ethernet interfaces path"""
return utils.get_sub_resource_path_by(self, 'EthernetInterfaces') return utils.get_sub_resource_path_by(self, 'EthernetInterfaces')
@property @property
@utils.cache_it @utils.cache_it
def ethernet_interface(self): def ethernet_interfaces(self):
"""Property to provide reference to `EthernetInterface` instance """Property to provide reference to `EthernetInterfaceCollection`
It is calculated once the first time it is queried. On refresh, It is calculated once the first time it is queried. On refresh,
this property is reset. this property is reset.
""" """
return ethernet_interface.EthernetInterfaceCollection( return ethernet_interface.EthernetInterfaceCollection(
self._conn, self._get_ethernet_interface_collection_path(), self._conn, self._get_ethernet_interfaces_collection_path(),
redfish_version=self.redfish_version)
def _get_network_interfaces_collection_path(self):
"""Helper function to find the network interfaces path"""
return utils.get_sub_resource_path_by(self, 'NetworkInterfaces')
@property
@utils.cache_it
def network_interfaces(self):
"""Property to provide reference to `NetworkInterfaceCollection`
It is calculated once the first time it is queried. On refresh,
this property is reset.
"""
return network_interface.NetworkInterfaceCollection(
self._conn, self._get_network_interfaces_collection_path(),
redfish_version=self.redfish_version) redfish_version=self.redfish_version)

View File

@ -24,13 +24,13 @@ class Manager(manager.Manager):
@property @property
@utils.cache_it @utils.cache_it
def ethernet_interfaces(self): def ethernet_interfaces(self):
"""Property to provide reference to `EthernetInterface` instance """Property to provide reference to `EthernetInterfaceColection`
It is calculated once when it is queried for the first time. On It is calculated once when it is queried for the first time. On
refresh, this property is reset. refresh, this property is reset.
""" """
return ethernet_interface.EthernetInterfaceCollection( return ethernet_interface.EthernetInterfaceCollection(
self._conn, self._get_ethernet_interface_path(), self._conn, self._get_ethernet_interfaces_path(),
redfish_version=self.redfish_version) redfish_version=self.redfish_version)

View File

@ -23,14 +23,14 @@ class System(system.System):
@property @property
@utils.cache_it @utils.cache_it
def ethernet_interface(self): def ethernet_interfaces(self):
"""Property to provide reference to `EthernetInterface` instance """Property to provide reference to `EthernetInterfaceCollection`
It is calculated once the first time it is queried. On refresh, It is calculated once the first time it is queried. On refresh,
this property is reset. this property is reset.
""" """
return ethernet_interface.EthernetInterfaceCollection( return ethernet_interface.EthernetInterfaceCollection(
self._conn, self._get_ethernet_interface_collection_path(), self._conn, self._get_ethernet_interfaces_collection_path(),
redfish_version=self.redfish_version) redfish_version=self.redfish_version)

View File

@ -94,11 +94,14 @@
"@odata.id": "/redfish/v1/Systems/437XR1138R2/SimpleStorage" "@odata.id": "/redfish/v1/Systems/437XR1138R2/SimpleStorage"
}, },
"Storage": { "Storage": {
"@odata.id": "/redfish/v1/Systems/1/Storage" "@odata.id": "/redfish/v1/Systems/437XR1138R2/Storage"
}, },
"LogServices": { "LogServices": {
"@odata.id": "/redfish/v1/Systems/437XR1138R2/LogServices" "@odata.id": "/redfish/v1/Systems/437XR1138R2/LogServices"
}, },
"NetworkInterfaces": {
"@odata.id": "/redfish/v1/Systems/437XR1138R2/NetworkInterfaces"
},
"Links": { "Links": {
"Chassis": [ "Chassis": [
{ {

View File

@ -52,6 +52,9 @@
"EthernetInterfaces": { "EthernetInterfaces": {
"@odata.id": "/redfish/v1/Systems/System2/EthernetInterfaces" "@odata.id": "/redfish/v1/Systems/System2/EthernetInterfaces"
}, },
"NetworkInterfaces": {
"@odata.id": "/redfish/v1/Systems/System2/NetworkInterfaces"
},
"SimpleStorage": {}, "SimpleStorage": {},
"Storage": { "Storage": {
"@odata.id": "/redfish/v1/Systems/System2/Storage" "@odata.id": "/redfish/v1/Systems/System2/Storage"

View File

@ -94,11 +94,14 @@
"@odata.id": "/redfish/v1/Systems/437XR1138R2/SimpleStorage" "@odata.id": "/redfish/v1/Systems/437XR1138R2/SimpleStorage"
}, },
"Storage": { "Storage": {
"@odata.id": "/redfish/v1/Systems/1/Storage" "@odata.id": "/redfish/v1/Systems/437XR1138R2/Storage"
}, },
"LogServices": { "LogServices": {
"@odata.id": "/redfish/v1/Systems/437XR1138R2/LogServices" "@odata.id": "/redfish/v1/Systems/437XR1138R2/LogServices"
}, },
"NetworkInterfaces": {
"@odata.id": "/redfish/v1/Systems/437XR1138R2/NetworkInterfaces"
},
"Links": { "Links": {
"Chassis": [ "Chassis": [
{ {

View File

@ -132,12 +132,12 @@ class TestManager(base.TestCase):
self.assertIsInstance(self.manager_inst.network_protocol, self.assertIsInstance(self.manager_inst.network_protocol,
network_protocol.NetworkProtocol) network_protocol.NetworkProtocol)
def test__get_ethernet_interface_path(self): def test__get_ethernet_interfaces_path(self):
expected = '/redfish/v1/Managers/PSME/EthernetInterfaces' expected = '/redfish/v1/Managers/PSME/EthernetInterfaces'
result = self.manager_inst._get_ethernet_interface_path() result = self.manager_inst._get_ethernet_interfaces_path()
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_ethernet_interface(self): def test_ethernet_interfaces(self):
# | GIVEN | # | GIVEN |
self.conn.get.return_value.json.reset_mock() self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_1/' with open('rsd_lib/tests/unit/json_samples/v2_1/'
@ -158,7 +158,7 @@ class TestManager(base.TestCase):
self.manager_inst.ethernet_interfaces) self.manager_inst.ethernet_interfaces)
self.conn.get.return_value.json.assert_not_called() self.conn.get.return_value.json.assert_not_called()
def test_ethernet_interface_on_refresh(self): def test_ethernet_interfaces_on_refresh(self):
# | GIVEN | # | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_1/' with open('rsd_lib/tests/unit/json_samples/v2_1/'
'manager_ethernet_interface_collection.json', 'r') as f: 'manager_ethernet_interface_collection.json', 'r') as f:

View File

@ -22,6 +22,7 @@ from sushy.resources.system import system as sushy_system
from rsd_lib.resources.v2_1.system import ethernet_interface from rsd_lib.resources.v2_1.system import ethernet_interface
from rsd_lib.resources.v2_1.system import memory from rsd_lib.resources.v2_1.system import memory
from rsd_lib.resources.v2_1.system import network_interface
from rsd_lib.resources.v2_1.system import storage_subsystem from rsd_lib.resources.v2_1.system import storage_subsystem
from rsd_lib.resources.v2_1.system import system from rsd_lib.resources.v2_1.system import system
@ -101,7 +102,7 @@ class SystemTestCase(testtools.TestCase):
def test__get_storage_collection_path(self): def test__get_storage_collection_path(self):
self.assertEqual( self.assertEqual(
'/redfish/v1/Systems/1/Storage', '/redfish/v1/Systems/437XR1138R2/Storage',
self.system_inst._get_storage_subsystem_collection_path()) self.system_inst._get_storage_subsystem_collection_path())
def test__get_storage_collection_path_missing_systems_attr(self): def test__get_storage_collection_path_missing_systems_attr(self):
@ -156,25 +157,25 @@ class SystemTestCase(testtools.TestCase):
self.assertIsInstance(self.system_inst.storage_subsystem, self.assertIsInstance(self.system_inst.storage_subsystem,
storage_subsystem.StorageSubsystemCollection) storage_subsystem.StorageSubsystemCollection)
def test__get_ethernet_interface_collection_path(self): def test__get_ethernet_interfaces_collection_path(self):
self.assertEqual( self.assertEqual(
'/redfish/v1/Systems/437XR1138R2/EthernetInterfaces', '/redfish/v1/Systems/437XR1138R2/EthernetInterfaces',
self.system_inst._get_ethernet_interface_collection_path()) self.system_inst._get_ethernet_interfaces_collection_path())
def test__get_ethernet_interface_collection_path_missing_attr(self): def test__get_ethernet_interfaces_collection_path_missing_attr(self):
self.system_inst._json.pop('EthernetInterfaces') self.system_inst._json.pop('EthernetInterfaces')
with self.assertRaisesRegex( with self.assertRaisesRegex(
exceptions.MissingAttributeError, 'attribute EthernetInterfaces'): exceptions.MissingAttributeError, 'attribute EthernetInterfaces'):
self.system_inst._get_ethernet_interface_collection_path() self.system_inst._get_ethernet_interfaces_collection_path()
def test_ethernet_interface(self): def test_ethernet_interfaces(self):
# | GIVEN | # | GIVEN |
self.conn.get.return_value.json.reset_mock() self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_1/' with open('rsd_lib/tests/unit/json_samples/v2_1/'
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read()) self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN | # | WHEN |
actual_ethernet_interface_col = self.system_inst.ethernet_interface actual_ethernet_interface_col = self.system_inst.ethernet_interfaces
# | THEN | # | THEN |
self.assertIsInstance(actual_ethernet_interface_col, self.assertIsInstance(actual_ethernet_interface_col,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)
@ -185,16 +186,16 @@ class SystemTestCase(testtools.TestCase):
# | WHEN & THEN | # | WHEN & THEN |
# tests for same object on invoking subsequently # tests for same object on invoking subsequently
self.assertIs(actual_ethernet_interface_col, self.assertIs(actual_ethernet_interface_col,
self.system_inst.ethernet_interface) self.system_inst.ethernet_interfaces)
self.conn.get.return_value.json.assert_not_called() self.conn.get.return_value.json.assert_not_called()
def test_ethernet_interface_on_refresh(self): def test_ethernet_interfaces_on_refresh(self):
# | GIVEN | # | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_1/' with open('rsd_lib/tests/unit/json_samples/v2_1/'
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read()) self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN & THEN | # | WHEN & THEN |
self.assertIsInstance(self.system_inst.ethernet_interface, self.assertIsInstance(self.system_inst.ethernet_interfaces,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)
# on refreshing the system instance... # on refreshing the system instance...
@ -210,9 +211,66 @@ class SystemTestCase(testtools.TestCase):
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.son.return_value = json.loads(f.read()) self.conn.get.return_value.son.return_value = json.loads(f.read())
# | WHEN & THEN | # | WHEN & THEN |
self.assertIsInstance(self.system_inst.ethernet_interface, self.assertIsInstance(self.system_inst.ethernet_interfaces,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)
def test__get_network_interfaces_collection_path(self):
self.assertEqual(
'/redfish/v1/Systems/437XR1138R2/NetworkInterfaces',
self.system_inst._get_network_interfaces_collection_path())
def test__get_network_interfaces_collection_path_missing_attr(self):
self.system_inst._json.pop('NetworkInterfaces')
with self.assertRaisesRegex(
exceptions.MissingAttributeError, 'attribute NetworkInterfaces'):
self.system_inst._get_network_interfaces_collection_path()
def test_network_interfaces(self):
# | GIVEN |
self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_1/'
'network_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN |
actual_network_interface_col = self.system_inst.network_interfaces
# | THEN |
self.assertIsInstance(actual_network_interface_col,
network_interface.NetworkInterfaceCollection)
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_network_interface_col,
self.system_inst.network_interfaces)
self.conn.get.return_value.json.assert_not_called()
def test_network_interfaces_on_refresh(self):
# | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_1/'
'network_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN & THEN |
self.assertIsInstance(self.system_inst.network_interfaces,
network_interface.NetworkInterfaceCollection)
# on refreshing the system instance...
with open('rsd_lib/tests/unit/json_samples/v2_1/system.json',
'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read())
self.system_inst.invalidate()
self.system_inst.refresh(force=False)
# | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_1/'
'network_interface_collection.json', 'r') as f:
self.conn.get.return_value.son.return_value = json.loads(f.read())
# | WHEN & THEN |
self.assertIsInstance(self.system_inst.network_interfaces,
network_interface.NetworkInterfaceCollection)
class SystemCollectionTestCase(testtools.TestCase): class SystemCollectionTestCase(testtools.TestCase):

View File

@ -33,12 +33,12 @@ class TestManager(base.TestCase):
'/redfish/v1/Manager/PSME', '/redfish/v1/Manager/PSME',
redfish_version='1.0.2') redfish_version='1.0.2')
def test__get_ethernet_interface_path(self): def test__get_ethernet_interfaces_path(self):
expected = '/redfish/v1/Managers/PSME/EthernetInterfaces' expected = '/redfish/v1/Managers/PSME/EthernetInterfaces'
result = self.manager_inst._get_ethernet_interface_path() result = self.manager_inst._get_ethernet_interfaces_path()
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_ethernet_interface(self): def test_ethernet_interfaces(self):
# | GIVEN | # | GIVEN |
self.conn.get.return_value.json.reset_mock() self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_3/' with open('rsd_lib/tests/unit/json_samples/v2_3/'
@ -59,7 +59,7 @@ class TestManager(base.TestCase):
self.manager_inst.ethernet_interfaces) self.manager_inst.ethernet_interfaces)
self.conn.get.return_value.json.assert_not_called() self.conn.get.return_value.json.assert_not_called()
def test_ethernet_interface_on_refresh(self): def test_ethernet_interfaces_on_refresh(self):
# | GIVEN | # | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_3/' with open('rsd_lib/tests/unit/json_samples/v2_3/'
'manager_ethernet_interface_collection.json', 'r') as f: 'manager_ethernet_interface_collection.json', 'r') as f:

View File

@ -43,25 +43,25 @@ class SystemTestCase(testtools.TestCase):
self.assertIsInstance(self.system_inst, v2_2_system.System) self.assertIsInstance(self.system_inst, v2_2_system.System)
self.assertIsInstance(self.system_inst, sushy_system.System) self.assertIsInstance(self.system_inst, sushy_system.System)
def test__get_ethernet_interface_collection_path(self): def test__get_ethernet_interfaces_collection_path(self):
self.assertEqual( self.assertEqual(
'/redfish/v1/Systems/437XR1138R2/EthernetInterfaces', '/redfish/v1/Systems/437XR1138R2/EthernetInterfaces',
self.system_inst._get_ethernet_interface_collection_path()) self.system_inst._get_ethernet_interfaces_collection_path())
def test__get_ethernet_interface_collection_path_missing_attr(self): def test__get_ethernet_interfaces_collection_path_missing_attr(self):
self.system_inst._json.pop('EthernetInterfaces') self.system_inst._json.pop('EthernetInterfaces')
with self.assertRaisesRegex( with self.assertRaisesRegex(
exceptions.MissingAttributeError, 'attribute EthernetInterfaces'): exceptions.MissingAttributeError, 'attribute EthernetInterfaces'):
self.system_inst._get_ethernet_interface_collection_path() self.system_inst._get_ethernet_interfaces_collection_path()
def test_ethernet_interface(self): def test_ethernet_interfaces(self):
# | GIVEN | # | GIVEN |
self.conn.get.return_value.json.reset_mock() self.conn.get.return_value.json.reset_mock()
with open('rsd_lib/tests/unit/json_samples/v2_3/' with open('rsd_lib/tests/unit/json_samples/v2_3/'
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read()) self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN | # | WHEN |
actual_ethernet_interface_col = self.system_inst.ethernet_interface actual_ethernet_interface_col = self.system_inst.ethernet_interfaces
# | THEN | # | THEN |
self.assertIsInstance(actual_ethernet_interface_col, self.assertIsInstance(actual_ethernet_interface_col,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)
@ -72,16 +72,16 @@ class SystemTestCase(testtools.TestCase):
# | WHEN & THEN | # | WHEN & THEN |
# tests for same object on invoking subsequently # tests for same object on invoking subsequently
self.assertIs(actual_ethernet_interface_col, self.assertIs(actual_ethernet_interface_col,
self.system_inst.ethernet_interface) self.system_inst.ethernet_interfaces)
self.conn.get.return_value.json.assert_not_called() self.conn.get.return_value.json.assert_not_called()
def test_ethernet_interface_on_refresh(self): def test_ethernet_interfaces_on_refresh(self):
# | GIVEN | # | GIVEN |
with open('rsd_lib/tests/unit/json_samples/v2_3/' with open('rsd_lib/tests/unit/json_samples/v2_3/'
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.json.return_value = json.loads(f.read()) self.conn.get.return_value.json.return_value = json.loads(f.read())
# | WHEN & THEN | # | WHEN & THEN |
self.assertIsInstance(self.system_inst.ethernet_interface, self.assertIsInstance(self.system_inst.ethernet_interfaces,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)
# on refreshing the system instance... # on refreshing the system instance...
@ -97,7 +97,7 @@ class SystemTestCase(testtools.TestCase):
'system_ethernet_interface_collection.json', 'r') as f: 'system_ethernet_interface_collection.json', 'r') as f:
self.conn.get.return_value.son.return_value = json.loads(f.read()) self.conn.get.return_value.son.return_value = json.loads(f.read())
# | WHEN & THEN | # | WHEN & THEN |
self.assertIsInstance(self.system_inst.ethernet_interface, self.assertIsInstance(self.system_inst.ethernet_interfaces,
ethernet_interface.EthernetInterfaceCollection) ethernet_interface.EthernetInterfaceCollection)