libcloud icon indicating copy to clipboard operation
libcloud copied to clipboard

Digital Ocean compute: public_ips += IPv6 addresses

Open danielshahaf opened this issue 3 years ago • 0 comments

Summary

Digital Ocean compute nodes' .public_ips attribute doesn't list IPv6 addresses. Patch for 3.6 tested against 3.4 included.

Detailed Information

Create a node with a public IPv6 address:

driver.create_node(
	name = ...,
	size = driver.list_sizes()[0],
	image = driver.list_images()[0],
	location = driver.list_locations()}[0],
	ex_create_attr = dict(ipv6=True),
)
driver.wait_until_running([node])

(docs for ex_create_attr).

Now inspect the node's public IP addresses:

>>> print(driver.list_nodes()[0].public_ips)
['159.223.187.157']

The IPv6 address is missing. (Observed in libcloud 3.4.1-5 in Debian sid — the latest I can easily test — but by code inspection applies to HEAD too.)

Patch

Here's a patch too. Not packaging it as a PR because I haven't done all the legwork (test it in 3.6 by hand and by test suite) yet, but posting it here since I didn't want to sit on it until I had time to finish it.

diff --git a/libcloud/compute/drivers/digitalocean.py b/libcloud/compute/drivers/digitalocean.py
index df7f0ae..0ea5346 100644
--- a/libcloud/compute/drivers/digitalocean.py
+++ b/libcloud/compute/drivers/digitalocean.py
@@ -689,11 +689,11 @@ class DigitalOcean_v2_NodeDriver(DigitalOcean_v2_BaseDriver, DigitalOceanNodeDri
         private_ips = []
         public_ips = []
         if networks:
-            for net in networks["v4"]:
+            for net in networks.get('v4', []) + networks.get('v6', []):
                 if net["type"] == "private":
-                    private_ips = [net["ip_address"]]
+                    private_ips.append(net["ip_address"])
                 if net["type"] == "public":
-                    public_ips = [net["ip_address"]]
+                    public_ips.append(net["ip_address"])
 
         extra = {}
         for key in extra_keys:

This was written against 3.4 but applied cleanly to 3.6 after changing single quotes to double quotes.

Result

>>> print(driver.list_nodes()[0].public_ips)
['159.223.187.157', '2604:a880:400:d0::1c58:e001']

I'm not sure whether the API contract allows this change.

danielshahaf avatar Aug 08 '22 16:08 danielshahaf