From d2dbd8551a7c5e598b6d17a981a6f169515a141e Mon Sep 17 00:00:00 2001
From: Markos Gogoulos <mgogoulos@mist.io>
Date: Fri, 31 Jan 2014 13:53:43 +0200
Subject: [PATCH] OpenStack public ip addresses fix

---
 libcloud/compute/drivers/openstack.py   | 11 ++++++++++-
 libcloud/test/compute/test_openstack.py | 12 ++++++++----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py
index aba37bc..c7d0b09 100644
--- a/libcloud/compute/drivers/openstack.py
+++ b/libcloud/compute/drivers/openstack.py
@@ -37,6 +37,7 @@ except ImportError:
 from libcloud.common.openstack import OpenStackBaseConnection
 from libcloud.common.openstack import OpenStackDriverMixin
 from libcloud.common.types import MalformedResponseError, ProviderError
+from libcloud.utils.networking import is_private_subnet
 from libcloud.compute.base import NodeSize, NodeImage
 from libcloud.compute.base import (NodeDriver, Node, NodeLocation,
                                    StorageVolume, VolumeSnapshot)
@@ -1987,7 +1988,15 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
             if label in public_networks_labels:
                 public_ips.extend(ips)
             else:
-                private_ips.extend(ips)
+                for ip in ips:
+                    #is_private_subnet does not check for ipv6
+                    try:
+                        if is_private_subnet(ip):
+                            private_ips.append(ip)
+                        else:
+                            public_ips.append(ip)
+                    except:
+                        private_ips.append(ip)
 
         # Sometimes 'image' attribute is not present if the node is in an error
         # state
diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py
index 1bb6487..bdc6979 100644
--- a/libcloud/test/compute/test_openstack.py
+++ b/libcloud/test/compute/test_openstack.py
@@ -961,11 +961,15 @@ class OpenStack_1_1_Tests(unittest.TestCase, TestCaseMixin):
         node = nodes[0]
 
         self.assertEqual('12065', node.id)
-        self.assertEqual('50.57.94.35', node.public_ips[0])
-        self.assertEqual(
-            '2001:4801:7808:52:16:3eff:fe47:788a', node.public_ips[1])
+        #test public IPv4
+        self.assertTrue('12.16.18.28' in node.public_ips)
+        self.assertTrue('50.57.94.35' in node.public_ips)
+        #test public IPv6
+        self.assertTrue(
+            '2001:4801:7808:52:16:3eff:fe47:788a' in node.public_ips)
+        #test private IPv4
         self.assertTrue('10.182.64.34' in node.private_ips)
-        self.assertTrue('12.16.18.28' in node.private_ips)
+        #test private IPv6
         self.assertTrue(
             'fec0:4801:7808:52:16:3eff:fe60:187d' in node.private_ips)
 
-- 
1.8.3.2

