2 # Copyright 2018 Telefonica Investigacion y Desarrollo S.A.U.
6 # Licensed under the Apache License, Version 2.0 (the "License"); you may
7 # not use this file except in compliance with the License. You may obtain
8 # a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15 # License for the specific language governing permissions and limitations
22 from osmclient
.common
import utils
23 from osmclient
.common
.exceptions
import ClientException
24 from osmclient
.common
.exceptions
import NotFound
29 def __init__(self
, http
=None, client
=None):
32 self
._apiName
= '/admin'
33 self
._apiVersion
= '/v1'
34 self
._apiResource
= '/users'
35 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
36 self
._apiVersion
, self
._apiResource
)
38 def create(self
, name
, user
):
39 """Creates a new OSM user
41 if len(user
["projects"]) == 1:
42 user
["projects"] = user
["projects"][0].split(",")
44 if user
["project-role-mappings"]:
45 project_role_mappings
= []
47 for set_mapping
in user
["project-role-mappings"]:
48 set_mapping_clean
= [m
.trim() for m
in set_mapping
.split(",")]
49 project
, roles
= set_mapping_clean
[0], set_mapping_clean
[1:]
52 mapping
= [project
, role
]
54 if mapping
not in project_role_mappings
:
55 project_role_mappings
.append(mapping
)
57 user
["project-role-mappings"] = project_role_mappings
59 http_code
, resp
= self
._http
.post_cmd(endpoint
=self
._apiBase
,
61 #print('HTTP CODE: {}'.format(http_code))
62 #print('RESP: {}'.format(resp))
63 if http_code
in (200, 201, 202, 204):
65 resp
= json
.loads(resp
)
66 if not resp
or 'id' not in resp
:
67 raise ClientException('unexpected response from server - {}'.format(
74 msg
= json
.loads(resp
)
77 raise ClientException("failed to create user {} - {}".format(name
, msg
))
79 def update(self
, name
, user
):
80 """Updates an existing OSM user identified by name
82 myuser
= self
.get(name
)
85 "name": myuser
["user"],
86 "project_role_mappings": myuser
["project_role_mappings"]
89 # if password is defined, update the password
91 update_user
["password"] = user
["password"]
93 if user
["set-project"]:
94 for set_project
in user
["set-project"]:
95 set_project_clean
= [m
.trim() for m
in set_project
.split(",")]
96 project
, roles
= set_project_clean
[0], set_project_clean
[1:]
98 update_user
["project_role_mappings"] = [mapping
for mapping
99 in update_user
["project_role_mappings"]
100 if mapping
[0] != project
]
103 update_user
["project_role_mappings"].append([project
, role
])
105 if user
["remove-project"]:
106 for remove_project
in user
["remove-project"]:
107 update_user
["project_role_mappings"] = [mapping
for mapping
108 in update_user
["project_role_mappings"]
109 if mapping
[0] != remove_project
]
111 if user
["add-project-role"]:
112 for add_project_role
in user
["add-project-role"]:
113 add_project_role_clean
= [m
.trim() for m
in add_project_role
.split(",")]
114 project
, roles
= add_project_role_clean
[0], add_project_role_clean
[1:]
117 mapping
= [project
, role
]
118 if mapping
not in update_user
["project_role_mappings"]:
119 update_user
["project_role_mappings"].append(mapping
)
121 if user
["remove-project-role"]:
122 for remove_project_role
in user
["remove-project-role"]:
123 remove_project_role_clean
= [m
.trim() for m
in remove_project_role
.split(",")]
124 project
, roles
= remove_project_role_clean
[0], remove_project_role_clean
[1:]
127 mapping_to_remove
= [project
, role
]
128 update_user
["project_role_mappings"] = [mapping
for mapping
129 in update_user
["project_role_mappings"]
130 if mapping
!= mapping_to_remove
]
132 if not user
["password"] and not user
["set-project"] and not user
["remove-project"] \
133 and not user
["add-project-role"] and not user
["remove-project-role"]:
134 raise ClientException("At least one parameter should be defined.")
136 http_code
, resp
= self
._http
.put_cmd(endpoint
='{}/{}'.format(self
._apiBase
,myuser
['_id']),
137 postfields_dict
=update_user
)
138 #print('HTTP CODE: {}'.format(http_code))
139 #print('RESP: {}'.format(resp))
140 if http_code
in (200, 201, 202, 204):
142 resp
= json
.loads(resp
)
143 if not resp
or 'id' not in resp
:
144 raise ClientException('unexpected response from server - {}'.format(
151 msg
= json
.loads(resp
)
154 raise ClientException("failed to update user {} - {}".format(name
, msg
))
156 def delete(self
, name
, force
=False):
157 """Deletes an existing OSM user identified by name
159 user
= self
.get(name
)
162 querystring
= '?FORCE=True'
163 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
164 user
['_id'], querystring
))
165 #print('HTTP CODE: {}'.format(http_code))
166 #print('RESP: {}'.format(resp))
168 print('Deletion in progress')
169 elif http_code
== 204:
171 elif resp
and 'result' in resp
:
177 msg
= json
.loads(resp
)
180 raise ClientException("failed to delete user {} - {}".format(name
, msg
))
182 def list(self
, filter=None):
183 """Returns the list of OSM users
187 filter_string
= '?{}'.format(filter)
188 resp
= self
._http
.get_cmd('{}{}'.format(self
._apiBase
,filter_string
))
189 #print('RESP: {}'.format(resp))
195 """Returns an OSM user based on name or id
197 if utils
.validate_uuid4(name
):
198 for user
in self
.list():
199 if name
== user
['_id']:
202 for user
in self
.list():
203 if name
== user
['username']:
205 raise NotFound("User {} not found".format(name
))