Adding role management
[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, 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[0] != project]
101
102 for role in roles:
103 update_user["project_role_mappings"].append([project, role])
104
105 if user["remove-project"]:
106 for remove_project in user["remove-project"]:
107 update_user["project_role_mappings"] = [mapping for mapping
108 in update_user["project_role_mappings"]
109 if mapping[0] != remove_project]
110
111 if user["add-project-role"]:
112 for add_project_role in user["add-project-role"]:
113 add_project_role_clean = [m.trim() for m in add_project_role.split(",")]
114 project, roles = add_project_role_clean[0], add_project_role_clean[1:]
115
116 for role in roles:
117 mapping = [project, role]
118 if mapping not in update_user["project_role_mappings"]:
119 update_user["project_role_mappings"].append(mapping)
120
121 if user["remove-project-role"]:
122 for remove_project_role in user["remove-project-role"]:
123 remove_project_role_clean = [m.trim() for m in remove_project_role.split(",")]
124 project, roles = remove_project_role_clean[0], remove_project_role_clean[1:]
125
126 for role in roles:
127 mapping_to_remove = [project, role]
128 update_user["project_role_mappings"] = [mapping for mapping
129 in update_user["project_role_mappings"]
130 if mapping != mapping_to_remove]
131
132 if not user["password"] and not user["set-project"] and not user["remove-project"] \
133 and not user["add-project-role"] and not user["remove-project-role"]:
134 raise ClientException("At least one parameter should be defined.")
135
136 http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase,myuser['_id']),
137 postfields_dict=update_user)
138 #print('HTTP CODE: {}'.format(http_code))
139 #print('RESP: {}'.format(resp))
140 if http_code in (200, 201, 202, 204):
141 if resp:
142 resp = json.loads(resp)
143 if not resp or 'id' not in resp:
144 raise ClientException('unexpected response from server - {}'.format(
145 resp))
146 print(resp['id'])
147 else:
148 msg = ""
149 if resp:
150 try:
151 msg = json.loads(resp)
152 except ValueError:
153 msg = resp
154 raise ClientException("failed to update user {} - {}".format(name, msg))
155
156 def delete(self, name, force=False):
157 """Deletes an existing OSM user identified by name
158 """
159 user = self.get(name)
160 querystring = ''
161 if force:
162 querystring = '?FORCE=True'
163 http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
164 user['_id'], querystring))
165 #print('HTTP CODE: {}'.format(http_code))
166 #print('RESP: {}'.format(resp))
167 if http_code == 202:
168 print('Deletion in progress')
169 elif http_code == 204:
170 print('Deleted')
171 elif resp and 'result' in resp:
172 print('Deleted')
173 else:
174 msg = ""
175 if resp:
176 try:
177 msg = json.loads(resp)
178 except ValueError:
179 msg = resp
180 raise ClientException("failed to delete user {} - {}".format(name, msg))
181
182 def list(self, filter=None):
183 """Returns the list of OSM users
184 """
185 filter_string = ''
186 if filter:
187 filter_string = '?{}'.format(filter)
188 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
189 #print('RESP: {}'.format(resp))
190 if resp:
191 return resp
192 return list()
193
194 def get(self, name):
195 """Returns an OSM user based on name or id
196 """
197 if utils.validate_uuid4(name):
198 for user in self.list():
199 if name == user['_id']:
200 return user
201 else:
202 for user in self.list():
203 if name == user['username']:
204 return user
205 raise NotFound("User {} not found".format(name))
206
207