Update Keystone resource search
Change-Id: I7a502dc202afed07c5f129fb26150958d84d0b81
This commit is contained in:
parent
211e1a8c27
commit
fd25eb61d0
|
@ -26,8 +26,6 @@ find_service_endpoint = _client.find_service_endpoint
|
||||||
list_endpoints = _client.list_endpoints
|
list_endpoints = _client.list_endpoints
|
||||||
list_services = _client.list_services
|
list_services = _client.list_services
|
||||||
KeystoneClientFixture = _client.KeystoneClientFixture
|
KeystoneClientFixture = _client.KeystoneClientFixture
|
||||||
KeystoneResourceNotFound = _client.KeystoneResourceNotFound
|
|
||||||
MultipleKeystoneResourcesFound = _client.MultipleKeystoneResourcesFound
|
|
||||||
|
|
||||||
keystone_credentials = _credentials.keystone_credentials
|
keystone_credentials = _credentials.keystone_credentials
|
||||||
get_keystone_credentials = _credentials.get_keystone_credentials
|
get_keystone_credentials = _credentials.get_keystone_credentials
|
||||||
|
|
|
@ -65,31 +65,43 @@ def get_keystone_client(session=None, shared=True, init_client=None,
|
||||||
return client.client
|
return client.client
|
||||||
|
|
||||||
|
|
||||||
def find_endpoint(client=None, check_found=True, check_unique=False,
|
_RAISE_ERROR = object()
|
||||||
**params):
|
|
||||||
endpoints = list_endpoints(client=client, **params)
|
|
||||||
return find_resource(resources=endpoints, check_found=check_found,
|
|
||||||
check_unique=check_unique)
|
|
||||||
|
|
||||||
|
|
||||||
def find_service(client=None, check_found=True, check_unique=False,
|
def find_endpoint(client=None, unique=False, default=_RAISE_ERROR,
|
||||||
**params):
|
**attributes):
|
||||||
services = list_services(client=client, **params)
|
endpoints = list_endpoints(client=client, **attributes)
|
||||||
return find_resource(resources=services, check_found=check_found,
|
if default is _RAISE_ERROR or endpoints:
|
||||||
check_unique=check_unique)
|
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,
|
def list_endpoints(client=None, service=None, interface=None, region=None,
|
||||||
translate=True, **params):
|
translate=True, **attributes):
|
||||||
client = keystone_client(client)
|
client = keystone_client(client)
|
||||||
|
|
||||||
service = service or params.pop('service_id', None)
|
service = service or attributes.pop('service_id', None)
|
||||||
if service:
|
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:
|
if region:
|
||||||
params['region_id'] = base.getid(region)
|
attributes['region_id'] = base.getid(region)
|
||||||
|
|
||||||
if client.version == 'v2.0':
|
if client.version == 'v2.0':
|
||||||
endpoints = client.endpoints.list()
|
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,
|
endpoints = client.endpoints.list(service=service,
|
||||||
interface=interface,
|
interface=interface,
|
||||||
region=region)
|
region=region)
|
||||||
if params:
|
endpoints = tobiko.select(endpoints)
|
||||||
endpoints = find_resources(endpoints, **params)
|
if attributes:
|
||||||
return list(endpoints)
|
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)
|
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:
|
if service_type:
|
||||||
params['type'] = base.getid(service_type)
|
attributes['type'] = base.getid(service_type)
|
||||||
|
|
||||||
if name:
|
if name:
|
||||||
params['name'] = name
|
attributes['name'] = name
|
||||||
|
|
||||||
if client.version == 'v2.0':
|
if client.version == 'v2.0':
|
||||||
services = client.services.list()
|
services = client.services.list()
|
||||||
else:
|
else:
|
||||||
services = client.services.list(name=name,
|
services = client.services.list(name=name,
|
||||||
service_type=service_type)
|
service_type=service_type)
|
||||||
|
services = tobiko.select(services)
|
||||||
if params:
|
if attributes:
|
||||||
services = find_resources(services, **params)
|
services = services.with_attributes(**attributes)
|
||||||
return list(services)
|
return services
|
||||||
|
|
||||||
|
|
||||||
def translate_v2_endpoints(v2_endpoints, interface=None):
|
def translate_v2_endpoints(v2_endpoints, interface=None):
|
||||||
|
@ -143,48 +156,9 @@ def translate_v2_endpoints(v2_endpoints, interface=None):
|
||||||
return endpoints
|
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,
|
def find_service_endpoint(enabled=True, interface='public', client=None,
|
||||||
**params):
|
**params):
|
||||||
client = keystone_client(client)
|
client = keystone_client(client)
|
||||||
service = find_service(client=client, enabled=enabled, **params)
|
service = find_service(client=client, enabled=enabled, **params)
|
||||||
return find_endpoint(client=client, service=service, interface=interface,
|
return find_endpoint(client=client, service=service, interface=interface,
|
||||||
enabled=enabled)
|
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}'
|
|
||||||
|
|
|
@ -25,21 +25,16 @@ class ServiceListFixture(tobiko.SharedFixture):
|
||||||
def setup_fixture(self):
|
def setup_fixture(self):
|
||||||
self.services = _client.list_services()
|
self.services = _client.list_services()
|
||||||
|
|
||||||
def has_service(self, **params):
|
def has_service(self, **attributes):
|
||||||
try:
|
services = self.services
|
||||||
_client.find_resource(self.services,
|
if services and attributes:
|
||||||
check_found=True,
|
services = services.with_attributes(**attributes)
|
||||||
check_unique=False,
|
return bool(services)
|
||||||
**params)
|
|
||||||
except _client.KeystoneResourceNotFound:
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def has_service(**params):
|
def has_service(**attributes):
|
||||||
fixture = tobiko.setup_fixture(ServiceListFixture)
|
fixture = tobiko.setup_fixture(ServiceListFixture)
|
||||||
return fixture.has_service(**params)
|
return fixture.has_service(**attributes)
|
||||||
|
|
||||||
|
|
||||||
def is_service_missing(**params):
|
def is_service_missing(**params):
|
||||||
|
|
|
@ -21,6 +21,7 @@ from oslo_log import log
|
||||||
import testtools
|
import testtools
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
|
import tobiko
|
||||||
from tobiko.openstack import keystone
|
from tobiko.openstack import keystone
|
||||||
from tobiko.shell import sh
|
from tobiko.shell import sh
|
||||||
|
|
||||||
|
@ -66,17 +67,19 @@ class KeystoneClientAPITest(testtools.TestCase):
|
||||||
service = keystone.find_service()
|
service = keystone.find_service()
|
||||||
self.assertTrue(service.id)
|
self.assertTrue(service.id)
|
||||||
|
|
||||||
def test_find_service_with_check_unique(self):
|
def test_find_service_with_unique(self):
|
||||||
self.assertRaises(keystone.MultipleKeystoneResourcesFound,
|
self.assertRaises(tobiko.MultipleObjectsFound,
|
||||||
keystone.find_service, check_unique=True)
|
keystone.find_service,
|
||||||
|
unique=True)
|
||||||
|
|
||||||
def test_find_service_not_found(self):
|
def test_find_service_not_found(self):
|
||||||
self.assertRaises(keystone.KeystoneResourceNotFound,
|
self.assertRaises(tobiko.ObjectNotFound,
|
||||||
keystone.find_service, name='never-never-land')
|
keystone.find_service,
|
||||||
|
name='never-never-land')
|
||||||
|
|
||||||
def test_find_service_without_check_found(self):
|
def test_find_service_with_defaulkt(self):
|
||||||
service = keystone.find_service(check_found=False,
|
service = keystone.find_service(name='never-never-land',
|
||||||
name='never-never-land')
|
default=None)
|
||||||
self.assertIsNone(service)
|
self.assertIsNone(service)
|
||||||
|
|
||||||
def test_find_service_by_name(self):
|
def test_find_service_by_name(self):
|
||||||
|
@ -123,18 +126,19 @@ class KeystoneClientAPITest(testtools.TestCase):
|
||||||
endpoint = keystone.find_endpoint()
|
endpoint = keystone.find_endpoint()
|
||||||
self.assertTrue(endpoint.id)
|
self.assertTrue(endpoint.id)
|
||||||
|
|
||||||
def test_find_endpoint_with_check_unique(self):
|
def test_find_endpoint_with_unique(self):
|
||||||
self.assertRaises(keystone.MultipleKeystoneResourcesFound,
|
self.assertRaises(tobiko.MultipleObjectsFound,
|
||||||
keystone.find_endpoint, check_unique=True)
|
keystone.find_endpoint,
|
||||||
|
unique=True)
|
||||||
|
|
||||||
def test_find_endpoint_not_found(self):
|
def test_find_endpoint_not_found(self):
|
||||||
self.assertRaises(keystone.KeystoneResourceNotFound,
|
self.assertRaises(tobiko.ObjectNotFound,
|
||||||
keystone.find_endpoint,
|
keystone.find_endpoint,
|
||||||
service='never-never-land')
|
service='never-never-land')
|
||||||
|
|
||||||
def test_find_endpoint_without_check_found(self):
|
def test_find_endpoint_with_default(self):
|
||||||
service = keystone.find_endpoint(check_found=False,
|
service = keystone.find_endpoint(service='never-never-land',
|
||||||
service='never-never-land')
|
default=None)
|
||||||
self.assertIsNone(service)
|
self.assertIsNone(service)
|
||||||
|
|
||||||
def test_find_endpoint_by_service(self):
|
def test_find_endpoint_by_service(self):
|
||||||
|
|
Loading…
Reference in New Issue