diff --git a/sushy/resources/base.py b/sushy/resources/base.py index d3704439..a6bbcca8 100644 --- a/sushy/resources/base.py +++ b/sushy/resources/base.py @@ -325,6 +325,8 @@ class ResourceCollectionBase(ResourceBase): adapter=utils.get_members_identities) """A tuple with the members identities""" + _members = None # caching variable + def __init__(self, connector, path, redfish_version=None): """A class representing the base of any Redfish resource collection @@ -365,4 +367,19 @@ class ResourceCollectionBase(ResourceBase): :returns: A list of ``_resource_type`` objects """ - return [self.get_member(id_) for id_ in self.members_identities] + if self._members is None: + self._members = [self.get_member(id_) + for id_ in self.members_identities] + + for m in self._members: + m.refresh(force=False) + return self._members + + def _do_refresh(self, force=False): + """Do refresh related activities. + + Undefine the `_members` attribute here for fresh evaluation in + subsequent calls to `get_members()` method. Other similar activities + can also follow in future, if needed. + """ + self._members = None diff --git a/sushy/resources/system/ethernet_interface.py b/sushy/resources/system/ethernet_interface.py index b89f2edd..8e95ad7a 100644 --- a/sushy/resources/system/ethernet_interface.py +++ b/sushy/resources/system/ethernet_interface.py @@ -83,4 +83,5 @@ class EthernetInterfaceCollection(base.ResourceCollectionBase): greedy-refresh not done for them unless forced by ``force`` argument. """ + super(EthernetInterfaceCollection, self)._do_refresh(force) self._summary = None diff --git a/sushy/resources/system/processor.py b/sushy/resources/system/processor.py index 1ee39e30..7d1ba551 100644 --- a/sushy/resources/system/processor.py +++ b/sushy/resources/system/processor.py @@ -155,5 +155,6 @@ class ProcessorCollection(base.ResourceCollectionBase): greedy-refresh not done for them unless forced by ``force`` argument. """ + super(ProcessorCollection, self)._do_refresh(force) # Reset summary attribute self._summary = None diff --git a/sushy/resources/system/simple_storage.py b/sushy/resources/system/simple_storage.py index f6154009..4fc0aec0 100644 --- a/sushy/resources/system/simple_storage.py +++ b/sushy/resources/system/simple_storage.py @@ -81,6 +81,7 @@ class SimpleStorageCollection(base.ResourceCollectionBase): return self._max_size_bytes def _do_refresh(self, force=False): + super(SimpleStorageCollection, self)._do_refresh(force) # Note(deray): undefine the attribute here for fresh creation in # subsequent calls to it's exposed property. self._max_size_bytes = None diff --git a/sushy/resources/system/storage/volume.py b/sushy/resources/system/storage/volume.py index 6e6c558f..21888192 100644 --- a/sushy/resources/system/storage/volume.py +++ b/sushy/resources/system/storage/volume.py @@ -53,5 +53,6 @@ class VolumeCollection(base.ResourceCollectionBase): return self._max_size_bytes def _do_refresh(self, force=False): + super(VolumeCollection, self)._do_refresh(force) # invalidate the attribute self._max_size_bytes = None diff --git a/sushy/tests/unit/resources/test_base.py b/sushy/tests/unit/resources/test_base.py index 8f92ba7d..32db00e9 100644 --- a/sushy/tests/unit/resources/test_base.py +++ b/sushy/tests/unit/resources/test_base.py @@ -129,10 +129,9 @@ class ResourceCollectionBaseTestCase(base.TestCase): self.test_resource_collection.get_member, '2') self.conn.get.assert_called_once_with(path='Fakes/2') - def test_get_members(self): + def _validate_get_members_result(self, member_ids): # | GIVEN | # setting some valid member paths - member_ids = ('1', '2') self.test_resource_collection.members_identities = member_ids # | WHEN | result = self.test_resource_collection.get_members() @@ -143,6 +142,26 @@ class ResourceCollectionBaseTestCase(base.TestCase): self.assertTrue(val.identity in member_ids) self.assertEqual('1.0.x', val.redfish_version) + return result + + def test_get_members(self): + self._validate_get_members_result(('1', '2')) + + def test_get_members_on_refresh(self): + self._validate_get_members_result(('1', '2')) + + # Now emulating the resource invalidate and refresh action! + self.test_resource_collection.invalidate() + self.assertTrue(self.test_resource_collection._is_stale) + self.test_resource_collection.refresh(force=False) + + self._validate_get_members_result(('3', '4')) + self.assertFalse(self.test_resource_collection._is_stale) + + def test_get_members_caching(self): + result = self._validate_get_members_result(('1', '2')) + self.assertIs(result, self.test_resource_collection.get_members()) + TEST_JSON = { 'String': 'a string',