summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/test_service.py8
-rw-r--r--nova/tests/test_wsgi.py9
-rw-r--r--nova/wsgi.py11
3 files changed, 26 insertions, 2 deletions
diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py
index 2d98a2641..0bb57d542 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):