blob: 4c194420cae521b82a6a42501c2dc7660349b71b [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
Matthew Treinish21905512015-07-13 10:33:35 -040016from oslo_serialization import jsonutils as json
Matthew Treinish89128142015-04-23 10:44:30 -040017from six.moves.urllib import parse as urllib
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053018
Ken'ichi Ohmichi0e836652015-01-08 04:38:56 +000019from tempest.common import service_client
Matthew Treinish684d8992014-01-30 16:27:40 +000020
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053021
Ken'ichi Ohmichia6287072015-07-02 02:43:15 +000022class IdentityV3Client(service_client.ServiceClient):
ghanshyamd26b5cd2015-02-09 14:48:58 +090023 api_version = "v3"
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053024
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000025 def show_api_description(self):
Filip Hubík81354052015-03-09 19:04:23 +010026 """Retrieves info about the v3 Identity API"""
27 url = ''
28 resp, body = self.get(url)
29 self.expected_success(200, resp.status)
Anusha Raminenie3ed3562015-08-24 11:43:56 +053030 body = json.loads(body)
31 return service_client.ResponseBody(resp, body)
Filip Hubík81354052015-03-09 19:04:23 +010032
piyush110786afaaf262015-12-11 18:54:05 +053033 def create_role(self, **kwargs):
34 """Create a Role.
35
36 Available params: see http://developer.openstack.org/
37 api-ref-identity-v3.html#createRole
38 """
39 post_body = json.dumps({'role': kwargs})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020040 resp, body = self.post('roles', post_body)
David Kranze9d2f422014-07-02 13:57:41 -040041 self.expected_success(201, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053042 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +000043 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053044
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +000045 def show_role(self, role_id):
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053046 """GET a Role."""
47 resp, body = self.get('roles/%s' % str(role_id))
David Kranze9d2f422014-07-02 13:57:41 -040048 self.expected_success(200, resp.status)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053049 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +000050 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053051
wanglianmina3e84ea2014-03-26 17:30:33 +080052 def list_roles(self):
53 """Get the list of Roles."""
54 resp, body = self.get("roles")
David Kranze9d2f422014-07-02 13:57:41 -040055 self.expected_success(200, resp.status)
wanglianmina3e84ea2014-03-26 17:30:33 +080056 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +000057 return service_client.ResponseBody(resp, body)
wanglianmina3e84ea2014-03-26 17:30:33 +080058
piyush11078619851152015-12-14 18:06:24 +053059 def update_role(self, role_id, **kwargs):
60 """Update a Role.
61
62 Available params: see http://developer.openstack.org/
63 api-ref-identity-v3.html#updateRole
64 """
65 post_body = json.dumps({'role': kwargs})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020066 resp, body = self.patch('roles/%s' % str(role_id), post_body)
David Kranze9d2f422014-07-02 13:57:41 -040067 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +000068 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +000069 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +000070
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053071 def delete_role(self, role_id):
72 """Delete a role."""
73 resp, body = self.delete('roles/%s' % str(role_id))
David Kranze9d2f422014-07-02 13:57:41 -040074 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +000075 return service_client.ResponseBody(resp, body)
rajalakshmi-ganesan7312bb52013-01-29 20:03:42 +053076
77 def assign_user_role(self, project_id, user_id, role_id):
78 """Add roles to a user on a project."""
79 resp, body = self.put('projects/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020080 (project_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -040081 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +000082 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +000083
84 def create_domain(self, name, **kwargs):
85 """Creates a domain."""
86 description = kwargs.get('description', None)
87 en = kwargs.get('enabled', True)
88 post_body = {
89 'description': description,
90 'enabled': en,
91 'name': name
92 }
93 post_body = json.dumps({'domain': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +020094 resp, body = self.post('domains', post_body)
David Kranze9d2f422014-07-02 13:57:41 -040095 self.expected_success(201, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +000096 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +000097 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +000098
99 def delete_domain(self, domain_id):
100 """Delete a domain."""
101 resp, body = self.delete('domains/%s' % str(domain_id))
David Kranze9d2f422014-07-02 13:57:41 -0400102 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000103 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +0000104
Andrea Frittolic3280152015-02-26 12:42:34 +0000105 def list_domains(self, params=None):
nayna-patel4df72dc2013-05-29 10:27:24 +0000106 """List Domains."""
Andrea Frittolic3280152015-02-26 12:42:34 +0000107 url = 'domains'
108 if params:
109 url += '?%s' % urllib.urlencode(params)
110 resp, body = self.get(url)
David Kranze9d2f422014-07-02 13:57:41 -0400111 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000112 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000113 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +0000114
115 def update_domain(self, domain_id, **kwargs):
116 """Updates a domain."""
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000117 body = self.show_domain(domain_id)['domain']
nayna-patel4df72dc2013-05-29 10:27:24 +0000118 description = kwargs.get('description', body['description'])
119 en = kwargs.get('enabled', body['enabled'])
120 name = kwargs.get('name', body['name'])
121 post_body = {
122 'description': description,
123 'enabled': en,
124 'name': name
125 }
126 post_body = json.dumps({'domain': post_body})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200127 resp, body = self.patch('domains/%s' % domain_id, post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400128 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000129 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000130 return service_client.ResponseBody(resp, body)
nayna-patel4df72dc2013-05-29 10:27:24 +0000131
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000132 def show_domain(self, domain_id):
nayna-patel4df72dc2013-05-29 10:27:24 +0000133 """Get Domain details."""
134 resp, body = self.get('domains/%s' % domain_id)
David Kranze9d2f422014-07-02 13:57:41 -0400135 self.expected_success(200, resp.status)
nayna-patel4df72dc2013-05-29 10:27:24 +0000136 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000137 return service_client.ResponseBody(resp, body)
nayna-patelb35f7232013-06-28 07:08:44 +0000138
Ken'ichi Ohmichi402b8752015-11-09 10:47:16 +0000139 def show_token(self, resp_token):
nayna-patelb35f7232013-06-28 07:08:44 +0000140 """Get token details."""
141 headers = {'X-Subject-Token': resp_token}
142 resp, body = self.get("auth/tokens", headers=headers)
David Kranze9d2f422014-07-02 13:57:41 -0400143 self.expected_success(200, resp.status)
nayna-patelb35f7232013-06-28 07:08:44 +0000144 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000145 return service_client.ResponseBody(resp, body)
nayna-patelb35f7232013-06-28 07:08:44 +0000146
147 def delete_token(self, resp_token):
148 """Deletes token."""
149 headers = {'X-Subject-Token': resp_token}
150 resp, body = self.delete("auth/tokens", headers=headers)
David Kranze9d2f422014-07-02 13:57:41 -0400151 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000152 return service_client.ResponseBody(resp, body)
nayna-patelb35f7232013-06-28 07:08:44 +0000153
nayna-patel755d8142013-07-16 06:45:34 +0000154 def assign_user_role_on_project(self, project_id, user_id, role_id):
155 """Add roles to a user on a project."""
156 resp, body = self.put('projects/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200157 (project_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400158 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000159 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000160
161 def assign_user_role_on_domain(self, domain_id, user_id, role_id):
162 """Add roles to a user on a domain."""
163 resp, body = self.put('domains/%s/users/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200164 (domain_id, user_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400165 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000166 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000167
168 def list_user_roles_on_project(self, project_id, user_id):
169 """list roles of a user on a project."""
170 resp, body = self.get('projects/%s/users/%s/roles' %
171 (project_id, user_id))
David Kranze9d2f422014-07-02 13:57:41 -0400172 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000173 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000174 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000175
176 def list_user_roles_on_domain(self, domain_id, user_id):
177 """list roles of a user on a domain."""
178 resp, body = self.get('domains/%s/users/%s/roles' %
179 (domain_id, user_id))
David Kranze9d2f422014-07-02 13:57:41 -0400180 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000181 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000182 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000183
Ken'ichi Ohmichib8461cb2015-11-20 08:10:51 +0000184 def delete_role_from_user_on_project(self, project_id, user_id, role_id):
nayna-patel755d8142013-07-16 06:45:34 +0000185 """Delete role of a user on a project."""
186 resp, body = self.delete('projects/%s/users/%s/roles/%s' %
187 (project_id, user_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400188 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000189 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000190
Ken'ichi Ohmichib8461cb2015-11-20 08:10:51 +0000191 def delete_role_from_user_on_domain(self, domain_id, user_id, role_id):
nayna-patel755d8142013-07-16 06:45:34 +0000192 """Delete role of a user on a domain."""
193 resp, body = self.delete('domains/%s/users/%s/roles/%s' %
194 (domain_id, user_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400195 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000196 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000197
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900198 def check_user_role_existence_on_project(self, project_id,
199 user_id, role_id):
200 """Check role of a user on a project."""
201 resp, body = self.head('projects/%s/users/%s/roles/%s' %
202 (project_id, user_id, role_id))
203 self.expected_success(204, resp.status)
204 return service_client.ResponseBody(resp)
205
206 def check_user_role_existence_on_domain(self, domain_id,
207 user_id, role_id):
208 """Check role of a user on a domain."""
209 resp, body = self.head('domains/%s/users/%s/roles/%s' %
210 (domain_id, user_id, role_id))
211 self.expected_success(204, resp.status)
212 return service_client.ResponseBody(resp)
213
nayna-patel755d8142013-07-16 06:45:34 +0000214 def assign_group_role_on_project(self, project_id, group_id, role_id):
215 """Add roles to a user on a project."""
216 resp, body = self.put('projects/%s/groups/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200217 (project_id, group_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400218 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000219 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000220
221 def assign_group_role_on_domain(self, domain_id, group_id, role_id):
222 """Add roles to a user on a domain."""
223 resp, body = self.put('domains/%s/groups/%s/roles/%s' %
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200224 (domain_id, group_id, role_id), None)
David Kranze9d2f422014-07-02 13:57:41 -0400225 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000226 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000227
228 def list_group_roles_on_project(self, project_id, group_id):
229 """list roles of a user on a project."""
230 resp, body = self.get('projects/%s/groups/%s/roles' %
231 (project_id, group_id))
David Kranze9d2f422014-07-02 13:57:41 -0400232 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000233 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000234 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000235
236 def list_group_roles_on_domain(self, domain_id, group_id):
237 """list roles of a user on a domain."""
238 resp, body = self.get('domains/%s/groups/%s/roles' %
239 (domain_id, group_id))
David Kranze9d2f422014-07-02 13:57:41 -0400240 self.expected_success(200, resp.status)
nayna-patel755d8142013-07-16 06:45:34 +0000241 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000242 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000243
Ken'ichi Ohmichib8461cb2015-11-20 08:10:51 +0000244 def delete_role_from_group_on_project(self, project_id, group_id, role_id):
nayna-patel755d8142013-07-16 06:45:34 +0000245 """Delete role of a user on a project."""
246 resp, body = self.delete('projects/%s/groups/%s/roles/%s' %
247 (project_id, group_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400248 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000249 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000250
Ken'ichi Ohmichib8461cb2015-11-20 08:10:51 +0000251 def delete_role_from_group_on_domain(self, domain_id, group_id, role_id):
nayna-patel755d8142013-07-16 06:45:34 +0000252 """Delete role of a user on a domain."""
253 resp, body = self.delete('domains/%s/groups/%s/roles/%s' %
254 (domain_id, group_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400255 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000256 return service_client.ResponseBody(resp, body)
nayna-patel755d8142013-07-16 06:45:34 +0000257
Maho Koshiyab6fa2e42015-12-07 16:52:53 +0900258 def check_role_from_group_on_project_existence(self, project_id,
259 group_id, role_id):
260 """Check role of a user on a project."""
261 resp, body = self.head('projects/%s/groups/%s/roles/%s' %
262 (project_id, group_id, role_id))
263 self.expected_success(204, resp.status)
264 return service_client.ResponseBody(resp)
265
266 def check_role_from_group_on_domain_existence(self, domain_id,
267 group_id, role_id):
268 """Check role of a user on a domain."""
269 resp, body = self.head('domains/%s/groups/%s/roles/%s' %
270 (domain_id, group_id, role_id))
271 self.expected_success(204, resp.status)
272 return service_client.ResponseBody(resp)
273
piyush1107864d7553a2015-12-10 10:57:40 +0530274 def create_trust(self, **kwargs):
275 """Creates a trust.
276
277 Available params: see http://developer.openstack.org/
278 api-ref-identity-v3-ext.html#createTrust
279 """
280 post_body = json.dumps({'trust': kwargs})
Valeriy Ponomaryov88686d82014-02-16 12:24:51 +0200281 resp, body = self.post('OS-TRUST/trusts', post_body)
David Kranze9d2f422014-07-02 13:57:41 -0400282 self.expected_success(201, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000283 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000284 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000285
286 def delete_trust(self, trust_id):
287 """Deletes a trust."""
288 resp, body = self.delete("OS-TRUST/trusts/%s" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400289 self.expected_success(204, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000290 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000291
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000292 def list_trusts(self, trustor_user_id=None, trustee_user_id=None):
Steven Hardybf70c5c2013-10-30 21:55:16 +0000293 """GET trusts."""
294 if trustor_user_id:
295 resp, body = self.get("OS-TRUST/trusts?trustor_user_id=%s"
296 % trustor_user_id)
297 elif trustee_user_id:
298 resp, body = self.get("OS-TRUST/trusts?trustee_user_id=%s"
299 % trustee_user_id)
300 else:
301 resp, body = self.get("OS-TRUST/trusts")
David Kranze9d2f422014-07-02 13:57:41 -0400302 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000303 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000304 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000305
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000306 def show_trust(self, trust_id):
Steven Hardybf70c5c2013-10-30 21:55:16 +0000307 """GET trust."""
308 resp, body = self.get("OS-TRUST/trusts/%s" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400309 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000310 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000311 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000312
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000313 def list_trust_roles(self, trust_id):
Steven Hardybf70c5c2013-10-30 21:55:16 +0000314 """GET roles delegated by a trust."""
315 resp, body = self.get("OS-TRUST/trusts/%s/roles" % trust_id)
David Kranze9d2f422014-07-02 13:57:41 -0400316 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000317 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000318 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000319
Ken'ichi Ohmichi2c4cb0c2016-02-03 07:16:21 +0000320 def show_trust_role(self, trust_id, role_id):
Steven Hardybf70c5c2013-10-30 21:55:16 +0000321 """GET role delegated by a trust."""
322 resp, body = self.get("OS-TRUST/trusts/%s/roles/%s"
323 % (trust_id, role_id))
David Kranze9d2f422014-07-02 13:57:41 -0400324 self.expected_success(200, resp.status)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000325 body = json.loads(body)
John Warren56317e02015-08-12 20:48:32 +0000326 return service_client.ResponseBody(resp, body)
Steven Hardybf70c5c2013-10-30 21:55:16 +0000327
328 def check_trust_role(self, trust_id, role_id):
329 """HEAD Check if role is delegated by a trust."""
330 resp, body = self.head("OS-TRUST/trusts/%s/roles/%s"
331 % (trust_id, role_id))
Morgan Fainberg883311d2014-07-03 13:13:10 -0700332 self.expected_success(200, resp.status)
Ken'ichi Ohmichia6ac2422015-01-13 01:09:39 +0000333 return service_client.ResponseBody(resp, body)