fix bugs 747 757: fix user-update interface
[osm/osmclient.git] / osmclient / sol005 / user.py
1 #
2 # Copyright 2018 Telefonica Investigacion y Desarrollo S.A.U.
3 #
4 # All Rights Reserved.
5 #
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
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
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
16 # under the License.
17
18 """
19 OSM user mgmt API
20 """
21
22 from osmclient.common import utils
23 from osmclient.common.exceptions import ClientException
24 from osmclient.common.exceptions import NotFound
25 import json
26
27
28 class User(object):
29 def __init__(self, http=None, client=None):
30 self._http = http
31 self._client = client
32 self._apiName = '/admin'
33 self._apiVersion = '/v1'
34 self._apiResource = '/users'
35 self._apiBase = '{}{}{}'.format(self._apiName,
36 self._apiVersion, self._apiResource)
37
38 def create(self, name, user):
39 """Creates a new OSM user
40 """
41 if not user["projects"] or (len(user["projects"]) == 1 and not user["projects"][0]):
42 del user["projects"]
43 elif len(user["projects"]) == 1:
44 user["projects"] = user["projects"][0].split(",")
45
46 if user["project_role_mappings"]:
47 project_role_mappings = []
48
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:]
52
53 for role in roles:
54 mapping = {"project": project, "role": role}
55
56 if mapping not in project_role_mappings:
57 project_role_mappings.append(mapping)
58
59 user["project_role_mappings"] = project_role_mappings
60 else:
61 del user["project_role_mappings"]
62
63 http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
64 postfields_dict=user)
65 #print('HTTP CODE: {}'.format(http_code))
66 #print('RESP: {}'.format(resp))
67 if http_code in (200, 201, 202, 204):
68 if resp:
69 resp = json.loads(resp)
70 if not resp or 'id' not in resp:
71 raise ClientException('unexpected response from server - {}'.format(
72 resp))
73 print(resp['id'])
74 else:
75 msg = ""
76 if resp:
77 try:
78 msg = json.loads(resp)
79 except ValueError:
80 msg = resp
81 raise ClientException("failed to create user {} - {}".format(name, msg))
82
83 def update(self, name, user):
84 """Updates an existing OSM user identified by name
85 """
86 # print(user)
87 myuser = self.get(name)
88 update_user = {
89 "add_project_role_mappings": [],
90 "remove_project_role_mappings": [],
91 }
92
93 # if password is defined, update the password
94 if user["password"]:
95 update_user["password"] = user["password"]
96 if user["username"]:
97 update_user["username"] = user["username"]
98
99 if user["set-project"]:
100 # Remove project and insert project role mapping
101 for set_project in user["set-project"]:
102
103 set_project_clean = [m.strip() for m in set_project.split(",")]
104 project, roles = set_project_clean[0], set_project_clean[1:]
105
106 update_user["remove_project_role_mappings"].append({"project": project})
107
108 for role in roles:
109 mapping = {"project": project, "role": role}
110 update_user["add_project_role_mappings"].append(mapping)
111
112 if user["remove-project"]:
113 for remove_project in user["remove-project"]:
114 update_user["remove_project_role_mappings"].append({"project": remove_project})
115
116 if user["add-project-role"]:
117 for add_project_role in user["add-project-role"]:
118 add_project_role_clean = [m.strip() for m in add_project_role.split(",")]
119 project, roles = add_project_role_clean[0], add_project_role_clean[1:]
120
121 for role in roles:
122 mapping = {"project": project, "role": role}
123 update_user["add_project_role_mappings"].append(mapping)
124
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:]
129
130 for role in roles:
131 mapping = {"project": project, "role": role}
132 update_user["remove_project_role_mappings"].append(mapping)
133
134 if not update_user["remove_project_role_mappings"]:
135 del update_user["remove_project_role_mappings"]
136 if not update_user["add_project_role_mappings"]:
137 del update_user["add_project_role_mappings"]
138 if not update_user:
139 raise ClientException("At least something should be changed.")
140
141 http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase, myuser['_id']),
142 postfields_dict=update_user)
143 # print('HTTP CODE: {}'.format(http_code))
144 # print('RESP: {}'.format(resp))
145 if http_code in (200, 201, 202):
146 if resp:
147 resp = json.loads(resp)
148 if not resp or 'id' not in resp:
149 raise ClientException('unexpected response from server - {}'.format(
150 resp))
151 print(resp['id'])
152 elif http_code == 204:
153 print('Updated')
154 else:
155 msg = ""
156 if resp:
157 try:
158 msg = json.loads(resp)
159 except ValueError:
160 msg = resp
161 raise ClientException("failed to update user {} - {}".format(name, msg))
162
163 def delete(self, name, force=False):
164 """Deletes an existing OSM user identified by name
165 """
166 user = self.get(name)
167 querystring = ''
168 if force:
169 querystring = '?FORCE=True'
170 http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
171 user['_id'], querystring))
172 #print('HTTP CODE: {}'.format(http_code))
173 #print('RESP: {}'.format(resp))
174 if http_code == 202:
175 print('Deletion in progress')
176 elif http_code == 204:
177 print('Deleted')
178 elif resp and 'result' in resp:
179 print('Deleted')
180 else:
181 msg = ""
182 if resp:
183 try:
184 msg = json.loads(resp)
185 except ValueError:
186 msg = resp
187 raise ClientException("failed to delete user {} - {}".format(name, msg))
188
189 def list(self, filter=None):
190 """Returns the list of OSM users
191 """
192 filter_string = ''
193 if filter:
194 filter_string = '?{}'.format(filter)
195 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
196 #print('RESP: {}'.format(resp))
197 if resp:
198 return resp
199 return list()
200
201 def get(self, name):
202 """Returns an OSM user based on name or id
203 """
204 if utils.validate_uuid4(name):
205 for user in self.list():
206 if name == user['_id']:
207 return user
208 else:
209 for user in self.list():
210 if name == user['username']:
211 return user
212 raise NotFound("User {} not found".format(name))
213
214