From: Thierry Parmentelat Date: Tue, 27 Aug 2013 12:48:58 +0000 (+0200) Subject: Merge branch 'master' into sfa-geni-v3 X-Git-Tag: tests-5.3-1~3 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=957bf73e13cfd2f74bcc8cda9ce832b7da06eacf;hp=88ce17543e3f87197e7d6fd792ea56d99b7d67c3;p=tests.git Merge branch 'master' into sfa-geni-v3 --- diff --git a/system/LocalSubstrate.inria.py b/system/LocalSubstrate.inria.py index a0946bb..a171588 100755 --- a/system/LocalSubstrate.inria.py +++ b/system/LocalSubstrate.inria.py @@ -31,8 +31,8 @@ class OnelabSubstrate (Substrate): # the lxc-capable box for PLCs def plc_lxc_boxes_spec (self): return [ - ('gotan', 20), # how many plcs max in this box - ('deathvegas', 20), + ('gotan', 10), # how many plcs max in this box + ('deathvegas', 10), ] # vplc01 to 40 diff --git a/system/Substrate.py b/system/Substrate.py index ff77940..56acf7e 100644 --- a/system/Substrate.py +++ b/system/Substrate.py @@ -59,6 +59,9 @@ import utils from TestSsh import TestSsh from TestMapper import TestMapper +# too painful to propagate this cleanly +verbose=None + def header (message,banner=True): if not message: return if banner: print "===============", @@ -261,7 +264,16 @@ class Box: self.test_ssh().run("shutdown -r now",message="Rebooting %s"%self.hostname, dry_run=options.dry_run) - def hostname_fedora (self): return "%s [%s]"%(self.hostname,self.fedora()) + def hostname_fedora (self,virt=None): + result = "%s {"%self.hostname + if virt: result += "%s-"%virt + result += "%s"%self.fedora() + # too painful to propagate this cleanly + global verbose + if verbose: + result += "-%s" % self.uname() + result += "}" + return result separator = "===composite===" @@ -516,7 +528,7 @@ class PlcBox (Box): for p in self.plc_instances: header (p.line(),banner=False) - +# we do not this at INRIA any more class PlcVsBox (PlcBox): def add_vserver (self,vservername,ctxid): @@ -528,7 +540,7 @@ class PlcVsBox (PlcBox): self.plc_instances.append(PlcVsInstance(self,vservername,ctxid)) def line(self): - msg="%s [max=%d,free=%d, VS-based] (%s)"%(self.hostname_fedora(), self.max_plcs,self.free_slots(),self.uname()) + msg="%s [max=%d,free=%d] (%s)"%(self.hostname_fedora(virt="vs"), self.max_plcs,self.free_slots(),self.uptime()) return msg def plc_instance_by_vservername (self, vservername): @@ -603,8 +615,10 @@ class PlcLxcBox (PlcBox): # a line describing the box def line(self): - return "%s [max=%d,free=%d, LXC-based] (%s)"%(self.hostname_fedora(), self.max_plcs,self.free_slots(), - self.uname()) + return "%s [max=%d,free=%d] (%s)"%(self.hostname_fedora(virt="lxc"), + self.max_plcs,self.free_slots(), + self.uptime(), + ) def plc_instance_by_lxcname (self, lxcname): for p in self.plc_instances: @@ -621,7 +635,6 @@ class PlcLxcBox (PlcBox): # sense is expected to fill self.plc_instances with PlcLxcInstance's # to describe the currently running VM's - # as well as to call self.get_uname() once def sense (self, options): print "xp", command="rsync lxc-driver.sh %s:/root"%self.hostname @@ -701,7 +714,7 @@ class QemuBox (Box): def line (self): return "%s [max=%d,free=%d] (%s) %s"%( - self.hostname_fedora(), self.max_qemus,self.free_slots(), + self.hostname_fedora(virt="qemu"), self.max_qemus,self.free_slots(), self.uptime(),self.driver()) def list(self, verbose=False): @@ -1317,6 +1330,8 @@ class Substrate: if self.options.qemus: boxes += self.qemu_boxes if self.options.all: boxes += self.all_boxes + global verbose + verbose=self.options.verbose # default scope is -b -p -q -t if not boxes: boxes = self.build_boxes + self.plc_boxes + self.qemu_boxes + [self.test_box] diff --git a/system/TestPlc.py b/system/TestPlc.py index cc1fe6f..1dcc585 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -64,6 +64,36 @@ def slice_mapper (method): actual.__doc__=TestSlice.__dict__[method.__name__].__doc__ return actual +# a variant that expects the TestSlice method to return a list of CompleterTasks that +# are then merged into a single Completer run to avoid wating for all the slices +# esp. useful when a test fails of course +# because we need to pass arguments we use a class instead.. +class slice_mapper__tasks (object): + # could not get this to work with named arguments + def __init__ (self,timeout_minutes,silent_minutes,period_seconds): + print "self",self + print "timeout_minutes,silent_minutes,period_seconds",timeout_minutes,silent_minutes,period_seconds + self.timeout=timedelta(minutes=timeout_minutes) + self.silent=timedelta(minutes=silent_minutes) + self.period=timedelta(seconds=period_seconds) + def __call__ (self, method): + decorator_self=self + # compute augmented method name + method_name = method.__name__ + "__tasks" + # locate in TestSlice + slice_method = TestSlice.__dict__[ method_name ] + def wrappee(self): + tasks=[] + for slice_spec in self.plc_spec['slices']: + site_spec = self.locate_site (slice_spec['sitename']) + test_site = TestSite(self,site_spec) + test_slice=TestSlice(self,test_site,slice_spec) + tasks += slice_method (test_slice, self.options) + return Completer (tasks).run (decorator_self.timeout, decorator_self.silent, decorator_self.period) + # restore the doc text from the TestSlice method even if a bit odd + wrappee.__doc__ = slice_method.__doc__ + return wrappee + def auth_sfa_mapper (method): def actual(self): overall=True @@ -1135,10 +1165,11 @@ class TestPlc: test_slice.create_slice() return True - @slice_mapper + @slice_mapper__tasks(20,10,15) def ssh_slice(self): pass - @slice_mapper + @slice_mapper__tasks(20,19,15) def ssh_slice_off (self): pass + @slice_mapper def ssh_slice_basics(self): pass diff --git a/system/TestSlice.py b/system/TestSlice.py index 1e53cac..f5d1e33 100644 --- a/system/TestSlice.py +++ b/system/TestSlice.py @@ -30,8 +30,11 @@ class CompleterTaskSshSlice (CompleterTask): if self.dry_run: return True if self.expected: return retcod==0 else: return retcod!=0 - def failure_message (self): - return "Could not ssh into slice %s @ %s"%(self.slicename,self.hostname) + def failure_message (self): + if self.expected: + return "Could not ssh into sliver %s@%s"%(self.slicename,self.hostname) + else: + return "Could still ssh into sliver%s@%s (that was expected to be down)"%(self.slicename,self.hostname) class TestSlice: @@ -140,23 +143,24 @@ class TestSlice: key_names += user_spec['key_names'] return self.test_plc.locate_private_key_from_key_names (key_names) - # trying to reach the slice through ssh - expected to answer - def ssh_slice (self, options, *args, **kwds): - "tries to ssh-enter the slice with the user key, to ensure slice creation" - return self.do_ssh_slice(options, expected=True, *args, **kwds) + # to be used through TestPlc.slice_mapper_tasks + # i.e. returns a list of CompleterTasks that are merged into the same Completer run + # to avoid waiting for as many slices as the Plc has + # also the __doc__ lines are used for the TestPlc methods, e.g. just 'ssh_slice' + def ssh_slice__tasks (self, options, *args, **kwds): + "tries to ssh-enter the slice with the user key, to check for slice creation" + return self.ssh_tasks(options, expected=True, *args, **kwds) # when we expect the slice is not reachable - def ssh_slice_off (self, options, *args, **kwds): + def ssh_slice_off__tasks (self, options, *args, **kwds): "tries to ssh-enter the slice with the user key, expecting it to be unreachable" - return self.do_ssh_slice(options, expected=False, *args, **kwds) + return self.ssh_tasks(options, expected=False, *args, **kwds) - def do_ssh_slice(self,options,expected=True, - timeout_minutes=20,silent_minutes=10,period_seconds=15,command=None): - "tries to enter a slice" - - timeout = timedelta(minutes=timeout_minutes) - graceout = timedelta(minutes=silent_minutes) - period = timedelta(seconds=period_seconds) + def ssh_tasks(self,options, expected=True, command=None): +# timeout_minutes=20,silent_minutes=10,period_seconds=15): +# timeout = timedelta(minutes=timeout_minutes) +# graceout = timedelta(minutes=silent_minutes) +# period = timedelta(seconds=period_seconds) if not command: command="echo hostname ; hostname; echo id; id; echo uname -a ; uname -a" # locate a key @@ -177,7 +181,8 @@ class TestSlice: (site_spec,node_spec) = self.test_plc.locate_node(nodename) tasks.append( CompleterTaskSshSlice(self.test_plc,node_spec['node_fields']['hostname'], slicename,private_key,command,expected,dry_run)) - return Completer (tasks).run (timeout, graceout, period) + return tasks +# return Completer (tasks).run (timeout, graceout, period) def ssh_slice_basics (self, options, *args, **kwds): "the slice is expected to be UP and we just check a few simple sanity commands, including 'ps' to check for /proc" diff --git a/tests.spec b/tests.spec index 9db0179..f6cea32 100644 --- a/tests.spec +++ b/tests.spec @@ -1,3 +1,3 @@ # for use by module-tools only %define version 5.2 -%define taglevel 5 +%define taglevel 7