mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
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:
@@ -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)
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user