diff --git a/tobiko/openstack/keystone/__init__.py b/tobiko/openstack/keystone/__init__.py index eb9146f55..5e47e0e46 100644 --- a/tobiko/openstack/keystone/__init__.py +++ b/tobiko/openstack/keystone/__init__.py @@ -26,8 +26,6 @@ find_service_endpoint = _client.find_service_endpoint list_endpoints = _client.list_endpoints list_services = _client.list_services KeystoneClientFixture = _client.KeystoneClientFixture -KeystoneResourceNotFound = _client.KeystoneResourceNotFound -MultipleKeystoneResourcesFound = _client.MultipleKeystoneResourcesFound keystone_credentials = _credentials.keystone_credentials get_keystone_credentials = _credentials.get_keystone_credentials diff --git a/tobiko/openstack/keystone/_client.py b/tobiko/openstack/keystone/_client.py index d8f77a9ce..fa3f9029c 100644 --- a/tobiko/openstack/keystone/_client.py +++ b/tobiko/openstack/keystone/_client.py @@ -65,31 +65,43 @@ def get_keystone_client(session=None, shared=True, init_client=None, return client.client -def find_endpoint(client=None, check_found=True, check_unique=False, - **params): - endpoints = list_endpoints(client=client, **params) - return find_resource(resources=endpoints, check_found=check_found, - check_unique=check_unique) +_RAISE_ERROR = object() -def find_service(client=None, check_found=True, check_unique=False, - **params): - services = list_services(client=client, **params) - return find_resource(resources=services, check_found=check_found, - check_unique=check_unique) +def find_endpoint(client=None, unique=False, default=_RAISE_ERROR, + **attributes): + endpoints = list_endpoints(client=client, **attributes) + if default is _RAISE_ERROR or endpoints: + if unique: + return endpoints.unique + else: + return endpoints.first + else: + return default + + +def find_service(client=None, unique=False, default=_RAISE_ERROR, **attribute): + services = list_services(client=client, **attribute) + if default is _RAISE_ERROR or services: + if unique: + return services.unique + else: + return services.first + else: + return default def list_endpoints(client=None, service=None, interface=None, region=None, - translate=True, **params): + translate=True, **attributes): client = keystone_client(client) - service = service or params.pop('service_id', None) + service = service or attributes.pop('service_id', None) if service: - params['service_id'] = base.getid(service) + attributes['service_id'] = base.getid(service) - region = region or params.pop('region_id', None) + region = region or attributes.pop('region_id', None) if region: - params['region_id'] = base.getid(region) + attributes['region_id'] = base.getid(region) if client.version == 'v2.0': endpoints = client.endpoints.list() @@ -100,30 +112,31 @@ def list_endpoints(client=None, service=None, interface=None, region=None, endpoints = client.endpoints.list(service=service, interface=interface, region=region) - if params: - endpoints = find_resources(endpoints, **params) - return list(endpoints) + endpoints = tobiko.select(endpoints) + if attributes: + endpoints = endpoints.with_attributes(**attributes) + return endpoints -def list_services(client=None, name=None, service_type=None, **params): +def list_services(client=None, name=None, service_type=None, **attributes): client = keystone_client(client) - service_type = service_type or params.pop('type', None) + service_type = service_type or attributes.pop('type', None) if service_type: - params['type'] = base.getid(service_type) + attributes['type'] = base.getid(service_type) if name: - params['name'] = name + attributes['name'] = name if client.version == 'v2.0': services = client.services.list() else: services = client.services.list(name=name, service_type=service_type) - - if params: - services = find_resources(services, **params) - return list(services) + services = tobiko.select(services) + if attributes: + services = services.with_attributes(**attributes) + return services def translate_v2_endpoints(v2_endpoints, interface=None): @@ -143,48 +156,9 @@ def translate_v2_endpoints(v2_endpoints, interface=None): return endpoints -def find_resource(resources, check_found=True, check_unique=True, **params): - """Look for a service matching some property values""" - resource_it = find_resources(resources, **params) - try: - resource = next(resource_it) - except StopIteration: - resource = None - - if check_found and resource is None: - raise KeystoneResourceNotFound(params=params) - - if check_unique: - duplicate_ids = [s.id for s in resource_it] - if duplicate_ids: - raise MultipleKeystoneResourcesFound(params=params) - - return resource - - -def find_resources(resources, **params): - """Look for a service matching some property values""" - # Remove parameters with None value - for resource in resources: - for name, match in params.items(): - value = getattr(resource, name) - if match is not None and match != value: - break - else: - yield resource - - def find_service_endpoint(enabled=True, interface='public', client=None, **params): client = keystone_client(client) service = find_service(client=client, enabled=enabled, **params) return find_endpoint(client=client, service=service, interface=interface, enabled=enabled) - - -class KeystoneResourceNotFound(tobiko.TobikoException): - message = 'No such resource found with parameters {params!r}' - - -class MultipleKeystoneResourcesFound(tobiko.TobikoException): - message = 'Multiple resources found with parameters {params!r}' diff --git a/tobiko/openstack/keystone/_services.py b/tobiko/openstack/keystone/_services.py index 0705c68a4..e9d0d8e46 100644 --- a/tobiko/openstack/keystone/_services.py +++ b/tobiko/openstack/keystone/_services.py @@ -25,21 +25,16 @@ class ServiceListFixture(tobiko.SharedFixture): def setup_fixture(self): self.services = _client.list_services() - def has_service(self, **params): - try: - _client.find_resource(self.services, - check_found=True, - check_unique=False, - **params) - except _client.KeystoneResourceNotFound: - return False - else: - return True + def has_service(self, **attributes): + services = self.services + if services and attributes: + services = services.with_attributes(**attributes) + return bool(services) -def has_service(**params): +def has_service(**attributes): fixture = tobiko.setup_fixture(ServiceListFixture) - return fixture.has_service(**params) + return fixture.has_service(**attributes) def is_service_missing(**params): diff --git a/tobiko/tests/functional/openstack/test_keystone.py b/tobiko/tests/functional/openstack/test_keystone.py index cd6cfe21b..d60b4531f 100644 --- a/tobiko/tests/functional/openstack/test_keystone.py +++ b/tobiko/tests/functional/openstack/test_keystone.py @@ -21,6 +21,7 @@ from oslo_log import log import testtools import yaml +import tobiko from tobiko.openstack import keystone from tobiko.shell import sh @@ -66,17 +67,19 @@ class KeystoneClientAPITest(testtools.TestCase): service = keystone.find_service() self.assertTrue(service.id) - def test_find_service_with_check_unique(self): - self.assertRaises(keystone.MultipleKeystoneResourcesFound, - keystone.find_service, check_unique=True) + def test_find_service_with_unique(self): + self.assertRaises(tobiko.MultipleObjectsFound, + keystone.find_service, + unique=True) def test_find_service_not_found(self): - self.assertRaises(keystone.KeystoneResourceNotFound, - keystone.find_service, name='never-never-land') + self.assertRaises(tobiko.ObjectNotFound, + keystone.find_service, + name='never-never-land') - def test_find_service_without_check_found(self): - service = keystone.find_service(check_found=False, - name='never-never-land') + def test_find_service_with_defaulkt(self): + service = keystone.find_service(name='never-never-land', + default=None) self.assertIsNone(service) def test_find_service_by_name(self): @@ -123,18 +126,19 @@ class KeystoneClientAPITest(testtools.TestCase): endpoint = keystone.find_endpoint() self.assertTrue(endpoint.id) - def test_find_endpoint_with_check_unique(self): - self.assertRaises(keystone.MultipleKeystoneResourcesFound, - keystone.find_endpoint, check_unique=True) + def test_find_endpoint_with_unique(self): + self.assertRaises(tobiko.MultipleObjectsFound, + keystone.find_endpoint, + unique=True) def test_find_endpoint_not_found(self): - self.assertRaises(keystone.KeystoneResourceNotFound, + self.assertRaises(tobiko.ObjectNotFound, keystone.find_endpoint, service='never-never-land') - def test_find_endpoint_without_check_found(self): - service = keystone.find_endpoint(check_found=False, - service='never-never-land') + def test_find_endpoint_with_default(self): + service = keystone.find_endpoint(service='never-never-land', + default=None) self.assertIsNone(service) def test_find_endpoint_by_service(self):