From f970ec9bad428eef1d3c56e3175e0dfa6850d28c Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 14 Apr 2010 10:13:41 +0000 Subject: [PATCH] more flexible tools to release the resources attached to a given test --- system/LocalTestResources.sample.inria | 13 ++++- system/TestPlc.py | 31 ++++++++---- system/TestResources.py | 66 ++++++++++++++------------ system/Trackers.py | 27 +++++++++-- 4 files changed, 93 insertions(+), 44 deletions(-) diff --git a/system/LocalTestResources.sample.inria b/system/LocalTestResources.sample.inria index 630f299..a20f94f 100644 --- a/system/LocalTestResources.sample.inria +++ b/system/LocalTestResources.sample.inria @@ -29,9 +29,18 @@ class OnelabTestResources (TestResources): '02:34:56:00:00:%02d'%i) for i in range(1,8) ] # 32bits : qemu32-[1-5] + 64bits : qemu64-[1-3] + # removing qemu64-3 until it gets on the right IP segment again def qemus_ip_pool (self): - return [ ( 'qemu64-%d.pl.sophia.inria.fr'%i, None, None) for i in range(1,4) ] + \ - [ ( 'qemu32-%d.pl.sophia.inria.fr'%i, None, None) for i in range(1,6) ] + return [ + ('qemu64-1.pl.sophia.inria.fr', None, None), + ('qemu64-2.pl.sophia.inria.fr', None, None), +# ('qemu64-3.pl.sophia.inria.fr', None, None), + ('qemu32-1.pl.sophia.inria.fr', None, None), + ('qemu32-2.pl.sophia.inria.fr', None, None), + ('qemu32-3.pl.sophia.inria.fr', None, None), + ('qemu32-4.pl.sophia.inria.fr', None, None), + ('qemu32-5.pl.sophia.inria.fr', None, None), + ] def max_qemus (self): return len(self.qemus_ip_pool())-2 diff --git a/system/TestPlc.py b/system/TestPlc.py index 9f4799e..0f169bd 100644 --- a/system/TestPlc.py +++ b/system/TestPlc.py @@ -84,7 +84,7 @@ SEP='' class TestPlc: default_steps = [ - 'display', 'local_pre', SEP, + 'display', 'resources_pre', SEP, 'delete_vs','create_vs','install', 'configure', 'start', SEP, 'fetch_keys', 'store_keys', 'clear_known_hosts', SEP, 'initscripts', 'sites', 'nodes', 'slices', 'nodegroups', SEP, @@ -100,10 +100,10 @@ class TestPlc: # 'setup_sfa', 'add_sfa', 'update_sfa', 'view_sfa', SEP, 'check_slice_sfa', 'delete_sfa', 'stop_sfa', SEP, 'check_tcp', 'check_hooks', SEP, - 'force_gather_logs', 'force_local_post', + 'force_gather_logs', 'force_resources_post', ] other_steps = [ - 'show_boxes', 'local_list','local_cleanup',SEP, + 'show_boxes', 'resources_list','resources_release','resources_release_plc','resources_release_qemu',SEP, 'stop', 'vs_start', SEP, 'clean_initscripts', 'clean_nodegroups','clean_all_sites', SEP, 'clean_sites', 'clean_nodes', 'clean_slices', 'clean_keys', SEP, @@ -313,8 +313,10 @@ class TestPlc: return True # entry point + always_display_keys=['PLC_WWW_HOST','nodes','sites',] def display_pass (self,passno): for (key,val) in self.plc_spec.iteritems(): + if not self.options.verbose and key not in TestPlc.always_display_keys: continue if passno == 2: if key == 'sites': for site in val: @@ -337,6 +339,7 @@ class TestPlc: def display_site_spec (self,site): print '+ ======== site',site['site_fields']['name'] for (k,v) in site.iteritems(): + if not self.options.verbose and k not in TestPlc.always_display_keys: continue if k=='nodes': if v: print '+ ','nodes : ', @@ -411,25 +414,35 @@ class TestPlc: print '+\tqemu box %s'%node_spec['host_box'] print '+\thostname=%s'%node_spec['node_fields']['hostname'] - def local_pre (self): + def resources_pre (self): "run site-dependant pre-test script as defined in LocalTestResources" from LocalTestResources import local_resources return local_resources.step_pre(self) - def local_post (self): + def resources_post (self): "run site-dependant post-test script as defined in LocalTestResources" from LocalTestResources import local_resources return local_resources.step_post(self) - def local_list (self): + def resources_list (self): "run site-dependant list script as defined in LocalTestResources" from LocalTestResources import local_resources return local_resources.step_list(self) - def local_cleanup (self): - "run site-dependant cleanup script as defined in LocalTestResources" + def resources_release (self): + "run site-dependant release script as defined in LocalTestResources" from LocalTestResources import local_resources - return local_resources.step_cleanup(self) + return local_resources.step_release(self) + + def resources_release_plc (self): + "run site-dependant release script as defined in LocalTestResources" + from LocalTestResources import local_resources + return local_resources.step_release_plc(self) + + def resources_release_qemu (self): + "run site-dependant release script as defined in LocalTestResources" + from LocalTestResources import local_resources + return local_resources.step_release_qemu(self) def delete_vs(self): "vserver delete the test myplc" diff --git a/system/TestResources.py b/system/TestResources.py index 40364e4..663977d 100644 --- a/system/TestResources.py +++ b/system/TestResources.py @@ -146,71 +146,77 @@ class TestResources: # as a plc step this should return a boolean def step_pre (self,plc): - return self.trqemu_record (plc) and self.trqemu_free(plc) \ - and self.trplc_record (plc) and self.trplc_free(plc) + return self.trqemu_record (plc) and self.trqemu_make_space(plc) \ + and self.trplc_record (plc) and self.trplc_make_space(plc) def step_post (self,plc): return True - def step_cleanup (self,plc): - return self.trqemu_cleanup(plc) and self.trplc_cleanup(plc) + def step_release (self,plc): + return self.trqemu_release(plc) and self.trplc_release(plc) + + def step_release_plc (self,plc): + return self.trplc_release(plc) + + def step_release_qemu (self,plc): + return self.trqemu_release(plc) def step_list (self,plc): return self.trqemu_list(plc) and self.trplc_list(plc) #################### - def trqemu_record (self,plc): - tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1) - for site_spec in plc.plc_spec['sites']: - for node_spec in site_spec['nodes']: - tracker.record(node_spec['host_box'],plc.options.buildname,node_spec['node_fields']['hostname']) + def trplc_record (self,plc): + tracker = TrackerPlc(plc.options,instances=self.max_plcs()) + tracker.record(plc.test_ssh.hostname,plc.vservername) tracker.store() return True - def trqemu_free (self,plc): - tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1) - for site_spec in plc.plc_spec['sites']: - for node_spec in site_spec['nodes']: - tracker.free() + def trplc_release (self,plc): + tracker = TrackerPlc(plc.options,instances=self.max_plcs()) + tracker.release(plc.test_ssh.hostname,plc.vservername) tracker.store() return True - ### - def trplc_record (self,plc): + def trplc_make_space (self,plc): tracker = TrackerPlc(plc.options,instances=self.max_plcs()) - tracker.record(plc.test_ssh.hostname,plc.vservername) + tracker.make_space() tracker.store() return True - def trplc_free (self,plc): - tracker = TrackerPlc(plc.options,instances=self.max_plcs()) - tracker.free() - tracker.store() + def trplc_list (self,plc): + TrackerPlc(plc.options,instances=self.max_plcs()).list() return True ### - def trqemu_cleanup (self,plc): + def trqemu_record (self,plc): tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1) for site_spec in plc.plc_spec['sites']: for node_spec in site_spec['nodes']: - tracker.cleanup() + tracker.record(node_spec['host_box'],plc.options.buildname,node_spec['node_fields']['hostname']) tracker.store() return True - def trplc_cleanup (self,plc): - tracker = TrackerPlc(plc.options,instances=self.max_plcs()) - tracker.cleanup() + def trqemu_release (self,plc): + tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1) + for site_spec in plc.plc_spec['sites']: + for node_spec in site_spec['nodes']: + tracker.release(node_spec['host_box'],plc.options.buildname,node_spec['node_fields']['hostname']) tracker.store() return True - def trqemu_list (self,plc): - TrackerQemu(plc.options,instances=self.max_qemus()-1).list() + def trqemu_make_space (self,plc): + tracker=TrackerQemu(plc.options,instances=self.max_qemus()-1) + for site_spec in plc.plc_spec['sites']: + for node_spec in site_spec['nodes']: + tracker.make_space() + tracker.store() return True - def trplc_list (self,plc): - TrackerPlc(plc.options,instances=self.max_plcs()).list() + def trqemu_list (self,plc): + TrackerQemu(plc.options,instances=self.max_qemus()-1).list() return True + ### def localize_rspec (self,plcs,options): utils.header ("Localize SFA Slice RSpec") diff --git a/system/Trackers.py b/system/Trackers.py index 17b5c16..29cff12 100644 --- a/system/Trackers.py +++ b/system/Trackers.py @@ -53,18 +53,33 @@ class Tracker: self.tracks.append( track ) print "Recorded %s in tracker %s"%(track,self.filename) + # this stops the instances currently attached with this test session and release tracker + def release (self,track): + for already in self.tracks: + if already==track: + if self.options.dry_run: + print 'dry_run: Tracker.release - skipping %s'%(track) + return + self.tracks.remove(track) + print "Releasing %s in tracker %s"%(track,self.filename) + command = self.stop_command (track) + utils.header("Trackers.make_space track : %s"%command) + utils.system(command) + print '%s was not found in %s'%(track,self.filename) + return + # this actually stops the old instances, so that the total fits in the number of instances - def free (self): + def make_space (self): # number of instances to stop how_many=len(self.tracks)-self.instances # nothing todo until we have more than keep_vservers in the tracker if how_many <= 0: - print 'Tracker.free : limit %d not reached'%self.instances + print 'Tracker.make_space : limit %d not reached'%self.instances return to_stop = self.tracks[:how_many] for track in to_stop: command = self.stop_command (track) - utils.header("Trackers.free track : %s"%command) + utils.header("Trackers.make_space track : %s"%command) utils.system(command) if not self.options.dry_run: self.tracks = self.tracks[how_many:] @@ -92,6 +107,9 @@ class TrackerPlc (Tracker): def record (self, hostname, vservername): Tracker.record (self,"%s@%s"%(hostname,vservername)) + def release (self, hostname, vservername): + Tracker.release (self,"%s@%s"%(hostname,vservername)) + def stop_command (self, track): (hostname,vservername) = track.split('@') return TestSsh(hostname).actual_command("vserver --silent %s stop"%vservername) @@ -117,6 +135,9 @@ class TrackerQemu (Tracker): def record (self, hostname, buildname, nodename): Tracker.record (self,"%s@%s@%s"%(hostname,buildname,nodename)) + def release (self, hostname, buildname, nodename): + Tracker.release (self,"%s@%s@%s"%(hostname,buildname,nodename)) + def stop_command (self, track): (hostname,buildname,nodename) = track.split('@') return TestSsh(hostname).actual_command("%s/qemu-%s/qemu-kill-node this"%(buildname,nodename)) -- 2.47.0