2012-03-04 05:18:27 +04:00
# 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 )
2012-03-04 05:38:15 +04:00
2012-03-04 19:01:18 +04:00
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 ) )
2012-03-04 05:18:27 +04:00
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 )
2012-03-04 05:38:15 +04:00
def get_vars ( self ) :
""" Retrieve the environment variables for this environment.
: return : Dictionary with string - > string values
"""
raise NotImplementedError ( self . get_vars )
2012-03-04 05:18:27 +04:00
class NoneEnvironment ( Environment ) :
""" Empty environment.
"""
def check ( self ) :
return True
def get_log ( self ) :
return " "
def teardown ( self ) :
return
2012-03-04 05:38:15 +04:00
def get_vars ( self ) :
return { }
2012-03-04 05:18:27 +04:00
2012-03-04 19:01:18 +04:00
class NoneTarget ( Target ) :
""" Target that can only provide the ' none ' environment. """
name = " none "
def setup_env ( self , envname , prefix ) :
raise UnsupportedEnvironment ( self . name , envname )
2012-03-04 05:18:27 +04:00
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 ]
2012-03-04 05:28:06 +04:00
if envname == " none " :
return NoneEnvironment ( )
return self . running_envs . get ( envname )
2012-03-04 05:18:27 +04:00
def getlog_env ( self , envname ) :
env = self . get_running_env ( envname )
return env . get_log ( )
2012-03-04 05:28:06 +04:00
def check_env ( self , envname ) :
2012-03-04 05:18:27 +04:00
""" 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 ) :
2012-03-04 05:28:06 +04:00
""" Teardown all environments. """
2012-03-04 05:18:27 +04:00
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
2012-03-04 05:29:34 +04:00
self . running_envs [ envname ] = env
2012-03-04 05:18:27 +04:00
return env