From 13d3bad01954a25dd49b7a7d71bd74dd931f09c5 Mon Sep 17 00:00:00 2001 From: Matthew Oliver Date: Thu, 30 Jul 2020 13:18:48 +1000 Subject: [PATCH] cephadm: add unwrap_ipv6 helper method When we pass in a mon-ip that is ipv6 we want it wrapped, this is so it can be properly inserted into the mon_addrv address. But there are times we need to unwrap it to test it's a valid ipv6 address. This patch adds a helper method `unwrap_ipv6` which takes a string and returns it either unwrapped or as it is, so it's harmless to other types of ips. This allows us to check a wrapped ipv6 base_ip with the networks on the host. Signed-off-by: Matthew Oliver --- src/cephadm/cephadm | 13 +++++++---- src/cephadm/tests/test_cephadm.py | 38 ++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index e9d0480203881..1911c3cec402a 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -2473,11 +2473,16 @@ def command_inspect_image(): ################################## +def unwrap_ipv6(address): + # type: (str) -> str + if address.startswith('[') and address.endswith(']'): + return address[1:-1] + return address + def is_ipv6(address): # type: (str) -> bool - if address.startswith('[') and address.endswith(']'): - address = address[1:-1] + address = unwrap_ipv6(address) try: return ipaddress.ip_address(unicode(address)).version == 6 except ValueError: @@ -2527,7 +2532,7 @@ def command_bootstrap(): # ip r = re.compile(r':(\d+)$') - base_ip = None + base_ip = '' if args.mon_ip: ipv6 = is_ipv6(args.mon_ip) hasport = r.findall(args.mon_ip) @@ -2573,7 +2578,7 @@ def command_bootstrap(): # make sure IP is configured locally, and then figure out the # CIDR network for net, ips in list_networks().items(): - if ipaddress.ip_address(unicode(base_ip)) in \ + if ipaddress.ip_address(unicode(unwrap_ipv6(base_ip))) in \ [ipaddress.ip_address(unicode(ip)) for ip in ips]: mon_network = net logger.info('Mon IP %s is in CIDR network %s' % (base_ip, diff --git a/src/cephadm/tests/test_cephadm.py b/src/cephadm/tests/test_cephadm.py index e37acc7975890..ef23a260454fa 100644 --- a/src/cephadm/tests/test_cephadm.py +++ b/src/cephadm/tests/test_cephadm.py @@ -107,33 +107,33 @@ default via fe80::2480:28ec:5097:3fe2 dev wlp2s0 proto ra metric 20600 pref medi """, """ 1: lo: mtu 65536 state UNKNOWN qlen 1000 - inet6 ::1/128 scope host + inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 state UP qlen 1000 - inet6 fdd8:591e:4969:6363:4c52:cafe:8dd4:dc4/64 scope global temporary dynamic + inet6 fdd8:591e:4969:6363:4c52:cafe:8dd4:dc4/64 scope global temporary dynamic valid_lft 86394sec preferred_lft 14394sec - inet6 fdbc:7574:21fe:9200:4c52:cafe:8dd4:dc4/64 scope global temporary dynamic + inet6 fdbc:7574:21fe:9200:4c52:cafe:8dd4:dc4/64 scope global temporary dynamic valid_lft 6745sec preferred_lft 3145sec - inet6 fdd8:591e:4969:6363:103a:abcd:af1f:57f3/64 scope global temporary deprecated dynamic + inet6 fdd8:591e:4969:6363:103a:abcd:af1f:57f3/64 scope global temporary deprecated dynamic valid_lft 86394sec preferred_lft 0sec - inet6 fdbc:7574:21fe:9200:103a:abcd:af1f:57f3/64 scope global temporary deprecated dynamic + inet6 fdbc:7574:21fe:9200:103a:abcd:af1f:57f3/64 scope global temporary deprecated dynamic valid_lft 6745sec preferred_lft 0sec - inet6 fdd8:591e:4969:6363:a128:1234:2bdd:1b6f/64 scope global temporary deprecated dynamic + inet6 fdd8:591e:4969:6363:a128:1234:2bdd:1b6f/64 scope global temporary deprecated dynamic valid_lft 86394sec preferred_lft 0sec - inet6 fdbc:7574:21fe:9200:a128:1234:2bdd:1b6f/64 scope global temporary deprecated dynamic + inet6 fdbc:7574:21fe:9200:a128:1234:2bdd:1b6f/64 scope global temporary deprecated dynamic valid_lft 6745sec preferred_lft 0sec - inet6 fdd8:591e:4969:6363:d581:4321:380b:3905/64 scope global temporary deprecated dynamic + inet6 fdd8:591e:4969:6363:d581:4321:380b:3905/64 scope global temporary deprecated dynamic valid_lft 86394sec preferred_lft 0sec - inet6 fdbc:7574:21fe:9200:d581:4321:380b:3905/64 scope global temporary deprecated dynamic + inet6 fdbc:7574:21fe:9200:d581:4321:380b:3905/64 scope global temporary deprecated dynamic valid_lft 6745sec preferred_lft 0sec - inet6 fe80::1111:2222:3333:4444/64 scope link noprefixroute + inet6 fe80::1111:2222:3333:4444/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 fde4:8dba:82e1:0:ec4a:e402:e9df:b357/64 scope global temporary dynamic valid_lft 1074sec preferred_lft 1074sec inet6 fde4:8dba:82e1:0:5054:ff:fe72:61af/64 scope global dynamic mngtmpaddr valid_lft 1074sec preferred_lft 1074sec 12: tun0: mtu 1500 state UNKNOWN qlen 100 - inet6 fe80::cafe:cafe:cafe:cafe/64 scope link stable-privacy + inet6 fe80::cafe:cafe:cafe:cafe/64 scope link stable-privacy valid_lft forever preferred_lft forever """, { @@ -164,7 +164,19 @@ default via fe80::2480:28ec:5097:3fe2 dev wlp2s0 proto ra metric 20600 pref medi "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffg", "1:2:3:4:5:6:7:8:9", "fd00::1::1", "[fg::1]"): assert not cd.is_ipv6(bad) - + + def test_unwrap_ipv6(self): + def unwrap_test(address, expected): + assert cd.unwrap_ipv6(address) == expected + + tests = [ + ('::1', '::1'), ('[::1]', '::1'), + ('[fde4:8dba:82e1:0:5054:ff:fe6a:357]', 'fde4:8dba:82e1:0:5054:ff:fe6a:357'), + ('can actually be any string', 'can actually be any string'), + ('[but needs to be stripped] ', '[but needs to be stripped] ')] + for address, expected in tests: + unwrap_test(address, expected) + @mock.patch('cephadm.call_throws') @mock.patch('cephadm.get_parm') def test_registry_login(self, get_parm, call_throws): @@ -205,7 +217,7 @@ default via fe80::2480:28ec:5097:3fe2 dev wlp2s0 proto ra metric 20600 pref medi " \"password\": \"REGISTRY_PASSWORD\"\n" "}\n") - # test login attempt with valid arguments where login command fails + # test login attempt with valid arguments where login command fails call_throws.side_effect = Exception args = cd._parse_args(['registry-login', '--registry-url', 'sample-url', '--registry-username', 'sample-user', '--registry-password', 'sample-pass']) cd.args = args -- 2.39.5