summaryrefslogtreecommitdiff
path: root/keystoneclient/v3
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2017-06-22 22:02:25 +0000
committerGerrit Code Review <review@openstack.org>2017-06-22 22:02:25 +0000
commit2a50f56b6145e6d1f29c09482bc8959f0179e892 (patch)
tree314d370f17607db282b82e4f47bd9c06e1a39273 /keystoneclient/v3
parentef49844248661671063567f98016e88943955ba0 (diff)
parent2cc2f1081f3a2762ec469bd4b3cc2ed46fe0b73e (diff)
downloadpython-keystoneclient-2a50f56b6145e6d1f29c09482bc8959f0179e892.tar.gz
Merge "Add support for endpoint group filtering"
Diffstat (limited to 'keystoneclient/v3')
-rw-r--r--keystoneclient/v3/contrib/endpoint_filter.py77
1 files changed, 75 insertions, 2 deletions
diff --git a/keystoneclient/v3/contrib/endpoint_filter.py b/keystoneclient/v3/contrib/endpoint_filter.py
index 586a74a..26d5a87 100644
--- a/keystoneclient/v3/contrib/endpoint_filter.py
+++ b/keystoneclient/v3/contrib/endpoint_filter.py
@@ -15,12 +15,18 @@
from keystoneclient import base
from keystoneclient import exceptions
from keystoneclient.i18n import _
+from keystoneclient.v3 import endpoint_groups
from keystoneclient.v3 import endpoints
from keystoneclient.v3 import projects
class EndpointFilterManager(base.Manager):
- """Manager class for manipulating project-endpoint associations."""
+ """Manager class for manipulating project-endpoint associations.
+
+ Project-endpoint associations can be with endpoints directly or via
+ endpoint groups.
+
+ """
OS_EP_FILTER_EXT = '/OS-EP-FILTER'
@@ -40,6 +46,23 @@ class EndpointFilterManager(base.Manager):
return self.OS_EP_FILTER_EXT + api_path
+ def _build_group_base_url(self, project=None, endpoint_group=None):
+ project_id = base.getid(project)
+ endpoint_group_id = base.getid(endpoint_group)
+
+ if project_id and endpoint_group_id:
+ api_path = '/endpoint_groups/%s/projects/%s' % (
+ endpoint_group_id, project_id)
+ elif project_id:
+ api_path = '/projects/%s/endpoint_groups' % (project_id)
+ elif endpoint_group_id:
+ api_path = '/endpoint_groups/%s/projects' % (endpoint_group_id)
+ else:
+ msg = _('Must specify a project, an endpoint group, or both')
+ raise exceptions.ValidationError(msg)
+
+ return self.OS_EP_FILTER_EXT + api_path
+
def add_endpoint_to_project(self, project, endpoint):
"""Create a project-endpoint association."""
if not (project and endpoint):
@@ -59,7 +82,7 @@ class EndpointFilterManager(base.Manager):
return super(EndpointFilterManager, self)._delete(url=base_url)
def check_endpoint_in_project(self, project, endpoint):
- """Check if project-endpoint association exist."""
+ """Check if project-endpoint association exists."""
if not (project and endpoint):
raise ValueError(_('project and endpoint are required'))
@@ -88,3 +111,53 @@ class EndpointFilterManager(base.Manager):
base_url,
projects.ProjectManager.collection_key,
obj_class=projects.ProjectManager.resource_class)
+
+ def add_endpoint_group_to_project(self, endpoint_group, project):
+ """Create a project-endpoint group association."""
+ if not (project and endpoint_group):
+ raise ValueError(_('project and endpoint_group are required'))
+
+ base_url = self._build_group_base_url(project=project,
+ endpoint_group=endpoint_group)
+ return super(EndpointFilterManager, self)._put(url=base_url)
+
+ def delete_endpoint_group_from_project(self, endpoint_group, project):
+ """Remove a project-endpoint group association."""
+ if not (project and endpoint_group):
+ raise ValueError(_('project and endpoint_group are required'))
+
+ base_url = self._build_group_base_url(project=project,
+ endpoint_group=endpoint_group)
+ return super(EndpointFilterManager, self)._delete(url=base_url)
+
+ def check_endpoint_group_in_project(self, endpoint_group, project):
+ """Check if project-endpoint group association exists."""
+ if not (project and endpoint_group):
+ raise ValueError(_('project and endpoint_group are required'))
+
+ base_url = self._build_group_base_url(project=project,
+ endpoint_group=endpoint_group)
+ return super(EndpointFilterManager, self)._head(url=base_url)
+
+ def list_endpoint_groups_for_project(self, project):
+ """List all endpoint groups for a given project."""
+ if not project:
+ raise ValueError(_('project is required'))
+
+ base_url = self._build_group_base_url(project=project)
+
+ return super(EndpointFilterManager, self)._list(
+ base_url,
+ 'endpoint_groups',
+ obj_class=endpoint_groups.EndpointGroupManager.resource_class)
+
+ def list_projects_for_endpoint_group(self, endpoint_group):
+ """List all projects associated with a given endpoint group."""
+ if not endpoint_group:
+ raise ValueError(_('endpoint_group is required'))
+
+ base_url = self._build_group_base_url(endpoint_group=endpoint_group)
+ return super(EndpointFilterManager, self)._list(
+ base_url,
+ projects.ProjectManager.collection_key,
+ obj_class=projects.ProjectManager.resource_class)