From cddf139bbca5d8f8c8fb941b1b7a3e09f8ffa8f8 Mon Sep 17 00:00:00 2001 From: Steve Pulec Date: Tue, 3 Nov 2015 09:37:02 -0500 Subject: [PATCH] Add ability to create EBS volumes from snapshots. Closes #447. --- moto/ec2/models.py | 11 ++++++++--- moto/ec2/responses/elastic_block_store.py | 19 ++++++++++++++----- tests/test_ec2/test_elastic_block_store.py | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/moto/ec2/models.py b/moto/ec2/models.py index 0a2c3ffb7..446561d33 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -1388,12 +1388,13 @@ class VolumeAttachment(object): class Volume(TaggedEC2Resource): - def __init__(self, ec2_backend, volume_id, size, zone): + def __init__(self, ec2_backend, volume_id, size, zone, snapshot_id=None): self.id = volume_id self.size = size self.zone = zone self.create_time = utc_date_and_time() self.attachment = None + self.snapshot_id = snapshot_id self.ec2_backend = ec2_backend @classmethod @@ -1436,10 +1437,14 @@ class EBSBackend(object): self.snapshots = {} super(EBSBackend, self).__init__() - def create_volume(self, size, zone_name): + def create_volume(self, size, zone_name, snapshot_id=None): volume_id = random_volume_id() zone = self.get_zone_by_name(zone_name) - volume = Volume(self, volume_id, size, zone) + if snapshot_id: + snapshot = self.get_snapshot(snapshot_id) + if size is None: + size = snapshot.volume.size + volume = Volume(self, volume_id, size, zone, snapshot_id) self.volumes[volume_id] = volume return volume diff --git a/moto/ec2/responses/elastic_block_store.py b/moto/ec2/responses/elastic_block_store.py index 876766b2f..5adb4c7d0 100644 --- a/moto/ec2/responses/elastic_block_store.py +++ b/moto/ec2/responses/elastic_block_store.py @@ -25,9 +25,10 @@ class ElasticBlockStore(BaseResponse): return template.render(snapshot=snapshot) def create_volume(self): - size = self.querystring.get('Size')[0] - zone = self.querystring.get('AvailabilityZone')[0] - volume = self.ec2_backend.create_volume(size, zone) + size = self._get_param('Size') + zone = self._get_param('AvailabilityZone') + snapshot_id = self._get_param('SnapshotId') + volume = self.ec2_backend.create_volume(size, zone, snapshot_id) template = self.response_template(CREATE_VOLUME_RESPONSE) return template.render(volume=volume) @@ -110,7 +111,11 @@ CREATE_VOLUME_RESPONSE = """