From 3e35f10d42aa474d34152a95ba504261c386b9d2 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Wed, 9 Jan 2013 11:41:18 -0500 Subject: Enhance wsgi to listen on ipv6 address * Check if the hostname is ipv6 and set the family appropriately * Add test case for wsgi.Server and service.WSGIService Change-Id: I6edd467467fa3d623d62e146750b3a6c42d8833c --- nova/tests/test_service.py | 8 ++++++++ nova/tests/test_wsgi.py | 9 +++++++++ nova/wsgi.py | 11 +++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py index 4c834e9c9..6fbeff329 100644 --- a/nova/tests/test_service.py +++ b/nova/tests/test_service.py @@ -182,6 +182,14 @@ class TestWSGIService(test.TestCase): self.assertNotEqual(0, test_service.port) test_service.stop() + def test_service_random_port_with_ipv6(self): + CONF.set_default("test_service_listen", "::1") + test_service = service.WSGIService("test_service") + test_service.start() + self.assertEqual("::1", test_service.host) + self.assertNotEqual(0, test_service.port) + test_service.stop() + class TestLauncher(test.TestCase): diff --git a/nova/tests/test_wsgi.py b/nova/tests/test_wsgi.py index eda735cae..b4b25ed97 100644 --- a/nova/tests/test_wsgi.py +++ b/nova/tests/test_wsgi.py @@ -90,3 +90,12 @@ class TestWSGIServer(test.TestCase): self.assertNotEqual(0, server.port) server.stop() server.wait() + + def test_start_random_port_with_ipv6(self): + server = nova.wsgi.Server("test_random_port", None, + host="::1", port=0) + server.start() + self.assertEqual("::1", server.host) + self.assertNotEqual(0, server.port) + server.stop() + server.wait() diff --git a/nova/wsgi.py b/nova/wsgi.py index e7e731523..c103526da 100644 --- a/nova/wsgi.py +++ b/nova/wsgi.py @@ -20,6 +20,7 @@ """Utility methods for working with WSGI servers.""" import os.path +import socket import sys import eventlet @@ -82,8 +83,14 @@ class Server(object): raise exception.InvalidInput( reason='The backlog must be more than 1') - self._socket = eventlet.listen((host, port), backlog=backlog) - (self.host, self.port) = self._socket.getsockname() + try: + socket.inet_pton(socket.AF_INET6, host) + family = socket.AF_INET6 + except Exception: + family = socket.AF_INET + + self._socket = eventlet.listen((host, port), family, backlog=backlog) + (self.host, self.port) = self._socket.getsockname()[0:2] LOG.info(_("%(name)s listening on %(host)s:%(port)s") % self.__dict__) def start(self): -- cgit