fix bug 643 750. Allow project update to change name
[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 myuser = self.get(name)
87 update_user = {
88 "username": myuser["username"],
89 "project_role_mappings": myuser["project_role_mappings"]
90 }
91
92 # if password is defined, update the password
93 if user["password"]:
94 update_user["password"] = user["password"]
95
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:]
100
101 update_user["project_role_mappings"] = [mapping for mapping
102 in update_user["project_role_mappings"]
103 if mapping["project"] != project]
104
105 for role in roles:
106 mapping = {"project": project, "role": role}
107 update_user["project_role_mappings"].append(mapping)
108
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]
114
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:]
119
120 for role in roles:
121 mapping = {"project": project, "role": role}
122 if mapping not in update_user["project_role_mappings"]:
123 update_user["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_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]
135
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.")
139
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):
145 if resp:
146 resp = json.loads(resp)
147 if not resp or 'id' not in resp:
148 raise ClientException('unexpected response from server - {}'.format(
149 resp))
150 print(resp['id'])
151 elif http_code == 204:
152 print('Updated')
153 else:
154 msg = ""
155 if resp:
156 try:
157 msg = json.loads(resp)
158 except ValueError:
159 msg = resp
160 raise ClientException("failed to update user {} - {}".format(name, msg))
161
162 def delete(self, name, force=False):
163 """Deletes an existing OSM user identified by name
164 """
165 user = self.get(name)
166 querystring = ''
167 if force:
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))
173 if http_code == 202:
174 print('Deletion in progress')
175 elif http_code == 204:
176 print('Deleted')
177 elif resp and 'result' in resp:
178 print('Deleted')
179 else:
180 msg = ""
181 if resp:
182 try:
183 msg = json.loads(resp)
184 except ValueError:
185 msg = resp
186 raise ClientException("failed to delete user {} - {}".format(name, msg))
187
188 def list(self, filter=None):
189 """Returns the list of OSM users
190 """
191 filter_string = ''
192 if filter:
193 filter_string = '?{}'.format(filter)
194 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
195 #print('RESP: {}'.format(resp))
196 if resp:
197 return resp
198 return list()
199
200 def get(self, name):
201 """Returns an OSM user based on name or id
202 """
203 if utils.validate_uuid4(name):
204 for user in self.list():
205 if name == user['_id']:
206 return user
207 else:
208 for user in self.list():
209 if name == user['username']:
210 return user
211 raise NotFound("User {} not found".format(name))
212
213