You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by se...@apache.org on 2015/05/05 15:26:22 UTC

[29/50] cloudstack-ec2stack git commit: Continue work on simulated ebs / instance store: undecided of approah

Continue work on simulated ebs / instance store: undecided of approah


Project: http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/commit/36ba44f6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/tree/36ba44f6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/diff/36ba44f6

Branch: refs/heads/master
Commit: 36ba44f670bbe8ba95ee8ded01841e458165b003
Parents: a4965ff
Author: BroganD1993 <da...@hotmail.com>
Authored: Fri Aug 15 22:17:17 2014 +0100
Committer: BroganD1993 <da...@hotmail.com>
Committed: Fri Aug 15 22:17:17 2014 +0100

----------------------------------------------------------------------
 ec2stack/configure.py                      |  2 +-
 ec2stack/providers/cloudstack/instances.py | 44 +++++++++++++++++++------
 ec2stack/providers/cloudstack/volumes.py   | 29 +++++++++++-----
 tests/volume_tests.py                      | 17 +++++++---
 4 files changed, 69 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/blob/36ba44f6/ec2stack/configure.py
----------------------------------------------------------------------
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 @@ def _set_optional_attributes_of_profile(config, profile):
     """
 
     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']:

http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/blob/36ba44f6/ec2stack/providers/cloudstack/instances.py
----------------------------------------------------------------------
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 @@ instances.
 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 @@ def _run_instance_request():
 
     @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 @@ def _run_instance_request():
         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 @@ def _run_instance_request():
 
     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):
     """

http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/blob/36ba44f6/ec2stack/providers/cloudstack/volumes.py
----------------------------------------------------------------------
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,26 +92,39 @@ def _create_volume_request():
     """
     args = {}
 
+    zone_name = helpers.get('AvailabilityZone')
+    zone_id = zones.get_zone(zone_name)['id']
+
+    args['zoneid'] = zone_id
+
     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'])
-        args['size'] = helpers.get('Size')
-        args['diskofferingid'] = disk_offerings.get_disk_offering(
+        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)
 
-    zone_name = helpers.get('AvailabilityZone')
-    zone_id = zones.get_zone(zone_name)['id']
+    return response
 
-    args['zoneid'] = zone_id
+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
 
-    response = requester.make_request_async(args)
-
-    return response
+    return requester.make_request_async(args)
 
 
 def _create_volume_response(response):

http://git-wip-us.apache.org/repos/asf/cloudstack-ec2stack/blob/36ba44f6/tests/volume_tests.py
----------------------------------------------------------------------
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 @@ class VolumeTestCase(Ec2StackAppTestCase):
         )
         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