1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2011 Cisco Systems
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
10
# http://www.apache.org/licenses/LICENSE-2.0
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
17
# @author: Tyler Smith, Cisco Systems
23
from quantum.common.serializer import Serializer
24
from quantum.client import Client
26
LOG = logging.getLogger('quantum.tests.test_api')
28
# Set a couple tenants to use for testing
34
"""This class stubs a basic server for the API client to talk to"""
36
class Response(object):
37
"""This class stubs a basic response to send the API client"""
38
def __init__(self, content=None, status=None):
39
self.content = content
48
# To test error codes, set the host to 10.0.0.1, and the port to the code
49
def __init__(self, host, port=9696, key_file="", cert_file=""):
52
self.key_file = key_file
53
self.cert_file = cert_file
55
def request(self, method, action, body, headers):
60
def status(self, status=None):
63
def getresponse(self):
64
res = self.Response(status=self.status())
66
# If the host is 10.0.0.1, return the port as an error code
67
if self.host == "10.0.0.1":
68
res.status = self.port
71
# Extract important information from the action string to assure sanity
72
match = re.search('tenants/(.+?)/(.+)\.(json|xml)$', self.action)
74
tenant = match.group(1)
76
format = match.group(3)
78
data = {'data': {'method': self.method, 'action': self.action,
79
'body': self.body, 'tenant': tenant, 'path': path,
80
'format': format, 'key_file': self.key_file,
81
'cert_file': self.cert_file}}
83
# Serialize it to the proper format so the API client can handle it
84
if data['data']['format'] == 'json':
85
res.content = Serializer().serialize(data, "application/json")
87
res.content = Serializer().serialize(data, "application/xml")
91
class APITest(unittest.TestCase):
94
""" Setups a test environment for the API client """
99
self.client = Client(HOST, PORT, USE_SSL, TENANT_1, 'json', ServerStub)
101
def _assert_sanity(self, call, status, method, path, data=[], params={}):
102
""" Perform common assertions to test the sanity of client requests """
104
# Handle an error case first
106
(self.client.host, self.client.port) = ("10.0.0.1", status)
107
self.assertRaises(Exception, call, *data, **params)
110
# Make the call, then get the data from the root node and assert it
111
data = call(*data, **params)['data']
113
self.assertEqual(data['method'], method)
114
self.assertEqual(data['format'], params['format'])
115
self.assertEqual(data['tenant'], params['tenant'])
116
self.assertEqual(data['path'], path)
120
def _test_list_networks(self, tenant=TENANT_1, format='json', status=200):
121
LOG.debug("_test_list_networks - tenant:%s "\
122
"- format:%s - START", format, tenant)
124
self._assert_sanity(self.client.list_networks,
129
params={'tenant': tenant, 'format': format})
131
LOG.debug("_test_list_networks - tenant:%s "\
132
"- format:%s - END", format, tenant)
134
def _test_show_network_details(self,
135
tenant=TENANT_1, format='json', status=200):
136
LOG.debug("_test_show_network_details - tenant:%s "\
137
"- format:%s - START", format, tenant)
139
self._assert_sanity(self.client.show_network_details,
144
params={'tenant': tenant, 'format': format})
146
LOG.debug("_test_show_network_details - tenant:%s "\
147
"- format:%s - END", format, tenant)
149
def _test_create_network(self, tenant=TENANT_1, format='json', status=200):
150
LOG.debug("_test_create_network - tenant:%s "\
151
"- format:%s - START", format, tenant)
153
self._assert_sanity(self.client.create_network,
157
data=[{'network': {'net-name': 'testNetwork'}}],
158
params={'tenant': tenant, 'format': format})
160
LOG.debug("_test_create_network - tenant:%s "\
161
"- format:%s - END", format, tenant)
163
def _test_update_network(self, tenant=TENANT_1, format='json', status=200):
164
LOG.debug("_test_update_network - tenant:%s "\
165
"- format:%s - START", format, tenant)
167
self._assert_sanity(self.client.update_network,
172
{'network': {'net-name': 'newName'}}],
173
params={'tenant': tenant, 'format': format})
175
LOG.debug("_test_update_network - tenant:%s "\
176
"- format:%s - END", format, tenant)
178
def _test_delete_network(self, tenant=TENANT_1, format='json', status=200):
179
LOG.debug("_test_delete_network - tenant:%s "\
180
"- format:%s - START", format, tenant)
182
self._assert_sanity(self.client.delete_network,
187
params={'tenant': tenant, 'format': format})
189
LOG.debug("_test_delete_network - tenant:%s "\
190
"- format:%s - END", format, tenant)
192
def _test_list_ports(self, tenant=TENANT_1, format='json', status=200):
193
LOG.debug("_test_list_ports - tenant:%s "\
194
"- format:%s - START", format, tenant)
196
self._assert_sanity(self.client.list_ports,
199
"networks/001/ports",
201
params={'tenant': tenant, 'format': format})
203
LOG.debug("_test_list_ports - tenant:%s "\
204
"- format:%s - END", format, tenant)
206
def _test_show_port_details(self,
207
tenant=TENANT_1, format='json', status=200):
208
LOG.debug("_test_show_port_details - tenant:%s "\
209
"- format:%s - START", format, tenant)
211
self._assert_sanity(self.client.show_port_details,
214
"networks/001/ports/001",
216
params={'tenant': tenant, 'format': format})
218
LOG.debug("_test_show_port_details - tenant:%s "\
219
"- format:%s - END", format, tenant)
221
def _test_create_port(self, tenant=TENANT_1, format='json', status=200):
222
LOG.debug("_test_create_port - tenant:%s "\
223
"- format:%s - START", format, tenant)
225
self._assert_sanity(self.client.create_port,
228
"networks/001/ports",
230
params={'tenant': tenant, 'format': format})
232
LOG.debug("_test_create_port - tenant:%s "\
233
"- format:%s - END", format, tenant)
235
def _test_delete_port(self, tenant=TENANT_1, format='json', status=200):
236
LOG.debug("_test_delete_port - tenant:%s "\
237
"- format:%s - START", format, tenant)
239
self._assert_sanity(self.client.delete_port,
242
"networks/001/ports/001",
244
params={'tenant': tenant, 'format': format})
246
LOG.debug("_test_delete_port - tenant:%s "\
247
"- format:%s - END", format, tenant)
249
def _test_update_port(self, tenant=TENANT_1, format='json', status=200):
250
LOG.debug("_test_update_port - tenant:%s "\
251
"- format:%s - START", format, tenant)
253
self._assert_sanity(self.client.update_port,
256
"networks/001/ports/001",
258
{'port': {'state': 'ACTIVE'}}],
259
params={'tenant': tenant, 'format': format})
261
LOG.debug("_test_update_port - tenant:%s "\
262
"- format:%s - END", format, tenant)
264
def _test_show_port_attachment(self,
265
tenant=TENANT_1, format='json', status=200):
266
LOG.debug("_test_show_port_attachment - tenant:%s "\
267
"- format:%s - START", format, tenant)
269
self._assert_sanity(self.client.show_port_attachment,
272
"networks/001/ports/001/attachment",
274
params={'tenant': tenant, 'format': format})
276
LOG.debug("_test_show_port_attachment - tenant:%s "\
277
"- format:%s - END", format, tenant)
279
def _test_attach_resource(self, tenant=TENANT_1,
280
format='json', status=200):
281
LOG.debug("_test_attach_resource - tenant:%s "\
282
"- format:%s - START", format, tenant)
284
self._assert_sanity(self.client.attach_resource,
287
"networks/001/ports/001/attachment",
289
{'resource': {'id': '1234'}}],
290
params={'tenant': tenant, 'format': format})
292
LOG.debug("_test_attach_resource - tenant:%s "\
293
"- format:%s - END", format, tenant)
295
def _test_detach_resource(self, tenant=TENANT_1,
296
format='json', status=200):
297
LOG.debug("_test_detach_resource - tenant:%s "\
298
"- format:%s - START", format, tenant)
300
self._assert_sanity(self.client.detach_resource,
303
"networks/001/ports/001/attachment",
305
params={'tenant': tenant, 'format': format})
307
LOG.debug("_test_detach_resource - tenant:%s "\
308
"- format:%s - END", format, tenant)
310
def _test_ssl_certificates(self, tenant=TENANT_1,
311
format='json', status=200):
312
LOG.debug("_test_ssl_certificates - tenant:%s "\
313
"- format:%s - START", format, tenant)
315
# Set SSL, and our cert file
316
self.client.use_ssl = True
317
cert_file = "/fake.cert"
318
self.client.key_file = self.client.cert_file = cert_file
320
data = self._assert_sanity(self.client.list_networks,
325
params={'tenant': tenant, 'format': format})
327
self.assertEquals(data["key_file"], cert_file)
328
self.assertEquals(data["cert_file"], cert_file)
330
LOG.debug("_test_ssl_certificates - tenant:%s "\
331
"- format:%s - END", format, tenant)
333
def test_list_networks_json(self):
334
self._test_list_networks(format='json')
336
def test_list_networks_xml(self):
337
self._test_list_networks(format='xml')
339
def test_list_networks_alt_tenant(self):
340
self._test_list_networks(tenant=TENANT_2)
342
def test_list_networks_error_470(self):
343
self._test_list_networks(status=470)
345
def test_list_networks_error_401(self):
346
self._test_list_networks(status=401)
348
def test_show_network_details_json(self):
349
self._test_show_network_details(format='json')
351
def test_show_network_details_xml(self):
352
self._test_show_network_details(format='xml')
354
def test_show_network_details_alt_tenant(self):
355
self._test_show_network_details(tenant=TENANT_2)
357
def test_show_network_details_error_470(self):
358
self._test_show_network_details(status=470)
360
def test_show_network_details_error_401(self):
361
self._test_show_network_details(status=401)
363
def test_show_network_details_error_420(self):
364
self._test_show_network_details(status=420)
366
def test_create_network_json(self):
367
self._test_create_network(format='json')
369
def test_create_network_xml(self):
370
self._test_create_network(format='xml')
372
def test_create_network_alt_tenant(self):
373
self._test_create_network(tenant=TENANT_2)
375
def test_create_network_error_470(self):
376
self._test_create_network(status=470)
378
def test_create_network_error_401(self):
379
self._test_create_network(status=401)
381
def test_create_network_error_400(self):
382
self._test_create_network(status=400)
384
def test_create_network_error_422(self):
385
self._test_create_network(status=422)
387
def test_update_network_json(self):
388
self._test_update_network(format='json')
390
def test_update_network_xml(self):
391
self._test_update_network(format='xml')
393
def test_update_network_alt_tenant(self):
394
self._test_update_network(tenant=TENANT_2)
396
def test_update_network_error_470(self):
397
self._test_update_network(status=470)
399
def test_update_network_error_401(self):
400
self._test_update_network(status=401)
402
def test_update_network_error_400(self):
403
self._test_update_network(status=400)
405
def test_update_network_error_420(self):
406
self._test_update_network(status=420)
408
def test_update_network_error_422(self):
409
self._test_update_network(status=422)
411
def test_delete_network_json(self):
412
self._test_delete_network(format='json')
414
def test_delete_network_xml(self):
415
self._test_delete_network(format='xml')
417
def test_delete_network_alt_tenant(self):
418
self._test_delete_network(tenant=TENANT_2)
420
def test_delete_network_error_470(self):
421
self._test_delete_network(status=470)
423
def test_delete_network_error_401(self):
424
self._test_delete_network(status=401)
426
def test_delete_network_error_420(self):
427
self._test_delete_network(status=420)
429
def test_delete_network_error_421(self):
430
self._test_delete_network(status=421)
432
def test_list_ports_json(self):
433
self._test_list_ports(format='json')
435
def test_list_ports_xml(self):
436
self._test_list_ports(format='xml')
438
def test_list_ports_alt_tenant(self):
439
self._test_list_ports(tenant=TENANT_2)
441
def test_list_ports_error_470(self):
442
self._test_list_ports(status=470)
444
def test_list_ports_error_401(self):
445
self._test_list_ports(status=401)
447
def test_list_ports_error_420(self):
448
self._test_list_ports(status=420)
450
def test_show_port_details_json(self):
451
self._test_list_ports(format='json')
453
def test_show_port_details_xml(self):
454
self._test_list_ports(format='xml')
456
def test_show_port_details_alt_tenant(self):
457
self._test_list_ports(tenant=TENANT_2)
459
def test_show_port_details_error_470(self):
460
self._test_show_port_details(status=470)
462
def test_show_port_details_error_401(self):
463
self._test_show_port_details(status=401)
465
def test_show_port_details_error_420(self):
466
self._test_show_port_details(status=420)
468
def test_show_port_details_error_430(self):
469
self._test_show_port_details(status=430)
471
def test_create_port_json(self):
472
self._test_create_port(format='json')
474
def test_create_port_xml(self):
475
self._test_create_port(format='xml')
477
def test_create_port_alt_tenant(self):
478
self._test_create_port(tenant=TENANT_2)
480
def test_create_port_error_470(self):
481
self._test_create_port(status=470)
483
def test_create_port_error_401(self):
484
self._test_create_port(status=401)
486
def test_create_port_error_400(self):
487
self._test_create_port(status=400)
489
def test_create_port_error_420(self):
490
self._test_create_port(status=420)
492
def test_create_port_error_430(self):
493
self._test_create_port(status=430)
495
def test_create_port_error_431(self):
496
self._test_create_port(status=431)
498
def test_delete_port_json(self):
499
self._test_delete_port(format='json')
501
def test_delete_port_xml(self):
502
self._test_delete_port(format='xml')
504
def test_delete_port_alt_tenant(self):
505
self._test_delete_port(tenant=TENANT_2)
507
def test_delete_port_error_470(self):
508
self._test_delete_port(status=470)
510
def test_delete_port_error_401(self):
511
self._test_delete_port(status=401)
513
def test_delete_port_error_420(self):
514
self._test_delete_port(status=420)
516
def test_delete_port_error_430(self):
517
self._test_delete_port(status=430)
519
def test_delete_port_error_432(self):
520
self._test_delete_port(status=432)
522
def test_update_port_json(self):
523
self._test_update_port(format='json')
525
def test_update_port_xml(self):
526
self._test_update_port(format='xml')
528
def test_update_port_alt_tenant(self):
529
self._test_update_port(tenant=TENANT_2)
531
def test_update_port_error_470(self):
532
self._test_update_port(status=470)
534
def test_update_port_error_401(self):
535
self._test_update_port(status=401)
537
def test_update_port_error_400(self):
538
self._test_update_port(status=400)
540
def test_update_port_error_420(self):
541
self._test_update_port(status=420)
543
def test_update_port_error_430(self):
544
self._test_update_port(status=430)
546
def test_update_port_error_431(self):
547
self._test_update_port(status=431)
549
def test_show_port_attachment_json(self):
550
self._test_show_port_attachment(format='json')
552
def test_show_port_attachment_xml(self):
553
self._test_show_port_attachment(format='xml')
555
def test_show_port_attachment_alt_tenant(self):
556
self._test_show_port_attachment(tenant=TENANT_2)
558
def test_show_port_attachment_error_470(self):
559
self._test_show_port_attachment(status=470)
561
def test_show_port_attachment_error_401(self):
562
self._test_show_port_attachment(status=401)
564
def test_show_port_attachment_error_400(self):
565
self._test_show_port_attachment(status=400)
567
def test_show_port_attachment_error_420(self):
568
self._test_show_port_attachment(status=420)
570
def test_show_port_attachment_error_430(self):
571
self._test_show_port_attachment(status=430)
573
def test_attach_resource_json(self):
574
self._test_attach_resource(format='json')
576
def test_attach_resource_xml(self):
577
self._test_attach_resource(format='xml')
579
def test_attach_resource_alt_tenant(self):
580
self._test_attach_resource(tenant=TENANT_2)
582
def test_attach_resource_error_470(self):
583
self._test_attach_resource(status=470)
585
def test_attach_resource_error_401(self):
586
self._test_attach_resource(status=401)
588
def test_attach_resource_error_400(self):
589
self._test_attach_resource(status=400)
591
def test_attach_resource_error_420(self):
592
self._test_attach_resource(status=420)
594
def test_attach_resource_error_430(self):
595
self._test_attach_resource(status=430)
597
def test_attach_resource_error_432(self):
598
self._test_attach_resource(status=432)
600
def test_attach_resource_error_440(self):
601
self._test_attach_resource(status=440)
603
def test_detach_resource_json(self):
604
self._test_detach_resource(format='json')
606
def test_detach_resource_xml(self):
607
self._test_detach_resource(format='xml')
609
def test_detach_resource_alt_tenant(self):
610
self._test_detach_resource(tenant=TENANT_2)
612
def test_detach_resource_error_470(self):
613
self._test_detach_resource(status=470)
615
def test_detach_resource_error_401(self):
616
self._test_detach_resource(status=401)
618
def test_detach_resource_error_420(self):
619
self._test_detach_resource(status=420)
621
def test_detach_resource_error_430(self):
622
self._test_detach_resource(status=430)
624
def test_ssl_certificates(self):
625
self._test_ssl_certificates()