Support id
and enabled
attributes when listing service providers
list SPs currently doesn't support to filter records by any attributes, but this is used somewhere, such as OpenStack Client using `name` to filter the record. SP doesn't has `name` attribute but has `id`, `enabled` attributes instead. This patch enables the filtering of Service Provider based on `id`, `enabled` attributes so that OpenStack Client or the CURL query can benefit from it. based off of: Ib672ba759d26bdd0eecd48451994b3451fb8648a Closes-Bug: 1555830 Change-Id: Icdecaa44415786397ee8bb22de16d25cb8fe603a
This commit is contained in:
parent
ccc7662ce3
commit
cecf6048f2
@ -358,9 +358,10 @@ class Federation(core.FederationDriverV9):
|
|||||||
raise exception.ServiceProviderNotFound(sp_id=sp_id)
|
raise exception.ServiceProviderNotFound(sp_id=sp_id)
|
||||||
return sp_ref
|
return sp_ref
|
||||||
|
|
||||||
def list_sps(self):
|
def list_sps(self, hints=None):
|
||||||
with sql.session_for_read() as session:
|
with sql.session_for_read() as session:
|
||||||
sps = session.query(ServiceProviderModel)
|
query = session.query(ServiceProviderModel)
|
||||||
|
sps = sql.filter_limit_query(ServiceProviderModel, query, hints)
|
||||||
sps_list = [sp.to_dict() for sp in sps]
|
sps_list = [sp.to_dict() for sp in sps]
|
||||||
return sps_list
|
return sps_list
|
||||||
|
|
||||||
|
@ -480,11 +480,12 @@ class ServiceProvider(_ControllerBase):
|
|||||||
response = ServiceProvider.wrap_member(context, sp_ref)
|
response = ServiceProvider.wrap_member(context, sp_ref)
|
||||||
return wsgi.render_response(body=response, status=('201', 'Created'))
|
return wsgi.render_response(body=response, status=('201', 'Created'))
|
||||||
|
|
||||||
@controller.protected()
|
@controller.filterprotected('id', 'enabled')
|
||||||
def list_service_providers(self, context):
|
def list_service_providers(self, context, filters):
|
||||||
ref = self.federation_api.list_sps()
|
hints = self.build_driver_hints(context, filters)
|
||||||
|
ref = self.federation_api.list_sps(hints=hints)
|
||||||
ref = [self.filter_params(x) for x in ref]
|
ref = [self.filter_params(x) for x in ref]
|
||||||
return ServiceProvider.wrap_collection(context, ref)
|
return ServiceProvider.wrap_collection(context, ref, hints=hints)
|
||||||
|
|
||||||
@controller.protected()
|
@controller.protected()
|
||||||
def get_service_provider(self, context, sp_id):
|
def get_service_provider(self, context, sp_id):
|
||||||
|
@ -375,16 +375,6 @@ class FederationDriverBase(object):
|
|||||||
"""
|
"""
|
||||||
raise exception.NotImplemented() # pragma: no cover
|
raise exception.NotImplemented() # pragma: no cover
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def list_sps(self):
|
|
||||||
"""List all service providers.
|
|
||||||
|
|
||||||
:returns: List of service provider ref objects
|
|
||||||
:rtype: list of dicts
|
|
||||||
|
|
||||||
"""
|
|
||||||
raise exception.NotImplemented() # pragma: no cover
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def get_sp(self, sp_id):
|
def get_sp(self, sp_id):
|
||||||
"""Get a service provider.
|
"""Get a service provider.
|
||||||
@ -459,6 +449,16 @@ class FederationDriverV8(FederationDriverBase):
|
|||||||
"""
|
"""
|
||||||
raise exception.NotImplemented() # pragma: no cover
|
raise exception.NotImplemented() # pragma: no cover
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def list_sps(self):
|
||||||
|
"""List all service providers.
|
||||||
|
|
||||||
|
:returns: List of service provider ref objects
|
||||||
|
:rtype: list of dicts
|
||||||
|
|
||||||
|
"""
|
||||||
|
raise exception.NotImplemented() # pragma: no cover
|
||||||
|
|
||||||
|
|
||||||
class FederationDriverV9(FederationDriverBase):
|
class FederationDriverV9(FederationDriverBase):
|
||||||
"""New or redefined methods from V8.
|
"""New or redefined methods from V8.
|
||||||
@ -483,6 +483,21 @@ class FederationDriverV9(FederationDriverBase):
|
|||||||
"""
|
"""
|
||||||
raise exception.NotImplemented() # pragma: no cover
|
raise exception.NotImplemented() # pragma: no cover
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def list_sps(self, hints):
|
||||||
|
"""List all service providers.
|
||||||
|
|
||||||
|
:param hints: filter hints which the driver should
|
||||||
|
implement if at all possible.
|
||||||
|
:returns: List of service provider ref objects
|
||||||
|
:rtype: list of dicts
|
||||||
|
|
||||||
|
:raises keystone.exception.ServiceProviderNotFound: If the SP
|
||||||
|
doesn't exist.
|
||||||
|
|
||||||
|
"""
|
||||||
|
raise exception.NotImplemented() # pragma: no cover
|
||||||
|
|
||||||
|
|
||||||
class V9FederationWrapperForV8Driver(FederationDriverV9):
|
class V9FederationWrapperForV8Driver(FederationDriverV9):
|
||||||
"""Wrapper class to supported a V8 legacy driver.
|
"""Wrapper class to supported a V8 legacy driver.
|
||||||
@ -576,7 +591,11 @@ class V9FederationWrapperForV8Driver(FederationDriverV9):
|
|||||||
def delete_sp(self, sp_id):
|
def delete_sp(self, sp_id):
|
||||||
self.driver.delete_sp(sp_id)
|
self.driver.delete_sp(sp_id)
|
||||||
|
|
||||||
def list_sps(self):
|
# NOTE(davechen): The hints is ignored here to support legacy drivers,
|
||||||
|
# but the filters in hints will be remain unsatisfied and V3Controller
|
||||||
|
# wrapper will apply these filters at the end. So that the result get
|
||||||
|
# returned for list SPs will still be filtered with the legacy drivers.
|
||||||
|
def list_sps(self, hints):
|
||||||
return self.driver.list_sps()
|
return self.driver.list_sps()
|
||||||
|
|
||||||
def get_sp(self, sp_id):
|
def get_sp(self, sp_id):
|
||||||
|
@ -100,3 +100,9 @@ class ServiceProviderTestsV8(
|
|||||||
def config_overrides(self):
|
def config_overrides(self):
|
||||||
super(ServiceProviderTestsV8, self).config_overrides()
|
super(ServiceProviderTestsV8, self).config_overrides()
|
||||||
self.useV8driver()
|
self.useV8driver()
|
||||||
|
|
||||||
|
def test_filter_list_sp_by_id(self):
|
||||||
|
self.skipTest('Operation not supported in v8 and earlier drivers')
|
||||||
|
|
||||||
|
def test_filter_list_sp_by_enabled(self):
|
||||||
|
self.skipTest('Operation not supported in v8 and earlier drivers')
|
||||||
|
@ -3264,6 +3264,15 @@ class ServiceProviderTests(test_v3.RestfulTestCase):
|
|||||||
return '/OS-FEDERATION/service_providers/' + str(suffix)
|
return '/OS-FEDERATION/service_providers/' + str(suffix)
|
||||||
return '/OS-FEDERATION/service_providers'
|
return '/OS-FEDERATION/service_providers'
|
||||||
|
|
||||||
|
def _create_default_sp(self, body=None):
|
||||||
|
"""Create default Service Provider."""
|
||||||
|
url = self.base_url(suffix=uuid.uuid4().hex)
|
||||||
|
if body is None:
|
||||||
|
body = self.sp_ref()
|
||||||
|
resp = self.put(url, body={'service_provider': body},
|
||||||
|
expected_status=http_client.CREATED)
|
||||||
|
return resp
|
||||||
|
|
||||||
def test_get_service_provider(self):
|
def test_get_service_provider(self):
|
||||||
url = self.base_url(suffix=self.SERVICE_PROVIDER_ID)
|
url = self.base_url(suffix=self.SERVICE_PROVIDER_ID)
|
||||||
resp = self.get(url)
|
resp = self.get(url)
|
||||||
@ -3413,6 +3422,56 @@ class ServiceProviderTests(test_v3.RestfulTestCase):
|
|||||||
url = self.base_url(suffix=uuid.uuid4().hex)
|
url = self.base_url(suffix=uuid.uuid4().hex)
|
||||||
self.delete(url, expected_status=http_client.NOT_FOUND)
|
self.delete(url, expected_status=http_client.NOT_FOUND)
|
||||||
|
|
||||||
|
def test_filter_list_sp_by_id(self):
|
||||||
|
def get_id(resp):
|
||||||
|
sp = resp.result.get('service_provider')
|
||||||
|
return sp.get('id')
|
||||||
|
|
||||||
|
sp1_id = get_id(self._create_default_sp())
|
||||||
|
sp2_id = get_id(self._create_default_sp())
|
||||||
|
|
||||||
|
# list the SP, should get SPs.
|
||||||
|
url = self.base_url()
|
||||||
|
resp = self.get(url)
|
||||||
|
sps = resp.result.get('service_providers')
|
||||||
|
entities_ids = [e['id'] for e in sps]
|
||||||
|
self.assertIn(sp1_id, entities_ids)
|
||||||
|
self.assertIn(sp2_id, entities_ids)
|
||||||
|
|
||||||
|
# filter the SP by 'id'. Only SP1 should appear.
|
||||||
|
url = self.base_url() + '?id=' + sp1_id
|
||||||
|
resp = self.get(url)
|
||||||
|
sps = resp.result.get('service_providers')
|
||||||
|
entities_ids = [e['id'] for e in sps]
|
||||||
|
self.assertIn(sp1_id, entities_ids)
|
||||||
|
self.assertNotIn(sp2_id, entities_ids)
|
||||||
|
|
||||||
|
def test_filter_list_sp_by_enabled(self):
|
||||||
|
def get_id(resp):
|
||||||
|
sp = resp.result.get('service_provider')
|
||||||
|
return sp.get('id')
|
||||||
|
|
||||||
|
sp1_id = get_id(self._create_default_sp())
|
||||||
|
sp2_ref = self.sp_ref()
|
||||||
|
sp2_ref['enabled'] = False
|
||||||
|
sp2_id = get_id(self._create_default_sp(body=sp2_ref))
|
||||||
|
|
||||||
|
# list the SP, should get two SPs.
|
||||||
|
url = self.base_url()
|
||||||
|
resp = self.get(url)
|
||||||
|
sps = resp.result.get('service_providers')
|
||||||
|
entities_ids = [e['id'] for e in sps]
|
||||||
|
self.assertIn(sp1_id, entities_ids)
|
||||||
|
self.assertIn(sp2_id, entities_ids)
|
||||||
|
|
||||||
|
# filter the SP by 'enabled'. Only SP1 should appear.
|
||||||
|
url = self.base_url() + '?enabled=True'
|
||||||
|
resp = self.get(url)
|
||||||
|
sps = resp.result.get('service_providers')
|
||||||
|
entities_ids = [e['id'] for e in sps]
|
||||||
|
self.assertIn(sp1_id, entities_ids)
|
||||||
|
self.assertNotIn(sp2_id, entities_ids)
|
||||||
|
|
||||||
|
|
||||||
class WebSSOTests(FederatedTokenTests):
|
class WebSSOTests(FederatedTokenTests):
|
||||||
"""A class for testing Web SSO."""
|
"""A class for testing Web SSO."""
|
||||||
|
@ -4,3 +4,7 @@ features:
|
|||||||
[`bug 1525317 <https://bugs.launchpad.net/keystone/+bug/1525317>`_]
|
[`bug 1525317 <https://bugs.launchpad.net/keystone/+bug/1525317>`_]
|
||||||
Enable filtering of identity providers based on `id`, and `enabled`
|
Enable filtering of identity providers based on `id`, and `enabled`
|
||||||
attributes.
|
attributes.
|
||||||
|
- >
|
||||||
|
[`bug 1555830 <https://bugs.launchpad.net/keystone/+bug/1555830>`_]
|
||||||
|
Enable filtering of service providers based on `id`, and `enabled`
|
||||||
|
attributes.
|
Loading…
Reference in New Issue
Block a user