1
# Copyright 2012 OpenStack, LLC.
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
15
"""The Volume Image Metadata API extension."""
17
from cinder.api import extensions
18
from cinder.api.openstack import wsgi
19
from cinder.api import xmlutil
20
from cinder import volume
23
authorize = extensions.soft_extension_authorizer('volume',
24
'volume_image_metadata')
27
class VolumeImageMetadataController(wsgi.Controller):
28
def __init__(self, *args, **kwargs):
29
super(VolumeImageMetadataController, self).__init__(*args, **kwargs)
30
self.volume_api = volume.API()
32
def _add_image_metadata(self, context, resp_volume):
34
image_meta = self.volume_api.get_volume_image_metadata(
40
resp_volume['volume_image_metadata'] = dict(
41
image_meta.iteritems())
44
def show(self, req, resp_obj, id):
45
context = req.environ['cinder.context']
46
if authorize(context):
47
resp_obj.attach(xml=VolumeImageMetadataTemplate())
48
self._add_image_metadata(context, resp_obj.obj['volume'])
51
def detail(self, req, resp_obj):
52
context = req.environ['cinder.context']
53
if authorize(context):
54
resp_obj.attach(xml=VolumesImageMetadataTemplate())
55
for volume in list(resp_obj.obj.get('volumes', [])):
56
self._add_image_metadata(context, volume)
59
class Volume_image_metadata(extensions.ExtensionDescriptor):
60
"""Show image metadata associated with the volume"""
62
name = "VolumeImageMetadata"
63
alias = "os-vol-image-meta"
64
namespace = ("http://docs.openstack.org/volume/ext/"
65
"volume_image_metadata/api/v1")
66
updated = "2012-12-07T00:00:00+00:00"
68
def get_controller_extensions(self):
69
controller = VolumeImageMetadataController()
70
extension = extensions.ControllerExtension(self, 'volumes', controller)
74
class VolumeImageMetadataMetadataTemplate(xmlutil.TemplateBuilder):
76
root = xmlutil.TemplateElement('volume_image_metadata',
77
selector='volume_image_metadata')
78
elem = xmlutil.SubTemplateElement(root, 'meta',
79
selector=xmlutil.get_items)
83
return xmlutil.MasterTemplate(root, 1)
86
class VolumeImageMetadataTemplate(xmlutil.TemplateBuilder):
88
root = xmlutil.TemplateElement('volume', selector='volume')
89
root.append(VolumeImageMetadataMetadataTemplate())
91
alias = Volume_image_metadata.alias
92
namespace = Volume_image_metadata.namespace
94
return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace})
97
class VolumesImageMetadataTemplate(xmlutil.TemplateBuilder):
99
root = xmlutil.TemplateElement('volumes')
100
elem = xmlutil.SubTemplateElement(root, 'volume', selector='volume')
101
elem.append(VolumeImageMetadataMetadataTemplate())
103
alias = Volume_image_metadata.alias
104
namespace = Volume_image_metadata.namespace
106
return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace})