EC2:create_volume() - Add support for VolumeType (#4264)
This commit is contained in:
parent
88c6a2f6db
commit
4e45152d86
@ -685,7 +685,11 @@ class Instance(TaggedEC2Resource, BotoInstance, CloudFormationModel):
|
||||
kms_key_id=None,
|
||||
):
|
||||
volume = self.ec2_backend.create_volume(
|
||||
size, self.region_name, snapshot_id, encrypted, kms_key_id
|
||||
size=size,
|
||||
zone_name=self.region_name,
|
||||
snapshot_id=snapshot_id,
|
||||
encrypted=encrypted,
|
||||
kms_key_id=kms_key_id,
|
||||
)
|
||||
self.ec2_backend.attach_volume(
|
||||
volume.id, self.id, device_path, delete_on_termination
|
||||
@ -694,7 +698,7 @@ class Instance(TaggedEC2Resource, BotoInstance, CloudFormationModel):
|
||||
def setup_defaults(self):
|
||||
# Default have an instance with root volume should you not wish to
|
||||
# override with attach volume cmd.
|
||||
volume = self.ec2_backend.create_volume(8, "us-east-1a")
|
||||
volume = self.ec2_backend.create_volume(size=8, zone_name="us-east-1a")
|
||||
self.ec2_backend.attach_volume(volume.id, self.id, "/dev/sda1", True)
|
||||
|
||||
def teardown_defaults(self):
|
||||
@ -1572,7 +1576,7 @@ class Ami(TaggedEC2Resource):
|
||||
self.launch_permission_groups.add("all")
|
||||
|
||||
# AWS auto-creates these, we should reflect the same.
|
||||
volume = self.ec2_backend.create_volume(15, region_name)
|
||||
volume = self.ec2_backend.create_volume(size=15, zone_name=region_name)
|
||||
self.ebs_snapshot = self.ec2_backend.create_snapshot(
|
||||
volume.id, "Auto-created snapshot for AMI %s" % self.id, owner_id
|
||||
)
|
||||
@ -3209,8 +3213,10 @@ class Volume(TaggedEC2Resource, CloudFormationModel):
|
||||
snapshot_id=None,
|
||||
encrypted=False,
|
||||
kms_key_id=None,
|
||||
volume_type=None,
|
||||
):
|
||||
self.id = volume_id
|
||||
self.volume_type = volume_type or "gp2"
|
||||
self.size = size
|
||||
self.zone = zone
|
||||
self.create_time = utc_date_and_time()
|
||||
@ -3331,7 +3337,13 @@ class EBSBackend(object):
|
||||
super().__init__()
|
||||
|
||||
def create_volume(
|
||||
self, size, zone_name, snapshot_id=None, encrypted=False, kms_key_id=None
|
||||
self,
|
||||
size,
|
||||
zone_name,
|
||||
snapshot_id=None,
|
||||
encrypted=False,
|
||||
kms_key_id=None,
|
||||
volume_type=None,
|
||||
):
|
||||
if kms_key_id and not encrypted:
|
||||
raise InvalidParameterDependency("KmsKeyId", "Encrypted")
|
||||
@ -3345,7 +3357,16 @@ class EBSBackend(object):
|
||||
size = snapshot.volume.size
|
||||
if snapshot.encrypted:
|
||||
encrypted = snapshot.encrypted
|
||||
volume = Volume(self, volume_id, size, zone, snapshot_id, encrypted, kms_key_id)
|
||||
volume = Volume(
|
||||
self,
|
||||
volume_id=volume_id,
|
||||
size=size,
|
||||
zone=zone,
|
||||
snapshot_id=snapshot_id,
|
||||
encrypted=encrypted,
|
||||
kms_key_id=kms_key_id,
|
||||
volume_type=volume_type,
|
||||
)
|
||||
self.volumes[volume_id] = volume
|
||||
return volume
|
||||
|
||||
|
@ -44,13 +44,19 @@ class ElasticBlockStore(BaseResponse):
|
||||
size = self._get_param("Size")
|
||||
zone = self._get_param("AvailabilityZone")
|
||||
snapshot_id = self._get_param("SnapshotId")
|
||||
volume_type = self._get_param("VolumeType")
|
||||
tags = self._parse_tag_specification("TagSpecification")
|
||||
volume_tags = tags.get("volume", {})
|
||||
encrypted = self._get_bool_param("Encrypted", if_none=False)
|
||||
kms_key_id = self._get_param("KmsKeyId")
|
||||
if self.is_not_dryrun("CreateVolume"):
|
||||
volume = self.ec2_backend.create_volume(
|
||||
size, zone, snapshot_id, encrypted, kms_key_id
|
||||
size=size,
|
||||
zone_name=zone,
|
||||
snapshot_id=snapshot_id,
|
||||
encrypted=encrypted,
|
||||
kms_key_id=kms_key_id,
|
||||
volume_type=volume_type,
|
||||
)
|
||||
volume.add_tags(volume_tags)
|
||||
template = self.response_template(CREATE_VOLUME_RESPONSE)
|
||||
@ -183,7 +189,7 @@ CREATE_VOLUME_RESPONSE = """<CreateVolumeResponse xmlns="http://ec2.amazonaws.co
|
||||
{% endfor %}
|
||||
</tagSet>
|
||||
{% endif %}
|
||||
<volumeType>standard</volumeType>
|
||||
<volumeType>{{ volume.volume_type }}</volumeType>
|
||||
</CreateVolumeResponse>"""
|
||||
|
||||
DESCRIBE_VOLUMES_RESPONSE = """<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||
@ -229,7 +235,7 @@ DESCRIBE_VOLUMES_RESPONSE = """<DescribeVolumesResponse xmlns="http://ec2.amazon
|
||||
{% endfor %}
|
||||
</tagSet>
|
||||
{% endif %}
|
||||
<volumeType>standard</volumeType>
|
||||
<volumeType>{{ volume.volume_type }}</volumeType>
|
||||
</item>
|
||||
{% endfor %}
|
||||
</volumeSet>
|
||||
|
@ -1543,3 +1543,26 @@ def test_kms_key_id_property_hidden_when_volume_not_encrypted():
|
||||
)
|
||||
volume.encrypted.should.be.false
|
||||
volume.kms_key_id.should.be.none
|
||||
|
||||
|
||||
@mock_ec2
|
||||
def test_create_volume_with_standard_type():
|
||||
ec2 = boto3.client("ec2", region_name="us-east-1")
|
||||
volume = ec2.create_volume(AvailabilityZone="us-east-1a", Size=100, Iops=1000)
|
||||
volume["VolumeType"].should.equal("gp2")
|
||||
|
||||
volume = ec2.describe_volumes(VolumeIds=[volume["VolumeId"]])["Volumes"][0]
|
||||
volume["VolumeType"].should.equal("gp2")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("volume_type", ["gp2", "gp3", "io1", "io2", "standard"])
|
||||
@mock_ec2
|
||||
def test_create_volume_with_non_standard_type(volume_type):
|
||||
ec2 = boto3.client("ec2", region_name="us-east-1")
|
||||
volume = ec2.create_volume(
|
||||
AvailabilityZone="us-east-1a", Size=100, Iops=1000, VolumeType=volume_type
|
||||
)
|
||||
volume["VolumeType"].should.equal(volume_type)
|
||||
|
||||
volume = ec2.describe_volumes(VolumeIds=[volume["VolumeId"]])["Volumes"][0]
|
||||
volume["VolumeType"].should.equal(volume_type)
|
||||
|
Loading…
Reference in New Issue
Block a user