@@ -175,6 +175,141 @@ def _get_parameter_string(self, parameters={}):
175175 parameter_string = "&" .join (["{}={}" .format (k ,v ) for k ,v in parameters .items ()])
176176 return "?" + parameter_string
177177
178+ ###
179+ #
180+ # Role stuff
181+ #
182+ ###
183+ def _get_role_url (self ):
184+ return self .config ['baseurl' ] + "/api/roles"
185+
186+ def get_roles (self , parameters = {}):
187+ url = self ._get_role_url () + self ._get_parameter_string (parameters )
188+ response = self .execute_get (url )
189+ return response .json ()
190+
191+ def get_roles_url_from_user_or_group (self , user_or_group ):
192+ roles_url = None
193+ for endpoint in user_or_group ['_meta' ]['links' ]:
194+ if endpoint ['rel' ] == "roles" :
195+ roles_url = endpoint ['href' ]
196+ return roles_url
197+
198+ def get_roles_for_user_or_group (self , user_or_group ):
199+ roles_url = self .get_roles_url_from_user_or_group (user_or_group )
200+ if roles_url :
201+ return self .execute_get (roles_url )
202+ else :
203+ return None
204+
205+ def get_role_url_by_name (self , role_name ):
206+ # Return the role URL for this server corresponding to the role name
207+ all_roles = self .get_roles ()
208+ for role in all_roles ['items' ]:
209+ if role ['name' ] == role_name :
210+ return role ['_meta' ]['href' ]
211+ return None
212+
213+ def assign_role_to_user_or_group (self , role_name , user_or_group ):
214+ user_or_group_roles_url = self .get_roles_url_from_user_or_group (user_or_group )
215+ return self .assign_role_given_role_url (role_name , user_or_group_roles_url )
216+
217+ def assign_role_given_role_url (self , role_name , user_or_group_role_assignment_url ):
218+ role_url = self .get_role_url_by_name (role_name )
219+ if self .bd_major_version == "3" :
220+ # A hack to get the assignment to work on v3
221+ role_url = role_url .replace ("api" , "api/internal" )
222+ data = {"name" : role_name , "role" : role_url }
223+ logging .debug ("executing POST to {} with {}" .format (
224+ user_or_group_role_assignment_url , data ))
225+ return self .execute_post (user_or_group_role_assignment_url , data = data )
226+
227+
228+ ###
229+ #
230+ # User stuff
231+ #
232+ ###
233+ def _get_user_url (self ):
234+ return self .config ['baseurl' ] + "/api/users"
235+
236+ def get_users (self , parameters = {}):
237+ url = self ._get_user_url () + self ._get_parameter_string (parameters )
238+ response = self .execute_get (url )
239+ return response .json ()
240+
241+ def create_user (self , user_json ):
242+ url = self ._get_user_url ()
243+ location = self ._create (url , user_json )
244+ return location
245+
246+ def get_user_by_id (self , user_id ):
247+ url = self ._get_user_url () + "/{}" .format (user_id )
248+ return self .get_user_by_url (url )
249+
250+ def get_user_by_url (self , user_url ):
251+ response = self .execute_get (user_url )
252+ jsondata = response .json ()
253+ return jsondata
254+
255+ def update_user_by_id (self , user_id , update_json ):
256+ url = self ._get_user_url () + "/{}" .format (user_id )
257+ return self .update_user_by_url (url , update_json )
258+
259+ def update_user_by_url (self , user_url , update_json ):
260+ return self .execute_put (user_url , update_json )
261+
262+ def delete_user_by_id (self , user_id ):
263+ url = self ._get_user_url () + "/{}" .format (user_id )
264+ return self .delete_user_by_url (url )
265+
266+ def delete_user_by_url (self , user_url ):
267+ return self .execute_delete (user_url )
268+
269+ ###
270+ #
271+ # User group stuff
272+ #
273+ ###
274+ def _get_user_group_url (self ):
275+ return self .config ['baseurl' ] + "/api/usergroups"
276+
277+ def get_user_groups (self , parameters = {}):
278+ url = self ._get_user_group_url () + self ._get_parameter_string (parameters )
279+ response = self .execute_get (url )
280+ return response .json ()
281+
282+ def create_user_group (self , user_group_json ):
283+ if self .bd_major_version == "3" :
284+ url = self .config ['baseurl' ] + '/api/v1/usergroups'
285+ else :
286+ url = self ._get_user_group_url ()
287+ location = self ._create (url , user_group_json )
288+ return location
289+
290+ def get_user_group_by_id (self , user_group_id ):
291+ url = self ._get_user_group_url () + "/{}" .format (user_group_id )
292+ return self .get_user_group_by_url (url )
293+
294+ def get_user_group_by_url (self , user_group_url ):
295+ response = self .execute_get (user_group_url )
296+ jsondata = response .json ()
297+ return jsondata
298+
299+ def update_user_group_by_id (self , user_group_id , update_json ):
300+ url = self ._get_user_group_url () + "/{}" .format (user_group_id )
301+ return self .update_user_group_by_url (url , update_json )
302+
303+ def update_user_group_by_url (self , user_group_url , update_json ):
304+ return self .execute_put (user_group_url , update_json )
305+
306+ def delete_user_group_by_id (self , user_group_id ):
307+ url = self ._get_user_group_url () + "/{}" .format (user_group_id )
308+ return self .delete_user_group_by_url (url )
309+
310+ def delete_user_group_by_url (self , user_group_url ):
311+ return self .execute_delete (user_group_url )
312+
178313 ###
179314 #
180315 # Policy stuff
@@ -527,8 +662,19 @@ def execute_put(self, url, data):
527662
528663 def _create (self , url , json_body ):
529664 response = self .execute_post (url , json_body )
530- if response .status_code == 201 and "location" in response .headers :
531- return (response .headers ["location" ])
665+ response_json = response .json ()
666+ # v4+ returns the newly created location in the response headers
667+ # and there is nothing in the response json
668+ # whereas v3 returns the newly created object in the response json
669+ if response .status_code == 201 :
670+ if "location" in response .headers :
671+ return (response .headers ["location" ])
672+ elif '_meta' in response_json and 'href' in response_json ['_meta' ]:
673+ return response_json ['_meta' ]['href' ]
674+ else :
675+ # worst case, try returning the whole response json and let
676+ # client figure it out
677+ return response .json ()
532678 elif response .status_code == 412 :
533679 raise CreateFailedAlreadyExists ("Failed to create the object because it already exists - url {}, body {}, response {}" .format (url , json_body , response ))
534680 else :
0 commit comments