You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by qu...@apache.org on 2018/03/09 04:55:43 UTC

[1/6] libcloud git commit: remove dead returns test_openstack.py

Repository: libcloud
Updated Branches:
  refs/heads/trunk 2b298b7cd -> 4d0f9e0a6


remove dead returns test_openstack.py

removed unreachable return statements in test cases

Closes #1178

Signed-off-by: Quentin Pradet <qu...@apache.org>


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

Branch: refs/heads/trunk
Commit: 4dd20ff80bba5de512923ad9f9fb92821b38efca
Parents: 2b298b7
Author: Rick van de Loo <ri...@gmail.com>
Authored: Sun Mar 4 14:51:42 2018 +0100
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:51:41 2018 +0400

----------------------------------------------------------------------
 libcloud/test/compute/test_openstack.py | 6 ------
 1 file changed, 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/4dd20ff8/libcloud/test/compute/test_openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py
index e9d9315..54606ef 100644
--- a/libcloud/test/compute/test_openstack.py
+++ b/libcloud/test/compute/test_openstack.py
@@ -2050,8 +2050,6 @@ class OpenStack_1_1_MockHttp(MockHttp, unittest.TestCase):
         else:
             raise NotImplementedError()
 
-        return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK])
-
     def _v1_1_slug_os_networks(self, method, url, body, headers):
         if method == 'GET':
             body = self.fixtures.load('_os_networks.json')
@@ -2074,8 +2072,6 @@ class OpenStack_1_1_MockHttp(MockHttp, unittest.TestCase):
         else:
             raise NotImplementedError()
 
-        return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK])
-
     def _v1_1_slug_servers_12063_action(self, method, url, body, headers):
         if method == 'POST':
             body = self.fixtures.load('_servers_unpause.json')
@@ -2083,8 +2079,6 @@ class OpenStack_1_1_MockHttp(MockHttp, unittest.TestCase):
         else:
             raise NotImplementedError()
 
-        return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK])
-
     def _v1_1_slug_servers_12086_action(self, method, url, body, headers):
         if method == 'POST':
             body = self.fixtures.load('_servers_12086_console_output.json')


[5/6] libcloud git commit: implement ex_delete_floating_ip for DigitalOcean

Posted by qu...@apache.org.
implement ex_delete_floating_ip for DigitalOcean

delete a floating IP by passing the object into conn.ex_delete_floating_ip
or by running .delete on the floating IP object

Signed-off-by: Quentin Pradet <qu...@apache.org>


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

Branch: refs/heads/trunk
Commit: c069603b3bb2c35032a8c742cd1b3efab0c45934
Parents: d613edf
Author: Rick van de Loo <ri...@gmail.com>
Authored: Sun Mar 4 14:26:25 2018 +0100
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:54:34 2018 +0400

----------------------------------------------------------------------
 libcloud/compute/drivers/digitalocean.py        | 13 ++++++++++++
 .../delete_floating_ip_167_138_123_111.json     |  0
 libcloud/test/compute/test_digitalocean_v2.py   | 22 ++++++++++++++++++++
 3 files changed, 35 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/c069603b/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index 91dee7b..d1f44ba 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -511,6 +511,19 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
                                        data=json.dumps(attr), method='POST')
         return self._to_floating_ip(resp.object['floating_ip'])
 
+    def ex_delete_floating_ip(self, ip):
+        """
+        Delete specified floating IP
+
+        :param      ip: floating IP to remove
+        :type       ip: :class:`DigitalOcean_v2_FloatingIpAddress`
+
+        :rtype: ``bool``
+        """
+        resp = self.connection.request('/v2/floating_ips/{}'.format(ip.id),
+                                       method='DELETE')
+        return resp.status == httplib.NO_CONTENT
+
     def _to_node(self, data):
         extra_keys = ['memory', 'vcpus', 'disk', 'region', 'image',
                       'size_slug', 'locked', 'created_at', 'networks',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/c069603b/libcloud/test/compute/fixtures/openstack_v1.1/delete_floating_ip_167_138_123_111.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/openstack_v1.1/delete_floating_ip_167_138_123_111.json b/libcloud/test/compute/fixtures/openstack_v1.1/delete_floating_ip_167_138_123_111.json
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/libcloud/blob/c069603b/libcloud/test/compute/test_digitalocean_v2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_digitalocean_v2.py b/libcloud/test/compute/test_digitalocean_v2.py
index f2cc3f7..9e87bd2 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -307,6 +307,21 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
         # from the start. This API call creates an unattached IP.
         self.assertIsNone(floating_ip.node_id)
 
+    def test_ex_delete_floating_ip(self):
+        nyc1 = [r for r in self.driver.list_locations() if r.id == 'nyc1'][0]
+        floating_ip = self.driver.ex_create_floating_ip(nyc1)
+        ret = self.driver.ex_delete_floating_ip(floating_ip)
+
+        # The API returns 204 NO CONTENT if all is well.
+        self.assertTrue(ret)
+
+    def test_floating_ip_can_be_deleted_by_calling_delete_on_floating_ip_object(self):
+        nyc1 = [r for r in self.driver.list_locations() if r.id == 'nyc1'][0]
+        floating_ip = self.driver.ex_create_floating_ip(nyc1)
+        ret = floating_ip.delete()
+
+        self.assertTrue(ret)
+
 
 class DigitalOceanMockHttp(MockHttp):
     fixtures = ComputeFileFixtures('digitalocean_v2')
@@ -474,6 +489,13 @@ class DigitalOceanMockHttp(MockHttp):
         else:
             raise NotImplementedError()
 
+    def _v2_floating_ips_167_138_123_111(self, method, url, body, headers):
+        if method == 'DELETE':
+            body = ''
+            return (httplib.NO_CONTENT, body, {}, httplib.responses[httplib.NO_CONTENT])
+        else:
+            raise NotImplementedError()
+
 
 if __name__ == '__main__':
     sys.exit(unittest.main())


[3/6] libcloud git commit: implement ex_list_floating_ips for DigitalOcean

Posted by qu...@apache.org.
implement ex_list_floating_ips for DigitalOcean

Signed-off-by: Quentin Pradet <qu...@apache.org>


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

Branch: refs/heads/trunk
Commit: e0bada2a05465c2ba4e4518c843824ec7618c7cf
Parents: c069603
Author: Rick van de Loo <ri...@gmail.com>
Authored: Sun Mar 4 14:33:07 2018 +0100
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:54:34 2018 +0400

----------------------------------------------------------------------
 libcloud/compute/drivers/digitalocean.py              | 10 ++++++++++
 .../fixtures/digitalocean_v2/list_floating_ips.json   |  2 ++
 libcloud/test/compute/test_digitalocean_v2.py         | 14 ++++++++++++++
 3 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/e0bada2a/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index d1f44ba..286c2d0 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -524,6 +524,16 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
                                        method='DELETE')
         return resp.status == httplib.NO_CONTENT
 
+    def ex_list_floating_ips(self):
+        """
+        List floating IPs
+
+        :rtype: ``list`` of :class:`DigitalOcean_v2_FloatingIpAddress`
+        """
+        return self._to_floating_ips(
+            self._paginated_request('/v2/floating_ips', 'floating_ips')
+        )
+
     def _to_node(self, data):
         extra_keys = ['memory', 'vcpus', 'disk', 'region', 'image',
                       'size_slug', 'locked', 'created_at', 'networks',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/e0bada2a/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json b/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
new file mode 100644
index 0000000..42b11b3
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
@@ -0,0 +1,2 @@
+{"floating_ips":[{"ip":"177.166.135.205","droplet":null,"region":{"name":"Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-48gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false},{"ip":"154.138.103.175","droplet":null,"region":{"name":"Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-48gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-
 128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false}],"links":{},"meta":{"total":2}}
+

http://git-wip-us.apache.org/repos/asf/libcloud/blob/e0bada2a/libcloud/test/compute/test_digitalocean_v2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_digitalocean_v2.py b/libcloud/test/compute/test_digitalocean_v2.py
index 9e87bd2..02f0f03 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -322,6 +322,17 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
 
         self.assertTrue(ret)
 
+    def test_list_floating_ips(self):
+        floating_ips = self.driver.ex_list_floating_ips()
+
+        self.assertEqual(len(floating_ips), 2, 'Wrong floating IPs count')
+
+        floating_ip = floating_ips[0]
+        self.assertEqual(floating_ip.id, '177.166.135.205')
+        self.assertEqual(floating_ip.ip_address, '177.166.135.205')
+        self.assertEqual(floating_ip.extra['region']['slug'], 'ams3')
+        self.assertIsNone(floating_ip.node_id)
+
 
 class DigitalOceanMockHttp(MockHttp):
     fixtures = ComputeFileFixtures('digitalocean_v2')
@@ -486,6 +497,9 @@ class DigitalOceanMockHttp(MockHttp):
         if method == 'POST':
             body = self.fixtures.load('create_floating_ip.json')
             return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+        elif method == 'GET':
+            body = self.fixtures.load('list_floating_ips.json')
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
         else:
             raise NotImplementedError()
 


[4/6] libcloud git commit: implement ex_create_floating_ip for DigitalOcean

Posted by qu...@apache.org.
implement ex_create_floating_ip for DigitalOcean

create a new unassociated floating IP in a region

Signed-off-by: Quentin Pradet <qu...@apache.org>


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

Branch: refs/heads/trunk
Commit: d613edf7151750b3b7c2f92070dca81e208e7e95
Parents: 4dd20ff
Author: Rick van de Loo <ri...@gmail.com>
Authored: Sun Mar 4 14:15:23 2018 +0100
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:54:34 2018 +0400

----------------------------------------------------------------------
 libcloud/compute/drivers/digitalocean.py        | 59 ++++++++++++++++++++
 .../digitalocean_v2/create_floating_ip.json     |  1 +
 libcloud/test/compute/test_digitalocean_v2.py   | 22 ++++++++
 3 files changed, 82 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/d613edf7/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index 5815955..91dee7b 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -493,6 +493,24 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
                                       method='DELETE')
         return res.status == httplib.NO_CONTENT
 
+    def ex_create_floating_ip(self, location):
+        """
+        Create new floating IP reserved to a region.
+
+        The newly created floating IP will not be associated to a Droplet.
+
+        See https://developers.digitalocean.com/documentation/v2/#floating-ips
+
+        :param location: Which data center to create the floating IP in.
+        :type location: :class:`.NodeLocation`
+
+        :rtype: :class:`DigitalOcean_v2_FloatingIpAddress`
+        """
+        attr = {'region': location.id}
+        resp = self.connection.request('/v2/floating_ips',
+                                       data=json.dumps(attr), method='POST')
+        return self._to_floating_ip(resp.object['floating_ip'])
+
     def _to_node(self, data):
         extra_keys = ['memory', 'vcpus', 'disk', 'region', 'image',
                       'size_slug', 'locked', 'created_at', 'networks',
@@ -573,3 +591,44 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
         return VolumeSnapshot(id=data['id'], name=data['name'],
                               size=data['size_gigabytes'],
                               driver=self, extra=extra)
+
+    def _to_floating_ips(self, obj):
+        return [self._to_floating_ip(ip) for ip in obj]
+
+    def _to_floating_ip(self, obj):
+        return DigitalOcean_v2_FloatingIpAddress(
+            # There is no ID, but the IP is unique so we can use that
+            id=obj['ip'],
+            ip_address=obj['ip'],
+            node_id=obj['droplet']['id'] if obj['droplet'] else None,
+            extra={
+                'region': obj['region'],
+            },
+            driver=self
+        )
+
+
+class DigitalOcean_v2_FloatingIpAddress(object):
+    """
+    Floating IP info.
+    """
+
+    def __init__(self, id, ip_address, node_id=None, extra=None, driver=None):
+        self.id = str(id)
+        self.ip_address = ip_address
+        self.extra = extra
+        self.node_id = node_id
+        self.driver = driver
+
+    def delete(self):
+        """
+        Delete this floating IP
+
+        :rtype: ``bool``
+        """
+        return self.driver.ex_delete_floating_ip(self)
+
+    def __repr__(self):
+        return ('<DigitalOcean_v2_FloatingIpAddress: id=%s, ip_addr=%s,'
+                ' driver=%s>'
+                % (self.id, self.ip_address, self.driver))

http://git-wip-us.apache.org/repos/asf/libcloud/blob/d613edf7/libcloud/test/compute/fixtures/digitalocean_v2/create_floating_ip.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/create_floating_ip.json b/libcloud/test/compute/fixtures/digitalocean_v2/create_floating_ip.json
new file mode 100644
index 0000000..dbacd74
--- /dev/null
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/create_floating_ip.json
@@ -0,0 +1 @@
+{"floating_ip":{"ip":"167.138.123.111","droplet":null,"region":{"name":"New York 1","slug":"nyc1","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-48gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false},"links":{}}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/d613edf7/libcloud/test/compute/test_digitalocean_v2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_digitalocean_v2.py b/libcloud/test/compute/test_digitalocean_v2.py
index 1b049f9..f2cc3f7 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -292,6 +292,21 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
         result = self.driver.delete_volume_snapshot(snapshot)
         self.assertTrue(result)
 
+    def test_ex_create_floating_ip(self):
+        nyc1 = [r for r in self.driver.list_locations() if r.id == 'nyc1'][0]
+        floating_ip = self.driver.ex_create_floating_ip(nyc1)
+
+        # Note that this is the ID. There is no real ID for a floating IP at
+        # DigitalOcean, but the IP is unique so we can use that instead.
+        self.assertEqual(floating_ip.id, '167.138.123.111')
+        self.assertEqual(floating_ip.ip_address, '167.138.123.111')
+        self.assertEqual(floating_ip.extra['region']['slug'], 'nyc1')
+        # The newly created floating IP reserved to a region is not
+        # associated with any droplet. See the DigitalOcean API docs
+        # how to create a floating IP that is associated with an instance
+        # from the start. This API call creates an unattached IP.
+        self.assertIsNone(floating_ip.node_id)
+
 
 class DigitalOceanMockHttp(MockHttp):
     fixtures = ComputeFileFixtures('digitalocean_v2')
@@ -452,6 +467,13 @@ class DigitalOceanMockHttp(MockHttp):
         return (httplib.NO_CONTENT, None, {},
                 httplib.responses[httplib.NO_CONTENT])
 
+    def _v2_floating_ips(self, method, url, body, headers):
+        if method == 'POST':
+            body = self.fixtures.load('create_floating_ip.json')
+            return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+        else:
+            raise NotImplementedError()
+
 
 if __name__ == '__main__':
     sys.exit(unittest.main())


[6/6] libcloud git commit: Add changes for #1177

Posted by qu...@apache.org.
Add changes for #1177

Closes #1177


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

Branch: refs/heads/trunk
Commit: 4d0f9e0a66245756594aa6c5e40dacc5e2f78209
Parents: c8df053
Author: Quentin Pradet <qu...@apache.org>
Authored: Fri Mar 9 08:53:06 2018 +0400
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:54:56 2018 +0400

----------------------------------------------------------------------
 CHANGES.rst | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/4d0f9e0a/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 5f8dd1e..f46dda6 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -7,6 +7,9 @@ Changes in Apache Libcloud in development
 Compute
 ~~~~~~~
 
+- [Digital Ocean] Support floating IPs (GITHUB-1177)
+  [Rick van de Loo]
+
 - [Dimension Data] Fix IndexError in list_images (GITHUB-1171)
   [Adam Friedman]
 


[2/6] libcloud git commit: implement ex_get_floating_ip for DigitalOcean

Posted by qu...@apache.org.
implement ex_get_floating_ip for DigitalOcean

Throws ValueError if the IP can not be found.

Inspired by ex_get_floating_ip from openstack.py,
but that one does `ip_obj, = [x for x in floating_ips if x.ip_address == ip]`
which will cause an ugly unpacking error if the IP can not be found:
`ValueError: need more than 0 values to unpack`

Signed-off-by: Quentin Pradet <qu...@apache.org>


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

Branch: refs/heads/trunk
Commit: c8df05363cf0210c53864f1d1cde93bfb147ec7d
Parents: e0bada2
Author: Rick van de Loo <ri...@gmail.com>
Authored: Sun Mar 4 14:44:54 2018 +0100
Committer: Quentin Pradet <qu...@apache.org>
Committed: Fri Mar 9 08:54:34 2018 +0400

----------------------------------------------------------------------
 libcloud/compute/drivers/digitalocean.py             | 15 +++++++++++++++
 .../fixtures/digitalocean_v2/list_floating_ips.json  |  2 +-
 libcloud/test/compute/test_digitalocean_v2.py        | 14 +++++++++++---
 3 files changed, 27 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/c8df0536/libcloud/compute/drivers/digitalocean.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index 286c2d0..fbb8397 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -534,6 +534,21 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver,
             self._paginated_request('/v2/floating_ips', 'floating_ips')
         )
 
+    def ex_get_floating_ip(self, ip):
+        """
+        Get specified floating IP
+
+        :param      ip: floating IP to get
+        :type       ip: ``str``
+
+        :rtype: :class:`DigitalOcean_v2_FloatingIpAddress`
+        """
+        floating_ips = self.ex_list_floating_ips()
+        matching_ips = [x for x in floating_ips if x.ip_address == ip]
+        if not matching_ips:
+            raise ValueError('Floating ip %s not found' % ip)
+        return matching_ips[0]
+
     def _to_node(self, data):
         extra_keys = ['memory', 'vcpus', 'disk', 'region', 'image',
                       'size_slug', 'locked', 'created_at', 'networks',

http://git-wip-us.apache.org/repos/asf/libcloud/blob/c8df0536/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json b/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
index 42b11b3..2960989 100644
--- a/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
+++ b/libcloud/test/compute/fixtures/digitalocean_v2/list_floating_ips.json
@@ -1,2 +1,2 @@
-{"floating_ips":[{"ip":"177.166.135.205","droplet":null,"region":{"name":"Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-48gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false},{"ip":"154.138.103.175","droplet":null,"region":{"name":"Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-48gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-
 128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false}],"links":{},"meta":{"total":2}}
+{"floating_ips":[{"ip":"133.166.122.204","droplet":{"status":"active","kernel": null,"volume_ids": [],"locked": false,"name":"vdloo-magweb","backup_ids": [],"created_at":"2018-03-01T10:15:06Z","snapshot_ids": [],"size_slug":"2gb","id": 84155775,"next_backup_window": null,"vcpus": 2,"features": [],"image": {"regions": ["ams3"],"min_disk_size": 80,"public": false,"name":"hypernode","distribution":"Ubuntu","created_at":"2018-05-23T14:16:34Z","size_gigabytes": 1.02,"type":"snapshot","slug": null,"id": 12367123},"memory": 4096,"region": {"available": true,"slug":"ams3","features": ["private_networking","backups","ipv6","metadata","install_agent","storage"],"name":"Amsterdam 3","sizes": ["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","36gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-36gb","s-16vcpu-64gb",
 "s-20vcpu-96gb","s-24vcpu-128gb"]},"disk": 80,"networks": {"v4": [{"ip_address":"145.65.193.36","netmask":"255.255.280.0","type":"public","gateway":"145.65.192.1"}],"v6": []},"tags": [],"size": {"price_monthly": 20.0,"available": true,"vcpus": 2,"regions": ["ams2","ams3","blr1","fra1","lon1","nyc1","nyc2","nyc3","sfo1","sfo2","sgp1","tor1"],"memory": 4096,"transfer": 3.0,"disk": 80,"price_hourly": 0.02976,"slug":"2gb"}},"region":{"name":"Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","36gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-36gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false},{"ip":"154.138.103.175","droplet":null,"region":{"name":"
 Amsterdam 3","slug":"ams3","sizes":["64gb","512mb","1gb","2gb","4gb","8gb","16gb","32gb","36gb","c-16","s-1vcpu-3gb","c-2","c-4","c-8","m-1vcpu-8gb","m-16gb","m-32gb","m-64gb","m-128gb","m-224gb","s-1vcpu-1gb","s-3vcpu-1gb","s-1vcpu-2gb","s-2vcpu-2gb","s-2vcpu-4gb","s-4vcpu-8gb","s-6vcpu-16gb","s-8vcpu-32gb","s-12vcpu-36gb","s-16vcpu-64gb","s-20vcpu-96gb","s-24vcpu-128gb"],"features":["private_networking","backups","ipv6","metadata","install_agent","storage"],"available":true},"locked":false}],"links":{},"meta":{"total":2}}
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/c8df0536/libcloud/test/compute/test_digitalocean_v2.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_digitalocean_v2.py b/libcloud/test/compute/test_digitalocean_v2.py
index 02f0f03..4612bb3 100644
--- a/libcloud/test/compute/test_digitalocean_v2.py
+++ b/libcloud/test/compute/test_digitalocean_v2.py
@@ -328,10 +328,18 @@ class DigitalOcean_v2_Tests(LibcloudTestCase):
         self.assertEqual(len(floating_ips), 2, 'Wrong floating IPs count')
 
         floating_ip = floating_ips[0]
-        self.assertEqual(floating_ip.id, '177.166.135.205')
-        self.assertEqual(floating_ip.ip_address, '177.166.135.205')
+        self.assertEqual(floating_ip.id, '133.166.122.204')
+        self.assertEqual(floating_ip.ip_address, '133.166.122.204')
         self.assertEqual(floating_ip.extra['region']['slug'], 'ams3')
-        self.assertIsNone(floating_ip.node_id)
+        self.assertEqual(84155775, floating_ip.node_id)
+
+    def test_get_floating_ip(self):
+        floating_ip = self.driver.ex_get_floating_ip('133.166.122.204')
+
+        self.assertEqual(floating_ip.id, '133.166.122.204')
+        self.assertEqual(floating_ip.ip_address, '133.166.122.204')
+        self.assertEqual(floating_ip.extra['region']['slug'], 'ams3')
+        self.assertEqual(84155775, floating_ip.node_id)
 
 
 class DigitalOceanMockHttp(MockHttp):