Skip to content

Commit 223c490

Browse files
authored
iland API V1.0 (#17)
1 parent 38b7800 commit 223c490

File tree

6 files changed

+52
-53
lines changed

6 files changed

+52
-53
lines changed

HISTORY.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
History
33
=======
44

5-
0.9.0 (2018-11-13)
5+
1.0.0 (2018-11-15)
66
------------------
77

8-
* iland API v0.9
8+
* Support for iland API v1.0
9+
* Update outdated dependencies
910

1011
0.7.5 (2017-06-27)
1112
------------------

iland/api.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,11 @@ def _do_request(self, rpath, verb='GET', form_data=None, headers=None):
123123

124124
default_headers = {
125125
'Authorization': 'Bearer %s' % self._get_access_token_string(),
126-
'Content-Type': 'application/vnd.ilandcloud.api.v0.9+json',
127-
'Accept': 'application/vnd.ilandcloud.api.v0.9+json'
126+
'Accept': 'application/vnd.ilandcloud.api.v1.0+json'
128127
}
128+
if verb in ('PUT', 'POST'):
129+
default_headers[
130+
'Content-Type'] = 'application/json'
129131

130132
merged_headers = default_headers.copy()
131133

@@ -159,9 +161,10 @@ def _do_request(self, rpath, verb='GET', form_data=None, headers=None):
159161
else:
160162
raise ApiException({'message': 'Unsupported HTTP verb %s' % verb})
161163

162-
# iland cloud API prefix have to be ignored because they are here to
163-
# prevent JSON Hijacking
164-
json_obj = json.loads(r.content[5:].decode('UTF8'))
164+
try:
165+
json_obj = r.json()
166+
except ValueError:
167+
raise ApiException(r.content)
165168
if r.status_code not in [200, 201, 202, 204]:
166169
raise ApiException(json_obj)
167170
return json_obj

iland/constant.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""A library that provides constants for the `iland.Api` object."""
44

55
#: Base URL to the iland cloud API.
6-
BASE_URL = 'https://api.ilandcloud.com/ecs'
6+
BASE_URL = 'https://api.ilandcloud.com/v1'
77

88
#: Access token URL.
99
ACCESS_URL = \

requirements_dev.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
bumpversion==0.5.3
22
wheel>=0.26.0
3-
watchdog==0.8.3
4-
flake8==3.3.0
3+
watchdog==0.9.0
4+
flake8==3.6.0
55
tox>=2.5.0
6-
coverage==4.4.1
7-
Sphinx==1.6.2
8-
requests_mock==1.3.0
6+
coverage==4.5.2
7+
Sphinx==1.8.2
8+
requests_mock==1.5.2

tests/test_iland.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def test_get_ok_200(self):
139139
status_code=200)
140140
rpath = '/user/jchirac'
141141
user_data = {'username': 'jchirac'}
142-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
142+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
143143
status_code=200)
144144
req = self.api.get(rpath)
145145
self.assertEquals(user_data, req)
@@ -151,7 +151,7 @@ def test_get_ok_201(self):
151151
status_code=200)
152152
rpath = '/user/jchirac'
153153
user_data = {'username': 'jchirac'}
154-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
154+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
155155
status_code=201)
156156
req = self.api.get(rpath)
157157
self.assertEquals(user_data, req)
@@ -163,7 +163,7 @@ def test_get_ok_202(self):
163163
status_code=200)
164164
rpath = '/user/jchirac'
165165
user_data = {'username': 'jchirac'}
166-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
166+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
167167
status_code=202)
168168
req = self.api.get(rpath)
169169
self.assertEquals(user_data, req)
@@ -175,7 +175,7 @@ def test_get_ok_204(self):
175175
status_code=200)
176176
rpath = '/user/jchirac'
177177
user_data = {'username': 'jchirac'}
178-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
178+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
179179
status_code=204)
180180
req = self.api.get(rpath)
181181
self.assertEquals(user_data, req)
@@ -187,7 +187,7 @@ def test_get_ko_400(self):
187187
status_code=200)
188188
rpath = '/user/jchirac'
189189
user_data = {'username': 'jchirac'}
190-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
190+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
191191
status_code=400)
192192
with self.assertRaises(iland.ApiException):
193193
self.api.get(rpath)
@@ -199,7 +199,7 @@ def test_get_ko_500(self):
199199
status_code=200)
200200
rpath = '/user/jchirac'
201201
user_data = {'username': 'jchirac'}
202-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
202+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
203203
status_code=500)
204204
with self.assertRaises(iland.ApiException):
205205
self.api.get(rpath)
@@ -211,7 +211,7 @@ def test_post_ok(self):
211211
status_code=200)
212212
rpath = '/user/jchirac'
213213
user_data = {'username': 'jchirac'}
214-
m.post(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
214+
m.post(BASE_URL + rpath, text=json.dumps(user_data),
215215
status_code=200)
216216
req = self.api.post(rpath, form_data={'a': 'b'})
217217
self.assertEquals(user_data, req)
@@ -223,7 +223,7 @@ def test_post_ok_no_formdata(self):
223223
status_code=200)
224224
rpath = '/user/jchirac'
225225
user_data = {'username': 'jchirac'}
226-
m.post(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
226+
m.post(BASE_URL + rpath, text=json.dumps(user_data),
227227
status_code=200)
228228
req = self.api.post(rpath)
229229
self.assertEquals(user_data, req)
@@ -235,7 +235,7 @@ def test_put_ok(self):
235235
status_code=200)
236236
rpath = '/user/jchirac'
237237
user_data = {'username': 'jchirac'}
238-
m.put(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
238+
m.put(BASE_URL + rpath, text=json.dumps(user_data),
239239
status_code=200)
240240
req = self.api.put(rpath, form_data={'a': 'b'})
241241
self.assertEquals(user_data, req)
@@ -247,7 +247,7 @@ def test_put_ok_no_formdata(self):
247247
status_code=200)
248248
rpath = '/user/jchirac'
249249
user_data = {'username': 'jchirac'}
250-
m.put(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
250+
m.put(BASE_URL + rpath, text=json.dumps(user_data),
251251
status_code=200)
252252
req = self.api.put(rpath)
253253
self.assertEquals(user_data, req)
@@ -259,7 +259,7 @@ def test_delete_ok(self):
259259
status_code=200)
260260
rpath = '/user/jchirac'
261261
user_data = {'username': 'jchirac'}
262-
m.delete(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
262+
m.delete(BASE_URL + rpath, text=json.dumps(user_data),
263263
status_code=200)
264264
req = self.api.delete(rpath)
265265
self.assertEquals(user_data, req)
@@ -271,7 +271,7 @@ def test_unknown_verb_internal(self):
271271
status_code=200)
272272
rpath = '/user/jchirac'
273273
user_data = {'username': 'jchirac'}
274-
m.delete(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
274+
m.delete(BASE_URL + rpath, text=json.dumps(user_data),
275275
status_code=200)
276276
with self.assertRaises(iland.ApiException):
277277
self.api._do_request(rpath, verb='ACK')
@@ -287,7 +287,7 @@ def test_with_default_base_url(self):
287287
status_code=200)
288288
rpath = '/user/jchirac'
289289
user_data = {'username': 'jchirac'}
290-
m.get(iland.BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
290+
m.get(iland.BASE_URL + rpath, text=json.dumps(user_data),
291291
status_code=200)
292292
req = self.api.get(rpath)
293293
self.assertEquals(user_data, req)
@@ -299,7 +299,7 @@ def test_with_proxies_set(self):
299299
status_code=200)
300300
rpath = '/user/jchirac'
301301
user_data = {'username': 'jchirac'}
302-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
302+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
303303
status_code=200)
304304
self.api._proxies = {'https': 'https://10.10.10.10:3128'}
305305
req = self.api.get(rpath)
@@ -312,7 +312,7 @@ def test_get_with_extra_header(self):
312312
status_code=200)
313313
rpath = '/user/jchirac'
314314
user_data = {'username': 'jchirac'}
315-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
315+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
316316
request_headers={'Host': 'api.ilandcloud.com'},
317317
status_code=200)
318318
req = self.api.get(rpath, headers={'Host': 'api.ilandcloud.com'})
@@ -325,7 +325,7 @@ def test_get_with_extra_disallowed_header(self):
325325
status_code=200)
326326
rpath = '/user/jchirac'
327327
user_data = {'username': 'jchirac'}
328-
m.get(BASE_URL + rpath, text='XXXXX' + json.dumps(user_data),
328+
m.get(BASE_URL + rpath, text=json.dumps(user_data),
329329
status_code=200)
330330
# Set Accept to text/csv but it's ignored by api, so we get json
331331
req = self.api.get(rpath, headers={'Accept': 'text/csv'})

tests/test_iland_int.py

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,64 +54,59 @@ def tearDown(self):
5454
pass
5555

5656
def test_get(self):
57-
user = self._api.get('/user/' + USERNAME)
57+
user = self._api.get('/users/' + USERNAME)
5858
self.assertEqual(USERNAME, user.get('name'))
5959
self.assertTrue(len(user.keys()) > 5)
6060

6161
def test_post(self):
62-
user_alert_emails = self._api.get('/user/' + USERNAME +
62+
user_alert_emails = self._api.get('/users/' + USERNAME +
6363
'/alert-emails')
6464
self.assertTrue(len(user_alert_emails['emails']) >= 1)
6565
self.assertEquals(user_alert_emails['username'], USERNAME)
6666

6767
old_user_alert_emails = user_alert_emails
68-
user_alert_emails = {'emails': ['test@iland.com', 'test2@iland.com'],
69-
'username': USERNAME}
70-
self._api.post('/user/' + USERNAME + '/alert-emails',
68+
user_alert_emails = {'emails': ['test@iland.com', 'test2@iland.com'], }
69+
self._api.post('/users/' + USERNAME + '/actions/update-alert-emails',
7170
user_alert_emails)
7271

73-
self.assertTrue(len(user_alert_emails['emails']) >= 1)
74-
self.assertEquals(user_alert_emails['username'], USERNAME)
72+
self.assertEqual(2, len(user_alert_emails['emails']))
7573

76-
self._api.post('/user/' + USERNAME + '/alert-emails',
74+
self._api.post('/users/' + USERNAME + '/actions/update-alert-emails',
7775
old_user_alert_emails)
7876
self.assertEquals(len(user_alert_emails['emails']), 2)
79-
self.assertEquals(user_alert_emails['username'], USERNAME)
8077

8178
def test_put_delete(self):
8279
vdc_uuid = VDC_UUID
83-
vdc_md = self._api.get('/vdc/' + vdc_uuid + '/metadata')
84-
85-
self.assertEquals(len(vdc_md), 0)
80+
vdc_md = self._api.get('/vdcs/' + vdc_uuid + '/metadata')
81+
self.assertEquals(len(vdc_md['data']), 0)
8682

8783
new_md = [{'type': 'string',
8884
'value': 'B',
8985
'access': 'READ_WRITE',
90-
'key': 'AAA'}]
91-
new_md.extend(vdc_md)
92-
self._api.put('/vdc/' + vdc_uuid + '/metadata',
93-
form_data=new_md)
86+
'key': 'AAA'}, ]
87+
new_md.extend(vdc_md['data'])
88+
self._api.put('/vdcs/' + vdc_uuid + '/metadata', form_data=new_md)
9489

9590
time.sleep(10)
9691

97-
updated_md = self._api.get('/vdc/' + vdc_uuid + '/metadata')
98-
self.assertEquals(len(updated_md), 1)
92+
updated_md = self._api.get('/vdcs/' + vdc_uuid + '/metadata')
93+
self.assertEquals(len(updated_md['data']), 1)
9994

100-
self._api.delete('/vdc/' + vdc_uuid + '/metadata/' + 'AAA')
95+
self._api.delete('/vdcs/' + vdc_uuid + '/metadata/' + 'AAA')
10196

10297
time.sleep(10)
10398

104-
updated_md = self._api.get('/vdc/' + vdc_uuid + '/metadata')
105-
self.assertEquals(len(updated_md), 0)
99+
updated_md = self._api.get('/vdcs/' + vdc_uuid + '/metadata')
100+
self.assertEquals(len(updated_md['data']), 0)
106101

107102
def test_get_with_host_header(self):
108-
user = self._api.get('/user/' + USERNAME,
103+
user = self._api.get('/users/' + USERNAME,
109104
headers={'Host': 'api.ilandcloud.com'})
110105
self.assertEqual(USERNAME, user.get('name'))
111106
self.assertTrue(len(user.keys()) > 5)
112107

113108
def test_get_with_disallowed_header(self):
114-
user = self._api.get('/user/' + USERNAME,
109+
user = self._api.get('/users/' + USERNAME,
115110
headers={'Accept': 'text/csv'})
116111
self.assertEqual(USERNAME, user.get('name'))
117112
self.assertTrue(len(user.keys()) > 5)
@@ -151,6 +146,6 @@ def test_api_errors(self):
151146
@unittest.skipIf(not PROXIES, "No proxies defined")
152147
def test_get_with_proxy(self):
153148
self._api._proxies = PROXIES
154-
user = self._api.get('/user/' + USERNAME)
149+
user = self._api.get('/users/' + USERNAME)
155150
self.assertEqual(USERNAME, user.get('name'))
156151
self.assertTrue(len(user.keys()) > 5)

0 commit comments

Comments
 (0)