1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00
samba-mirror/selftest/target/__init__.py
2012-03-04 18:02:07 +01:00

166 lines
4.4 KiB
Python

# target.py -- Targets
# Copyright (C) 2012 Jelmer Vernooij <jelmer@samba.org>
#
# 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; version 3
# of the License or (at your option) any later version of
# the License.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
"""Selftest target management."""
__all__ = ['Target', 'Environment', 'EnvironmentManager']
class EnvironmentDown(Exception):
"""Indicates an environment has gone down."""
def __init__(self, msg):
super(EnvironmentDown, self).__init__("environment went down: %s" % msg)
class UnsupportedEnvironment(Exception):
"""Indicates a particular environment is not supported."""
def __init__(self, target, envname):
super(UnsupportedEnvironment, self).__init__(
"Target %s does not support environment %s" % (target, envname))
class Target(object):
"""A target for Samba tests."""
def setup_env(self, name, prefix):
"""Setup an environment.
:param name: name of the environment
:param prefix: directory to create it in
"""
raise NotImplementedError(self.setup_env)
class Environment(object):
"""An environment for Samba tests.
Tests often need to run against a server with particular things set up,
a "environment". This environment is provided by the test target.
"""
def check(self):
"""Check if this environment is still up and running.
:return: Boolean indicating whether environment is still running
"""
raise NotImplementedError(self.check)
def get_log(self):
"""Retrieve the last log for this environment.
:return: String with log
"""
raise NotImplementedError(self.get_log)
def teardown(self):
"""Tear down an environment.
"""
raise NotImplementedError(self.teardown)
def get_vars(self):
"""Retrieve the environment variables for this environment.
:return: Dictionary with string -> string values
"""
raise NotImplementedError(self.get_vars)
class NoneEnvironment(Environment):
"""Empty environment.
"""
def check(self):
return True
def get_log(self):
return ""
def teardown(self):
return
def get_vars(self):
return {}
class NoneTarget(Target):
"""Target that can only provide the 'none' environment."""
name = "none"
def setup_env(self, envname, prefix):
raise UnsupportedEnvironment(self.name, envname)
class EnvironmentManager(object):
"""Manager of environments."""
def __init__(self, target):
self.target = target
self.running_envs = {}
def get_running_env(self, name):
envname = name.split(":")[0]
if envname == "none":
return NoneEnvironment()
return self.running_envs.get(envname)
def getlog_env(self, envname):
env = self.get_running_env(envname)
return env.get_log()
def check_env(self, envname):
"""Check if an environment is still up.
:param envname: Environment to check
"""
env = self.get_running_env(envname)
return env.check()
def teardown_env(self, envname):
"""Tear down an environment.
:param envname: Name of the environment
"""
env = self.get_running_env(envname)
env.teardown()
del self.running_envs[envname]
def teardown_all(self):
"""Teardown all environments."""
for env in self.running_envs.iterkeys():
self.teardown_env(env)
def setup_env(self, envname, prefix):
running_env = self.get_running_env(envname)
if running_env is not None:
if not running_env.check():
raise EnvironmentDown(running_env.get_log())
return running_env
env = self.target.setup_env(envname, prefix)
if env is None:
return None
self.running_envs[envname] = env
return env