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 not user
["projects"] or (len(user
["projects"]) == 1 and not user
["projects"][0]):
43 elif len(user
["projects"]) == 1:
44 user
["projects"] = user
["projects"][0].split(",")
46 if user
["project_role_mappings"]:
47 project_role_mappings
= []
49 for set_mapping
in user
["project_role_mappings"]:
50 set_mapping_clean
= [m
.strip() for m
in set_mapping
.split(",")]
51 project
, roles
= set_mapping_clean
[0], set_mapping_clean
[1:]
54 mapping
= {"project": project
, "role": role
}
56 if mapping
not in project_role_mappings
:
57 project_role_mappings
.append(mapping
)
59 user
["project_role_mappings"] = project_role_mappings
61 del user
["project_role_mappings"]
63 http_code
, resp
= self
._http
.post_cmd(endpoint
=self
._apiBase
,
65 #print('HTTP CODE: {}'.format(http_code))
66 #print('RESP: {}'.format(resp))
67 if http_code
in (200, 201, 202, 204):
69 resp
= json
.loads(resp
)
70 if not resp
or 'id' not in resp
:
71 raise ClientException('unexpected response from server - {}'.format(
78 msg
= json
.loads(resp
)
81 raise ClientException("failed to create user {} - {}".format(name
, msg
))
83 def update(self
, name
, user
):
84 """Updates an existing OSM user identified by name
86 myuser
= self
.get(name
)
88 "username": myuser
["username"],
89 "project_role_mappings": myuser
["project_role_mappings"]
92 # if password is defined, update the password
94 update_user
["password"] = user
["password"]
96 if user
["set-project"]:
97 for set_project
in user
["set-project"]:
98 set_project_clean
= [m
.strip() for m
in set_project
.split(",")]
99 project
, roles
= set_project_clean
[0], set_project_clean
[1:]
101 update_user
["project_role_mappings"] = [mapping
for mapping
102 in update_user
["project_role_mappings"]
103 if mapping
["project"] != project
]
106 mapping
= {"project": project
, "role": role
}
107 update_user
["project_role_mappings"].append(mapping
)
109 if user
["remove-project"]:
110 for remove_project
in user
["remove-project"]:
111 update_user
["project_role_mappings"] = [mapping
for mapping
112 in update_user
["project_role_mappings"]
113 if mapping
["project"] != remove_project
]
115 if user
["add-project-role"]:
116 for add_project_role
in user
["add-project-role"]:
117 add_project_role_clean
= [m
.strip() for m
in add_project_role
.split(",")]
118 project
, roles
= add_project_role_clean
[0], add_project_role_clean
[1:]
121 mapping
= {"project": project
, "role": role
}
122 if mapping
not in update_user
["project_role_mappings"]:
123 update_user
["project_role_mappings"].append(mapping
)
125 if user
["remove-project-role"]:
126 for remove_project_role
in user
["remove-project-role"]:
127 remove_project_role_clean
= [m
.strip() for m
in remove_project_role
.split(",")]
128 project
, roles
= remove_project_role_clean
[0], remove_project_role_clean
[1:]
131 mapping_to_remove
= {"project": project
, "role": role
}
132 update_user
["project_role_mappings"] = [mapping
for mapping
133 in update_user
["project_role_mappings"]
134 if mapping
!= mapping_to_remove
]
136 if not user
["password"] and not user
["set-project"] and not user
["remove-project"] \
137 and not user
["add-project-role"] and not user
["remove-project-role"]:
138 raise ClientException("At least one parameter should be defined.")
140 http_code
, resp
= self
._http
.put_cmd(endpoint
='{}/{}'.format(self
._apiBase
, myuser
['_id']),
141 postfields_dict
=update_user
)
142 # print('HTTP CODE: {}'.format(http_code))
143 # print('RESP: {}'.format(resp))
144 if http_code
in (200, 201, 202):
146 resp
= json
.loads(resp
)
147 if not resp
or 'id' not in resp
:
148 raise ClientException('unexpected response from server - {}'.format(
151 elif http_code
== 204:
157 msg
= json
.loads(resp
)
160 raise ClientException("failed to update user {} - {}".format(name
, msg
))
162 def delete(self
, name
, force
=False):
163 """Deletes an existing OSM user identified by name
165 user
= self
.get(name
)
168 querystring
= '?FORCE=True'
169 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
170 user
['_id'], querystring
))
171 #print('HTTP CODE: {}'.format(http_code))
172 #print('RESP: {}'.format(resp))
174 print('Deletion in progress')
175 elif http_code
== 204:
177 elif resp
and 'result' in resp
:
183 msg
= json
.loads(resp
)
186 raise ClientException("failed to delete user {} - {}".format(name
, msg
))
188 def list(self
, filter=None):
189 """Returns the list of OSM users
193 filter_string
= '?{}'.format(filter)
194 resp
= self
._http
.get_cmd('{}{}'.format(self
._apiBase
,filter_string
))
195 #print('RESP: {}'.format(resp))
201 """Returns an OSM user based on name or id
203 if utils
.validate_uuid4(name
):
204 for user
in self
.list():
205 if name
== user
['_id']:
208 for user
in self
.list():
209 if name
== user
['username']:
211 raise NotFound("User {} not found".format(name
))