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
.exceptions
import ClientException
23 from osmclient
.common
.exceptions
import NotFound
29 def __init__(self
, http
=None, client
=None):
32 self
._logger
= logging
.getLogger('osmclient')
33 self
._apiName
= '/admin'
34 self
._apiVersion
= '/v1'
35 self
._apiResource
= '/users'
36 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
37 self
._apiVersion
, self
._apiResource
)
39 def create(self
, name
, user
):
40 """Creates a new OSM user
42 self
._logger
.debug("")
43 self
._client
.get_token()
44 if not user
["projects"] or (len(user
["projects"]) == 1 and not user
["projects"][0]):
46 elif len(user
["projects"]) == 1:
47 user
["projects"] = user
["projects"][0].split(",")
49 if user
["project_role_mappings"]:
50 project_role_mappings
= []
52 for set_mapping
in user
["project_role_mappings"]:
53 set_mapping_clean
= [m
.strip() for m
in set_mapping
.split(",")]
54 project
, roles
= set_mapping_clean
[0], set_mapping_clean
[1:]
57 mapping
= {"project": project
, "role": role
}
59 if mapping
not in project_role_mappings
:
60 project_role_mappings
.append(mapping
)
61 user
["project_role_mappings"] = project_role_mappings
63 del user
["project_role_mappings"]
65 http_code
, resp
= self
._http
.post_cmd(endpoint
=self
._apiBase
,
67 skip_query_admin
=True)
68 #print('HTTP CODE: {}'.format(http_code))
69 #print('RESP: {}'.format(resp))
70 #if http_code in (200, 201, 202, 204):
72 resp
= json
.loads(resp
)
73 if not resp
or 'id' not in resp
:
74 raise ClientException('unexpected response from server - {}'.format(
81 # msg = json.loads(resp)
84 # raise ClientException("failed to create user {} - {}".format(name, msg))
86 def update(self
, name
, user
):
87 """Updates an existing OSM user identified by name
89 self
._logger
.debug("")
90 self
._client
.get_token()
92 myuser
= self
.get(name
)
94 "add_project_role_mappings": [],
95 "remove_project_role_mappings": [],
98 # if password is defined, update the password
100 update_user
["password"] = user
["password"]
102 update_user
["username"] = user
["username"]
104 if user
["set-project"]:
105 # Remove project and insert project role mapping
106 for set_project
in user
["set-project"]:
108 set_project_clean
= [m
.strip() for m
in set_project
.split(",")]
109 project
, roles
= set_project_clean
[0], set_project_clean
[1:]
111 update_user
["remove_project_role_mappings"].append({"project": project
})
114 mapping
= {"project": project
, "role": role
}
115 update_user
["add_project_role_mappings"].append(mapping
)
117 if user
["remove-project"]:
118 for remove_project
in user
["remove-project"]:
119 update_user
["remove_project_role_mappings"].append({"project": remove_project
})
121 if user
["add-project-role"]:
122 for add_project_role
in user
["add-project-role"]:
123 add_project_role_clean
= [m
.strip() for m
in add_project_role
.split(",")]
124 project
, roles
= add_project_role_clean
[0], add_project_role_clean
[1:]
127 mapping
= {"project": project
, "role": role
}
128 update_user
["add_project_role_mappings"].append(mapping
)
130 if user
["remove-project-role"]:
131 for remove_project_role
in user
["remove-project-role"]:
132 remove_project_role_clean
= [m
.strip() for m
in remove_project_role
.split(",")]
133 project
, roles
= remove_project_role_clean
[0], remove_project_role_clean
[1:]
136 mapping
= {"project": project
, "role": role
}
137 update_user
["remove_project_role_mappings"].append(mapping
)
139 if not update_user
["remove_project_role_mappings"]:
140 del update_user
["remove_project_role_mappings"]
141 if not update_user
["add_project_role_mappings"]:
142 del update_user
["add_project_role_mappings"]
144 raise ClientException("At least something should be changed.")
146 http_code
, resp
= self
._http
.patch_cmd(endpoint
='{}/{}'.format(self
._apiBase
, myuser
['_id']),
147 postfields_dict
=update_user
, skip_query_admin
=True)
148 # print('HTTP CODE: {}'.format(http_code))
149 # print('RESP: {}'.format(resp))
150 if http_code
in (200, 201, 202):
152 resp
= json
.loads(resp
)
153 if not resp
or 'id' not in resp
:
154 raise ClientException('unexpected response from server - {}'.format(
157 elif http_code
== 204:
163 # msg = json.loads(resp)
166 # raise ClientException("failed to update user {} - {}".format(name, msg))
168 def delete(self
, name
, force
=False):
169 """Deletes an existing OSM user identified by name
171 self
._logger
.debug("")
172 self
._client
.get_token()
173 user
= self
.get(name
)
176 querystring
= '?FORCE=True'
177 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
178 user
['_id'], querystring
), skip_query_admin
=True)
179 #print('HTTP CODE: {}'.format(http_code))
180 #print('RESP: {}'.format(resp))
182 print('Deletion in progress')
183 elif http_code
== 204:
185 elif resp
and 'result' in resp
:
191 # msg = json.loads(resp)
194 raise ClientException("failed to delete user {} - {}".format(name
, msg
))
196 def list(self
, filter=None):
197 """Returns the list of OSM users
199 self
._logger
.debug("")
200 self
._client
.get_token()
203 filter_string
= '?{}'.format(filter)
204 _
, resp
= self
._http
.get2_cmd('{}{}'.format(self
._apiBase
,filter_string
), skip_query_admin
=True)
205 #print('RESP: {}'.format(resp))
207 return json
.loads(resp
)
211 """Returns an OSM user based on name or id
213 self
._logger
.debug("")
214 self
._client
.get_token()
215 # keystone with external LDAP contains large ids, not uuid format
216 # utils.validate_uuid4(name) cannot be used
217 user_list
= self
.list()
218 for user
in user_list
:
219 if name
== user
['_id']:
221 for user
in user_list
:
222 if name
== user
['username']:
224 raise NotFound("User {} not found".format(name
))