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": project
, "role": 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
["project"] != project
]
103 mapping
= {"project": project
, "role": role
}
104 update_user
["project_role_mappings"].append(mapping
)
106 if user
["remove-project"]:
107 for remove_project
in user
["remove-project"]:
108 update_user
["project_role_mappings"] = [mapping
for mapping
109 in update_user
["project_role_mappings"]
110 if mapping
["project"] != remove_project
]
112 if user
["add-project-role"]:
113 for add_project_role
in user
["add-project-role"]:
114 add_project_role_clean
= [m
.trim() for m
in add_project_role
.split(",")]
115 project
, roles
= add_project_role_clean
[0], add_project_role_clean
[1:]
118 mapping
= {"project": project
, "role": role
}
119 if mapping
not in update_user
["project_role_mappings"]:
120 update_user
["project_role_mappings"].append(mapping
)
122 if user
["remove-project-role"]:
123 for remove_project_role
in user
["remove-project-role"]:
124 remove_project_role_clean
= [m
.trim() for m
in remove_project_role
.split(",")]
125 project
, roles
= remove_project_role_clean
[0], remove_project_role_clean
[1:]
128 mapping_to_remove
= {"project": project
, "role": role
}
129 update_user
["project_role_mappings"] = [mapping
for mapping
130 in update_user
["project_role_mappings"]
131 if mapping
!= mapping_to_remove
]
133 if not user
["password"] and not user
["set-project"] and not user
["remove-project"] \
134 and not user
["add-project-role"] and not user
["remove-project-role"]:
135 raise ClientException("At least one parameter should be defined.")
137 http_code
, resp
= self
._http
.put_cmd(endpoint
='{}/{}'.format(self
._apiBase
,myuser
['_id']),
138 postfields_dict
=update_user
)
139 #print('HTTP CODE: {}'.format(http_code))
140 #print('RESP: {}'.format(resp))
141 if http_code
in (200, 201, 202, 204):
143 resp
= json
.loads(resp
)
144 if not resp
or 'id' not in resp
:
145 raise ClientException('unexpected response from server - {}'.format(
152 msg
= json
.loads(resp
)
155 raise ClientException("failed to update user {} - {}".format(name
, msg
))
157 def delete(self
, name
, force
=False):
158 """Deletes an existing OSM user identified by name
160 user
= self
.get(name
)
163 querystring
= '?FORCE=True'
164 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
165 user
['_id'], querystring
))
166 #print('HTTP CODE: {}'.format(http_code))
167 #print('RESP: {}'.format(resp))
169 print('Deletion in progress')
170 elif http_code
== 204:
172 elif resp
and 'result' in resp
:
178 msg
= json
.loads(resp
)
181 raise ClientException("failed to delete user {} - {}".format(name
, msg
))
183 def list(self
, filter=None):
184 """Returns the list of OSM users
188 filter_string
= '?{}'.format(filter)
189 resp
= self
._http
.get_cmd('{}{}'.format(self
._apiBase
,filter_string
))
190 #print('RESP: {}'.format(resp))
196 """Returns an OSM user based on name or id
198 if utils
.validate_uuid4(name
):
199 for user
in self
.list():
200 if name
== user
['_id']:
203 for user
in self
.list():
204 if name
== user
['username']:
206 raise NotFound("User {} not found".format(name
))