Use of PATCH method instead of PUT for projects
[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 self._client.get_token()
42 if not user["projects"] or (len(user["projects"]) == 1 and not user["projects"][0]):
43 del user["projects"]
44 elif len(user["projects"]) == 1:
45 user["projects"] = user["projects"][0].split(",")
46
47 if user["project_role_mappings"]:
48 project_role_mappings = []
49
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:]
53
54 for role in roles:
55 mapping = {"project": project, "role": role}
56
57 if mapping not in project_role_mappings:
58 project_role_mappings.append(mapping)
59
60 user["project_role_mappings"] = project_role_mappings
61 else:
62 del user["project_role_mappings"]
63
64 http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
65 postfields_dict=user)
66 #print('HTTP CODE: {}'.format(http_code))
67 #print('RESP: {}'.format(resp))
68 if http_code in (200, 201, 202, 204):
69 if resp:
70 resp = json.loads(resp)
71 if not resp or 'id' not in resp:
72 raise ClientException('unexpected response from server - {}'.format(
73 resp))
74 print(resp['id'])
75 else:
76 msg = ""
77 if resp:
78 try:
79 msg = json.loads(resp)
80 except ValueError:
81 msg = resp
82 raise ClientException("failed to create user {} - {}".format(name, msg))
83
84 def update(self, name, user):
85 """Updates an existing OSM user identified by name
86 """
87 self._client.get_token()
88 # print(user)
89 myuser = self.get(name)
90 update_user = {
91 "add_project_role_mappings": [],
92 "remove_project_role_mappings": [],
93 }
94
95 # if password is defined, update the password
96 if user["password"]:
97 update_user["password"] = user["password"]
98 if user["username"]:
99 update_user["username"] = user["username"]
100
101 if user["set-project"]:
102 # Remove project and insert project role mapping
103 for set_project in user["set-project"]:
104
105 set_project_clean = [m.strip() for m in set_project.split(",")]
106 project, roles = set_project_clean[0], set_project_clean[1:]
107
108 update_user["remove_project_role_mappings"].append({"project": project})
109
110 for role in roles:
111 mapping = {"project": project, "role": role}
112 update_user["add_project_role_mappings"].append(mapping)
113
114 if user["remove-project"]:
115 for remove_project in user["remove-project"]:
116 update_user["remove_project_role_mappings"].append({"project": remove_project})
117
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:]
122
123 for role in roles:
124 mapping = {"project": project, "role": role}
125 update_user["add_project_role_mappings"].append(mapping)
126
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:]
131
132 for role in roles:
133 mapping = {"project": project, "role": role}
134 update_user["remove_project_role_mappings"].append(mapping)
135
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"]
140 if not update_user:
141 raise ClientException("At least something should be changed.")
142
143 http_code, resp = self._http.patch_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):
148 if resp:
149 resp = json.loads(resp)
150 if not resp or 'id' not in resp:
151 raise ClientException('unexpected response from server - {}'.format(
152 resp))
153 print(resp['id'])
154 elif http_code == 204:
155 print('Updated')
156 else:
157 msg = ""
158 if resp:
159 try:
160 msg = json.loads(resp)
161 except ValueError:
162 msg = resp
163 raise ClientException("failed to update user {} - {}".format(name, msg))
164
165 def delete(self, name, force=False):
166 """Deletes an existing OSM user identified by name
167 """
168 self._client.get_token()
169 user = self.get(name)
170 querystring = ''
171 if force:
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))
177 if http_code == 202:
178 print('Deletion in progress')
179 elif http_code == 204:
180 print('Deleted')
181 elif resp and 'result' in resp:
182 print('Deleted')
183 else:
184 msg = ""
185 if resp:
186 try:
187 msg = json.loads(resp)
188 except ValueError:
189 msg = resp
190 raise ClientException("failed to delete user {} - {}".format(name, msg))
191
192 def list(self, filter=None):
193 """Returns the list of OSM users
194 """
195 self._client.get_token()
196 filter_string = ''
197 if filter:
198 filter_string = '?{}'.format(filter)
199 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
200 #print('RESP: {}'.format(resp))
201 if resp:
202 return resp
203 return list()
204
205 def get(self, name):
206 """Returns an OSM user based on name or id
207 """
208 self._client.get_token()
209 if utils.validate_uuid4(name):
210 for user in self.list():
211 if name == user['_id']:
212 return user
213 else:
214 for user in self.list():
215 if name == user['username']:
216 return user
217 raise NotFound("User {} not found".format(name))
218
219