reviewed list options parsing
[tests.git] / system / TestResources.py
index c7b343c..bc928ac 100644 (file)
@@ -1,15 +1,15 @@
+# Thierry Parmentelat <thierry.parmentelat@inria.fr>
+# Copyright (C) 2010 INRIA 
 #
-# $Id$
-#
-
 import sys
+import traceback
 
 import utils
 from TestMapper import TestMapper
 from TestPool import TestPoolQemu, TestPoolIP
 from Trackers import TrackerPlc, TrackerQemu
 
-class TestResources ():
+class TestResources:
 
     # need more specialization, see an example in OnelabTestResources
 
@@ -17,18 +17,24 @@ class TestResources ():
     def localize (self,plcs,options):
         try:
             plcs = self.localize_qemus(plcs,options)
-        except:
-            print 'Could not localize qemus - exiting'
+        except Exception, e:
+            print '* Could not localize qemus','--',e,'--','exiting'
+            traceback.print_exc()
             sys.exit(1)
         try:
             plcs = self.localize_nodes(plcs,options)
-        except:
-            print 'Could not localize nodes - exiting'
+        except Exception,e:
+            print '* Could not localize nodes','--',e,'--','exiting'
             sys.exit(1)
         try:
             plcs = self.localize_plcs(plcs,options)
-        except:
-            print 'Could not localize plcs - exiting'
+        except Exception,e:
+            print '* Could not localize plcs','--',e,'--','exiting'
+            sys.exit(1)
+        try:
+            plcs = self.localize_rspec(plcs,options)
+        except Exception,e:
+            print '* Could not localize RSpec','--',e,'--','exiting'
             sys.exit(1)
         return plcs
 
@@ -49,7 +55,8 @@ class TestResources ():
                 ip_or_hostname=options.ips_qemu.pop()
                 (hostname,ip,unused)=qemu_pool.locate_entry(ip_or_hostname)
             else:
-                (hostname,ip,unused) = qemu_pool.next_free()
+                tracker=TrackerQemu(options,instances=self.max_qemus()-1)
+                (hostname,ip,unused) = qemu_pool.next_free(tracker.hostnames())
 
             node_map += [ ('node%d'%index, {'host_box':hostname},) ]
 
@@ -67,7 +74,7 @@ class TestResources ():
         
 
     def localize_nodes (self, plcs, options):
-        
+       
         ip_pool = TestPoolIP (self.nodes_ip_pool(),options)
         network_dict = self.network_dict()
 
@@ -78,10 +85,10 @@ class TestResources ():
         for nodename in all_nodenames:
             if options.ips_node:
                 ip_or_hostname=options.ips_node.pop()
-                print 'debug','in',ip_or_hostname,'out',ip_pool.locate_entry(ip_or_hostname)
                 (hostname,ip,mac)=ip_pool.locate_entry(ip_or_hostname)
             else:
-                (hostname,ip,mac) = ip_pool.next_free()
+                tracker=TrackerQemu(options,instances=self.max_qemus()-1)
+                (hostname,ip,mac) = ip_pool.next_free(tracker.nodenames())
             utils.header('Attaching node %s to %s (%s)'%(nodename,hostname,ip))
             node_dict= {'node_fields:hostname':hostname,
                         'interface_fields:ip':ip, 
@@ -99,8 +106,6 @@ class TestResources ():
 
     def localize_plcs (self,plcs,options):
         
-        utils.header ("Turning configuration into a vserver-based one for onelab")
-    
         ip_pool = TestPoolIP (self.plcs_ip_pool(),options)
     
         plc_counter=0
@@ -112,20 +117,29 @@ class TestResources ():
                     utils.header("Using user-provided %s %s for plc %s"%(
                             hostname,ip_or_hostname,plc['name']))
             else:
-                (hostname,ip,mac)=ip_pool.next_free()
+                tracker = TrackerPlc(options,instances=self.max_plcs())
+                (hostname,ip,mac)=ip_pool.next_free(tracker.plcnames())
                 if options.verbose:
                     utils.header("Using auto-allocated %s %s for plc %s"%(
                             hostname,ip,plc['name']))
     
             ### rewrite fields in plc
             # compute a helpful vserver name - remove domain in hostname
-            simplehostname=hostname.split('.')[0]
+            simplehostname = hostname.split('.')[0]
+            preferred_hostname = self.preferred_hostname()
             vservername = options.buildname
             if len(plcs) == 1 :
                 vservername = "%s-%s" % (vservername,simplehostname)
+                #ugly hack for "vuname: vc_set_vhi_name(): Arg list too long" errors
+                if len(vservername) > 38 and preferred_hostname is not None:
+                    vservername = "%s-%s" % (options.buildname,preferred_hostname)
             else:
                 plc_counter += 1
                 vservername = "%s-%d-%s" % (vservername,plc_counter,simplehostname)
+                #ugly hack for "vuname: vc_set_vhi_name(): Arg list too long" errors
+                if len(vservername) > 38 and preferred_hostname is not None:
+                    vservername = "%s-%d-%s" % (options.buildname,plc_counter,preferred_hostname)
+
             # apply
             plc['vservername']=vservername
             plc['vserverip']=ip
@@ -139,56 +153,89 @@ 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)
+        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 self.trplc_record (plc) and self.trplc_free(plc)
+        return True
+
+    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_cleanup (self,plc):
-        return self.trqemu_cleanup(plc) and self.trplc_cleanup(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):
+    def trplc_make_space (self,plc):
         tracker = TrackerPlc(plc.options,instances=self.max_plcs())
-        tracker.record(self.test_ssh.hostname,self.vservername)
+        tracker.make_space()
         tracker.store()
         return True
 
-    def trplc_free (self):
-        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_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 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")
+
+       for plc in plcs:
+           for site in plc['sites']:
+               for node in site['nodes']:
+                   plc['sfa']['sfa_slice_rspec']['part4'] = node['node_fields']['hostname']
+            plc['sfa']['SFA_REGISTRY_HOST'] = plc['PLC_DB_HOST']
+            plc['sfa']['SFA_AGGREGATE_HOST'] = plc['PLC_DB_HOST']
+            plc['sfa']['SFA_SM_HOST'] = plc['PLC_DB_HOST']
+            plc['sfa']['SFA_PLC_DB_HOST'] = plc['PLC_DB_HOST']
+           plc['sfa']['SFA_PLC_URL'] = 'https://' + plc['PLC_API_HOST'] + ':443/PLCAPI/' 
+       
+       return plcs