~ubuntu-branches/ubuntu/raring/cinder/raring-updates

« back to all changes in this revision

Viewing changes to cinder/api/contrib/volume_image_metadata.py

Tags: upstream-2013.1~g2
ImportĀ upstreamĀ versionĀ 2013.1~g2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#   Copyright 2012 OpenStack, LLC.
 
2
#
 
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
 
6
#
 
7
#       http://www.apache.org/licenses/LICENSE-2.0
 
8
#
 
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
 
13
#   under the License.
 
14
 
 
15
"""The Volume Image Metadata API extension."""
 
16
 
 
17
from cinder.api import extensions
 
18
from cinder.api.openstack import wsgi
 
19
from cinder.api import xmlutil
 
20
from cinder import volume
 
21
 
 
22
 
 
23
authorize = extensions.soft_extension_authorizer('volume',
 
24
                                                 'volume_image_metadata')
 
25
 
 
26
 
 
27
class VolumeImageMetadataController(wsgi.Controller):
 
28
    def __init__(self, *args, **kwargs):
 
29
        super(VolumeImageMetadataController, self).__init__(*args, **kwargs)
 
30
        self.volume_api = volume.API()
 
31
 
 
32
    def _add_image_metadata(self, context, resp_volume):
 
33
        try:
 
34
            image_meta = self.volume_api.get_volume_image_metadata(
 
35
                context, resp_volume)
 
36
        except Exception:
 
37
            return
 
38
        else:
 
39
            if image_meta:
 
40
                resp_volume['volume_image_metadata'] = dict(
 
41
                    image_meta.iteritems())
 
42
 
 
43
    @wsgi.extends
 
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'])
 
49
 
 
50
    @wsgi.extends
 
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)
 
57
 
 
58
 
 
59
class Volume_image_metadata(extensions.ExtensionDescriptor):
 
60
    """Show image metadata associated with the volume"""
 
61
 
 
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"
 
67
 
 
68
    def get_controller_extensions(self):
 
69
        controller = VolumeImageMetadataController()
 
70
        extension = extensions.ControllerExtension(self, 'volumes', controller)
 
71
        return [extension]
 
72
 
 
73
 
 
74
class VolumeImageMetadataMetadataTemplate(xmlutil.TemplateBuilder):
 
75
    def construct(self):
 
76
        root = xmlutil.TemplateElement('volume_image_metadata',
 
77
                                       selector='volume_image_metadata')
 
78
        elem = xmlutil.SubTemplateElement(root, 'meta',
 
79
                                          selector=xmlutil.get_items)
 
80
        elem.set('key', 0)
 
81
        elem.text = 1
 
82
 
 
83
        return xmlutil.MasterTemplate(root, 1)
 
84
 
 
85
 
 
86
class VolumeImageMetadataTemplate(xmlutil.TemplateBuilder):
 
87
    def construct(self):
 
88
        root = xmlutil.TemplateElement('volume', selector='volume')
 
89
        root.append(VolumeImageMetadataMetadataTemplate())
 
90
 
 
91
        alias = Volume_image_metadata.alias
 
92
        namespace = Volume_image_metadata.namespace
 
93
 
 
94
        return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace})
 
95
 
 
96
 
 
97
class VolumesImageMetadataTemplate(xmlutil.TemplateBuilder):
 
98
    def construct(self):
 
99
        root = xmlutil.TemplateElement('volumes')
 
100
        elem = xmlutil.SubTemplateElement(root, 'volume', selector='volume')
 
101
        elem.append(VolumeImageMetadataMetadataTemplate())
 
102
 
 
103
        alias = Volume_image_metadata.alias
 
104
        namespace = Volume_image_metadata.namespace
 
105
 
 
106
        return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace})