more flexible tools to release the resources attached to a given test
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 14 Apr 2010 10:13:41 +0000 (10:13 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Wed, 14 Apr 2010 10:13:41 +0000 (10:13 +0000)
system/LocalTestResources.sample.inria
system/TestPlc.py
system/TestResources.py
system/Trackers.py

index 630f299..a20f94f 100644 (file)
@@ -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
index 9f4799e..0f169bd 100644 (file)
@@ -84,7 +84,7 @@ SEP='<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"
index 40364e4..663977d 100644 (file)
@@ -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")
index 17b5c16..29cff12 100644 (file)
@@ -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))