fix bug 643 750. Allow project update to change name
[osm/osmclient.git] / osmclient / sol005 / project.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 project 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 Project(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 = '/projects'
35 self._apiBase = '{}{}{}'.format(self._apiName,
36 self._apiVersion, self._apiResource)
37
38 def create(self, name, project):
39 """Creates a new OSM project
40 """
41 http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
42 postfields_dict=project)
43 #print('HTTP CODE: {}'.format(http_code))
44 #print('RESP: {}'.format(resp))
45 if http_code in (200, 201, 202, 204):
46 if resp:
47 resp = json.loads(resp)
48 if not resp or 'id' not in resp:
49 raise ClientException('unexpected response from server - {}'.format(
50 resp))
51 print(resp['id'])
52 else:
53 msg = ""
54 if resp:
55 try:
56 msg = json.loads(resp)
57 except ValueError:
58 msg = resp
59 raise ClientException("failed to create project {} - {}".format(name, msg))
60
61 def update(self, project, project_changes):
62 """Updates an OSM project identified by name
63 """
64 proj = self.get(project)
65 http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase, proj['_id']),
66 postfields_dict=project_changes)
67 # print('HTTP CODE: {}'.format(http_code))
68 # print('RESP: {}'.format(resp))
69 if http_code in (200, 201, 202):
70 if resp:
71 resp = json.loads(resp)
72 if not resp or 'id' not in resp:
73 raise ClientException('unexpected response from server - {}'.format(
74 resp))
75 print(resp['id'])
76 elif http_code == 204:
77 print("Updated")
78 else:
79 msg = ""
80 if resp:
81 try:
82 msg = json.loads(resp)
83 except ValueError:
84 msg = resp
85 raise ClientException("failed to update project {} - {}".format(project, msg))
86
87 def delete(self, name, force=False):
88 """Deletes an OSM project identified by name
89 """
90 project = self.get(name)
91 querystring = ''
92 if force:
93 querystring = '?FORCE=True'
94 http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
95 project['_id'], querystring))
96 #print('HTTP CODE: {}'.format(http_code))
97 #print('RESP: {}'.format(resp))
98 if http_code == 202:
99 print('Deletion in progress')
100 elif http_code == 204:
101 print('Deleted')
102 elif resp and 'result' in resp:
103 print('Deleted')
104 else:
105 msg = ""
106 if resp:
107 try:
108 msg = json.loads(resp)
109 except ValueError:
110 msg = resp
111 raise ClientException("failed to delete project {} - {}".format(name, msg))
112
113 def list(self, filter=None):
114 """Returns the list of OSM projects
115 """
116 filter_string = ''
117 if filter:
118 filter_string = '?{}'.format(filter)
119 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
120 #print('RESP: {}'.format(resp))
121 if resp:
122 return resp
123 return list()
124
125 def get(self, name):
126 """Returns a specific OSM project based on name or id
127 """
128 if utils.validate_uuid4(name):
129 for proj in self.list():
130 if name == proj['_id']:
131 return proj
132 else:
133 for proj in self.list():
134 if name == proj['name']:
135 return proj
136 raise NotFound("Project {} not found".format(name))
137
138