diff --git a/openstack/resource.py b/openstack/resource.py index 5010a92fb..185b13dde 100644 --- a/openstack/resource.py +++ b/openstack/resource.py @@ -1863,22 +1863,26 @@ class Resource(dict): return the_result @classmethod - def find(cls, session, name_or_id, ignore_missing=True, **params): + def find( + cls, session, name_or_id, ignore_missing=True, + list_base_path=None, **params + ): """Find a resource by its name or id. :param session: The session to use for making this request. :type session: :class:`~keystoneauth1.adapter.Adapter` :param name_or_id: This resource's identifier, if needed by - the request. The default is ``None``. + the request. The default is ``None``. :param bool ignore_missing: When set to ``False`` - :class:`~openstack.exceptions.ResourceNotFound` will be - raised when the resource does not exist. - When set to ``True``, None will be returned when - attempting to find a nonexistent resource. + :class:`~openstack.exceptions.ResourceNotFound` will be raised when + the resource does not exist. When set to ``True``, None will be + returned when attempting to find a nonexistent resource. + :param str list_base_path: base_path to be used when need listing + resources. :param dict params: Any additional parameters to be passed into - underlying methods, such as to - :meth:`~openstack.resource.Resource.existing` - in order to pass on URI parameters. + underlying methods, such as to + :meth:`~openstack.resource.Resource.existing` in order to pass on + URI parameters. :return: The :class:`Resource` object matching the given name or id or None if nothing matches. @@ -1900,6 +1904,9 @@ class Resource(dict): # 400 if we try to GET resource and it doesn't exist. pass + if list_base_path: + params['base_path'] = list_base_path + if ('name' in cls._query_mapping._mapping.keys() and 'name' not in params): params['name'] = name_or_id diff --git a/openstack/tests/unit/test_resource.py b/openstack/tests/unit/test_resource.py index 6018434fe..7c9f2a442 100644 --- a/openstack/tests/unit/test_resource.py +++ b/openstack/tests/unit/test_resource.py @@ -2668,7 +2668,7 @@ class TestResourceFind(base.TestCase): @classmethod def list(cls, session, **params): - return None + return [] class OneResult(Base): @@ -2789,6 +2789,22 @@ class TestResourceFind(base.TestCase): exceptions.DuplicateResource, resource.Resource._get_one_match, the_id, [match, match]) + def test_list_no_base_path(self): + + with mock.patch.object(self.Base, "list") as list_mock: + self.Base.find(self.cloud.compute, "name") + + list_mock.assert_called_with(self.cloud.compute) + + def test_list_base_path(self): + + with mock.patch.object(self.Base, "list") as list_mock: + self.Base.find( + self.cloud.compute, "name", list_base_path='/dummy/list') + + list_mock.assert_called_with( + self.cloud.compute, base_path='/dummy/list') + class TestWaitForStatus(base.TestCase):