87
def make_volume(elem):
91
elem.set('availabilityZone')
93
elem.set('displayName')
94
elem.set('displayDescription')
95
elem.set('volumeType')
96
elem.set('snapshotId')
98
attachments = xmlutil.SubTemplateElement(elem, 'attachments')
99
attachment = xmlutil.SubTemplateElement(attachments, 'attachment',
100
selector='attachments')
101
make_attachment(attachment)
103
metadata = xmlutil.make_flat_dict('metadata')
104
elem.append(metadata)
107
class VolumeTemplate(xmlutil.TemplateBuilder):
109
root = xmlutil.TemplateElement('volume', selector='volume')
111
return xmlutil.MasterTemplate(root, 1)
114
class VolumesTemplate(xmlutil.TemplateBuilder):
116
root = xmlutil.TemplateElement('volumes')
117
elem = xmlutil.SubTemplateElement(root, 'volume', selector='volumes')
119
return xmlutil.MasterTemplate(root, 1)
87
122
class VolumeController(object):
88
123
"""The Volumes API controller for the OpenStack API."""
114
150
raise exc.HTTPNotFound()
115
151
return webob.Response(status_int=202)
153
@wsgi.serializers(xml=VolumesTemplate)
117
154
def index(self, req):
118
155
"""Returns a summary list of volumes."""
119
156
return self._items(req, entity_maker=_translate_volume_summary_view)
158
@wsgi.serializers(xml=VolumesTemplate)
121
159
def detail(self, req):
122
160
"""Returns a detailed list of volumes."""
123
161
return self._items(req, entity_maker=_translate_volume_detail_view)
167
206
return {'volume': retval}
170
def make_volume(elem):
174
elem.set('availabilityZone')
175
elem.set('createdAt')
176
elem.set('displayName')
177
elem.set('displayDescription')
178
elem.set('volumeType')
179
elem.set('snapshotId')
181
attachments = xmlutil.SubTemplateElement(elem, 'attachments')
182
attachment = xmlutil.SubTemplateElement(attachments, 'attachment',
183
selector='attachments')
184
make_attachment(attachment)
186
metadata = xmlutil.make_flat_dict('metadata')
187
elem.append(metadata)
190
class VolumeTemplate(xmlutil.TemplateBuilder):
192
root = xmlutil.TemplateElement('volume', selector='volume')
194
return xmlutil.MasterTemplate(root, 1)
197
class VolumesTemplate(xmlutil.TemplateBuilder):
199
root = xmlutil.TemplateElement('volumes')
200
elem = xmlutil.SubTemplateElement(root, 'volume', selector='volumes')
202
return xmlutil.MasterTemplate(root, 1)
205
class VolumeSerializer(xmlutil.XMLTemplateSerializer):
207
return VolumeTemplate()
210
return VolumesTemplate()
213
return VolumesTemplate()
216
209
def _translate_attachment_detail_view(_context, vol):
217
210
"""Maps keys for attachment details view."""
237
def make_attachment(elem):
244
class VolumeAttachmentTemplate(xmlutil.TemplateBuilder):
246
root = xmlutil.TemplateElement('volumeAttachment',
247
selector='volumeAttachment')
248
make_attachment(root)
249
return xmlutil.MasterTemplate(root, 1)
252
class VolumeAttachmentsTemplate(xmlutil.TemplateBuilder):
254
root = xmlutil.TemplateElement('volumeAttachments')
255
elem = xmlutil.SubTemplateElement(root, 'volumeAttachment',
256
selector='volumeAttachments')
257
make_attachment(elem)
258
return xmlutil.MasterTemplate(root, 1)
244
261
class VolumeAttachmentController(object):
245
262
"""The volume attachment API controller for the Openstack API.
254
271
self.volume_api = volume.API()
255
272
super(VolumeAttachmentController, self).__init__()
274
@wsgi.serializers(xml=VolumeAttachmentsTemplate)
257
275
def index(self, req, server_id):
258
276
"""Returns the list of volume attachments for a given instance."""
259
277
return self._items(req, server_id,
260
278
entity_maker=_translate_attachment_summary_view)
280
@wsgi.serializers(xml=VolumeAttachmentTemplate)
262
281
def show(self, req, server_id, id):
263
282
"""Return data about the given volume attachment."""
264
283
context = req.environ['nova.context']
278
297
return {'volumeAttachment': _translate_attachment_detail_view(context,
300
@wsgi.serializers(xml=VolumeAttachmentTemplate)
281
301
def create(self, req, server_id, body):
282
302
"""Attach a volume to an instance."""
283
303
context = req.environ['nova.context']
356
376
return {'volumeAttachments': res}
359
def make_attachment(elem):
366
class VolumeAttachmentTemplate(xmlutil.TemplateBuilder):
368
root = xmlutil.TemplateElement('volumeAttachment',
369
selector='volumeAttachment')
370
make_attachment(root)
371
return xmlutil.MasterTemplate(root, 1)
374
class VolumeAttachmentsTemplate(xmlutil.TemplateBuilder):
376
root = xmlutil.TemplateElement('volumeAttachments')
377
elem = xmlutil.SubTemplateElement(root, 'volumeAttachment',
378
selector='volumeAttachments')
379
make_attachment(elem)
380
return xmlutil.MasterTemplate(root, 1)
383
class VolumeAttachmentSerializer(xmlutil.XMLTemplateSerializer):
385
return VolumeAttachmentTemplate()
388
return VolumeAttachmentsTemplate()
391
379
class BootFromVolumeController(servers.Controller):
392
380
"""The boot from volume API controller for the Openstack API."""
410
def make_snapshot(elem):
414
elem.set('createdAt')
415
elem.set('displayName')
416
elem.set('displayDescription')
420
class SnapshotTemplate(xmlutil.TemplateBuilder):
422
root = xmlutil.TemplateElement('snapshot', selector='snapshot')
424
return xmlutil.MasterTemplate(root, 1)
427
class SnapshotsTemplate(xmlutil.TemplateBuilder):
429
root = xmlutil.TemplateElement('snapshots')
430
elem = xmlutil.SubTemplateElement(root, 'snapshot',
431
selector='snapshots')
433
return xmlutil.MasterTemplate(root, 1)
422
436
class SnapshotController(object):
423
437
"""The Volumes API controller for the OpenStack API."""
449
464
return exc.HTTPNotFound()
450
465
return webob.Response(status_int=202)
467
@wsgi.serializers(xml=SnapshotsTemplate)
452
468
def index(self, req):
453
469
"""Returns a summary list of snapshots."""
454
470
return self._items(req, entity_maker=_translate_snapshot_summary_view)
472
@wsgi.serializers(xml=SnapshotsTemplate)
456
473
def detail(self, req):
457
474
"""Returns a detailed list of snapshots."""
458
475
return self._items(req, entity_maker=_translate_snapshot_detail_view)
466
483
res = [entity_maker(context, snapshot) for snapshot in limited_list]
467
484
return {'snapshots': res}
486
@wsgi.serializers(xml=SnapshotTemplate)
469
487
def create(self, req, body):
470
488
"""Creates a new snapshot."""
471
489
context = req.environ['nova.context']
495
513
return {'snapshot': retval}
498
def make_snapshot(elem):
502
elem.set('createdAt')
503
elem.set('displayName')
504
elem.set('displayDescription')
508
class SnapshotTemplate(xmlutil.TemplateBuilder):
510
root = xmlutil.TemplateElement('snapshot', selector='snapshot')
512
return xmlutil.MasterTemplate(root, 1)
515
class SnapshotsTemplate(xmlutil.TemplateBuilder):
517
root = xmlutil.TemplateElement('snapshots')
518
elem = xmlutil.SubTemplateElement(root, 'snapshot',
519
selector='snapshots')
521
return xmlutil.MasterTemplate(root, 1)
524
class SnapshotSerializer(xmlutil.XMLTemplateSerializer):
526
return SnapshotTemplate()
529
return SnapshotsTemplate()
532
return SnapshotsTemplate()
535
516
class Volumes(extensions.ExtensionDescriptor):
536
517
"""Volumes support"""
539
520
alias = "os-volumes"
540
namespace = "http://docs.openstack.org/ext/volumes/api/v1.1"
521
namespace = "http://docs.openstack.org/compute/ext/volumes/api/v1.1"
541
522
updated = "2011-03-25T00:00:00+00:00"
543
524
def get_resources(self):
547
'application/xml': VolumeSerializer(),
549
serializer = wsgi.ResponseSerializer(body_serializers)
551
527
# NOTE(justinsb): No way to provide singular name ('volume')
552
528
# Does this matter?
553
529
res = extensions.ResourceExtension('os-volumes',
554
530
VolumeController(),
555
serializer=serializer,
556
531
collection_actions={'detail': 'GET'})
557
532
resources.append(res)
560
'application/xml': VolumeAttachmentSerializer(),
562
serializer = wsgi.ResponseSerializer(body_serializers)
564
534
res = extensions.ResourceExtension('os-volume_attachments',
565
535
VolumeAttachmentController(),
566
serializer=serializer,
568
537
member_name='server',
569
538
collection_name='servers'))
570
539
resources.append(res)
572
headers_serializer = servers.HeadersSerializer()
574
'application/xml': servers.ServerXMLSerializer(),
576
serializer = wsgi.ResponseSerializer(body_serializers,
579
body_deserializers = {
580
'application/xml': servers.ServerXMLDeserializer(),
582
deserializer = wsgi.RequestDeserializer(body_deserializers)
584
541
res = extensions.ResourceExtension('os-volumes_boot',
585
BootFromVolumeController(),
586
serializer=serializer,
587
deserializer=deserializer)
542
BootFromVolumeController())
588
543
resources.append(res)
590
snapshot_serializers = {
591
'application/xml': SnapshotSerializer(),
593
snap_serializer = wsgi.ResponseSerializer(snapshot_serializers)
595
545
res = extensions.ResourceExtension('os-snapshots',
596
546
SnapshotController(),
597
serializer=snap_serializer,
598
547
collection_actions={'detail': 'GET'})
599
548
resources.append(res)