From da63183e6ae2f2148fb6ca1ac4a4dc11cebae011 Mon Sep 17 00:00:00 2001 From: Redouane Kachach Date: Wed, 30 Mar 2022 15:48:40 +0200 Subject: [PATCH] mgr/cephadm: fixing public network conf parsing Fixes: https://tracker.ceph.com/issues/55132 Signed-off-by: Redouane Kachach (cherry picked from commit 3ef6341e8ef5fe6a01f15c847f6bc9e2205d4d97) --- src/cephadm/cephadm | 20 +++++++++++++------ src/cephadm/tests/test_cephadm.py | 32 +++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index b52dfc588332d..7b3726fc3a02e 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -4305,6 +4305,7 @@ def check_subnet(subnets: str) -> Tuple[int, List[int], str]: subnet_list = subnets.split(',') for subnet in subnet_list: # ensure the format of the string is as expected address/netmask + subnet = subnet.strip() if not re.search(r'\/\d+$', subnet): rc = 1 errors.append(f'{subnet} is not in CIDR format (address/netmask)') @@ -4403,7 +4404,11 @@ def prepare_mon_addresses( logger.debug('Base mon IP is %s, final addrv is %s' % (base_ip, addr_arg)) mon_network = None - if not ctx.skip_mon_network: + cp = read_config(ctx.config) + if cp.has_option('global', 'public_network'): + mon_network = cp.get('global', 'public_network') + + if mon_network is None and not ctx.skip_mon_network: # make sure IP is configured locally, and then figure out the # CIDR network errmsg = f'Cannot infer CIDR network for mon IP `{base_ip}`' @@ -4426,18 +4431,21 @@ def prepare_mon_addresses( def prepare_cluster_network(ctx: CephadmContext) -> Tuple[str, bool]: - cluster_network = '' ipv6_cluster_network = False # the cluster network may not exist on this node, so all we can do is # validate that the address given is valid ipv4 or ipv6 subnet - if ctx.cluster_network: - rc, versions, err_msg = check_subnet(ctx.cluster_network) + cp = read_config(ctx.config) + cluster_network = ctx.cluster_network + if cluster_network is None and cp.has_option('global', 'cluster_network'): + cluster_network = cp.get('global', 'cluster_network') + + if cluster_network: + rc, versions, err_msg = check_subnet(cluster_network) if rc: raise Error(f'Invalid --cluster-network parameter: {err_msg}') - cluster_network = ctx.cluster_network ipv6_cluster_network = True if 6 in versions else False else: - logger.info('- internal network (--cluster-network) has not ' + logger.info('Internal network (--cluster-network) has not ' 'been provided, OSD replication will default to ' 'the public_network') diff --git a/src/cephadm/tests/test_cephadm.py b/src/cephadm/tests/test_cephadm.py index 1b308abbbee92..73171631ee207 100644 --- a/src/cephadm/tests/test_cephadm.py +++ b/src/cephadm/tests/test_cephadm.py @@ -1949,3 +1949,35 @@ class TestSNMPGateway: with pytest.raises(Exception) as e: c = cd.get_container(ctx, fsid, 'snmp-gateway', 'daemon_id') assert str(e.value) == 'not a valid snmp version: V1' + + def test_ipv4_subnet(self): + rc, v, msg = cd.check_subnet('192.168.1.0/24') + assert rc == 0 and v[0] == 4 + + def test_ipv4_subnet_list(self): + rc, v, msg = cd.check_subnet('192.168.1.0/24,10.90.90.0/24') + assert rc == 0 and not msg + + def test_ipv4_subnet_list_with_spaces(self): + rc, v, msg = cd.check_subnet('192.168.1.0/24, 10.90.90.0/24 ') + assert rc == 0 and not msg + + def test_ipv4_subnet_badlist(self): + rc, v, msg = cd.check_subnet('192.168.1.0/24,192.168.1.1') + assert rc == 1 and msg + + def test_ipv4_subnet_mixed(self): + rc, v, msg = cd.check_subnet('192.168.100.0/24,fe80::/64') + assert rc == 0 and v == [4,6] + + def test_ipv6_subnet(self): + rc, v, msg = cd.check_subnet('fe80::/64') + assert rc == 0 and v[0] == 6 + + def test_subnet_mask_missing(self): + rc, v, msg = cd.check_subnet('192.168.1.58') + assert rc == 1 and msg + + def test_subnet_mask_junk(self): + rc, v, msg = cd.check_subnet('wah') + assert rc == 1 and msg -- 2.39.5