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 2014/09/02 17:38:14 UTC

git commit: Correctly categorize node public and private IP addresses when dealing with OpenStack floating IPs.

Repository: libcloud
Updated Branches:
  refs/heads/trunk f007edaaf -> 65e0bfbc1


Correctly categorize node public and private IP addresses when dealing with
OpenStack floating IPs.

Patch by Andrew Mann and Tomaz (tests).


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

Branch: refs/heads/trunk
Commit: 65e0bfbc1de05f77ccdd659acafa5d19858bfb32
Parents: f007eda
Author: Tomaz Muraus <to...@apache.org>
Authored: Tue Sep 2 15:45:49 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Tue Sep 2 16:24:42 2014 +0200

----------------------------------------------------------------------
 CHANGES.rst                                     |   4 +
 libcloud/compute/drivers/openstack.py           |  46 ++++--
 .../openstack_v1.1/_servers_detail.json         | 163 ++++++++++++++++++-
 libcloud/test/compute/test_openstack.py         |  10 ++
 4 files changed, 207 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/65e0bfbc/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 69ab399..e1253d4 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -82,6 +82,10 @@ Compute
   (GITHUB-321, GITHUB-354)
   [Itxaka Serrano]
 
+- Correctly categorize node IP addresses into public and private when dealing
+  with OpenStack floating IPs.
+  [Andrew Mann]
+
 Storage
 ~~~~~~~
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/65e0bfbc/libcloud/compute/drivers/openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py
index c836109..01fadee 100644
--- a/libcloud/compute/drivers/openstack.py
+++ b/libcloud/compute/drivers/openstack.py
@@ -39,7 +39,7 @@ from libcloud.common.openstack import OpenStackBaseConnection
 from libcloud.common.openstack import OpenStackDriverMixin
 from libcloud.common.openstack import OpenStackException
 from libcloud.common.openstack import OpenStackResponse
-from libcloud.utils.networking import is_private_subnet
+from libcloud.utils.networking import is_public_subnet
 from libcloud.compute.base import NodeSize, NodeImage
 from libcloud.compute.base import (NodeDriver, Node, NodeLocation,
                                    StorageVolume, VolumeSnapshot)
@@ -1942,20 +1942,36 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver):
         public_ips, private_ips = [], []
 
         for label, values in api_node['addresses'].items():
-            ips = [v['addr'] for v in values]
-
-            if label in public_networks_labels:
-                public_ips.extend(ips)
-            else:
-                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)
+            for value in values:
+                ip = value['addr']
+
+                is_public_ip = False
+
+                try:
+                    public_subnet = is_public_subnet(ip)
+                except:
+                    # IPv6
+                    public_subnet = False
+
+                # Openstack Icehouse sets 'OS-EXT-IPS:type' to 'floating' for
+                # public and 'fixed' for private
+                explicit_ip_type = value.get('OS-EXT-IPS:type', None)
+
+                if explicit_ip_type == 'floating':
+                    is_public_ip = True
+                elif explicit_ip_type == 'fixed':
+                    is_public_ip = False
+                elif label in public_networks_labels:
+                    # Try label next
+                    is_public_ip = True
+                elif public_subnet:
+                    # Check for public subnet
+                    is_public_ip = True
+
+                if is_public_ip:
+                    public_ips.append(ip)
+                else:
+                    private_ips.append(ip)
 
         # Sometimes 'image' attribute is not present if the node is in an error
         # state

http://git-wip-us.apache.org/repos/asf/libcloud/blob/65e0bfbc/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
index 35d9085..b2dfe18 100644
--- a/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
+++ b/libcloud/test/compute/fixtures/openstack_v1.1/_servers_detail.json
@@ -1 +1,162 @@
-{"servers": [{"status": "BUILD", "updated": "2011-10-11T00:50:04Z", "hostId": "912566d83a13fbb357ea3f13c629363d9f7e1ba3f925b49f3d2ab725", "user_id": "rs-reach", "name": "lc-test-2", "links": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12065", "rel": "self"}, {"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12065", "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": "50.57.94.35"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe47:788a"}], "private": [{"version": 4, "addr": "10.182.64.34"}, {"version": 6, "addr": "fec0:4801:7808:52:16:3eff:fe60:187d"}], "mynetwork": [{"version": 4, "addr": "12.16.18.28"}]}, "tenant_id": "rs-reach-project", "image": {"id": "7", "links": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7", "rel": "bookmark"}]}, "created": "2011-10-11T00:51:39Z", "uuid": "02786501-714e-40af-8342-9c17eccb166d", "accessIPv4"
 : "", "accessIPv6": "", "key_name": null, "progress": 25, "flavor": {"id": "2", "links": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2", "rel": "bookmark"}]}, "config_drive": "", "id": 12065, "metadata": {}, "OS-DCF:diskConfig": "AUTO"}, {"status": "ACTIVE", "updated": "2011-10-11T00:44:20Z", "hostId": "a024053a6201e6c6c12660aab3d8fd879e332e663a5e1fdbc02a0307", "user_id": "rs-reach", "name": "lc-test", "links": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12064", "rel": "self"}, {"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12064", "rel": "bookmark"}], "addresses": {"public": [{"version": 4, "addr": "50.57.94.30"}, {"version": 6, "addr": "2001:4801:7808:52:16:3eff:fe77:32e3"}], "private": [{"version": 4, "addr": "10.182.64.29"}, {"version": 6, "addr": "fec0:4801:7808:52:16:3eff:fe6e:b7e2"}]}, "tenant_id": "rs-reach-project", "image": {"id": "7", "li
 nks": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7", "rel": "bookmark"}]}, "created": "2011-10-11T00:45:02Z", "uuid": "ec53630b-e4fb-442a-a748-c376f5c4345b", "accessIPv4": "", "accessIPv6": "", "key_name": null, "progress": 100, "flavor": {"id": "2", "links": [{"href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2", "rel": "bookmark"}]}, "config_drive": "", "id": 12064, "metadata": {}, "OS-DCF:diskConfig": "AUTO"}]}
+{
+    "servers": [
+        {
+            "status": "BUILD",
+            "updated": "2011-10-11T00:50:04Z",
+            "hostId": "912566d83a13fbb357ea3f13c629363d9f7e1ba3f925b49f3d2ab725",
+            "user_id": "rs-reach",
+            "name": "lc-test-2",
+            "links": [
+                {
+                    "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12065",
+                    "rel": "self"
+                },
+                {
+                    "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12065",
+                    "rel": "bookmark"
+                }
+            ],
+            "addresses": {
+                "public": [
+                    {
+                        "version": 4,
+                        "addr": "50.57.94.35"
+                    },
+                    {
+                        "version": 6,
+                        "addr": "2001:4801:7808:52:16:3eff:fe47:788a"
+                    }
+                ],
+                "private": [
+                    {
+                        "version": 4,
+                        "addr": "10.182.64.34"
+                    },
+                    {
+                        "version": 6,
+                        "addr": "fec0:4801:7808:52:16:3eff:fe60:187d"
+                    }
+                ],
+                "mynetwork": [
+                    {
+                        "version": 4,
+                        "addr": "12.16.18.28"
+                    }
+                ],
+                "mynetwork_public": [
+                    {
+                        "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:79:90:aa",
+                        "OS-EXT-IPS:type": "floating",
+                        "addr": "192.168.3.3",
+                        "version": 4
+                    }
+                ],
+                "mynetwork_private": [
+                    {
+                        "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:79:90:aa",
+                        "OS-EXT-IPS:type": "fixed",
+                        "addr": "10.3.3.3",
+                        "version": 4
+                    }
+                ]
+            },
+            "tenant_id": "rs-reach-project",
+            "image": {
+                "id": "7",
+                "links": [
+                    {
+                        "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7",
+                        "rel": "bookmark"
+                    }
+                ]
+            },
+            "created": "2011-10-11T00:51:39Z",
+            "uuid": "02786501-714e-40af-8342-9c17eccb166d",
+            "accessIPv4": "",
+            "accessIPv6": "",
+            "key_name": null,
+            "progress": 25,
+            "flavor": {
+                "id": "2",
+                "links": [
+                    {
+                        "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2",
+                        "rel": "bookmark"
+                    }
+                ]
+            },
+            "config_drive": "",
+            "id": 12065,
+            "metadata": {},
+            "OS-DCF:diskConfig": "AUTO"
+        },
+        {
+            "status": "ACTIVE",
+            "updated": "2011-10-11T00:44:20Z",
+            "hostId": "a024053a6201e6c6c12660aab3d8fd879e332e663a5e1fdbc02a0307",
+            "user_id": "rs-reach",
+            "name": "lc-test",
+            "links": [
+                {
+                    "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/v1.1/rs-reach-project/servers/12064",
+                    "rel": "self"
+                },
+                {
+                    "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/servers/12064",
+                    "rel": "bookmark"
+                }
+            ],
+            "addresses": {
+                "public": [
+                    {
+                        "version": 4,
+                        "addr": "50.57.94.30"
+                    },
+                    {
+                        "version": 6,
+                        "addr": "2001:4801:7808:52:16:3eff:fe77:32e3"
+                    }
+                ],
+                "private": [
+                    {
+                        "version": 4,
+                        "addr": "10.182.64.29"
+                    },
+                    {
+                        "version": 6,
+                        "addr": "fec0:4801:7808:52:16:3eff:fe6e:b7e2"
+                    }
+                ]
+            },
+            "tenant_id": "rs-reach-project",
+            "image": {
+                "id": "7",
+                "links": [
+                    {
+                        "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/images/7",
+                        "rel": "bookmark"
+                    }
+                ]
+            },
+            "created": "2011-10-11T00:45:02Z",
+            "uuid": "ec53630b-e4fb-442a-a748-c376f5c4345b",
+            "accessIPv4": "",
+            "accessIPv6": "",
+            "key_name": null,
+            "progress": 100,
+            "flavor": {
+                "id": "2",
+                "links": [
+                    {
+                        "href": "http://alpha.ord.servers.api.rackspacecloud.com:8774/rs-reach-project/flavors/2",
+                        "rel": "bookmark"
+                    }
+                ]
+            },
+            "config_drive": "",
+            "id": 12064,
+            "metadata": {},
+            "OS-DCF:diskConfig": "AUTO"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/65e0bfbc/libcloud/test/compute/test_openstack.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py
index 642b7a8..e52c6d9 100644
--- a/libcloud/test/compute/test_openstack.py
+++ b/libcloud/test/compute/test_openstack.py
@@ -750,14 +750,24 @@ class OpenStack_1_1_Tests(unittest.TestCase, TestCaseMixin):
         node = nodes[0]
 
         self.assertEqual('12065', node.id)
+
         # test public IPv4
         self.assertTrue('12.16.18.28' in node.public_ips)
         self.assertTrue('50.57.94.35' in node.public_ips)
+
+        # floating ip
+        self.assertTrue('192.168.3.3' 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)
+
+        # floating ip
+        self.assertTrue('10.3.3.3' in node.private_ips)
+
         # test private IPv6
         self.assertTrue(
             'fec0:4801:7808:52:16:3eff:fe60:187d' in node.private_ips)