74
75
LOG.audit(_("vol=%s"), vol, context=context)
76
77
if vol.get('volume_metadata'):
78
for i in vol['volume_metadata']:
79
meta_dict[i['key']] = i['value']
80
d['metadata'] = meta_dict
78
metadata = vol.get('volume_metadata')
79
d['metadata'] = dict((item['key'], item['value']) for item in metadata)
119
118
return xmlutil.MasterTemplate(root, 1)
121
class CommonDeserializer(wsgi.MetadataXMLDeserializer):
122
"""Common deserializer to handle xml-formatted volume requests.
124
Handles standard volume attributes as well as the optional metadata
128
metadata_deserializer = common.MetadataXMLDeserializer()
130
def _extract_volume(self, node):
131
"""Marshal the volume attribute of a parsed request."""
133
volume_node = self.find_first_child_named(node, 'volume')
135
attributes = ['display_name', 'display_description', 'size',
136
'volume_type', 'availability_zone']
137
for attr in attributes:
138
if volume_node.getAttribute(attr):
139
volume[attr] = volume_node.getAttribute(attr)
141
metadata_node = self.find_first_child_named(volume_node, 'metadata')
142
if metadata_node is not None:
143
volume['metadata'] = self.extract_metadata(metadata_node)
148
class CreateDeserializer(CommonDeserializer):
149
"""Deserializer to handle xml-formatted create volume requests.
151
Handles standard volume attributes as well as the optional metadata
155
def default(self, string):
156
"""Deserialize an xml-formatted volume create request."""
157
dom = minidom.parseString(string)
158
volume = self._extract_volume(dom)
159
return {'body': {'volume': volume}}
122
162
class VolumeController(object):
123
163
"""The Volumes API controller for the OpenStack API."""
174
214
return {'volumes': res}
176
216
@wsgi.serializers(xml=VolumeTemplate)
217
@wsgi.deserializers(xml=CreateDeserializer)
177
218
def create(self, req, body):
178
219
"""Creates a new volume."""
179
220
context = req.environ['nova.context']