Continue work on simulated ebs / instance store: undecided of approah
diff --git a/ec2stack/configure.py b/ec2stack/configure.py index 25e79d6..a80b70d 100644 --- a/ec2stack/configure.py +++ b/ec2stack/configure.py
@@ -170,7 +170,7 @@ """ configure_instance_type_mapings = raw_input( - 'Do you wish to input a local custom storage disk? (Yes/No): ' + 'Do you wish to input a local custom storage disk for instances? (Yes/No): ' ) if configure_instance_type_mapings.lower() in ['yes', 'y']:
diff --git a/ec2stack/providers/cloudstack/instances.py b/ec2stack/providers/cloudstack/instances.py index 68c8c49..b391c51 100644 --- a/ec2stack/providers/cloudstack/instances.py +++ b/ec2stack/providers/cloudstack/instances.py
@@ -8,7 +8,7 @@ from flask import current_app from ec2stack.providers import cloudstack -from ec2stack.providers.cloudstack import requester, service_offerings, zones +from ec2stack.providers.cloudstack import requester, service_offerings, zones, disk_offerings from ec2stack import helpers, errors @@ -122,7 +122,21 @@ @return: Response. """ + args = {} + if helpers.contains_parameter('Placement.AvailabilityZone'): + zone_id = zones.get_zone( + helpers.get('Placement.AvailabilityZone') + ) + else: + zone_id = zones.get_zone( + current_app.config['CLOUDSTACK_DEFAULT_ZONE'] + )['id'] + + if helpers.get('BlockDeviceMapping.1.Ebs.VolumeType') is not None: + args = _get_simulated_combination_instance_storage_args(zone_id) + else: + args['zoneid'] = zone_id if helpers.get('InstanceType') is None: instance_type = 'm1.small' @@ -139,15 +153,6 @@ service_offerings.get_service_offering(instance_type)['id'] args['templateid'] = helpers.get('ImageId') - if helpers.contains_parameter('Placement.AvailabilityZone'): - args['zoneid'] = zones.get_zone( - helpers.get('Placement.AvailabilityZone') - ) - else: - args['zoneid'] = zones.get_zone( - current_app.config['CLOUDSTACK_DEFAULT_ZONE'] - )['id'] - if helpers.contains_parameter('KeyName'): args['keypair'] = helpers.get('KeyName') @@ -178,6 +183,25 @@ return response +def _get_simulated_combination_instance_storage_args(zone_id): + args = {} + disk_type = helpers.get('BlockDeviceMapping.1.Ebs.VolumeType') + if disk_type == 'gp2': + if 'CLOUDSTACK_LOCAL_CUSTOM_DISK_OFFERING' in current_app.config: + args['diskofferingid'] = disk_offerings.get_disk_offering( + current_app.config['CLOUDSTACK_LOCAL_CUSTOM_DISK_OFFERING'] + )['id'] + else: + errors.invalid_request( + str('CLOUDSTACK_LOCAL_CUSTOM_DISK_OFFERING') + " not found in " + "configuration, no able to configure gp2 disk, please run ec2stack-configure and chose to configure " + "a local disk") + + if helpers.get('BlockDeviceMapping.1.Ebs.VolumeSize') is None: + errors.invalid_request("VolumeSize not found in BlockDeviceMapping") + else: + args['size'] = helpers.get('BlockDeviceMapping.1.Ebs.VolumeSize') + def _run_instance_response(response): """
diff --git a/ec2stack/providers/cloudstack/volumes.py b/ec2stack/providers/cloudstack/volumes.py index 8b0cb4e..c89ed26 100644 --- a/ec2stack/providers/cloudstack/volumes.py +++ b/ec2stack/providers/cloudstack/volumes.py
@@ -92,27 +92,40 @@ """ args = {} - if helpers.contains_parameter('SnapshotId'): - args['snapshotid'] = helpers.get('SnapshotId') - - else: - helpers.require_parameters(['Size']) - args['size'] = helpers.get('Size') - args['diskofferingid'] = disk_offerings.get_disk_offering( - current_app.config['CLOUDSTACK_CUSTOM_DISK_OFFERING'] - )['id'] - zone_name = helpers.get('AvailabilityZone') zone_id = zones.get_zone(zone_name)['id'] args['zoneid'] = zone_id - args['command'] = 'createVolume' - args['name'] = uuid.uuid1() - response = requester.make_request_async(args) + if helpers.contains_parameter('SnapshotId'): + args['snapshotid'] = helpers.get('SnapshotId') + args['name'] = uuid.uuid1() + args['command'] = 'createVolume' + response = requester.make_request_async(args) + + else: + helpers.require_parameters(['Size']) + size = helpers.get('Size') + disk_id = disk_offerings.get_disk_offering( + current_app.config['CLOUDSTACK_CUSTOM_DISK_OFFERING'] + )['id'] + response = create_cloudstack_volume_from_disk(disk_id, size, args) return response +def create_cloudstack_volume_from_disk(disk_id, size, args): + """ + Create a volume from disk offering. + + @return: Response. + """ + args['command'] = 'createVolume' + args['diskofferingid'] = disk_id + args['name'] = uuid.uuid1() + args['size'] = size + + return requester.make_request_async(args) + def _create_volume_response(response): """
diff --git a/tests/volume_tests.py b/tests/volume_tests.py index 7d56402..ad593a2 100644 --- a/tests/volume_tests.py +++ b/tests/volume_tests.py
@@ -240,11 +240,20 @@ ) get_request.return_value.status_code = 200 + get_zone = mock.Mock() + get_zone.return_value = json.loads(read_file( + 'tests/data/zones_search.json' + )) + with mock.patch('requests.get', get_request): - response = self.post( - '/', - data=data - ) + with mock.patch( + 'ec2stack.providers.cloudstack.zones.get_zone', + get_zone + ): + response = self.post( + '/', + data=data + ) self.assert_bad_request(response) assert 'InvalidDiskOffering.NotFound' in response.data