diff options
author | Samuel Pilla <sp516w@att.com> | 2017-08-18 16:16:12 -0500 |
---|---|---|
committer | Gage Hugo <gagehugo@gmail.com> | 2017-12-20 13:51:08 -0600 |
commit | 9cfbf96620a8d01605c9eb553ad72b76068b79b4 (patch) | |
tree | 0864a967dd880f773998bf57c44fe4e05ed44dee /keystoneclient/v3/projects.py | |
parent | 789301a388ba7e190de21e54300b0bb8e0ed6d18 (diff) | |
download | python-keystoneclient-9cfbf96620a8d01605c9eb553ad72b76068b79b4.tar.gz |
Add project tags to keystoneclient
Adds the client functionality for the following project tag calls:
- Create a project tag on a project
- Check if a project tag exists on a project
- List project tags on a project
- Modify project tags on a project
- Delete a specific project tag on a project
- Delete all project tags on a project
Co-Authored-By: Jess Egler <jess.egler@gmail.com>
Co-Authored-By: Rohan Arora <ra271w@att.com>
Co-Authored-By: Tin Lam <tin@irrational.io>
Partially Implements: bp project-tags
Change-Id: I486b2969ae0aa2638842d842fb8b0955cc086d25
Diffstat (limited to 'keystoneclient/v3/projects.py')
-rw-r--r-- | keystoneclient/v3/projects.py | 112 |
1 files changed, 110 insertions, 2 deletions
diff --git a/keystoneclient/v3/projects.py b/keystoneclient/v3/projects.py index 3b2c4d8..470d818 100644 --- a/keystoneclient/v3/projects.py +++ b/keystoneclient/v3/projects.py @@ -14,6 +14,8 @@ # License for the specific language governing permissions and limitations # under the License. +import six.moves.urllib as urllib + from keystoneclient import base from keystoneclient import exceptions from keystoneclient.i18n import _ @@ -52,6 +54,24 @@ class Project(base.Resource): return retval + def add_tag(self, tag): + self.manager.add_tag(self, tag) + + def update_tags(self, tags): + return self.manager.update_tags(self, tags) + + def delete_tag(self, tag): + self.manager.delete_tag(self, tag) + + def delete_all_tags(self): + return self.manager.update_tags(self, []) + + def list_tags(self): + return self.manager.list_tags(self) + + def check_tag(self, tag): + return self.manager.check_tag(self, tag) + class ProjectManager(base.CrudManager): """Manager class for manipulating Identity projects.""" @@ -101,17 +121,24 @@ class ProjectManager(base.CrudManager): assignments on. :type user: str or :class:`keystoneclient.v3.users.User` :param kwargs: any other attribute provided will filter projects on. + Project tags filter keyword: ``tags``, ``tags_any``, + ``not_tags``, and ``not_tags_any``. tag attribute type + string. Pass in a comma separated string to filter + with multiple tags. :returns: a list of projects. :rtype: list of :class:`keystoneclient.v3.projects.Project` """ base_url = '/users/%s' % base.getid(user) if user else None - return super(ProjectManager, self).list( + projects = super(ProjectManager, self).list( base_url=base_url, domain_id=base.getid(domain), fallback_to_auth=True, **kwargs) + for p in projects: + p.tags = self._encode_tags(getattr(p, 'tags', [])) + return projects def _check_not_parents_as_ids_and_parents_as_list(self, parents_as_ids, parents_as_list): @@ -174,7 +201,9 @@ class ProjectManager(base.CrudManager): query = self.build_key_only_query(query_params) dict_args = {'project_id': base.getid(project)} url = self.build_url(dict_args_in_out=dict_args) - return self._get(url + query, self.key) + p = self._get(url + query, self.key) + p.tags = self._encode_tags(getattr(p, 'tags', [])) + return p def update(self, project, name=None, domain=None, description=None, enabled=None, **kwargs): @@ -213,3 +242,82 @@ class ProjectManager(base.CrudManager): """ return super(ProjectManager, self).delete( project_id=base.getid(project)) + + def _encode_tags(self, tags): + """Encode tags to non-unicode string in python2. + + :param tags: list of unicode tags + + :returns: List of strings + """ + return [str(t) for t in tags] + + def add_tag(self, project, tag): + """Add a tag to a project. + + :param project: project to add a tag to. + :param tag: str name of tag. + + """ + url = "/projects/%s/tags/%s" % (base.getid(project), + urllib.parse.quote(tag)) + self.client.put(url) + + def update_tags(self, project, tags): + """Update tag list of a project. + + Replaces current tag list with list specified in tags parameter. + + :param project: project to update. + :param tags: list of str tag names to add to the project + + :returns: list of tags + + """ + url = "/projects/%s/tags" % base.getid(project) + for tag in tags: + tag = urllib.parse.quote(tag) + resp, body = self.client.put(url, body={"tags": tags}) + return body['tags'] + + def delete_tag(self, project, tag): + """Remove tag from project. + + :param projectd: project to remove tag from. + :param tag: str name of tag to remove from project + + """ + self._delete( + "/projects/%s/tags/%s" % (base.getid(project), + urllib.parse.quote(tag))) + + def list_tags(self, project): + """List tags associated with project. + + :param project: project to list tags for. + + :returns: list of str tag names + + """ + url = "/projects/%s/tags" % base.getid(project) + resp, body = self.client.get(url) + return self._encode_tags(body['tags']) + + def check_tag(self, project, tag): + """Check if tag is associated with project. + + :param project: project to check tags for. + :param tag: str name of tag + + :returns: true if tag is associated, false otherwise + + """ + url = "/projects/%s/tags/%s" % (base.getid(project), + urllib.parse.quote(tag)) + try: + self.client.head(url) + # no errors means found the tag + return True + except exceptions.NotFound: + # 404 means tag not in project + return False |