Maintaining format for project_role_mapping for creating and listing
[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 len(user["projects"]) == 1:
42 user["projects"] = user["projects"][0].split(",")
43
44 if user["project-role-mappings"]:
45 project_role_mappings = []
46
47 for set_mapping in user["project-role-mappings"]:
48 set_mapping_clean = [m.trim() for m in set_mapping.split(",")]
49 project, roles = set_mapping_clean[0], set_mapping_clean[1:]
50
51 for role in roles:
52 mapping = {"project": project, "role": role}
53
54 if mapping not in project_role_mappings:
55 project_role_mappings.append(mapping)
56
57 user["project-role-mappings"] = project_role_mappings
58
59 http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
60 postfields_dict=user)
61 #print('HTTP CODE: {}'.format(http_code))
62 #print('RESP: {}'.format(resp))
63 if http_code in (200, 201, 202, 204):
64 if resp:
65 resp = json.loads(resp)
66 if not resp or 'id' not in resp:
67 raise ClientException('unexpected response from server - {}'.format(
68 resp))
69 print(resp['id'])
70 else:
71 msg = ""
72 if resp:
73 try:
74 msg = json.loads(resp)
75 except ValueError:
76 msg = resp
77 raise ClientException("failed to create user {} - {}".format(name, msg))
78
79 def update(self, name, user):
80 """Updates an existing OSM user identified by name
81 """
82 myuser = self.get(name)
83 update_user = {
84 "_id": myuser["_id"],
85 "name": myuser["user"],
86 "project_role_mappings": myuser["project_role_mappings"]
87 }
88
89 # if password is defined, update the password
90 if user["password"]:
91 update_user["password"] = user["password"]
92
93 if user["set-project"]:
94 for set_project in user["set-project"]:
95 set_project_clean = [m.trim() for m in set_project.split(",")]
96 project, roles = set_project_clean[0], set_project_clean[1:]
97
98 update_user["project_role_mappings"] = [mapping for mapping
99 in update_user["project_role_mappings"]
100 if mapping["project"] != project]
101
102 for role in roles:
103 mapping = {"project": project, "role": role}
104 update_user["project_role_mappings"].append(mapping)
105
106 if user["remove-project"]:
107 for remove_project in user["remove-project"]:
108 update_user["project_role_mappings"] = [mapping for mapping
109 in update_user["project_role_mappings"]
110 if mapping["project"] != remove_project]
111
112 if user["add-project-role"]:
113 for add_project_role in user["add-project-role"]:
114 add_project_role_clean = [m.trim() for m in add_project_role.split(",")]
115 project, roles = add_project_role_clean[0], add_project_role_clean[1:]
116
117 for role in roles:
118 mapping = {"project": project, "role": role}
119 if mapping not in update_user["project_role_mappings"]:
120 update_user["project_role_mappings"].append(mapping)
121
122 if user["remove-project-role"]:
123 for remove_project_role in user["remove-project-role"]:
124 remove_project_role_clean = [m.trim() for m in remove_project_role.split(",")]
125 project, roles = remove_project_role_clean[0], remove_project_role_clean[1:]
126
127 for role in roles:
128 mapping_to_remove = {"project": project, "role": role}
129 update_user["project_role_mappings"] = [mapping for mapping
130 in update_user["project_role_mappings"]
131 if mapping != mapping_to_remove]
132
133 if not user["password"] and not user["set-project"] and not user["remove-project"] \
134 and not user["add-project-role"] and not user["remove-project-role"]:
135 raise ClientException("At least one parameter should be defined.")
136
137 http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase,myuser['_id']),
138 postfields_dict=update_user)
139 #print('HTTP CODE: {}'.format(http_code))
140 #print('RESP: {}'.format(resp))
141 if http_code in (200, 201, 202, 204):
142 if resp:
143 resp = json.loads(resp)
144 if not resp or 'id' not in resp:
145 raise ClientException('unexpected response from server - {}'.format(
146 resp))
147 print(resp['id'])
148 else:
149 msg = ""
150 if resp:
151 try:
152 msg = json.loads(resp)
153 except ValueError:
154 msg = resp
155 raise ClientException("failed to update user {} - {}".format(name, msg))
156
157 def delete(self, name, force=False):
158 """Deletes an existing OSM user identified by name
159 """
160 user = self.get(name)
161 querystring = ''
162 if force:
163 querystring = '?FORCE=True'
164 http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
165 user['_id'], querystring))
166 #print('HTTP CODE: {}'.format(http_code))
167 #print('RESP: {}'.format(resp))
168 if http_code == 202:
169 print('Deletion in progress')
170 elif http_code == 204:
171 print('Deleted')
172 elif resp and 'result' in resp:
173 print('Deleted')
174 else:
175 msg = ""
176 if resp:
177 try:
178 msg = json.loads(resp)
179 except ValueError:
180 msg = resp
181 raise ClientException("failed to delete user {} - {}".format(name, msg))
182
183 def list(self, filter=None):
184 """Returns the list of OSM users
185 """
186 filter_string = ''
187 if filter:
188 filter_string = '?{}'.format(filter)
189 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
190 #print('RESP: {}'.format(resp))
191 if resp:
192 return resp
193 return list()
194
195 def get(self, name):
196 """Returns an OSM user based on name or id
197 """
198 if utils.validate_uuid4(name):
199 for user in self.list():
200 if name == user['_id']:
201 return user
202 else:
203 for user in self.list():
204 if name == user['username']:
205 return user
206 raise NotFound("User {} not found".format(name))
207
208