[Openais] [PATCH 2/4] CTS: fix issues with new pacemaker cts

Steven Dake sdake at redhat.com
Wed Mar 24 14:05:35 PDT 2010


good for merge

On Thu, 2010-03-25 at 07:38 +1100, Angus Salkeld wrote:
> Signed-off-by: Angus Salkeld <asalkeld at redhat.com>
> ---
>  cts/agents/mem_leak_test.sh |   13 +----
>  cts/corolab.py              |  126 +++++++++++++++++++++++-------------------
>  cts/corosync.py             |   29 +++++++---
>  cts/corotests.py            |   16 +++---
>  4 files changed, 98 insertions(+), 86 deletions(-)
> 
> diff --git a/cts/agents/mem_leak_test.sh b/cts/agents/mem_leak_test.sh
> index 1a0f37f..1bdb2b0 100755
> --- a/cts/agents/mem_leak_test.sh
> +++ b/cts/agents/mem_leak_test.sh
> @@ -57,16 +57,6 @@ _object_test_()
>  }
>  
>  #
> -# load and unload a service a bunch of times
> -#
> -_service_test_()
> -{
> -  echo _service_test_
> -
> -  exit 0
> -}
> -
> -#
>  # run the corosync tools to cause IPC sessions to created/destroyed
>  #
>  _session_test_()
> @@ -88,7 +78,7 @@ _session_test_()
>  # Note that we use `"$@"' to let each command-line parameter expand to a 
>  # separate word. The quotes around `$@' are essential!
>  # We need TEMP as the `eval set --' would nuke the return value of getopt.
> -TEMP=`getopt -o u123 --long help,object,session,service \
> +TEMP=`getopt -o u12 --long help,object,session \
>       -n '$0' -- "$@"`
>  
>  if [ $? != 0 ] ; then echo "Incorrect arguments..." >&2 ; _usage_ ; exit 1 ; fi
> @@ -101,7 +91,6 @@ while true ; do
>                  -u|--help) _usage_ ;;
>                  -1|--object) _object_test_ ;;
>                  -2|--session) _session_test_ ;;
> -                -3|--service) _service_test_ ;;
>                  --) shift ; break ;;
>                  *) echo "Internal error!" ; exit 1 ;;
>          esac
> diff --git a/cts/corolab.py b/cts/corolab.py
> index 4efb4ce..83547de 100755
> --- a/cts/corolab.py
> +++ b/cts/corolab.py
> @@ -40,8 +40,8 @@ Copyright (c) 2010 Red Hat, Inc.
>  
>  import sys
>  from cts.CTSaudits import AuditList
> -from cts.CTS import Scenario, InitClusterManager
> -from corotests import CoroTestList, AllTests
> +from cts.CTSscenarios import *
> +from corotests import CoroTestList
>  from corosync import *
>  
> 
> @@ -93,12 +93,53 @@ def usage(arg):
>      print "\t [--set option=value]"
>      sys.exit(1)
>  
> +class CoroLabEnvironment(CtsLab):
> +
> +    def __init__(self):
> +        CtsLab.__init__(self)
> +
> +        #  Get a random seed for the random number generator.
> +        self["DoStonith"] = 0
> +        self["DoStandby"] = 0
> +        self["DoFencing"] = 0
> +        self["XmitLoss"] = "0.0"
> +        self["RecvLoss"] = "0.0"
> +        self["IPBase"] = "127.0.0.10"
> +        self["ClobberCIB"] = 0
> +        self["CIBfilename"] = None
> +        self["CIBResource"] = 0
> +        self["DoBSC"]    = 0
> +        self["use_logd"] = 0
> +        self["oprofile"] = []
> +        self["warn-inactive"] = 0
> +        self["ListTests"] = 0
> +        self["benchmark"] = 0
> +        self["logrestartcmd"] = "/etc/init.d/rsyslog restart 2>&1 > /dev/null"
> +        self["Schema"] = "corosync 1.2"
> +        self["Stack"] = "corosync (flatiron)"
> +        self['CMclass'] = corosync_flatiron
> +        self["stonith-type"] = "external/ssh"
> +        self["stonith-params"] = "hostlist=all,livedangerously=yes"
> +        self["at-boot"] = 0  # Does the cluster software start automatically when the node boot 
> +        self["logger"] = ([StdErrLog(self)])
> +        self["loop-minutes"] = 60
> +        self["valgrind-prefix"] = None
> +        self["valgrind-procs"] = "corosync"
> +        self["valgrind-opts"] = """--leak-check=full --show-reachable=yes --trace-children=no --num-callers=25 --gen-suppressions=all --suppressions="""+CTSvars.CTS_home+"""/cts.supp"""
> +
> +        self["experimental-tests"] = 0
> +        self["valgrind-tests"] = 0
> +        self["unsafe-tests"] = 0
> +        self["loop-tests"] = 0
> +        self["all-once"] = 1
> +        self["LogWatcher"] = "remote"
> +        self["SyslogFacility"] = DefaultFacility
>      
>  #
>  # Main entry into the test system.
>  #
>  if __name__ == '__main__': 
> -    Environment = CtsLab()
> +    Environment = CoroLabEnvironment()
>  
>      NumIter = 0
>      Version = 1
> @@ -209,12 +250,6 @@ if __name__ == '__main__':
>             except ValueError:
>                 usage(args[i])
>  
> -    Environment["remote_logwatch"]  = True
> -    Environment["SyslogFacility"] = DefaultFacility
> -    Environment["loop-minutes"] = int(Environment["loop-minutes"])
> -    Environment["Stack"]    = "corosync (flatiron)"
> -    Environment['CMclass']  = corosync_flatiron
> -    Environment["use_logd"] = 0
>      if Environment["OutputFile"]:
>          Environment["logger"].append(FileLog(Environment, Environment["OutputFile"]))
>  
> @@ -233,74 +268,51 @@ if __name__ == '__main__':
>  
>      # Create the Cluster Manager object
>      cm = Environment['CMclass'](Environment)
> -
>      Audits = AuditList(cm)
> -    Tests = []
>          
> -    # Your basic start up the world type of test scenario...
> -
> -    # Scenario selection
> -    scenario = Scenario(
> -        [ InitClusterManager(Environment), TestAgentComponent(Environment)])
> -
> -
>      if Environment["ListTests"] == 1 :
>          Tests = CoroTestList(cm, Audits)
> -        cm.log("Total %d tests"%len(Tests))
> +        Environment.log("Total %d tests"%len(Tests))
>          for test in Tests :
> -            cm.log(str(test.name));
> +            Environment.log(str(test.name));
>          sys.exit(0)
>  
>      if TruncateLog:
> -        cm.log("Truncating %s" % LogFile)
> +        Environment.log("Truncating %s" % LogFile)
>          lf = open(LogFile, "w");
>          if lf != None:
>              lf.truncate(0)
>              lf.close()
>  
> -    keys = []
> -    for key in Environment.keys():
> -        keys.append(key)
> -
> -    keys.sort()
> -    for key in keys:
> -        cm.debug("Environment["+key+"]:\t"+str(Environment[key]))
> -
> -    cm.log(">>>>>>>>>>>>>>>> BEGINNING " + repr(NumIter) + " TESTS ")
> -    cm.log("System log files: %s" % Environment["LogFileName"])
> -    cm.ns.WaitForAllNodesToComeUp(Environment["nodes"])
> -    cm.log("Cluster nodes: ")
> -    for node in Environment["nodes"]:
> -        cm.log("    * %s" % (node))
> -
>      if TestCase != None:
>          for test in CoroTestList(cm, Audits):
>              if test.name == TestCase:
>                  Tests.append(test)
>          if Tests == []:
>              usage("--choose: No applicable/valid tests chosen")        
> +
>      else:
>          Tests = CoroTestList(cm, Audits)
>      
> -    if Environment["benchmark"]:
> -        Environment.ScenarioTests = BenchTests(scenario, cm, Tests, Audits)
> -    elif Environment["all-once"] or NumIter == 0:
> -        Environment.ScenarioTests = AllTests(scenario, cm, Tests, Audits)
> -    else:
> -        Environment.ScenarioTests = RandomTests(scenario, cm, Tests, Audits)
> -
> -    try :
> -        overall, detailed = Environment.ScenarioTests.run(NumIter)
> -    except :
> -        cm.Env.log("Exception by %s" % sys.exc_info()[0])
> -        for logmethod in Environment["logger"]:
> -          traceback.print_exc(50, logmethod)
> -        
> -    Environment.ScenarioTests.summarize()
> -    if Environment.ScenarioTests.Stats["failure"] > 0:
> -        sys.exit(Environment.ScenarioTests.Stats["failure"])
> +    # Scenario selection
> +    if Environment["DoBSC"]:
> +        scenario = RandomTests(cm, [ BasicSanityCheck(Environment) ], Audits, Tests)
>  
> -    elif Environment.ScenarioTests.Stats["success"] != NumIter:
> -        cm.Env.log("No failure count but success != requested iterations")
> -        sys.exit(1)
> -        
> +    elif Environment["all-once"] or NumIter == 0: 
> +        NumIter = len(Tests)
> +        scenario = AllOnce(
> +            cm, [ InitClusterManager(Environment), TestAgentComponent(Environment), PacketLoss(Environment) ], Audits, Tests)
> +    else:
> +        scenario = RandomTests(
> +            cm, [ InitClusterManager(Environment), TestAgentComponent(Environment), PacketLoss(Environment) ], Audits, Tests)
> +
> +    Environment.log(">>>>>>>>>>>>>>>> BEGINNING " + repr(NumIter) + " TESTS ")
> +    Environment.log("Stack:            %s" % Environment["Stack"])
> +    Environment.log("Schema:           %s" % Environment["Schema"])
> +    Environment.log("Scenario:         %s" % scenario.__doc__)
> +    Environment.log("Random Seed:      %s" % Environment["RandSeed"])
> +    Environment.log("System log files: %s" % Environment["LogFileName"])
> +
> +    Environment.dump()
> +    rc = Environment.run(scenario, NumIter)
> +    sys.exit(rc)
> diff --git a/cts/corosync.py b/cts/corosync.py
> index d6c808c..9455a36 100644
> --- a/cts/corosync.py
> +++ b/cts/corosync.py
> @@ -44,7 +44,7 @@ import string
>  
>  import augeas
>  from cts.CTS import ClusterManager
> -from cts.CTS import ScenarioComponent
> +from cts.CTSscenarios import ScenarioComponent
>  from cts.CTS import RemoteExec
>  from cts.CTSvars import CTSvars
>  
> @@ -222,12 +222,11 @@ class corosync_flatiron(ClusterManager):
>              self.agent[node].stop()
>          return ClusterManager.StopaCM(self, node)
>  
> -
> -    def StataCM(self, node):
> -
> -        '''Report the status of corosync on a given node'''
> -
> -        out=self.rsh(node, self["StatusCmd"], 1)
> +    def test_node_CM(self, node):
> +        # 2 - up and stable
> +        # 1 - unstable
> +        # 0 - down
> +        out = self.rsh(node, self["StatusCmd"], 1)
>          is_stopped = string.find(out, 'stopped')
>          is_dead = string.find(out, 'dead')
>  
> @@ -235,6 +234,7 @@ class corosync_flatiron(ClusterManager):
>  
>          try:
>              if ret:
> +                ret = 2
>                  if self.ShouldBeStatus[node] == "down":
>                      self.log(
>                      "Node status for %s is %s but we think it should be %s"
> @@ -246,15 +246,26 @@ class corosync_flatiron(ClusterManager):
>                      %        (node, "down", self.ShouldBeStatus[node]))
>          except KeyError:        pass
>  
> -        if ret:        self.ShouldBeStatus[node]="up"
> -        else:        self.ShouldBeStatus[node]="down"
> +        if ret:        self.ShouldBeStatus[node] = "up"
> +        else:        self.ShouldBeStatus[node] = "down"
>          return ret
>  
> +    def StataCM(self, node):
> +
> +        '''Report the status of corosync on a given node'''
> +        if self.test_node_CM(node) > 0:
> +            return 1
> +        else:
> +            return None
>  
>      def RereadCM(self, node):
>          self.log('reloading corosync on : ' + node)
>          return ClusterManager.RereadCM(self, node)
>  
> +    def find_partitions(self):
> +        ccm_partitions = []
> +        return ccm_partitions
> +
>      def prepare(self):
>          '''Finish the Initialization process. Prepare to test...'''
>  
> diff --git a/cts/corotests.py b/cts/corotests.py
> index 92ea570..fb28fc5 100644
> --- a/cts/corotests.py
> +++ b/cts/corotests.py
> @@ -189,6 +189,7 @@ class CpgCfgChgOnExecCrash(CpgConfigChangeBase):
>          self.CM.log("sending SIGSEGV to corosync on " + self.wobbly)
>          self.CM.rsh(self.wobbly, "killall -9 corosync")
>          self.CM.rsh(self.wobbly, "rm -f /var/run/corosync.pid")
> +        self.CM.ShouldBeStatus[self.wobbly] = "down"
>  
>      def __call__(self, node):
>          self.incr("calls")
> @@ -452,6 +453,13 @@ def CoroTestList(cm, audits):
>      result = []
>      configs = []
>      empty = {}
> +
> +    for testclass in AllTestClasses:
> +        bound_test = testclass(cm)
> +        if bound_test.is_applicable():
> +            bound_test.Audits = audits
> +            result.append(bound_test)
> +
>      configs.append(empty)
>  
>      a = {}
> @@ -495,13 +503,5 @@ def CoroTestList(cm, audits):
>                  result.append(bound_test)
>          num = num + 1
>  
> -
> -
> -    for testclass in AllTestClasses:
> -        bound_test = testclass(cm)
> -        if bound_test.is_applicable():
> -            bound_test.Audits = audits
> -            result.append(bound_test)
> -
>      return result
>  



More information about the Openais mailing list