You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by an...@apache.org on 2017/04/10 22:16:42 UTC

[2/3] libcloud git commit: Merge branch 'github-1023' into trunk Closes #1023

Merge branch 'github-1023' into trunk
Closes #1023


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/c3dde041
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/c3dde041
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/c3dde041

Branch: refs/heads/trunk
Commit: c3dde041a5648cf5f4138561e75443758f292d25
Parents: 9f4d0a2 0e73f77
Author: Anthony Shaw <an...@apache.org>
Authored: Tue Apr 11 08:07:49 2017 +1000
Committer: Anthony Shaw <an...@apache.org>
Committed: Tue Apr 11 08:07:49 2017 +1000

----------------------------------------------------------------------
 libcloud/compute/drivers/ec2.py                 | 226 +++++++++++++++++++
 .../ec2/describe_import_snapshot_tasks.xml      |  18 ++
 .../describe_import_snapshot_tasks_active.xml   |  17 ++
 .../compute/fixtures/ec2/import_snapshot.xml    |  16 ++
 libcloud/test/compute/test_ec2.py               |  41 ++++
 5 files changed, 318 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/c3dde041/libcloud/compute/drivers/ec2.py
----------------------------------------------------------------------
diff --cc libcloud/compute/drivers/ec2.py
index 31b8b8e,461248c..5177327
--- a/libcloud/compute/drivers/ec2.py
+++ b/libcloud/compute/drivers/ec2.py
@@@ -6799,27 -6859,69 +6962,90 @@@ class BaseEC2NodeDriver(NodeDriver)
                                 % (idx, k, key)] = str(value)
          return params
  
 +    def _get_billing_product_params(self, billing_products):
 +        """
 +        Return a list of dictionaries with valid param for billing product.
 +
 +        :param      billing_product: List of billing code values(str)
 +        :type       billing product: ``list``
 +
 +        :return:    Dictionary representation of the billing product codes
 +        :rtype:     ``dict``
 +        """
 +
 +        if not isinstance(billing_products, (list, tuple)):
 +            raise AttributeError(
 +                'billing_products not list or tuple')
 +
 +        params = {}
 +
 +        for idx, v in enumerate(billing_products):
 +            idx += 1  # We want 1-based indexes
 +            params['BillingProduct.%d' % (idx)] = str(v)
 +
+     def _get_disk_container_params(self, disk_container):
+         """
+         Return a list of dictionaries with query parameters for
+         a valid disk container.
+ 
+         :param      disk_container: List of dictionaries with
+                                     disk_container details
+         :type       disk_container: ``list`` or ``dict``
+ 
+         :return:    Dictionary representation of the disk_container
+         :rtype:     ``dict``
+         """
+ 
+         if not isinstance(disk_container, (list, tuple)):
+             raise AttributeError('disk_container not list or tuple')
+ 
+         params = {}
+ 
+         for idx, content in enumerate(disk_container):
+             idx += 1  # We want 1-based indexes
+             if not isinstance(content, dict):
+                 raise AttributeError(
+                     'content %s in disk_container not a dict' % content)
+ 
+             for k, v in content.items():
+                 if not isinstance(v, dict):
+                     params['DiskContainer.%s' % (k)] = str(v)
+ 
+                 else:
+                     for key, value in v.items():
+                         params['DiskContainer.%s.%s'
+                                % (k, key)] = str(value)
+ 
+         return params
+ 
+     def _get_client_data_params(self, client_data):
+         """
+         Return a dictionary with query parameters for
+         a valid client data.
+ 
+         :param      client_data: List of dictionaries with the disk
+                                  upload details
+         :type       client_data: ``dict``
+ 
+         :return:    Dictionary representation of the client data
+         :rtype:     ``dict``
+         """
+ 
+         if not isinstance(client_data, (list, tuple)):
+             raise AttributeError('client_data not list or tuple')
+ 
+         params = {}
+ 
+         for idx, content in enumerate(client_data):
+             idx += 1  # We want 1-based indexes
+             if not isinstance(content, dict):
+                 raise AttributeError(
+                     'content %s in client_data'
+                     'not a dict' % content)
+ 
+             for k, v in content.items():
+                 params['ClientData.%s' % (k)] = str(v)
+ 
          return params
  
      def _get_common_security_group_params(self, group_id, protocol,

http://git-wip-us.apache.org/repos/asf/libcloud/blob/c3dde041/libcloud/test/compute/test_ec2.py
----------------------------------------------------------------------
diff --cc libcloud/test/compute/test_ec2.py
index 3e761a5,6b942e3..4d34e47
--- a/libcloud/test/compute/test_ec2.py
+++ b/libcloud/test/compute/test_ec2.py
@@@ -564,11 -559,38 +564,40 @@@ class EC2Tests(LibcloudTestCase, TestCa
                                                description='My Image',
                                                architecture='x86_64',
                                                block_device_mapping=mapping,
 -                                              ena_support=True)
 +                                              ena_support=True,
 +                                              billing_products=['ab-5dh78019'],
 +                                              sriov_net_support='simple')
          self.assertEqual(image.id, 'ami-57c2fb3e')
  
+     def test_ex_import_snapshot(self):
+         disk_container = [{'Description': 'Dummy import snapshot task',
+                            'Format': 'raw',
+                            'UserBucket': {'S3Bucket': 'dummy-bucket', 'S3Key': 'dummy-key'}}]
+ 
+         snap = self.driver.ex_import_snapshot(disk_container=disk_container)
+         self.assertEqual(snap.id, 'snap-0ea83e8a87e138f39')
+ 
+     def test_wait_for_import_snapshot_completion(self):
+         snap = self.driver._wait_for_import_snapshot_completion(
+             import_task_id='import-snap-fhdysyq6')
+         self.assertEqual(snap.id, 'snap-0ea83e8a87e138f39')
+ 
+     def test_timeout_wait_for_import_snapshot_completion(self):
+         import_task_id = 'import-snap-fhdysyq6'
+         EC2MockHttp.type = 'timeout'
+         with self.assertRaises(Exception) as context:
+             self.driver._wait_for_import_snapshot_completion(
+                 import_task_id=import_task_id, timeout=0.01, interval=0.001)
+         self.assertEqual('Timeout while waiting for import task Id %s'
+                          % import_task_id, str(context.exception))
+ 
+     def test_ex_describe_import_snapshot_tasks(self):
+         snap = self.driver.ex_describe_import_snapshot_tasks(
+             import_task_id='import-snap-fh7y6i6w<')
+ 
+         self.assertEqual(snap.snapshotId, 'snap-0ea83e8a87e138f39')
+         self.assertEqual(snap.status, 'completed')
+ 
      def test_ex_list_availability_zones(self):
          availability_zones = self.driver.ex_list_availability_zones()
          availability_zone = availability_zones[0]