From 846ae2b3f4807f2b1897811b9fe9978103c2451a Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 5 Jun 2013 18:30:39 +0200 Subject: tests: Configure/unconfigure remote hosts Set up the hostname, /etc/resolv.conf, and /etc/hosts on remote hosts in the test setup. Undo the changes in test teardown. Part of the work for https://fedorahosted.org/freeipa/ticket/3621 --- ipatests/beakerlib_plugin.py | 1 + ipatests/test_integration/base.py | 19 ++++--- ipatests/test_integration/host.py | 14 +++++ ipatests/test_integration/tasks.py | 110 +++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 9 deletions(-) diff --git a/ipatests/beakerlib_plugin.py b/ipatests/beakerlib_plugin.py index bd4f8465b..770fced49 100644 --- a/ipatests/beakerlib_plugin.py +++ b/ipatests/beakerlib_plugin.py @@ -166,6 +166,7 @@ class BeakerLibPlugin(Plugin): self.log_exception(err) self.run_beakerlib_command( ['rlFail', 'Test failed: unhandled exception']) + self.collect_logs(test.context) def addFailure(self, test, err): self.log_exception(err) diff --git a/ipatests/test_integration/base.py b/ipatests/test_integration/base.py index 131db89d8..934dce056 100644 --- a/ipatests/test_integration/base.py +++ b/ipatests/test_integration/base.py @@ -60,8 +60,12 @@ class IntegrationTest(object): for host in cls.get_all_hosts(): cls.prepare_host(host) - cls.install() - cls.kinit_all() + try: + cls.install() + cls.kinit_all() + except: + cls.uninstall() + raise @classmethod def get_all_hosts(cls): @@ -69,7 +73,7 @@ class IntegrationTest(object): @classmethod def prepare_host(cls, host): - log.info('Preparing host %s', host.hostname) + cls.log.info('Preparing host %s', host.hostname) env_filename = os.path.join(host.config.test_dir, 'env.sh') cls.collect_log(host, env_filename) host.mkdir_recursive(host.config.test_dir) @@ -104,14 +108,11 @@ class IntegrationTest(object): @classmethod def uninstall(cls): - cls.collect_log(cls.master, '/var/log/ipaserver-uninstall.log') - cls.master.run_command(['ipa-server-install', '--uninstall', '-U']) + tasks.uninstall_master(cls.master, collect_log=cls.collect_log) for replica in cls.replicas: - cls.collect_log(replica, '/var/log/ipaserver-uninstall.log') - replica.run_command(['ipa-server-install', '--uninstall', '-U']) + tasks.uninstall_master(replica, collect_log=cls.collect_log) for client in cls.clients: - cls.collect_log(replica, '/var/log/ipaclient-uninstall.log') - client.run_command(['ipa-client-install', '--uninstall', '-U']) + tasks.uninstall_client(client, collect_log=cls.collect_log) @classmethod def collect_log(cls, host, filename): diff --git a/ipatests/test_integration/host.py b/ipatests/test_integration/host.py index b4d736cd6..404e5eec8 100644 --- a/ipatests/test_integration/host.py +++ b/ipatests/test_integration/host.py @@ -23,6 +23,7 @@ import os import socket import threading import subprocess +import errno import paramiko @@ -122,6 +123,7 @@ class Host(object): self.index = index shortname, dot, ext_domain = hostname.partition('.') + self.shortname = shortname self.hostname = shortname + '.' + self.domain.name self.external_hostname = hostname @@ -279,3 +281,15 @@ class Host(object): self.log.info('WRITE %s', filename) with self.sftp.open(filename, 'w') as f: return f.write(contents) + + def file_exists(self, filename): + """Return true if the named remote file exists""" + self.log.info('STAT %s', filename) + try: + self.sftp.stat(filename) + except IOError, e: + if e.errno == errno.ENOENT: + return False + else: + raise + return True diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index d899ba789..5e4606276 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -21,12 +21,100 @@ import os import textwrap +import re +from ipapython import ipautil from ipapython.ipa_log_manager import log_mgr log = log_mgr.get_logger(__name__) +def apply_common_fixes(host): + fix_etc_hosts(host) + fix_hostname(host) + fix_resolv_conf(host) + + +def backup_file(host, filename): + if host.file_exists(filename): + backupname = os.path.join(host.config.test_dir, 'file_backup', + filename.lstrip('/')) + host.mkdir_recursive(os.path.dirname(backupname)) + host.run_command(['cp', '-af', filename, backupname]) + return True + else: + rmname = os.path.join(host.config.test_dir, 'file_remove') + host.run_command('echo %s >> %s' % ( + ipautil.shell_quote(filename), + ipautil.shell_quote(rmname))) + contents = host.get_file_contents(rmname) + host.mkdir_recursive(os.path.dirname(rmname)) + return False + + +def fix_etc_hosts(host): + backup_file(host, '/etc/hosts') + contents = host.get_file_contents('/etc/hosts') + # Remove existing mentions of the host's FQDN, short name, and IP + contents = re.sub('\s%s(\s|$)' % re.escape(host.hostname), ' ', contents, + flags=re.MULTILINE) + contents = re.sub('\s%s(\s|$)' % re.escape(host.shortname), ' ', contents, + flags=re.MULTILINE) + contents = re.sub('^%s.*' % re.escape(host.ip), '', contents, + flags=re.MULTILINE) + # Add the host's info again + contents += '\n%s %s %s\n' % (host.ip, host.hostname, host.shortname) + log.info('Writing the following to /etc/hosts:\n%s', contents) + host.put_file_contents('/etc/hosts', contents) + + +def fix_hostname(host): + backup_file(host, '/etc/hostname') + host.put_file_contents('/etc/hostname', host.hostname + '\n') + host.run_command(['hostname', host.hostname]) + + backupname = os.path.join(host.config.test_dir, 'backup_hostname') + host.run_command('hostname > %s' % ipautil.shell_quote(backupname)) + + +def fix_resolv_conf(host): + backup_file(host, '/etc/resolv.conf') + lines = host.get_file_contents('/etc/resolv.conf').splitlines() + lines = ['#' + l if l.startswith('nameserver') else l for l in lines] + for other_host in host.domain.hosts: + if other_host.role in ('master', 'replica'): + lines.append('nameserver %s' % other_host.ip) + contents = '\n'.join(lines) + log.info('Writing the following to /etc/resolv.conf:\n%s', contents) + host.put_file_contents('/etc/resolv.conf', contents) + + +def unapply_fixes(host): + restore_files(host) + restore_hostname(host) + + +def restore_files(host): + backupname = os.path.join(host.config.test_dir, 'file_backup') + rmname = os.path.join(host.config.test_dir, 'file_remove') + host.run_command('cp -arvf %s/* /' % ipautil.shell_quote(backupname), + raiseonerr=False) + host.run_command(['xargs', '-d', r'\n', '-a', rmname, 'rm', '-vf'], + raiseonerr=False) + host.run_command(['rm', '-rvf', backupname, rmname], raiseonerr=False) + + +def restore_hostname(host): + backupname = os.path.join(host.config.test_dir, 'backup_hostname') + try: + hostname = host.get_file_contents(backupname) + except IOError: + log.info('No hostname backed up on %s' % host.hostname) + else: + host.run_command(['hostname', hostname.strip()]) + host.run_command(['rm', backupname]) + + def enable_replication_debugging(host): log.info('Enable LDAP replication logging') logging_ldif = textwrap.dedent(""" @@ -49,6 +137,8 @@ def install_master(host, collect_log=None): collect_log(host, '/var/log/dirsrv/slapd-%s/errors' % inst) collect_log(host, '/var/log/dirsrv/slapd-%s/access' % inst) + apply_common_fixes(host) + host.run_command(['ipa-server-install', '-U', '-r', host.domain.name, '-p', host.config.dirman_password, @@ -64,6 +154,8 @@ def install_replica(master, replica, collect_log=None): collect_log(replica, '/var/log/ipareplica-install.log') collect_log(replica, '/var/log/ipareplica-conncheck.log') + apply_common_fixes(replica) + master.run_command(['ipa-replica-prepare', '-p', replica.config.dirman_password, '--ip-address', replica.ip, @@ -88,3 +180,21 @@ def connect_replica(master, replica=None): else: args = [master.hostname] replica.run_command(['ipa-replica-manage', 'connect'] + args) + + +def uninstall_master(host, collect_log=None): + if collect_log: + collect_log(host, '/var/log/ipaserver-uninstall.log') + + host.run_command(['ipa-server-install', '--uninstall', '-U'], + raiseonerr=False) + unapply_fixes(host) + + +def uninstall_client(host, collect_log=None): + if collect_log: + collect_log(host, '/var/log/ipaclient-uninstall.log') + + host.run_command(['ipa-client-install', '--uninstall', '-U'], + raiseonerr=False) + unapply_fixes(host) -- cgit