From 2e6a2ef534d61e7dc11526eb8408aaf41dd07263 Mon Sep 17 00:00:00 2001 From: Frode Nordahl Date: Sat, 6 Jun 2020 14:38:38 +0200 Subject: [PATCH] Add helper to format IP addresses appropriately The ``format_addr`` helper will allow you to write IP version agnostic code by encapsulating IPv6 addresses in brackets ('[]'). --- unit_tests/charm_tests/test_utils.py | 12 ++++++++++++ zaza/openstack/charm_tests/test_utils.py | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/unit_tests/charm_tests/test_utils.py b/unit_tests/charm_tests/test_utils.py index 280e2e2..a415360 100644 --- a/unit_tests/charm_tests/test_utils.py +++ b/unit_tests/charm_tests/test_utils.py @@ -30,3 +30,15 @@ class TestOpenStackBaseTest(unittest.TestCase): MyTestClass.setUpClass('foo', 'bar') _setUpClass.assert_called_with('foo', 'bar') + + +class TestUtils(unittest.TestCase): + + def test_format_addr(self): + self.assertEquals('1.2.3.4', test_utils.format_addr('1.2.3.4')) + self.assertEquals( + '[2001:db8::42]', test_utils.format_addr('2001:db8::42')) + with self.assertRaises(ValueError): + test_utils.format_addr('999.999.999.999') + with self.assertRaises(ValueError): + test_utils.format_addr('2001:db8::g') diff --git a/zaza/openstack/charm_tests/test_utils.py b/zaza/openstack/charm_tests/test_utils.py index bcb5aff..47c12d7 100644 --- a/zaza/openstack/charm_tests/test_utils.py +++ b/zaza/openstack/charm_tests/test_utils.py @@ -14,6 +14,7 @@ """Module containing base class for implementing charm tests.""" import contextlib import logging +import ipaddress import subprocess import unittest @@ -431,3 +432,20 @@ class OpenStackBaseTest(BaseCharmTest): cls.keystone_session = openstack_utils.get_overcloud_keystone_session( model_name=cls.model_name) cls.cacert = openstack_utils.get_cacert() + + +def format_addr(addr): + """Validate and format IP address. + + :param addr: IPv6 or IPv4 address + :type addr: str + :returns: Address string, optionally encapsulated in brackets([]) + :rtype: str + :raises: ValueError + """ + ipaddr = ipaddress.ip_address(addr) + if isinstance(ipaddr, ipaddress.IPv6Address): + fmt = '[{}]' + else: + fmt = '{}' + return fmt.format(ipaddr)