From 159925248375727ae67ef93a606b09a54e83ba2d Mon Sep 17 00:00:00 2001 From: Sven Kieske Date: Fri, 16 Oct 2020 16:24:02 +0200 Subject: re-add rabbitmq config for clustering interface this adds back the ability to configure the rabbitmq/erlang kernel network interface which was removed in https://review.opendev.org/#/c/584427/ seemingly by accident. Closes-Bug: 1900160 Change-Id: I6f00396495853e117429c17fadfafe809e322a31 --- kolla_ansible/put_address_in_context.py | 21 ++++++++++++++++++--- kolla_ansible/tests/unit/test_address_filters.py | 9 +++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'kolla_ansible') diff --git a/kolla_ansible/put_address_in_context.py b/kolla_ansible/put_address_in_context.py index d176a5611..69355283f 100644 --- a/kolla_ansible/put_address_in_context.py +++ b/kolla_ansible/put_address_in_context.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from ipaddress import ip_address from kolla_ansible.exception import FilterError @@ -27,18 +28,32 @@ def put_address_in_context(address, context): :returns: string with address in proper context """ - if context not in ['url', 'memcache']: + if context not in ['url', 'memcache', 'rabbitmq']: raise FilterError("Unknown context '{context}'" .format(context=context)) - if ':' not in address: + if ':' not in address and context != 'rabbitmq': return address # must be IPv6 raw address if context == 'url': return '[{address}]'.format(address=address) - elif context == 'memcache': + if context == 'memcache': return 'inet6:[{address}]'.format(address=address) + # rabbitmq/erlang has special syntax for ip addresses in IPv4 and IPv6 + # see: https://www.erlang.org/doc/man/inet.html + # replacing dots and colons with decimal points + # and converting IPv6 as described here: + # https://www.erlang.org/doc/man/inet.html#type-ip6_address + + if context == 'rabbitmq': + if ip_address(address).version == 6: + return (",".join(['16#%x' % int(x, 16) + for x in + ip_address(address).exploded.split(':')])) + + return address.replace('.', ',') + return address diff --git a/kolla_ansible/tests/unit/test_address_filters.py b/kolla_ansible/tests/unit/test_address_filters.py index 338afb130..be2cee78d 100644 --- a/kolla_ansible/tests/unit/test_address_filters.py +++ b/kolla_ansible/tests/unit/test_address_filters.py @@ -51,6 +51,15 @@ class TestAddressContextFilter(unittest.TestCase): self.assertEqual(put_address_in_context(addr, context), 'inet6:[{}]'.format(addr)) + def test_rabbitmq_context(self): + context = 'rabbitmq' + addr = '192.168.1.1' + self.assertEqual(put_address_in_context(addr, context), + '192,168,1,1') + addr = 'fd::' + self.assertEqual(put_address_in_context(addr, context), + '16#fd,16#0,16#0,16#0,16#0,16#0,16#0,16#0') + def test_unknown_context(self): self.assertRaises(FilterError, put_address_in_context, '', 'lol') -- cgit v1.2.3