1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
4
# Copyright 2011 OpenStack LLC.
7
# Licensed under the Apache License, Version 2.0 (the "License"); you may
8
# not use this file except in compliance with the License. You may obtain
9
# a copy of the License at
11
# http://www.apache.org/licenses/LICENSE-2.0
13
# Unless required by applicable law or agreed to in writing, software
14
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
# License for the specific language governing permissions and limitations
20
from lxml import etree
23
from nova.api.openstack import volume
24
from nova.api.openstack import xmlutil
25
from nova import flags
26
from nova.openstack.common import jsonutils
30
NS = "{http://docs.openstack.org/common/api/v1.0}"
33
class ExtensionTestCase(test.TestCase):
35
super(ExtensionTestCase, self).setUp()
36
ext_list = FLAGS.osapi_volume_extension[:]
37
fox = ('nova.tests.api.openstack.volume.extensions.'
38
'foxinsocks.Foxinsocks')
39
if fox not in ext_list:
41
self.flags(osapi_volume_extension=ext_list)
44
class ExtensionControllerTest(ExtensionTestCase):
47
super(ExtensionControllerTest, self).setUp()
54
def test_list_extensions_json(self):
55
app = volume.APIRouter()
56
request = webob.Request.blank("/fake/extensions")
57
response = request.get_response(app)
58
self.assertEqual(200, response.status_int)
60
# Make sure we have all the extensions, extra extensions being OK.
61
data = jsonutils.loads(response.body)
62
names = [str(x['name']) for x in data['extensions']
63
if str(x['name']) in self.ext_list]
65
self.assertEqual(names, self.ext_list)
67
# Ensure all the timestamps are valid according to iso8601
68
for ext in data['extensions']:
69
iso8601.parse_date(ext['updated'])
71
# Make sure that at least Fox in Sox is correct.
73
x for x in data['extensions'] if x['alias'] == 'FOXNSOX']
74
self.assertEqual(fox_ext, {
75
'namespace': 'http://www.fox.in.socks/api/ext/pie/v1.0',
76
'name': 'Fox In Socks',
77
'updated': '2011-01-22T13:25:27-06:00',
78
'description': 'The Fox In Socks Extension',
84
for ext in data['extensions']:
85
url = '/fake/extensions/%s' % ext['alias']
86
request = webob.Request.blank(url)
87
response = request.get_response(app)
88
output = jsonutils.loads(response.body)
89
self.assertEqual(output['extension']['alias'], ext['alias'])
91
def test_get_extension_json(self):
92
app = volume.APIRouter()
93
request = webob.Request.blank("/fake/extensions/FOXNSOX")
94
response = request.get_response(app)
95
self.assertEqual(200, response.status_int)
97
data = jsonutils.loads(response.body)
98
self.assertEqual(data['extension'], {
99
"namespace": "http://www.fox.in.socks/api/ext/pie/v1.0",
100
"name": "Fox In Socks",
101
"updated": "2011-01-22T13:25:27-06:00",
102
"description": "The Fox In Socks Extension",
106
def test_get_non_existing_extension_json(self):
107
app = volume.APIRouter()
108
request = webob.Request.blank("/fake/extensions/4")
109
response = request.get_response(app)
110
self.assertEqual(404, response.status_int)
112
def test_list_extensions_xml(self):
113
app = volume.APIRouter()
114
request = webob.Request.blank("/fake/extensions")
115
request.accept = "application/xml"
116
response = request.get_response(app)
117
self.assertEqual(200, response.status_int)
119
root = etree.XML(response.body)
120
self.assertEqual(root.tag.split('extensions')[0], NS)
122
# Make sure we have all the extensions, extras extensions being OK.
123
exts = root.findall('{0}extension'.format(NS))
124
self.assert_(len(exts) >= len(self.ext_list))
126
# Make sure that at least Fox in Sox is correct.
127
(fox_ext, ) = [x for x in exts if x.get('alias') == 'FOXNSOX']
128
self.assertEqual(fox_ext.get('name'), 'Fox In Socks')
129
self.assertEqual(fox_ext.get('namespace'),
130
'http://www.fox.in.socks/api/ext/pie/v1.0')
131
self.assertEqual(fox_ext.get('updated'), '2011-01-22T13:25:27-06:00')
132
self.assertEqual(fox_ext.findtext('{0}description'.format(NS)),
133
'The Fox In Socks Extension')
135
xmlutil.validate_schema(root, 'extensions')
137
def test_get_extension_xml(self):
138
app = volume.APIRouter()
139
request = webob.Request.blank("/fake/extensions/FOXNSOX")
140
request.accept = "application/xml"
141
response = request.get_response(app)
142
self.assertEqual(200, response.status_int)
145
root = etree.XML(xml)
146
self.assertEqual(root.tag.split('extension')[0], NS)
147
self.assertEqual(root.get('alias'), 'FOXNSOX')
148
self.assertEqual(root.get('name'), 'Fox In Socks')
149
self.assertEqual(root.get('namespace'),
150
'http://www.fox.in.socks/api/ext/pie/v1.0')
151
self.assertEqual(root.get('updated'), '2011-01-22T13:25:27-06:00')
152
self.assertEqual(root.findtext('{0}description'.format(NS)),
153
'The Fox In Socks Extension')
155
xmlutil.validate_schema(root, 'extension')