1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2012 OpenStack LLC.
5
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6
# not use this file except in compliance with the License. You may obtain
7
# a copy of the License at
9
# http://www.apache.org/licenses/LICENSE-2.0
11
# Unless required by applicable law or agreed to in writing, software
12
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14
# License for the specific language governing permissions and limitations
20
from xml.dom import minidom
24
from cinder.api import common
25
from cinder.api.openstack.wsgi import MetadataXMLDeserializer
26
from cinder.api.openstack.wsgi import XMLDeserializer
27
from cinder import test
28
from cinder.tests.api import fakes
29
from cinder import volume
32
def fake_volume_get(*args, **kwargs):
36
'status': 'available',
38
'availability_zone': 'somewhere',
39
'created_at': datetime.datetime.now(),
40
'attach_status': None,
41
'display_name': 'anothervolume',
42
'display_description': 'Just another volume!',
43
'volume_type_id': None,
49
def fake_volume_get_all(*args, **kwargs):
50
return [fake_volume_get()]
53
fake_image_metadata = {
56
'kernel_id': 'somekernel',
57
'ramdisk_id': 'someramdisk',
61
def fake_get_volume_image_metadata(*args, **kwargs):
62
return fake_image_metadata
65
class VolumeImageMetadataTest(test.TestCase):
66
content_type = 'application/json'
69
super(VolumeImageMetadataTest, self).setUp()
70
self.stubs.Set(volume.API, 'get', fake_volume_get)
71
self.stubs.Set(volume.API, 'get_all', fake_volume_get_all)
72
self.stubs.Set(volume.API, 'get_volume_image_metadata',
73
fake_get_volume_image_metadata)
74
self.UUID = uuid.uuid4()
76
def _make_request(self, url):
77
req = webob.Request.blank(url)
78
req.accept = self.content_type
79
res = req.get_response(fakes.wsgi_app())
82
def _get_image_metadata(self, body):
83
return json.loads(body)['volume']['volume_image_metadata']
85
def _get_image_metadata_list(self, body):
87
volume['volume_image_metadata']
88
for volume in json.loads(body)['volumes']
91
def test_get_volume(self):
92
res = self._make_request('/v2/fake/volumes/%s' % self.UUID)
93
self.assertEqual(res.status_int, 200)
94
self.assertEqual(self._get_image_metadata(res.body),
97
def test_list_detail_volumes(self):
98
res = self._make_request('/v2/fake/volumes/detail')
99
self.assertEqual(res.status_int, 200)
100
self.assertEqual(self._get_image_metadata_list(res.body)[0],
104
class ImageMetadataXMLDeserializer(common.MetadataXMLDeserializer):
105
metadata_node_name = "volume_image_metadata"
108
class VolumeImageMetadataXMLTest(VolumeImageMetadataTest):
109
content_type = 'application/xml'
111
def _get_image_metadata(self, body):
112
deserializer = XMLDeserializer()
113
volume = deserializer.find_first_child_named(
114
minidom.parseString(body), 'volume')
115
image_metadata = deserializer.find_first_child_named(
116
volume, 'volume_image_metadata')
117
return MetadataXMLDeserializer().extract_metadata(image_metadata)
119
def _get_image_metadata_list(self, body):
120
deserializer = XMLDeserializer()
121
volumes = deserializer.find_first_child_named(
122
minidom.parseString(body), 'volumes')
123
volume_list = deserializer.find_children_named(volumes, 'volume')
124
image_metadata_list = [
125
deserializer.find_first_child_named(
126
volume, 'volume_image_metadata'
128
for volume in volume_list]
129
return map(MetadataXMLDeserializer().extract_metadata,