From 64f2a408ef5bc408c7c99a224c596dcf68037dd7 Mon Sep 17 00:00:00 2001 From: Sergey Orlov Date: Thu, 28 Jan 2021 20:02:51 +0100 Subject: [PATCH] ipatests: setup resolvers during replica and client installations Set IPA master as nameserver on replica and client machines during default installation. This will help to avoid manual configuration in test cases which require members of IPA domain to be resolvable. Related to https://pagure.io/freeipa/issue/8703 Reviewed-By: Florence Blanc-Renaud --- ipatests/pytest_ipa/integration/tasks.py | 70 ++++++++++++++++++------ 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/ipatests/pytest_ipa/integration/tasks.py b/ipatests/pytest_ipa/integration/tasks.py index 2fe78367f..865f6dc80 100755 --- a/ipatests/pytest_ipa/integration/tasks.py +++ b/ipatests/pytest_ipa/integration/tasks.py @@ -406,21 +406,19 @@ def master_authoritative_for_client_domain(master, client): return result.returncode == 0 -def config_host_resolvconf_with_master_data(master, host): - """ - Configure host /etc/resolv.conf to use master as DNS server - """ - content = ('search {domain}\nnameserver {master_ip}' - .format(domain=master.domain.name, master_ip=master.ip)) - host.put_file_contents(paths.RESOLV_CONF, content) - - def install_replica(master, replica, setup_ca=True, setup_dns=False, setup_kra=False, setup_adtrust=False, extra_args=(), domain_level=None, unattended=True, stdin_text=None, - raiseonerr=True, promote=True): + raiseonerr=True, promote=True, nameservers='master'): """ This task installs client and then promote it to the replica + + :param nameservers: nameservers to write in resolver config. Possible + values: + * "master" - use ip of `master` parameter + * None - do not setup resolver + * IP_ADDRESS or [IP_ADDRESS, ...] - use this address as resolver + """ replica_args = list(extra_args) # needed for client's ntp options if domain_level is None: @@ -451,12 +449,18 @@ def install_replica(master, replica, setup_ca=True, setup_dns=False, for ntp_arg in ntp_args: replica_args.remove(ntp_arg) - install_client(master, replica, extra_args=ntp_args) + install_client(master, replica, extra_args=ntp_args, + nameservers=nameservers) else: # for one step installation of replica we need authorized user # to enroll a replica and master server to contact args.extend(['--principal', replica.config.admin_name, '--server', master.hostname]) + replica.resolver.backup() + if nameservers is not None: + if nameservers == 'master': + nameservers = master.ip + replica.resolver.setup_resolver(nameservers, master.domain.name) if unattended: args.append('-U') @@ -499,7 +503,15 @@ def install_replica(master, replica, setup_ca=True, setup_dns=False, def install_client(master, client, extra_args=[], user=None, - password=None, unattended=True, stdin_text=None): + password=None, unattended=True, stdin_text=None, + nameservers='master'): + """ + :param nameservers: nameservers to write in resolver config. Possible + values: + * "master" - use ip of `master` parameter + * None - do not setup resolver + * IP_ADDRESS or [IP_ADDRESS, ...] - use this address as resolver + """ apply_common_fixes(client) allow_sync_ptr(master) # Now, for the situations where a client resides in a different subnet from @@ -509,6 +521,11 @@ def install_client(master, client, extra_args=[], user=None, if not error: master.run_command(["ipa", "dnszone-mod", zone, "--dynamic-update=TRUE"]) + if nameservers is not None: + client.resolver.backup() + if nameservers == 'master': + nameservers = master.ip + client.resolver.setup_resolver(nameservers, master.domain.name) if user is None: user = client.config.admin_name if password is None: @@ -1024,6 +1041,8 @@ def uninstall_master(host, ignore_topology_disconnect=True, "xargs rm -fv" % paths.SSSD_KEYTABS_DIR, raiseonerr=False) host.run_command("find /run/ipa -name 'krb5*' | xargs rm -fv", raiseonerr=False) + while host.resolver.has_backups(): + host.resolver.restore() if clean: unapply_fixes(host) @@ -1031,6 +1050,8 @@ def uninstall_master(host, ignore_topology_disconnect=True, def uninstall_client(host): host.run_command(['ipa-client-install', '--uninstall', '-U'], raiseonerr=False) + while host.resolver.has_backups(): + host.resolver.restore() unapply_fixes(host) @@ -1345,18 +1366,35 @@ def install_topo(topo, master, replicas, clients, domain_level=None, install_replica( parent, child, setup_ca=setup_replica_cas, - setup_kra=setup_replica_kras + setup_kra=setup_replica_kras, + nameservers=master.ip, ) installed.add(child) install_clients([master] + replicas, clients, clients_extra_args) -def install_clients(servers, clients, extra_args=()): - """Install IPA clients, distributing them among the given servers""" +def install_clients(servers, clients, extra_args=(), + nameservers='first'): + """Install IPA clients, distributing them among the given servers + + :param nameservers: nameservers to write in resolver config on clients. + Possible values: + * "first" - use ip of the first item in `servers` parameter + * "distribute" - use ip of master/replica which is used for client + installation + * None - do not setup resolver + * IP_ADDRESS or [IP_ADDRESS, ...] - use this address as resolver + """ izip = getattr(itertools, 'izip', zip) + client_nameservers = nameservers for server, client in izip(itertools.cycle(servers), clients): logger.info('Installing client %s on %s', server, client) - install_client(server, client, extra_args) + if nameservers == 'distribute': + client_nameservers = server.ip + if nameservers == 'first': + client_nameservers = servers[0].ip + install_client(server, client, extra_args, + nameservers=client_nameservers) def _entries_to_ldif(entries):