diff options
author | Petr Viktorin <pviktori@redhat.com> | 2013-05-28 13:31:37 +0200 |
---|---|---|
committer | Petr Viktorin <pviktori@redhat.com> | 2013-07-15 15:49:06 +0200 |
commit | 353f3c62c3dc95db471a2b23fcd90d6071542362 (patch) | |
tree | 00fd09352061194c964cd151b1480b6405b69a6d /ipatests/test_integration/base.py | |
parent | c577420e40a353f3038263bf8ef763f7c01f6f22 (diff) | |
download | freeipa-353f3c62c3dc95db471a2b23fcd90d6071542362.tar.gz freeipa-353f3c62c3dc95db471a2b23fcd90d6071542362.tar.xz freeipa-353f3c62c3dc95db471a2b23fcd90d6071542362.zip |
Add a framework for integration testing
Add methods to run commands and copy files to Host objects.
Adds a base class for integration tests which can currently install
and uninstall IPA in a "star" topology with per-test specified number
of hosts.
A simple test for user replication between two masters is provided.
Log files from the remote hosts can be marked for collection, but the
actual collection is left to a Nose plugin.
Part of the work for: https://fedorahosted.org/freeipa/ticket/3621
Diffstat (limited to 'ipatests/test_integration/base.py')
-rw-r--r-- | ipatests/test_integration/base.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/ipatests/test_integration/base.py b/ipatests/test_integration/base.py new file mode 100644 index 000000000..8e1b5bdca --- /dev/null +++ b/ipatests/test_integration/base.py @@ -0,0 +1,120 @@ +# Authors: +# Petr Viktorin <pviktori@redhat.com> +# +# Copyright (C) 2013 Red Hat +# see file 'COPYING' for use and warranty information +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +"""Base class for FreeIPA integration tests""" + +import os + +import nose + +from ipapython.ipa_log_manager import log_mgr +from ipatests.test_integration.config import get_global_config, env_to_script +from ipatests.test_integration import tasks +from ipatests.order_plugin import ordered + +log = log_mgr.get_logger(__name__) + + +@ordered +class IntegrationTest(object): + num_replicas = 0 + num_clients = 0 + topology = 'none' + + @classmethod + def setup_class(cls): + config = get_global_config() + if not config.domains: + raise nose.SkipTest('Integration testing not configured') + + cls.logs_to_collect = {} + + domain = config.domains[0] + cls.master = domain.master + if len(domain.replicas) < cls.num_replicas: + raise nose.SkipTest( + 'Not enough replicas available (have %s, need %s)' % + (len(domain.replicas), cls.num_replicas)) + if len(domain.clients) < cls.num_clients: + raise nose.SkipTest( + 'Not enough clients available (have %s, need %s)' % + (len(domain.clients), cls.num_clients)) + cls.replicas = domain.replicas[:cls.num_replicas] + cls.clients = domain.clients[:cls.num_clients] + for host in cls.get_all_hosts(): + cls.prepare_host(host) + + cls.install() + cls.kinit_all() + + @classmethod + def get_all_hosts(cls): + return [cls.master] + cls.replicas + cls.clients + + @classmethod + def prepare_host(cls, host): + 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) + host.put_file_contents(env_filename, env_to_script(host.to_env())) + + @classmethod + def install(cls): + if cls.topology == 'none': + return + elif cls.topology == 'star': + tasks.install_master(cls.master, collect_log=cls.collect_log) + for replica in cls.replicas: + tasks.install_replica(cls.master, replica, + collect_log=cls.collect_log) + else: + raise ValueError('Unknown topology %s' % cls.topology) + + @classmethod + def kinit_all(cls): + for host in cls.get_all_hosts(): + host.run_command(['kinit', 'admin'], + stdin_text=host.config.admin_password) + + @classmethod + def teardown_class(cls): + try: + cls.uninstall() + finally: + del cls.logs_to_collect + del cls.master + del cls.replicas + del cls.clients + + @classmethod + def uninstall(cls): + cls.master.run_command(['ipa-server-install', '--uninstall', '-U']) + for replica in cls.replicas: + replica.run_command(['ipa-server-install', '--uninstall', '-U']) + for client in cls.clients: + client.run_command(['ipa-client-install', '--uninstall', '-U']) + + @classmethod + def collect_log(cls, host, filename): + cls.log.info('Adding %s:%s to list of logs to collect' % + (host.hostname, filename)) + cls.logs_to_collect.setdefault(host, []).append(filename) + +IntegrationTest.log = log_mgr.get_logger(IntegrationTest()) |