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 self
._client
.get_token()
42 if not user
["projects"] or (len(user
["projects"]) == 1 and not user
["projects"][0]):
44 elif len(user
["projects"]) == 1:
45 user
["projects"] = user
["projects"][0].split(",")
47 if user
["project_role_mappings"]:
48 project_role_mappings
= []
50 for set_mapping
in user
["project_role_mappings"]:
51 set_mapping_clean
= [m
.strip() for m
in set_mapping
.split(",")]
52 project
, roles
= set_mapping_clean
[0], set_mapping_clean
[1:]
55 mapping
= {"project": project
, "role": role
}
57 if mapping
not in project_role_mappings
:
58 project_role_mappings
.append(mapping
)
60 user
["project_role_mappings"] = project_role_mappings
62 del user
["project_role_mappings"]
64 http_code
, resp
= self
._http
.post_cmd(endpoint
=self
._apiBase
,
66 #print('HTTP CODE: {}'.format(http_code))
67 #print('RESP: {}'.format(resp))
68 if http_code
in (200, 201, 202, 204):
70 resp
= json
.loads(resp
)
71 if not resp
or 'id' not in resp
:
72 raise ClientException('unexpected response from server - {}'.format(
79 msg
= json
.loads(resp
)
82 raise ClientException("failed to create user {} - {}".format(name
, msg
))
84 def update(self
, name
, user
):
85 """Updates an existing OSM user identified by name
87 self
._client
.get_token()
89 myuser
= self
.get(name
)
91 "add_project_role_mappings": [],
92 "remove_project_role_mappings": [],
95 # if password is defined, update the password
97 update_user
["password"] = user
["password"]
99 update_user
["username"] = user
["username"]
101 if user
["set-project"]:
102 # Remove project and insert project role mapping
103 for set_project
in user
["set-project"]:
105 set_project_clean
= [m
.strip() for m
in set_project
.split(",")]
106 project
, roles
= set_project_clean
[0], set_project_clean
[1:]
108 update_user
["remove_project_role_mappings"].append({"project": project
})
111 mapping
= {"project": project
, "role": role
}
112 update_user
["add_project_role_mappings"].append(mapping
)
114 if user
["remove-project"]:
115 for remove_project
in user
["remove-project"]:
116 update_user
["remove_project_role_mappings"].append({"project": remove_project
})
118 if user
["add-project-role"]:
119 for add_project_role
in user
["add-project-role"]:
120 add_project_role_clean
= [m
.strip() for m
in add_project_role
.split(",")]
121 project
, roles
= add_project_role_clean
[0], add_project_role_clean
[1:]
124 mapping
= {"project": project
, "role": role
}
125 update_user
["add_project_role_mappings"].append(mapping
)
127 if user
["remove-project-role"]:
128 for remove_project_role
in user
["remove-project-role"]:
129 remove_project_role_clean
= [m
.strip() for m
in remove_project_role
.split(",")]
130 project
, roles
= remove_project_role_clean
[0], remove_project_role_clean
[1:]
133 mapping
= {"project": project
, "role": role
}
134 update_user
["remove_project_role_mappings"].append(mapping
)
136 if not update_user
["remove_project_role_mappings"]:
137 del update_user
["remove_project_role_mappings"]
138 if not update_user
["add_project_role_mappings"]:
139 del update_user
["add_project_role_mappings"]
141 raise ClientException("At least something should be changed.")
143 http_code
, resp
= self
._http
.put_cmd(endpoint
='{}/{}'.format(self
._apiBase
, myuser
['_id']),
144 postfields_dict
=update_user
)
145 # print('HTTP CODE: {}'.format(http_code))
146 # print('RESP: {}'.format(resp))
147 if http_code
in (200, 201, 202):
149 resp
= json
.loads(resp
)
150 if not resp
or 'id' not in resp
:
151 raise ClientException('unexpected response from server - {}'.format(
154 elif http_code
== 204:
160 msg
= json
.loads(resp
)
163 raise ClientException("failed to update user {} - {}".format(name
, msg
))
165 def delete(self
, name
, force
=False):
166 """Deletes an existing OSM user identified by name
168 self
._client
.get_token()
169 user
= self
.get(name
)
172 querystring
= '?FORCE=True'
173 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
174 user
['_id'], querystring
))
175 #print('HTTP CODE: {}'.format(http_code))
176 #print('RESP: {}'.format(resp))
178 print('Deletion in progress')
179 elif http_code
== 204:
181 elif resp
and 'result' in resp
:
187 msg
= json
.loads(resp
)
190 raise ClientException("failed to delete user {} - {}".format(name
, msg
))
192 def list(self
, filter=None):
193 """Returns the list of OSM users
195 self
._client
.get_token()
198 filter_string
= '?{}'.format(filter)
199 resp
= self
._http
.get_cmd('{}{}'.format(self
._apiBase
,filter_string
))
200 #print('RESP: {}'.format(resp))
206 """Returns an OSM user based on name or id
208 self
._client
.get_token()
209 if utils
.validate_uuid4(name
):
210 for user
in self
.list():
211 if name
== user
['_id']:
214 for user
in self
.list():
215 if name
== user
['username']:
217 raise NotFound("User {} not found".format(name
))