summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Bezdicka <lbezdick@redhat.com>2015-03-19 15:09:52 +0100
committerLukas Bezdicka <social@v3.sk>2015-04-23 11:15:26 +0000
commitc7fd828cefe3947bdd89702f4af9b573a0ce60ca (patch)
tree88b35406b23aee34bcb5d47bd458befae5f870fe
parente6f12dee2441b7941e5cf7ae218029a246502b0a (diff)
downloadoslo-messaging-c7fd828cefe3947bdd89702f4af9b573a0ce60ca.tar.gz
rabbit: fix ipv6 support
Url constructed for kombu cannot contain ipv6 address without brackets. The url.hostname returns hosts without brackets so we have to readd them. Change-Id: Ifb1d358a67655af99a84b77ca813fc2dd87d87dc (cherry picked from commit 9f137948ae3245f2ddaf7a21eb5a570ad0c81934)
-rw-r--r--oslo_messaging/_drivers/impl_rabbit.py11
-rw-r--r--oslo_messaging/tests/drivers/test_impl_rabbit.py10
-rw-r--r--tests/drivers/test_impl_rabbit.py10
3 files changed, 29 insertions, 2 deletions
diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py
index 17a140d..d4ca4af 100644
--- a/oslo_messaging/_drivers/impl_rabbit.py
+++ b/oslo_messaging/_drivers/impl_rabbit.py
@@ -623,7 +623,8 @@ class Connection(object):
transport,
parse.quote(host.username or ''),
parse.quote(host.password or ''),
- host.hostname or '', str(host.port or 5672),
+ self._parse_url_hostname(host.hostname) or '',
+ str(host.port or 5672),
virtual_host)
elif url.transport.startswith('kombu+'):
# NOTE(sileht): url have a + but no hosts
@@ -638,7 +639,7 @@ class Connection(object):
";" if self._url else '',
parse.quote(self.driver_conf.rabbit_userid),
parse.quote(self.driver_conf.rabbit_password),
- hostname, port,
+ self._parse_url_hostname(hostname), port,
virtual_host)
self._initial_pid = os.getpid()
@@ -726,6 +727,12 @@ class Connection(object):
except KeyError:
raise RuntimeError(_("Invalid SSL version : %s") % version)
+ def _parse_url_hostname(self, hostname):
+ """Handles hostname returned from urlparse and checks whether it's
+ ipaddress. If it's ipaddress it ensures that it has brackets for IPv6.
+ """
+ return '[%s]' % hostname if ':' in hostname else hostname
+
def _fetch_ssl_params(self):
"""Handles fetching what ssl params should be used for the connection
(if any).
diff --git a/oslo_messaging/tests/drivers/test_impl_rabbit.py b/oslo_messaging/tests/drivers/test_impl_rabbit.py
index dacb40a..5f75ab4 100644
--- a/oslo_messaging/tests/drivers/test_impl_rabbit.py
+++ b/oslo_messaging/tests/drivers/test_impl_rabbit.py
@@ -234,6 +234,13 @@ class TestRabbitTransportURL(test_utils.BaseTestCase):
expected=["amqp://user:password@host:10/virtual_host",
"amqp://user2:password2@host2:12/virtual_host"]
)),
+ ('rabbit_ipv6',
+ dict(url='rabbit://u:p@[fd00:beef:dead:55::133]:10/vhost',
+ skip_py26='python 2.6 has broken urlparse for ipv6',
+ expected=['amqp://u:p@[fd00:beef:dead:55::133]:10/vhost'])),
+ ('rabbit_ipv4',
+ dict(url='rabbit://user:password@10.20.30.40:10/vhost',
+ expected=['amqp://user:password@10.20.30.40:10/vhost'])),
]
def setUp(self):
@@ -245,6 +252,9 @@ class TestRabbitTransportURL(test_utils.BaseTestCase):
@mock.patch('oslo_messaging._drivers.impl_rabbit.Connection.ensure')
@mock.patch('oslo_messaging._drivers.impl_rabbit.Connection.reset')
def test_transport_url(self, fake_reset, fake_ensure):
+ if hasattr(self, 'skip_py26') and sys.version_info < (2, 7):
+ self.skipTest(self.skip_py26)
+
transport = oslo_messaging.get_transport(self.conf, self.url)
self.addCleanup(transport.cleanup)
driver = transport._driver
diff --git a/tests/drivers/test_impl_rabbit.py b/tests/drivers/test_impl_rabbit.py
index d383bab..7b58212 100644
--- a/tests/drivers/test_impl_rabbit.py
+++ b/tests/drivers/test_impl_rabbit.py
@@ -141,6 +141,13 @@ class TestRabbitTransportURL(test_utils.BaseTestCase):
('rabbit',
dict(url='kombu+rabbit://user:password@host:10/virtual_host',
expected=['amqp://user:password@host:10/virtual_host'])),
+ ('rabbit_ipv6',
+ dict(url='kombu+rabbit://u:p@[fd00:beef:dead:55::133]:10/vhost',
+ skip_py26='python 2.6 has broken urlparse for ipv6',
+ expected=['amqp://u:p@[fd00:beef:dead:55::133]:10/vhost'])),
+ ('rabbit_ipv4',
+ dict(url='kombu+rabbit://user:password@10.20.30.40:10/vhost',
+ expected=['amqp://user:password@10.20.30.40:10/vhost'])),
]
def setUp(self):
@@ -152,6 +159,9 @@ class TestRabbitTransportURL(test_utils.BaseTestCase):
@mock.patch('oslo_messaging._drivers.impl_rabbit.Connection.ensure')
@mock.patch('oslo_messaging._drivers.impl_rabbit.Connection.reset')
def test_transport_url(self, fake_ensure_connection, fake_reset):
+ if hasattr(self, 'skip_py26') and sys.version_info < (2, 7):
+ self.skipTest(self.skip_py26)
+
transport = messaging.get_transport(self.conf, self.url)
self.addCleanup(transport.cleanup)
driver = transport._driver