You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2013/01/25 07:54:12 UTC

svn commit: r1438350 - in /libcloud/trunk: CHANGES libcloud/compute/drivers/ec2.py libcloud/test/compute/test_ec2.py

Author: tomaz
Date: Fri Jan 25 06:54:11 2013
New Revision: 1438350

URL: http://svn.apache.org/viewvc?rev=1438350&view=rev
Log:
Allow user to pass 'ex_blockdevicemappings' kwarg to the EC2 driver
create_node method.

Contributed by Joe Miller, part of LIBCLOUD-282.

Modified:
    libcloud/trunk/CHANGES
    libcloud/trunk/libcloud/compute/drivers/ec2.py
    libcloud/trunk/libcloud/test/compute/test_ec2.py

Modified: libcloud/trunk/CHANGES
URL: http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1438350&r1=1438349&r2=1438350&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Fri Jan 25 06:54:11 2013
@@ -103,6 +103,10 @@ Changes with Apache Libcloud in developm
    - Add new driver for Abiquo provider - http://www.abiquo.com (LIBCLOUD-250).
      [Jaume Devesa]
 
+   - Allow user to pass 'ex_blockdevicemappings' kwarg to the EC2 driver
+     'create_node' method. (LIBCLOUD-282)
+     [Joe Miller, Tomaz Muraus]
+
   *) Storage
 
     - Add a new local storage driver.

Modified: libcloud/trunk/libcloud/compute/drivers/ec2.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/ec2.py?rev=1438350&r1=1438349&r2=1438350&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/ec2.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/ec2.py Fri Jan 25 06:54:11 2013
@@ -154,7 +154,7 @@ INSTANCE_TYPES = {
         'id': 'cr1.8xlarge',
         'name': 'High Memory Cluster Eight Extra Large',
         'ram': 244000,
-        'disk': 240, # 2 x 120 GB SSD
+        'disk': 240,
         'bandwidth': None
     },
     'hs1.8xlarge': {
@@ -1251,6 +1251,11 @@ class BaseEC2NodeDriver(NodeDriver):
 
         @keyword    ex_clienttoken: Unique identifier to ensure idempotency
         @type       ex_clienttoken: C{str}
+
+        @keyword    ex_blockdevicemappings: C{list} of C{dict} block device
+                    mappings. Example:
+                    [{'DeviceName': '/dev/sdb', 'VirtualName': 'ephemeral0'}]
+        @type       ex_blockdevicemappings: C{list} of C{dict}
         """
         image = kwargs["image"]
         size = kwargs["size"]
@@ -1288,6 +1293,13 @@ class BaseEC2NodeDriver(NodeDriver):
         if 'ex_clienttoken' in kwargs:
             params['ClientToken'] = kwargs['ex_clienttoken']
 
+        if 'ex_blockdevicemappings' in kwargs:
+            for index, mapping in enumerate(kwargs['ex_blockdevicemappings']):
+                params['BlockDeviceMapping.%d.DeviceName' % (index + 1)] = \
+                    mapping['DeviceName']
+                params['BlockDeviceMapping.%d.VirtualName' % (index + 1)] = \
+                    mapping['VirtualName']
+
         object = self.connection.request(self.path, params=params).object
         nodes = self._to_nodes(object, 'instancesSet/item')
 

Modified: libcloud/trunk/libcloud/test/compute/test_ec2.py
URL: http://svn.apache.org/viewvc/libcloud/trunk/libcloud/test/compute/test_ec2.py?rev=1438350&r1=1438349&r2=1438350&view=diff
==============================================================================
--- libcloud/trunk/libcloud/test/compute/test_ec2.py (original)
+++ libcloud/trunk/libcloud/test/compute/test_ec2.py Fri Jan 25 06:54:11 2013
@@ -28,15 +28,22 @@ from libcloud.compute.drivers.ec2 import
 from libcloud.compute.drivers.ec2 import NimbusNodeDriver, EucNodeDriver
 from libcloud.compute.drivers.ec2 import IdempotentParamError
 from libcloud.compute.drivers.ec2 import REGION_DETAILS
+from libcloud.utils.py3 import urlparse
 from libcloud.compute.base import Node, NodeImage, NodeSize, NodeLocation
 from libcloud.compute.base import StorageVolume
 
-from libcloud.test import MockHttp, LibcloudTestCase
+from libcloud.test import MockHttpTestCase, LibcloudTestCase
 from libcloud.test.compute import TestCaseMixin
 from libcloud.test.file_fixtures import ComputeFileFixtures
 
 from libcloud.test.secrets import EC2_PARAMS
 
+try:
+    parse_qsl = urlparse.parse_qsl
+except AttributeError:
+    import cgi
+    parse_qsl = cgi.parse_qsl
+
 
 class BaseEC2Tests(LibcloudTestCase):
     def test_instantiate_driver_valid_datacenters(self):
@@ -191,6 +198,22 @@ class EC2Tests(LibcloudTestCase, TestCas
         ret = self.driver.ex_stop_node(node)
         self.assertTrue(ret)
 
+    def test_ex_create_node_with_ex_blockdevicemappings(self):
+        EC2MockHttp.type = 'create_ex_blockdevicemappings'
+
+        image = NodeImage(id='ami-be3adfd7',
+                          name=self.image_name,
+                          driver=self.driver)
+        size = NodeSize('m1.small', 'Small Instance', None, None, None, None,
+                        driver=self.driver)
+        mappings = [
+            {'DeviceName': '/dev/sdb', 'VirtualName': 'ephemeral0'},
+            {'DeviceName': '/dev/sdc', 'VirtualName': 'ephemeral1'}
+        ]
+        node = self.driver.create_node(name='foo', image=image, size=size,
+                                       ex_blockdevicemappings=mappings)
+        self.assertEqual(node.id, 'i-2ba64342')
+
     def test_destroy_node(self):
         node = Node('i-4382922a', None, None, None, None, self.driver)
         ret = self.driver.destroy_node(node)
@@ -442,7 +465,7 @@ class EC2SAEastOldStyleModelTests(EC2Old
     driver_klass = EC2SAEastNodeDriver
 
 
-class EC2MockHttp(MockHttp):
+class EC2MockHttp(MockHttpTestCase):
     fixtures = ComputeFileFixtures('ec2')
 
     def _DescribeInstances(self, method, url, body, headers):
@@ -485,6 +508,20 @@ class EC2MockHttp(MockHttp):
         body = self.fixtures.load('run_instances.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _create_ex_blockdevicemappings_RunInstances(self, method, url, body, headers):
+        parameters = dict(parse_qsl(url))
+        self.assertEqual(parameters['BlockDeviceMapping.1.DeviceName'],
+                         '/dev/sdb')
+        self.assertEqual(parameters['BlockDeviceMapping.1.VirtualName'],
+                         'ephemeral0')
+        self.assertEqual(parameters['BlockDeviceMapping.2.DeviceName'],
+                         '/dev/sdc')
+        self.assertEqual(parameters['BlockDeviceMapping.2.VirtualName'],
+                         'ephemeral1')
+
+        body = self.fixtures.load('run_instances.xml')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
     def _idempotent_RunInstances(self, method, url, body, headers):
         body = self.fixtures.load('run_instances_idem.xml')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])