moto/moto/ec2/responses/elastic_block_store.py

310 lines
13 KiB
Python
Raw Normal View History

from __future__ import unicode_literals
from moto.core.responses import BaseResponse
from moto.ec2.utils import filters_from_querystring
2013-02-22 04:13:01 +00:00
class ElasticBlockStore(BaseResponse):
2013-02-22 04:13:01 +00:00
def attach_volume(self):
volume_id = self._get_param('VolumeId')
instance_id = self._get_param('InstanceId')
device_path = self._get_param('Device')
if self.is_not_dryrun('AttachVolume'):
2017-02-24 02:37:43 +00:00
attachment = self.ec2_backend.attach_volume(
volume_id, instance_id, device_path)
template = self.response_template(ATTACHED_VOLUME_RESPONSE)
return template.render(attachment=attachment)
2013-02-22 04:13:01 +00:00
def copy_snapshot(self):
if self.is_not_dryrun('CopySnapshot'):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.copy_snapshot is not yet implemented')
2013-02-22 04:13:01 +00:00
def create_snapshot(self):
volume_id = self._get_param('VolumeId')
description = self._get_param('Description')
tags = self._parse_tag_specification("TagSpecification")
snapshot_tags = tags.get('snapshot', {})
if self.is_not_dryrun('CreateSnapshot'):
snapshot = self.ec2_backend.create_snapshot(volume_id, description)
snapshot.add_tags(snapshot_tags)
template = self.response_template(CREATE_SNAPSHOT_RESPONSE)
return template.render(snapshot=snapshot)
2013-02-22 04:13:01 +00:00
def create_volume(self):
size = self._get_param('Size')
zone = self._get_param('AvailabilityZone')
snapshot_id = self._get_param('SnapshotId')
2018-01-15 08:52:32 +00:00
tags = self._parse_tag_specification("TagSpecification")
volume_tags = tags.get('volume', {})
encrypted = self._get_param('Encrypted', if_none=False)
if self.is_not_dryrun('CreateVolume'):
2017-02-24 02:37:43 +00:00
volume = self.ec2_backend.create_volume(
size, zone, snapshot_id, encrypted)
2018-01-15 08:52:32 +00:00
volume.add_tags(volume_tags)
template = self.response_template(CREATE_VOLUME_RESPONSE)
return template.render(volume=volume)
2013-02-22 04:13:01 +00:00
def delete_snapshot(self):
snapshot_id = self._get_param('SnapshotId')
if self.is_not_dryrun('DeleteSnapshot'):
self.ec2_backend.delete_snapshot(snapshot_id)
return DELETE_SNAPSHOT_RESPONSE
2013-02-22 04:13:01 +00:00
def delete_volume(self):
volume_id = self._get_param('VolumeId')
if self.is_not_dryrun('DeleteVolume'):
self.ec2_backend.delete_volume(volume_id)
return DELETE_VOLUME_RESPONSE
2013-02-22 04:13:01 +00:00
def describe_snapshots(self):
filters = filters_from_querystring(self.querystring)
snapshot_ids = self._get_multi_param('SnapshotId')
snapshots = self.ec2_backend.describe_snapshots(snapshot_ids=snapshot_ids, filters=filters)
template = self.response_template(DESCRIBE_SNAPSHOTS_RESPONSE)
return template.render(snapshots=snapshots)
2013-02-22 04:13:01 +00:00
def describe_volumes(self):
filters = filters_from_querystring(self.querystring)
volume_ids = self._get_multi_param('VolumeId')
volumes = self.ec2_backend.describe_volumes(volume_ids=volume_ids, filters=filters)
template = self.response_template(DESCRIBE_VOLUMES_RESPONSE)
2013-02-23 22:37:55 +00:00
return template.render(volumes=volumes)
2013-02-22 04:13:01 +00:00
def describe_volume_attribute(self):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.describe_volume_attribute is not yet implemented')
2013-02-22 04:13:01 +00:00
def describe_volume_status(self):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.describe_volume_status is not yet implemented')
2013-02-22 04:13:01 +00:00
def detach_volume(self):
volume_id = self._get_param('VolumeId')
instance_id = self._get_param('InstanceId')
device_path = self._get_param('Device')
if self.is_not_dryrun('DetachVolume'):
2017-02-24 02:37:43 +00:00
attachment = self.ec2_backend.detach_volume(
volume_id, instance_id, device_path)
template = self.response_template(DETATCH_VOLUME_RESPONSE)
return template.render(attachment=attachment)
2013-02-23 22:37:55 +00:00
2013-02-22 04:13:01 +00:00
def enable_volume_io(self):
if self.is_not_dryrun('EnableVolumeIO'):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.enable_volume_io is not yet implemented')
2013-02-22 04:13:01 +00:00
def import_volume(self):
if self.is_not_dryrun('ImportVolume'):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.import_volume is not yet implemented')
2013-02-22 04:13:01 +00:00
def describe_snapshot_attribute(self):
snapshot_id = self._get_param('SnapshotId')
2017-02-24 02:37:43 +00:00
groups = self.ec2_backend.get_create_volume_permission_groups(
snapshot_id)
template = self.response_template(
DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE)
return template.render(snapshot_id=snapshot_id, groups=groups)
2013-02-22 04:13:01 +00:00
def modify_snapshot_attribute(self):
snapshot_id = self._get_param('SnapshotId')
operation_type = self._get_param('OperationType')
group = self._get_param('UserGroup.1')
user_id = self._get_param('UserId.1')
if self.is_not_dryrun('ModifySnapshotAttribute'):
if (operation_type == 'add'):
2017-02-24 02:37:43 +00:00
self.ec2_backend.add_create_volume_permission(
snapshot_id, user_id=user_id, group=group)
elif (operation_type == 'remove'):
2017-02-24 02:37:43 +00:00
self.ec2_backend.remove_create_volume_permission(
snapshot_id, user_id=user_id, group=group)
return MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE
2013-02-22 04:13:01 +00:00
def modify_volume_attribute(self):
if self.is_not_dryrun('ModifyVolumeAttribute'):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.modify_volume_attribute is not yet implemented')
2013-02-22 04:13:01 +00:00
def reset_snapshot_attribute(self):
if self.is_not_dryrun('ResetSnapshotAttribute'):
2017-02-24 02:37:43 +00:00
raise NotImplementedError(
'ElasticBlockStore.reset_snapshot_attribute is not yet implemented')
2013-02-22 04:13:01 +00:00
2013-02-23 22:37:55 +00:00
2016-02-02 13:15:18 +00:00
CREATE_VOLUME_RESPONSE = """<CreateVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
2013-02-23 22:37:55 +00:00
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<volumeId>{{ volume.id }}</volumeId>
<size>{{ volume.size }}</size>
{% if volume.snapshot_id %}
<snapshotId>{{ volume.snapshot_id }}</snapshotId>
{% else %}
<snapshotId/>
{% endif %}
2016-07-04 10:25:51 +00:00
<encrypted>{{ volume.encrypted }}</encrypted>
2013-02-23 22:37:55 +00:00
<availabilityZone>{{ volume.zone.name }}</availabilityZone>
<status>creating</status>
<createTime>{{ volume.create_time}}</createTime>
2018-01-15 08:52:32 +00:00
<tagSet>
{% for tag in volume.get_tags() %}
<item>
<resourceId>{{ tag.resource_id }}</resourceId>
<resourceType>{{ tag.resource_type }}</resourceType>
<key>{{ tag.key }}</key>
<value>{{ tag.value }}</value>
</item>
{% endfor %}
</tagSet>
2013-02-23 22:37:55 +00:00
<volumeType>standard</volumeType>
</CreateVolumeResponse>"""
2016-02-02 13:15:18 +00:00
DESCRIBE_VOLUMES_RESPONSE = """<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
2013-02-23 22:37:55 +00:00
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<volumeSet>
{% for volume in volumes %}
<item>
<volumeId>{{ volume.id }}</volumeId>
<size>{{ volume.size }}</size>
{% if volume.snapshot_id %}
<snapshotId>{{ volume.snapshot_id }}</snapshotId>
{% else %}
<snapshotId/>
{% endif %}
<encrypted>{{ volume.encrypted }}</encrypted>
2013-02-23 22:37:55 +00:00
<availabilityZone>{{ volume.zone.name }}</availabilityZone>
<status>{{ volume.status }}</status>
<createTime>{{ volume.create_time}}</createTime>
2013-02-23 22:37:55 +00:00
<attachmentSet>
{% if volume.attachment %}
<item>
<volumeId>{{ volume.id }}</volumeId>
<instanceId>{{ volume.attachment.instance.id }}</instanceId>
<device>{{ volume.attachment.device }}</device>
<status>attached</status>
<attachTime>{{volume.attachment.attach_time}}</attachTime>
2013-02-23 22:37:55 +00:00
<deleteOnTermination>false</deleteOnTermination>
</item>
{% endif %}
</attachmentSet>
<tagSet>
{% for tag in volume.get_tags() %}
<item>
<resourceId>{{ tag.resource_id }}</resourceId>
<resourceType>{{ tag.resource_type }}</resourceType>
<key>{{ tag.key }}</key>
<value>{{ tag.value }}</value>
</item>
{% endfor %}
</tagSet>
2013-02-23 22:37:55 +00:00
<volumeType>standard</volumeType>
</item>
{% endfor %}
</volumeSet>
</DescribeVolumesResponse>"""
2016-02-02 13:15:18 +00:00
DELETE_VOLUME_RESPONSE = """<DeleteVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
2013-02-23 22:37:55 +00:00
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<return>true</return>
</DeleteVolumeResponse>"""
2016-02-02 13:15:18 +00:00
ATTACHED_VOLUME_RESPONSE = """<AttachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
2013-02-23 22:37:55 +00:00
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<volumeId>{{ attachment.volume.id }}</volumeId>
<instanceId>{{ attachment.instance.id }}</instanceId>
<device>{{ attachment.device }}</device>
<status>attaching</status>
<attachTime>{{attachment.attach_time}}</attachTime>
2013-02-23 22:37:55 +00:00
</AttachVolumeResponse>"""
2016-02-02 13:15:18 +00:00
DETATCH_VOLUME_RESPONSE = """<DetachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
2013-02-23 22:37:55 +00:00
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<volumeId>{{ attachment.volume.id }}</volumeId>
<instanceId>{{ attachment.instance.id }}</instanceId>
<device>{{ attachment.device }}</device>
<status>detaching</status>
<attachTime>2013-10-04T17:38:53.000Z</attachTime>
2013-02-23 22:37:55 +00:00
</DetachVolumeResponse>"""
2016-02-02 13:15:18 +00:00
CREATE_SNAPSHOT_RESPONSE = """<CreateSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<snapshotId>{{ snapshot.id }}</snapshotId>
<volumeId>{{ snapshot.volume.id }}</volumeId>
<status>pending</status>
<startTime>{{ snapshot.start_time}}</startTime>
<progress>60%</progress>
<ownerId>{{ snapshot.owner_id }}</ownerId>
<volumeSize>{{ snapshot.volume.size }}</volumeSize>
<description>{{ snapshot.description }}</description>
2016-07-04 13:29:33 +00:00
<encrypted>{{ snapshot.encrypted }}</encrypted>
<tagSet>
{% for tag in snapshot.get_tags() %}
<item>
<resourceId>{{ tag.resource_id }}</resourceId>
<resourceType>{{ tag.resource_type }}</resourceType>
<key>{{ tag.key }}</key>
<value>{{ tag.value }}</value>
</item>
{% endfor %}
</tagSet>
</CreateSnapshotResponse>"""
2016-02-02 13:15:18 +00:00
DESCRIBE_SNAPSHOTS_RESPONSE = """<DescribeSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<snapshotSet>
{% for snapshot in snapshots %}
<item>
<snapshotId>{{ snapshot.id }}</snapshotId>
<volumeId>{{ snapshot.volume.id }}</volumeId>
2016-05-02 02:24:49 +00:00
<status>{{ snapshot.status }}</status>
<startTime>{{ snapshot.start_time}}</startTime>
<progress>100%</progress>
<ownerId>{{ snapshot.owner_id }}</ownerId>
<volumeSize>{{ snapshot.volume.size }}</volumeSize>
<description>{{ snapshot.description }}</description>
2016-07-04 13:29:33 +00:00
<encrypted>{{ snapshot.encrypted }}</encrypted>
<tagSet>
{% for tag in snapshot.get_tags() %}
<item>
<resourceId>{{ tag.resource_id }}</resourceId>
<resourceType>{{ tag.resource_type }}</resourceType>
<key>{{ tag.key }}</key>
<value>{{ tag.value }}</value>
</item>
{% endfor %}
</tagSet>
</item>
{% endfor %}
</snapshotSet>
</DescribeSnapshotsResponse>"""
2016-02-02 13:15:18 +00:00
DELETE_SNAPSHOT_RESPONSE = """<DeleteSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
<return>true</return>
</DeleteSnapshotResponse>"""
DESCRIBE_SNAPSHOT_ATTRIBUTES_RESPONSE = """
2016-02-02 13:15:18 +00:00
<DescribeSnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
<requestId>a9540c9f-161a-45d8-9cc1-1182b89ad69f</requestId>
<snapshotId>snap-a0332ee0</snapshotId>
{% if not groups %}
<createVolumePermission/>
{% endif %}
{% if groups %}
<createVolumePermission>
{% for group in groups %}
<item>
<group>{{ group }}</group>
</item>
{% endfor %}
</createVolumePermission>
{% endif %}
</DescribeSnapshotAttributeResponse>
"""
MODIFY_SNAPSHOT_ATTRIBUTE_RESPONSE = """
2016-02-02 13:15:18 +00:00
<ModifySnapshotAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
<requestId>666d2944-9276-4d6a-be12-1f4ada972fd8</requestId>
<return>true</return>
</ModifySnapshotAttributeResponse>
2017-02-24 02:37:43 +00:00
"""