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 2015/06/13 14:44:13 UTC

[3/7] libcloud git commit: Added Gandi ex_get_node with test & added docstring

Added Gandi ex_get_node with test & added docstring

Closes #534

Signed-off-by: Tomaz Muraus <to...@tomaz.me>


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

Branch: refs/heads/trunk
Commit: 915bc1aee86a1e41caa0ce98b8c29ae6b53b0f18
Parents: 3fe88d0
Author: ZuluPro <mo...@hotmail.com>
Authored: Tue Jun 2 13:30:10 2015 -0400
Committer: Tomaz Muraus <to...@tomaz.me>
Committed: Sat Jun 13 20:32:08 2015 +0800

----------------------------------------------------------------------
 libcloud/compute/drivers/gandi.py   | 115 ++++++++++++++++++++++++++++++-
 libcloud/test/compute/test_gandi.py |   4 ++
 2 files changed, 118 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/915bc1ae/libcloud/compute/drivers/gandi.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/gandi.py b/libcloud/compute/drivers/gandi.py
index 420d25d..ba6e89b 100644
--- a/libcloud/compute/drivers/gandi.py
+++ b/libcloud/compute/drivers/gandi.py
@@ -145,6 +145,12 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         return [self._to_volume(d) for d in disks]
 
     def list_nodes(self):
+        """
+        Return a list of nodes in the current zone or all zones.
+
+        :return:  List of Node objects
+        :rtype:   ``list`` of :class:`Node`
+        """
         vms = self.connection.request('hosting.vm.list').object
         ips = self.connection.request('hosting.ip.list').object
         for vm in vms:
@@ -158,7 +164,37 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         nodes = self._to_nodes(vms)
         return nodes
 
+    def ex_get_node(self, node_id):
+        """
+        Return a Node object based on a node id.
+
+        :param  name: The ID of the node
+        :type   name: ``int``
+
+        :return:  A Node object for the node
+        :rtype:   :class:`Node`
+        """
+        vm = self.connection.request('hosting.vm.info', int(node_id)).object
+        ips = self.connection.request('hosting.ip.list').object
+        vm['ips'] = []
+        for ip in ips:
+            if vm['ifaces_id'][0] == ip['iface_id']:
+                ip = ip.get('ip', None)
+                if ip:
+                    vm['ips'].append(ip)
+        node = self._to_node(vm)
+        return node
+
     def reboot_node(self, node):
+        """
+        Reboot a node.
+
+        :param  node: Node to be rebooted
+        :type   node: :class:`Node`
+
+        :return:  True if successful, False if not
+        :rtype:   ``bool``
+        """
         op = self.connection.request('hosting.vm.reboot', int(node.id))
         self._wait_operation(op.object['id'])
         vm = self._node_info(int(node.id))
@@ -167,6 +203,15 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         return False
 
     def destroy_node(self, node):
+        """
+        Destroy a node.
+
+        :param  node: Node object to destroy
+        :type   node: :class:`Node`
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
         vm = self._node_info(node.id)
         if vm['state'] == 'running':
             # Send vm_stop and wait for accomplish
@@ -216,7 +261,7 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         :type       inet_family: ``int``
 
         :keyword    keypairs: IDs of keypairs or Keypairs object
-        :type       keypairs: ``int`` or :class:`.KeyPair`
+        :type       keypairs: list of ``int`` or :class:`.KeyPair`
 
         :rtype: :class:`Node`
         """
@@ -300,6 +345,15 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         )
 
     def list_images(self, location=None):
+        """
+        Return a list of image objects.
+
+        :keyword    location: Which data center to filter a images in.
+        :type       location: :class:`NodeLocation`
+
+        :return:  List of GCENodeImage objects
+        :rtype:   ``list`` of :class:`GCENodeImage`
+        """
         try:
             if location:
                 filtering = {'datacenter_id': int(location.id)}
@@ -338,6 +392,15 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
                 for name, instance in INSTANCE_TYPES.items()]
 
     def list_sizes(self, location=None):
+        """
+        Return a list of sizes (machineTypes) in a zone.
+
+        :keyword  location: Which data center to filter a sizes in.
+        :type     location: :class:`NodeLocation` or ``None``
+
+        :return:  List of NodeSize objects
+        :rtype:   ``list`` of :class:`NodeSize`
+        """
         account = self.connection.request('hosting.account.info').object
         if account.get('rating_enabled'):
             # This account use new rating model
@@ -379,18 +442,44 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         )
 
     def list_locations(self):
+        """
+        Return a list of locations (datacenters).
+
+        :return: List of NodeLocation objects
+        :rtype: ``list`` of :class:`NodeLocation`
+        """
         res = self.connection.request('hosting.datacenter.list')
         return [self._to_loc(l) for l in res.object]
 
     def list_volumes(self):
         """
+        Return a list of volumes.
 
+        :return: A list of volume objects.
         :rtype: ``list`` of :class:`StorageVolume`
         """
         res = self.connection.request('hosting.disk.list', {})
         return self._to_volumes(res.object)
 
     def create_volume(self, size, name, location=None, snapshot=None):
+        """
+        Create a volume (disk).
+
+        :param  size: Size of volume to create (in GB).
+        :type   size: ``int``
+
+        :param  name: Name of volume to create
+        :type   name: ``str``
+
+        :keyword  location: Location (zone) to create the volume in
+        :type     location: :class:`NodeLocation` or ``None``
+
+        :keyword  snapshot: Snapshot to create image from
+        :type     snapshot: :class:`Snapshot`
+
+        :return:  Storage Volume object
+        :rtype:   :class:`StorageVolume`
+        """
         disk_param = {
             'name': name,
             'size': int(size),
@@ -407,6 +496,21 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         return None
 
     def attach_volume(self, node, volume, device=None):
+        """
+        Attach a volume to a node.
+
+        :param  node: The node to attach the volume to
+        :type   node: :class:`Node`
+
+        :param  volume: The volume to attach.
+        :type   volume: :class:`StorageVolume`
+
+        :keyword  device: Not used in this cloud.
+        :type     device: ``None``
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
         op = self.connection.request('hosting.vm.disk_attach',
                                      int(node.id), int(volume.id))
         if self._wait_operation(op.object['id']):
@@ -432,6 +536,15 @@ class GandiNodeDriver(BaseGandiDriver, NodeDriver):
         return False
 
     def destroy_volume(self, volume):
+        """
+        Destroy a volume.
+
+        :param  volume: Volume object to destroy
+        :type   volume: :class:`StorageVolume`
+
+        :return:  True if successful
+        :rtype:   ``bool``
+        """
         op = self.connection.request('hosting.disk.delete', int(volume.id))
         if self._wait_operation(op.object['id']):
             return True

http://git-wip-us.apache.org/repos/asf/libcloud/blob/915bc1ae/libcloud/test/compute/test_gandi.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_gandi.py b/libcloud/test/compute/test_gandi.py
index 5336820..ae01e6d 100644
--- a/libcloud/test/compute/test_gandi.py
+++ b/libcloud/test/compute/test_gandi.py
@@ -171,6 +171,10 @@ class GandiTests(unittest.TestCase):
         response = self.driver.delete_key_pair(10)
         self.assertTrue(response)
 
+    def test_ex_get_node(self):
+        node = self.driver.ex_get_node(34951)
+        self.assertEqual(node.name, "test2")
+
 
 class GandiRatingTests(unittest.TestCase):