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 <flo@redhat.com>
This commit is contained in:
Sergey Orlov
2021-01-28 20:02:51 +01:00
parent 2e92d0836d
commit cd066ba887

View File

@@ -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):