diff options
author | Lukas Bezdicka <lbezdick@redhat.com> | 2015-03-19 15:09:52 +0100 |
---|---|---|
committer | Lukas Bezdicka <social@v3.sk> | 2015-04-23 11:15:26 +0000 |
commit | c7fd828cefe3947bdd89702f4af9b573a0ce60ca (patch) | |
tree | 88b35406b23aee34bcb5d47bd458befae5f870fe | |
parent | e6f12dee2441b7941e5cf7ae218029a246502b0a (diff) | |
download | oslo-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.py | 11 | ||||
-rw-r--r-- | oslo_messaging/tests/drivers/test_impl_rabbit.py | 10 | ||||
-rw-r--r-- | tests/drivers/test_impl_rabbit.py | 10 |
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 |