summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipatests/beakerlib_plugin.py1
-rw-r--r--ipatests/test_integration/base.py19
-rw-r--r--ipatests/test_integration/host.py14
-rw-r--r--ipatests/test_integration/tasks.py110
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)