blob: d8afd2c02342b5e30f83a4f36f5d36a1e1ef5077 [file] [log] [blame]
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +05301# Copyright 2013 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16import json
Matthew Treinish89128142015-04-23 10:44:30 -040017
18from six.moves.urllib import parse as urllib
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053019
Ken'ichi Ohmichi0e836652015-01-08 04:38:56 +000020from tempest.common import service_client
Matthew Treinish684d8992014-01-30 16:27:40 +000021
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053022
Ken'ichi Ohmichia6287072015-07-02 02:43:15 +000023class IdentityV3Client(service_client.ServiceClient):
ghanshyamd26b5cd2015-02-09 14:48:58 +090024 api_version = "v3"
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053025
Filip HubĂ­k81354052015-03-09 19:04:23 +010026 def get_api_description(self):
27 """Retrieves info about the v3 Identity API"""
28 url = ''
29 resp, body = self.get(url)
30 self.expected_success(200, resp.status)
31 return service_client.ResponseBody(resp, self._parse_resp(body))
32
Brad Pokorny769cddc2014-10-02 12:19:33 -070033 def create_user(self, user_name, password=None, project_id=None,
34 email=None, domain_id='default', **kwargs):
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053035 """Creates a user."""
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053036 en = kwargs.get('enabled', True)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053037 description = kwargs.get('description', None)
root34345472014-11-23 15:23:07 +020038 default_project_id = kwargs.get('default_project_id')
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053039 post_body = {
40 'project_id': project_id,
root34345472014-11-23 15:23:07 +020041 'default_project_id': default_project_id,
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053042 'description': description,
43 'domain_id': domain_id,
44 'email': email,
45 'enabled': en,
46 'name': user_name,
47 'password': password
48 }
49 post_body = json.dumps({'user': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020050 resp, body = self.post('users', post_body)
David Kranze9d2f422014-07-02 13:57:41 -040051 self.expected_success(201, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053052 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +000053 return service_client.ResponseBody(resp, body['user'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053054
55 def update_user(self, user_id, name, **kwargs):
56 """Updates a user."""
David Kranzd8ccb792014-12-29 11:32:05 -050057 body = self.get_user(user_id)
nayna-patel755d8142013-07-16 06:45:34 +000058 email = kwargs.get('email', body['email'])
59 en = kwargs.get('enabled', body['enabled'])
60 project_id = kwargs.get('project_id', body['project_id'])
root34345472014-11-23 15:23:07 +020061 if 'default_project_id' in body.keys():
62 default_project_id = kwargs.get('default_project_id',
63 body['default_project_id'])
64 else:
65 default_project_id = kwargs.get('default_project_id')
nayna-patel755d8142013-07-16 06:45:34 +000066 description = kwargs.get('description', body['description'])
67 domain_id = kwargs.get('domain_id', body['domain_id'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053068 post_body = {
69 'name': name,
70 'email': email,
71 'enabled': en,
72 'project_id': project_id,
root34345472014-11-23 15:23:07 +020073 'default_project_id': default_project_id,
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053074 'id': user_id,
75 'domain_id': domain_id,
76 'description': description
77 }
78 post_body = json.dumps({'user': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020079 resp, body = self.patch('users/%s' % user_id, post_body)
David Kranze9d2f422014-07-02 13:57:41 -040080 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053081 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +000082 return service_client.ResponseBody(resp, body['user'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053083
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000084 def update_user_password(self, user_id, password, original_password):
85 """Updates a user password."""
86 update_user = {
87 'password': password,
88 'original_password': original_password
89 }
90 update_user = json.dumps({'user': update_user})
91 resp, _ = self.post('users/%s/password' % user_id, update_user)
92 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +000093 return service_client.ResponseBody(resp)
ravikumar-venkatesand35d6442014-05-05 12:14:45 +000094
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053095 def list_user_projects(self, user_id):
96 """Lists the projects on which a user has roles assigned."""
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020097 resp, body = self.get('users/%s/projects' % user_id)
David Kranze9d2f422014-07-02 13:57:41 -040098 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053099 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000100 return service_client.ResponseBodyList(resp, body['projects'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530101
nayna-patel2db83b32014-05-15 11:41:03 +0000102 def get_users(self, params=None):
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530103 """Get the list of users."""
nayna-patel2db83b32014-05-15 11:41:03 +0000104 url = 'users'
105 if params:
106 url += '?%s' % urllib.urlencode(params)
107 resp, body = self.get(url)
David Kranze9d2f422014-07-02 13:57:41 -0400108 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530109 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000110 return service_client.ResponseBodyList(resp, body['users'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530111
112 def get_user(self, user_id):
113 """GET a user."""
114 resp, body = self.get("users/%s" % user_id)
David Kranze9d2f422014-07-02 13:57:41 -0400115 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530116 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000117 return service_client.ResponseBody(resp, body['user'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530118
119 def delete_user(self, user_id):
120 """Deletes a User."""
121 resp, body = self.delete("users/%s" % user_id)
David Kranze9d2f422014-07-02 13:57:41 -0400122 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000123 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530124
125 def create_project(self, name, **kwargs):
126 """Creates a project."""
127 description = kwargs.get('description', None)
128 en = kwargs.get('enabled', True)
129 domain_id = kwargs.get('domain_id', 'default')
130 post_body = {
131 'description': description,
132 'domain_id': domain_id,
133 'enabled': en,
134 'name': name
135 }
136 post_body = json.dumps({'project': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200137 resp, body = self.post('projects', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400138 self.expected_success(201, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530139 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000140 return service_client.ResponseBody(resp, body['project'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530141
nayna-patel153e9dd2014-05-16 09:00:05 +0000142 def list_projects(self, params=None):
143 url = "projects"
144 if params:
145 url += '?%s' % urllib.urlencode(params)
146 resp, body = self.get(url)
David Kranze9d2f422014-07-02 13:57:41 -0400147 self.expected_success(200, resp.status)
Nayna Patele6331362013-08-12 06:59:48 +0000148 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000149 return service_client.ResponseBodyList(resp, body['projects'])
Nayna Patele6331362013-08-12 06:59:48 +0000150
151 def update_project(self, project_id, **kwargs):
David Kranzd8ccb792014-12-29 11:32:05 -0500152 body = self.get_project(project_id)
Nayna Patele6331362013-08-12 06:59:48 +0000153 name = kwargs.get('name', body['name'])
154 desc = kwargs.get('description', body['description'])
155 en = kwargs.get('enabled', body['enabled'])
156 domain_id = kwargs.get('domain_id', body['domain_id'])
157 post_body = {
158 'id': project_id,
159 'name': name,
160 'description': desc,
161 'enabled': en,
162 'domain_id': domain_id,
163 }
164 post_body = json.dumps({'project': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200165 resp, body = self.patch('projects/%s' % project_id, post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400166 self.expected_success(200, resp.status)
Nayna Patele6331362013-08-12 06:59:48 +0000167 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000168 return service_client.ResponseBody(resp, body['project'])
Nayna Patele6331362013-08-12 06:59:48 +0000169
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530170 def get_project(self, project_id):
171 """GET a Project."""
172 resp, body = self.get("projects/%s" % project_id)
David Kranze9d2f422014-07-02 13:57:41 -0400173 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530174 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000175 return service_client.ResponseBody(resp, body['project'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530176
177 def delete_project(self, project_id):
178 """Delete a project."""
179 resp, body = self.delete('projects/%s' % str(project_id))
David Kranze9d2f422014-07-02 13:57:41 -0400180 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000181 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530182
183 def create_role(self, name):
184 """Create a Role."""
185 post_body = {
186 'name': name
187 }
188 post_body = json.dumps({'role': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200189 resp, body = self.post('roles', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400190 self.expected_success(201, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530191 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000192 return service_client.ResponseBody(resp, body['role'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530193
194 def get_role(self, role_id):
195 """GET a Role."""
196 resp, body = self.get('roles/%s' % str(role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400197 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530198 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000199 return service_client.ResponseBody(resp, body['role'])
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530200
wanglianmina3e84ea2014-03-26 17:30:33 +0800201 def list_roles(self):
202 """Get the list of Roles."""
203 resp, body = self.get("roles")
David Kranze9d2f422014-07-02 13:57:41 -0400204 self.expected_success(200, resp.status)
wanglianmina3e84ea2014-03-26 17:30:33 +0800205 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000206 return service_client.ResponseBodyList(resp, body['roles'])
wanglianmina3e84ea2014-03-26 17:30:33 +0800207
nayna-patel755d8142013-07-16 06:45:34 +0000208 def update_role(self, name, role_id):
209 """Create a Role."""
210 post_body = {
211 'name': name
212 }
213 post_body = json.dumps({'role': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200214 resp, body = self.patch('roles/%s' % str(role_id), post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400215 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000216 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000217 return service_client.ResponseBody(resp, body['role'])
nayna-patel755d8142013-07-16 06:45:34 +0000218
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530219 def delete_role(self, role_id):
220 """Delete a role."""
221 resp, body = self.delete('roles/%s' % str(role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400222 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000223 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +0530224
225 def assign_user_role(self, project_id, user_id, role_id):
226 """Add roles to a user on a project."""
227 resp, body = self.put('projects/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200228 (project_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400229 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000230 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +0000231
232 def create_domain(self, name, **kwargs):
233 """Creates a domain."""
234 description = kwargs.get('description', None)
235 en = kwargs.get('enabled', True)
236 post_body = {
237 'description': description,
238 'enabled': en,
239 'name': name
240 }
241 post_body = json.dumps({'domain': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200242 resp, body = self.post('domains', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400243 self.expected_success(201, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000244 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000245 return service_client.ResponseBody(resp, body['domain'])
nayna-patel4df72dc2013-05-29 10:27:24 +0000246
247 def delete_domain(self, domain_id):
248 """Delete a domain."""
249 resp, body = self.delete('domains/%s' % str(domain_id))
David Kranze9d2f422014-07-02 13:57:41 -0400250 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000251 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +0000252
Andrea Frittolic3280152015-02-26 12:42:34 +0000253 def list_domains(self, params=None):
nayna-patel4df72dc2013-05-29 10:27:24 +0000254 """List Domains."""
Andrea Frittolic3280152015-02-26 12:42:34 +0000255 url = 'domains'
256 if params:
257 url += '?%s' % urllib.urlencode(params)
258 resp, body = self.get(url)
David Kranze9d2f422014-07-02 13:57:41 -0400259 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000260 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000261 return service_client.ResponseBodyList(resp, body['domains'])
nayna-patel4df72dc2013-05-29 10:27:24 +0000262
263 def update_domain(self, domain_id, **kwargs):
264 """Updates a domain."""
David Kranzd8ccb792014-12-29 11:32:05 -0500265 body = self.get_domain(domain_id)
nayna-patel4df72dc2013-05-29 10:27:24 +0000266 description = kwargs.get('description', body['description'])
267 en = kwargs.get('enabled', body['enabled'])
268 name = kwargs.get('name', body['name'])
269 post_body = {
270 'description': description,
271 'enabled': en,
272 'name': name
273 }
274 post_body = json.dumps({'domain': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200275 resp, body = self.patch('domains/%s' % domain_id, post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400276 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000277 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000278 return service_client.ResponseBody(resp, body['domain'])
nayna-patel4df72dc2013-05-29 10:27:24 +0000279
280 def get_domain(self, domain_id):
281 """Get Domain details."""
282 resp, body = self.get('domains/%s' % domain_id)
David Kranze9d2f422014-07-02 13:57:41 -0400283 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000284 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000285 return service_client.ResponseBody(resp, body['domain'])
nayna-patelb35f7232013-06-28 07:08:44 +0000286
287 def get_token(self, resp_token):
288 """Get token details."""
289 headers = {'X-Subject-Token': resp_token}
290 resp, body = self.get("auth/tokens", headers=headers)
David Kranze9d2f422014-07-02 13:57:41 -0400291 self.expected_success(200, resp.status)
nayna-patelb35f7232013-06-28 07:08:44 +0000292 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000293 return service_client.ResponseBody(resp, body['token'])
nayna-patelb35f7232013-06-28 07:08:44 +0000294
295 def delete_token(self, resp_token):
296 """Deletes token."""
297 headers = {'X-Subject-Token': resp_token}
298 resp, body = self.delete("auth/tokens", headers=headers)
David Kranze9d2f422014-07-02 13:57:41 -0400299 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000300 return service_client.ResponseBody(resp, body)
nayna-patelb35f7232013-06-28 07:08:44 +0000301
nayna-patel755d8142013-07-16 06:45:34 +0000302 def create_group(self, name, **kwargs):
303 """Creates a group."""
304 description = kwargs.get('description', None)
305 domain_id = kwargs.get('domain_id', 'default')
306 project_id = kwargs.get('project_id', None)
307 post_body = {
308 'description': description,
309 'domain_id': domain_id,
310 'project_id': project_id,
311 'name': name
312 }
313 post_body = json.dumps({'group': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200314 resp, body = self.post('groups', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400315 self.expected_success(201, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000316 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000317 return service_client.ResponseBody(resp, body['group'])
nayna-patel755d8142013-07-16 06:45:34 +0000318
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800319 def get_group(self, group_id):
320 """Get group details."""
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200321 resp, body = self.get('groups/%s' % group_id)
David Kranze9d2f422014-07-02 13:57:41 -0400322 self.expected_success(200, resp.status)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800323 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000324 return service_client.ResponseBody(resp, body['group'])
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800325
ravikumar-venkatesana0003702015-02-04 10:31:17 +0000326 def list_groups(self):
327 """Lists the groups."""
328 resp, body = self.get('groups')
329 self.expected_success(200, resp.status)
330 body = json.loads(body)
331 return service_client.ResponseBodyList(resp, body['groups'])
332
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800333 def update_group(self, group_id, **kwargs):
334 """Updates a group."""
David Kranzd8ccb792014-12-29 11:32:05 -0500335 body = self.get_group(group_id)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800336 name = kwargs.get('name', body['name'])
337 description = kwargs.get('description', body['description'])
338 post_body = {
339 'name': name,
340 'description': description
341 }
342 post_body = json.dumps({'group': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200343 resp, body = self.patch('groups/%s' % group_id, post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400344 self.expected_success(200, resp.status)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800345 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000346 return service_client.ResponseBody(resp, body['group'])
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800347
nayna-patel755d8142013-07-16 06:45:34 +0000348 def delete_group(self, group_id):
349 """Delete a group."""
350 resp, body = self.delete('groups/%s' % str(group_id))
David Kranze9d2f422014-07-02 13:57:41 -0400351 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000352 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000353
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800354 def add_group_user(self, group_id, user_id):
355 """Add user into group."""
356 resp, body = self.put('groups/%s/users/%s' % (group_id, user_id),
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200357 None)
David Kranze9d2f422014-07-02 13:57:41 -0400358 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000359 return service_client.ResponseBody(resp, body)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800360
361 def list_group_users(self, group_id):
362 """List users in group."""
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200363 resp, body = self.get('groups/%s/users' % group_id)
David Kranze9d2f422014-07-02 13:57:41 -0400364 self.expected_success(200, resp.status)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800365 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000366 return service_client.ResponseBodyList(resp, body['users'])
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800367
wanglianmin29b0f4c2014-03-06 19:09:16 +0800368 def list_user_groups(self, user_id):
369 """Lists groups which a user belongs to."""
370 resp, body = self.get('users/%s/groups' % user_id)
David Kranze9d2f422014-07-02 13:57:41 -0400371 self.expected_success(200, resp.status)
wanglianmin29b0f4c2014-03-06 19:09:16 +0800372 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000373 return service_client.ResponseBodyList(resp, body['groups'])
wanglianmin29b0f4c2014-03-06 19:09:16 +0800374
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800375 def delete_group_user(self, group_id, user_id):
376 """Delete user in group."""
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200377 resp, body = self.delete('groups/%s/users/%s' % (group_id, user_id))
David Kranze9d2f422014-07-02 13:57:41 -0400378 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000379 return service_client.ResponseBody(resp, body)
Zhi Kun Liue8136f02014-01-07 18:56:28 +0800380
nayna-patel755d8142013-07-16 06:45:34 +0000381 def assign_user_role_on_project(self, project_id, user_id, role_id):
382 """Add roles to a user on a project."""
383 resp, body = self.put('projects/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200384 (project_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400385 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000386 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000387
388 def assign_user_role_on_domain(self, domain_id, user_id, role_id):
389 """Add roles to a user on a domain."""
390 resp, body = self.put('domains/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200391 (domain_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400392 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000393 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000394
395 def list_user_roles_on_project(self, project_id, user_id):
396 """list roles of a user on a project."""
397 resp, body = self.get('projects/%s/users/%s/roles' %
398 (project_id, user_id))
David Kranze9d2f422014-07-02 13:57:41 -0400399 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000400 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000401 return service_client.ResponseBodyList(resp, body['roles'])
nayna-patel755d8142013-07-16 06:45:34 +0000402
403 def list_user_roles_on_domain(self, domain_id, user_id):
404 """list roles of a user on a domain."""
405 resp, body = self.get('domains/%s/users/%s/roles' %
406 (domain_id, user_id))
David Kranze9d2f422014-07-02 13:57:41 -0400407 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000408 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000409 return service_client.ResponseBodyList(resp, body['roles'])
nayna-patel755d8142013-07-16 06:45:34 +0000410
411 def revoke_role_from_user_on_project(self, project_id, user_id, role_id):
412 """Delete role of a user on a project."""
413 resp, body = self.delete('projects/%s/users/%s/roles/%s' %
414 (project_id, user_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400415 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000416 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000417
418 def revoke_role_from_user_on_domain(self, domain_id, user_id, role_id):
419 """Delete role of a user on a domain."""
420 resp, body = self.delete('domains/%s/users/%s/roles/%s' %
421 (domain_id, user_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400422 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000423 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000424
425 def assign_group_role_on_project(self, project_id, group_id, role_id):
426 """Add roles to a user on a project."""
427 resp, body = self.put('projects/%s/groups/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200428 (project_id, group_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400429 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000430 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000431
432 def assign_group_role_on_domain(self, domain_id, group_id, role_id):
433 """Add roles to a user on a domain."""
434 resp, body = self.put('domains/%s/groups/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200435 (domain_id, group_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400436 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000437 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000438
439 def list_group_roles_on_project(self, project_id, group_id):
440 """list roles of a user on a project."""
441 resp, body = self.get('projects/%s/groups/%s/roles' %
442 (project_id, group_id))
David Kranze9d2f422014-07-02 13:57:41 -0400443 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000444 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000445 return service_client.ResponseBodyList(resp, body['roles'])
nayna-patel755d8142013-07-16 06:45:34 +0000446
447 def list_group_roles_on_domain(self, domain_id, group_id):
448 """list roles of a user on a domain."""
449 resp, body = self.get('domains/%s/groups/%s/roles' %
450 (domain_id, group_id))
David Kranze9d2f422014-07-02 13:57:41 -0400451 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000452 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000453 return service_client.ResponseBodyList(resp, body['roles'])
nayna-patel755d8142013-07-16 06:45:34 +0000454
455 def revoke_role_from_group_on_project(self, project_id, group_id, role_id):
456 """Delete role of a user on a project."""
457 resp, body = self.delete('projects/%s/groups/%s/roles/%s' %
458 (project_id, group_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400459 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000460 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000461
462 def revoke_role_from_group_on_domain(self, domain_id, group_id, role_id):
463 """Delete role of a user on a domain."""
464 resp, body = self.delete('domains/%s/groups/%s/roles/%s' %
465 (domain_id, group_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400466 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000467 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000468
Steven Hardybf70c5c2013-10-30 21:55:16 +0000469 def create_trust(self, trustor_user_id, trustee_user_id, project_id,
470 role_names, impersonation, expires_at):
471 """Creates a trust."""
472 roles = [{'name': n} for n in role_names]
473 post_body = {
474 'trustor_user_id': trustor_user_id,
475 'trustee_user_id': trustee_user_id,
476 'project_id': project_id,
477 'impersonation': impersonation,
478 'roles': roles,
479 'expires_at': expires_at
480 }
481 post_body = json.dumps({'trust': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200482 resp, body = self.post('OS-TRUST/trusts', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400483 self.expected_success(201, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000484 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000485 return service_client.ResponseBody(resp, body['trust'])
Steven Hardybf70c5c2013-10-30 21:55:16 +0000486
487 def delete_trust(self, trust_id):
488 """Deletes a trust."""
489 resp, body = self.delete("OS-TRUST/trusts/%s" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400490 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000491 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000492
493 def get_trusts(self, trustor_user_id=None, trustee_user_id=None):
494 """GET trusts."""
495 if trustor_user_id:
496 resp, body = self.get("OS-TRUST/trusts?trustor_user_id=%s"
497 % trustor_user_id)
498 elif trustee_user_id:
499 resp, body = self.get("OS-TRUST/trusts?trustee_user_id=%s"
500 % trustee_user_id)
501 else:
502 resp, body = self.get("OS-TRUST/trusts")
David Kranze9d2f422014-07-02 13:57:41 -0400503 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000504 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000505 return service_client.ResponseBodyList(resp, body['trusts'])
Steven Hardybf70c5c2013-10-30 21:55:16 +0000506
507 def get_trust(self, trust_id):
508 """GET trust."""
509 resp, body = self.get("OS-TRUST/trusts/%s" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400510 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000511 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000512 return service_client.ResponseBody(resp, body['trust'])
Steven Hardybf70c5c2013-10-30 21:55:16 +0000513
514 def get_trust_roles(self, trust_id):
515 """GET roles delegated by a trust."""
516 resp, body = self.get("OS-TRUST/trusts/%s/roles" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400517 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000518 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000519 return service_client.ResponseBodyList(resp, body['roles'])
Steven Hardybf70c5c2013-10-30 21:55:16 +0000520
521 def get_trust_role(self, trust_id, role_id):
522 """GET role delegated by a trust."""
523 resp, body = self.get("OS-TRUST/trusts/%s/roles/%s"
524 % (trust_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400525 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000526 body = json.loads(body)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000527 return service_client.ResponseBody(resp, body['role'])
Steven Hardybf70c5c2013-10-30 21:55:16 +0000528
529 def check_trust_role(self, trust_id, role_id):
530 """HEAD Check if role is delegated by a trust."""
531 resp, body = self.head("OS-TRUST/trusts/%s/roles/%s"
532 % (trust_id, role_id))
Morgan Fainberg883311d2014-07-03 13:13:10 -0700533 self.expected_success(200, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000534 return service_client.ResponseBody(resp, body)