diff --git a/oslo_utils/netutils.py b/oslo_utils/netutils.py index eae0d87c..3e3deaf6 100644 --- a/oslo_utils/netutils.py +++ b/oslo_utils/netutils.py @@ -137,6 +137,22 @@ def is_valid_cidr(address): return True +def is_valid_ipv6_cidr(address): + """Verify that address represents a valid IPv6 CIDR address. + + :param address: address to verify + :type address: string + :returns: true if address is valid, false otherwise + + .. versionadded:: 3.17 + """ + try: + netaddr.IPNetwork(address, version=6).cidr + return True + except (TypeError, netaddr.AddrFormatError): + return False + + def get_ipv6_addr_by_EUI64(prefix, mac): """Calculate IPv6 address using EUI-64 specification. diff --git a/oslo_utils/tests/test_netutils.py b/oslo_utils/tests/test_netutils.py index 9a4a3594..3678bcf8 100644 --- a/oslo_utils/tests/test_netutils.py +++ b/oslo_utils/tests/test_netutils.py @@ -191,6 +191,17 @@ class NetworkUtilsTest(test_base.BaseTestCase): self.assertFalse(netutils.is_valid_cidr('10.0.0.1/33')) self.assertFalse(netutils.is_valid_cidr(10)) + def test_is_valid_ipv6_cidr(self): + self.assertTrue(netutils.is_valid_ipv6_cidr("2600::/64")) + self.assertTrue(netutils.is_valid_ipv6_cidr( + "abcd:ef01:2345:6789:abcd:ef01:192.168.254.254/48")) + self.assertTrue(netutils.is_valid_ipv6_cidr( + "0000:0000:0000:0000:0000:0000:0000:0001/32")) + self.assertTrue(netutils.is_valid_ipv6_cidr( + "0000:0000:0000:0000:0000:0000:0000:0001")) + self.assertFalse(netutils.is_valid_ipv6_cidr("foo")) + self.assertFalse(netutils.is_valid_ipv6_cidr("127.0.0.1")) + def test_valid_port(self): valid_inputs = [0, '0', 1, '1', 2, '3', '5', 8, 13, 21, '80', '3246', '65535']