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):