diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index 5ef7603dbec..38b799e8f81 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -4368,6 +4368,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)') @@ -4466,7 +4467,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}`' @@ -4489,18 +4494,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 a21e2e15421..4a1861b6b9a 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