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
This commit is contained in:
Petr Viktorin
2013-06-05 18:30:39 +02:00
parent d84e10347e
commit 846ae2b3f4
4 changed files with 135 additions and 9 deletions

View File

@@ -166,6 +166,7 @@ class BeakerLibPlugin(Plugin):
self.log_exception(err) self.log_exception(err)
self.run_beakerlib_command( self.run_beakerlib_command(
['rlFail', 'Test failed: unhandled exception']) ['rlFail', 'Test failed: unhandled exception'])
self.collect_logs(test.context)
def addFailure(self, test, err): def addFailure(self, test, err):
self.log_exception(err) self.log_exception(err)

View File

@@ -60,8 +60,12 @@ class IntegrationTest(object):
for host in cls.get_all_hosts(): for host in cls.get_all_hosts():
cls.prepare_host(host) cls.prepare_host(host)
cls.install() try:
cls.kinit_all() cls.install()
cls.kinit_all()
except:
cls.uninstall()
raise
@classmethod @classmethod
def get_all_hosts(cls): def get_all_hosts(cls):
@@ -69,7 +73,7 @@ class IntegrationTest(object):
@classmethod @classmethod
def prepare_host(cls, host): 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') env_filename = os.path.join(host.config.test_dir, 'env.sh')
cls.collect_log(host, env_filename) cls.collect_log(host, env_filename)
host.mkdir_recursive(host.config.test_dir) host.mkdir_recursive(host.config.test_dir)
@@ -104,14 +108,11 @@ class IntegrationTest(object):
@classmethod @classmethod
def uninstall(cls): def uninstall(cls):
cls.collect_log(cls.master, '/var/log/ipaserver-uninstall.log') tasks.uninstall_master(cls.master, collect_log=cls.collect_log)
cls.master.run_command(['ipa-server-install', '--uninstall', '-U'])
for replica in cls.replicas: for replica in cls.replicas:
cls.collect_log(replica, '/var/log/ipaserver-uninstall.log') tasks.uninstall_master(replica, collect_log=cls.collect_log)
replica.run_command(['ipa-server-install', '--uninstall', '-U'])
for client in cls.clients: for client in cls.clients:
cls.collect_log(replica, '/var/log/ipaclient-uninstall.log') tasks.uninstall_client(client, collect_log=cls.collect_log)
client.run_command(['ipa-client-install', '--uninstall', '-U'])
@classmethod @classmethod
def collect_log(cls, host, filename): def collect_log(cls, host, filename):

View File

@@ -23,6 +23,7 @@ import os
import socket import socket
import threading import threading
import subprocess import subprocess
import errno
import paramiko import paramiko
@@ -122,6 +123,7 @@ class Host(object):
self.index = index self.index = index
shortname, dot, ext_domain = hostname.partition('.') shortname, dot, ext_domain = hostname.partition('.')
self.shortname = shortname
self.hostname = shortname + '.' + self.domain.name self.hostname = shortname + '.' + self.domain.name
self.external_hostname = hostname self.external_hostname = hostname
@@ -279,3 +281,15 @@ class Host(object):
self.log.info('WRITE %s', filename) self.log.info('WRITE %s', filename)
with self.sftp.open(filename, 'w') as f: with self.sftp.open(filename, 'w') as f:
return f.write(contents) 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

View File

@@ -21,12 +21,100 @@
import os import os
import textwrap import textwrap
import re
from ipapython import ipautil
from ipapython.ipa_log_manager import log_mgr from ipapython.ipa_log_manager import log_mgr
log = log_mgr.get_logger(__name__) 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): def enable_replication_debugging(host):
log.info('Enable LDAP replication logging') log.info('Enable LDAP replication logging')
logging_ldif = textwrap.dedent(""" 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/errors' % inst)
collect_log(host, '/var/log/dirsrv/slapd-%s/access' % inst) collect_log(host, '/var/log/dirsrv/slapd-%s/access' % inst)
apply_common_fixes(host)
host.run_command(['ipa-server-install', '-U', host.run_command(['ipa-server-install', '-U',
'-r', host.domain.name, '-r', host.domain.name,
'-p', host.config.dirman_password, '-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-install.log')
collect_log(replica, '/var/log/ipareplica-conncheck.log') collect_log(replica, '/var/log/ipareplica-conncheck.log')
apply_common_fixes(replica)
master.run_command(['ipa-replica-prepare', master.run_command(['ipa-replica-prepare',
'-p', replica.config.dirman_password, '-p', replica.config.dirman_password,
'--ip-address', replica.ip, '--ip-address', replica.ip,
@@ -88,3 +180,21 @@ def connect_replica(master, replica=None):
else: else:
args = [master.hostname] args = [master.hostname]
replica.run_command(['ipa-replica-manage', 'connect'] + args) 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)