X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2FSubstrate.py;h=932d579e2ea4608ce9ff3bea4323b24db858d79a;hb=4b6ed5c985b2353b989aee4de3bcbb4594ea40c6;hp=b8c622a515c7d67bf7eeb49212d9fb35a3f1614e;hpb=821b6ca28f9b8a56743302bc5468a0d658cec40e;p=tests.git diff --git a/system/Substrate.py b/system/Substrate.py index b8c622a..932d579 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===" @@ -286,21 +298,24 @@ class Box: else: probe_argv=self.test_ssh().actual_argv(composite_command) composite=self.backquote ( probe_argv, trash_err=True ) - if not composite: print "root@%s unreachable"%self.hostname self._hostname = self._uptime = self._uname = self._fedora = "** Unknown **" - try: - pieces = composite.split(Box.separator) - pieces = [ x.strip() for x in pieces ] - [self._hostname, self._uptime, self._uname, self._fedora] = pieces - # customize - self._uptime = ', '.join([ x.strip() for x in self._uptime.split(',')[2:]]) - self._fedora = self._fedora.replace("Fedora release ","f").split(" ")[0] - except: - import traceback - print 'BEG issue with pieces',pieces - traceback.print_exc() - print 'END issue with pieces',pieces - self._probed=self._hostname + if not composite: + print "root@%s unreachable"%self.hostname + self._probed='' + else: + try: + pieces = composite.split(Box.separator) + pieces = [ x.strip() for x in pieces ] + [self._hostname, self._uptime, self._uname, self._fedora] = pieces + # customize + self._uptime = ', '.join([ x.strip() for x in self._uptime.split(',')[2:]]) + self._fedora = self._fedora.replace("Fedora release ","f").split(" ")[0] + except: + import traceback + print 'BEG issue with pieces',pieces + traceback.print_exc() + print 'END issue with pieces',pieces + self._probed=self._hostname return self._probed # use argv=['bash','-c',"the command line"] @@ -387,6 +402,10 @@ class BuildBox (Box): if not options.soft: Box.reboot(self,options) else: + self.soft_reboot (options) + +class BuildVsBox (BuildBox): + def soft_reboot (self, options): command=['pkill','vbuild'] self.run_ssh(command,"Terminating vbuild processes",dry_run=options.dry_run) @@ -394,7 +413,7 @@ class BuildBox (Box): matcher=re.compile("\s*(?P[0-9]+).*-[bo]\s+(?P[^\s]+)(\s|\Z)") matcher_building_vm=re.compile("\s*(?P[0-9]+).*init-vserver.*\s+(?P[^\s]+)\s*\Z") def sense(self, options): - print 'bb', + print 'vb', pids=self.backquote_ssh(['pgrep','vbuild'],trash_err=True) if not pids: return command=['ps','-o','pid,command'] + [ pid for pid in pids.split("\n") if pid] @@ -415,6 +434,15 @@ class BuildBox (Box): header('BuildBox.sense: command %r returned line that failed to match'%command) header(">>%s<<"%line) +class BuildLxcBox (BuildBox): + def soft_reboot (self, options): + command=['pkill','lbuild'] + self.run_ssh(command,"Terminating vbuild processes",dry_run=options.dry_run) + + # inspect box and find currently running builds + def sense(self, options): + print 'xb (Substrate.BuildLxcBox.sense - NIY)', + ############################################################ class PlcInstance: def __init__ (self, plcbox): @@ -513,7 +541,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): @@ -525,7 +553,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): @@ -600,8 +628,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: @@ -618,7 +648,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 @@ -631,7 +660,8 @@ class PlcLxcBox (PlcBox): pid=lxc_line.split(";")[1] timestamp=lxc_line.split(";")[2] self.add_lxc(lxcname,pid) - timestamp=int(timestamp) + try: timestamp=int(timestamp) + except: timestamp=0 p=self.plc_instance_by_lxcname(lxcname) if not p: print 'WARNING zombie plc',self.hostname,lxcname @@ -697,7 +727,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): @@ -976,14 +1006,10 @@ class Substrate: self.options.reboot=False self.options.soft=False self.test_box = TestBox (self.test_box_spec()) - self.build_boxes = [ BuildBox(h) for h in self.build_boxes_spec() ] - # for compat with older LocalSubstrate - try: - self.plc_vs_boxes = [ PlcVsBox (h,m) for (h,m) in self.plc_vs_boxes_spec ()] - self.plc_lxc_boxes = [ PlcLxcBox (h,m) for (h,m) in self.plc_lxc_boxes_spec ()] - except: - self.plc_vs_boxes = [ PlcVsBox (h,m) for (h,m) in self.plc_boxes_spec ()] - self.plc_lxc_boxes = [ ] + self.build_vs_boxes = [ BuildVsBox(h) for h in self.build_vs_boxes_spec() ] + self.build_lxc_boxes = [ BuildLxcBox(h) for h in self.build_lxc_boxes_spec() ] + self.plc_vs_boxes = [ PlcVsBox (h,m) for (h,m) in self.plc_vs_boxes_spec ()] + self.plc_lxc_boxes = [ PlcLxcBox (h,m) for (h,m) in self.plc_lxc_boxes_spec ()] self.qemu_boxes = [ QemuBox (h,m) for (h,m) in self.qemu_boxes_spec ()] self._sensed=False @@ -994,6 +1020,7 @@ class Substrate: # which plc boxes are we interested in ? def rescope (self, plcs_on_vs, plcs_on_lxc): + self.build_boxes = self.build_vs_boxes + self.build_lxc_boxes self.plc_boxes=[] if plcs_on_vs: self.plc_boxes += self.plc_vs_boxes if plcs_on_lxc: self.plc_boxes += self.plc_lxc_boxes @@ -1313,6 +1340,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]