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 2014/01/03 15:59:14 UTC

[02/44] git commit: Add functionality to create_node & create_volume to use existing disks of the same name. Also some pep8 fixes.

Add functionality to create_node & create_volume to use existing
disks of the same name.
Also some pep8 fixes.


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

Branch: refs/heads/trunk
Commit: 0d477589953643dd87084eb1af7c53701f30667e
Parents: 07f6b94
Author: Rick Wright <ri...@google.com>
Authored: Wed Dec 4 17:12:15 2013 -0800
Committer: Rick Wright <ri...@google.com>
Committed: Wed Dec 4 17:12:15 2013 -0800

----------------------------------------------------------------------
 libcloud/compute/drivers/gce.py | 99 ++++++++++++++++++++++++------------
 1 file changed, 66 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/0d477589/libcloud/compute/drivers/gce.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py
index 0c4c046..852b944 100644
--- a/libcloud/compute/drivers/gce.py
+++ b/libcloud/compute/drivers/gce.py
@@ -1310,7 +1310,7 @@ class GCENodeDriver(NodeDriver):
 
     def create_node(self, name, size, image, location=None,
                     ex_network='default', ex_tags=None, ex_metadata=None,
-                    ex_boot_disk=None):
+                    ex_boot_disk=None, use_existing_disk=False):
         """
         Create a new node and return a node object for the node.
 
@@ -1340,6 +1340,11 @@ class GCENodeDriver(NodeDriver):
         :keyword  ex_boot_disk: The boot disk to attach to the instance.
         :type     ex_boot_disk: :class:`StorageVolume` or ``str``
 
+        :keyword  use_existing_disk: If True and if an existing disk with the
+                                     same name/location is found, use that
+                                     disk instead of creating a new one.
+        :type     use_existing_disk: ``bool``
+
         :return:  A Node object for the new node.
         :rtype:   :class:`Node`
         """
@@ -1355,7 +1360,8 @@ class GCENodeDriver(NodeDriver):
 
         if not ex_boot_disk:
             ex_boot_disk = self.create_volume(None, name, location=location,
-                                              image=image)
+                                              image=image,
+                                              use_existing=use_existing_disk)
 
         request, node_data = self._create_node_req(name, size, image,
                                                    location, ex_network,
@@ -1365,11 +1371,10 @@ class GCENodeDriver(NodeDriver):
 
         return self.ex_get_node(name, location.name)
 
-
     def ex_create_multiple_nodes(self, base_name, size, image, number,
                                  location=None, ex_network='default',
                                  ex_tags=None, ex_metadata=None,
-                                 ignore_errors=True,
+                                 ignore_errors=True, use_existing_disk=False,
                                  timeout=DEFAULT_TASK_COMPLETION_TIMEOUT):
         """
         Create multiple nodes and return a list of Node objects.
@@ -1410,6 +1415,11 @@ class GCENodeDriver(NodeDriver):
                                  more nodes fails.
         :type     ignore_errors: ``bool``
 
+        :keyword  use_existing_disk: If True and if an existing disk with the
+                                     same name/location is found, use that
+                                     disk instead of creating a new one.
+        :type     use_existing_disk: ``bool``
+
         :keyword  timeout: The number of seconds to wait for all nodes to be
                            created before timing out.
         :type     timeout: ``int``
@@ -1429,22 +1439,36 @@ class GCENodeDriver(NodeDriver):
             image = self.ex_get_image(image)
 
         # List for holding the status information for disk/node creation.
-        status_list = [None] * number
+        status_list = []
 
         for i in range(number):
             name = '%s-%03d' % (base_name, i)
 
+            status = {'name': name,
+                      'node_response': None,
+                      'node': None,
+                      'disk_response': None,
+                      'disk': None}
+
             # Create disks for nodes
-            disk_req, disk_data, disk_params = self._create_vol_req(
-                None, name, location=location, image=image)
-            disk_res = self.connection.request(disk_req, method='POST',
-                                               data=disk_data,
-                                               params=disk_params).object
-            status_list[i] = {'name': name,
-                              'node_response': None,
-                              'node': None,
-                              'disk_response': disk_res,
-                              'disk': None}
+            disk = None
+            if use_existing_disk:
+                try:
+                    disk = self.ex_get_volume(name, location)
+                except:
+                    pass
+
+            if disk:
+                status['disk'] = disk
+            else:
+                disk_req, disk_data, disk_params = self._create_vol_req(
+                    None, name, location=location, image=image)
+                disk_res = self.connection.request(disk_req, method='POST',
+                                                   data=disk_data,
+                                                   params=disk_params).object
+                status['disk_response'] = disk_res
+
+            status_list.append(status)
 
         start_time = time.time()
         complete = False
@@ -1471,22 +1495,18 @@ class GCENodeDriver(NodeDriver):
                             status['disk'] = GCEFailedDisk(status['name'],
                                                            error, code)
                         else:
-                            status['disk'] = self.ex_get_volume(status['name'], location)
+                            status['disk'] = self.ex_get_volume(status['name'],
+                                                                location)
 
-                # If disk exists, but node does not, create the node or check on
-                # its status if already in progress.
+                # If disk exists, but node does not, create the node or check
+                # on its status if already in progress.
                 if status['disk'] and not status['node']:
                     if not status['node_response']:
-                        request, node_data = self._create_node_req(status['name'], size,
-                                                                   image,
-                                                                   location,
-                                                                   ex_network,
-                                                                   ex_tags,
-                                                                   ex_metadata,
-                                                                   boot_disk=status['disk'])
-                        node_res = self.connection.request(request,
-                                                           method='POST',
-                                                           data=node_data).object
+                        request, node_data = self._create_node_req(
+                            status['name'], size, image, location, ex_network,
+                            ex_tags, ex_metadata, boot_disk=status['disk'])
+                        node_res = self.connection.request(
+                            request, method='POST', data=node_data).object
                         status['node_response'] = node_res
                     else:
                         error = None
@@ -1503,7 +1523,8 @@ class GCENodeDriver(NodeDriver):
                             status['node'] = GCEFailedNode(status['name'],
                                                            error, code)
                         else:
-                            status['node'] = self.ex_get_node(status['name'], location)
+                            status['node'] = self.ex_get_node(status['name'],
+                                                              location)
 
                 # If any of the nodes have not been created (or failed) we are
                 # not done yet.
@@ -1589,8 +1610,8 @@ class GCENodeDriver(NodeDriver):
         :keyword  snapshot: Snapshot to create image from (needs full URI)
         :type     snapshot: ``str``
 
-        :return:  Tuple containg the request string, the data dictionary and the
-                  URL parameters
+        :return:  Tuple containg the request string, the data dictionary and
+                  the URL parameters
         :rtype:   ``tuple``
         """
         volume_data = {}
@@ -1614,9 +1635,8 @@ class GCENodeDriver(NodeDriver):
 
         return request, volume_data, params
 
-
     def create_volume(self, size, name, location=None, image=None,
-                      snapshot=None):
+                      snapshot=None, use_existing=False):
         """
         Create a volume (disk).
 
@@ -1637,9 +1657,22 @@ class GCENodeDriver(NodeDriver):
         :keyword  snapshot: Snapshot to create image from (needs full URI)
         :type     snapshot: ``str``
 
+        :keyword  use_existing: If True and a disk with the given name already
+                                exists, return an object for that disk instead
+                                of attempting to create a new disk.
+        :type     use_existing: ``bool``
+
         :return:  Storage Volume object
         :rtype:   :class:`StorageVolume`
         """
+        vol = None
+        if use_existing:
+            try:
+                vol = self.ex_get_volume(name, location)
+            except:
+                pass
+        if vol:
+            return vol
         request, volume_data, params = self._create_vol_req(
             size, name, location, image, snapshot)
         self.connection.async_request(request, method='POST', data=volume_data,