various fixes
[tests.git] / system / TestPlc.py
index 4694d1c..7671459 100644 (file)
@@ -14,19 +14,9 @@ from TestNode import TestNode
 from TestUser import TestUser
 from TestKey import TestKey
 from TestSlice import TestSlice
+from TestSliver import TestSliver
 from TestBox import TestBox
 
-# inserts a backslash before each occurence of the following chars
-# \ " ' < > & | ; ( ) $ * ~ 
-def backslash_shell_specials (command):
-    result=''
-    for char in command:
-        if char in "\\\"'<>&|;()$*~":
-            result +='\\'+char
-        else:
-            result +=char
-    return result
-
 # step methods must take (self, options) and return a boolean
 
 def standby(minutes):
@@ -76,14 +66,14 @@ class TestPlc:
         if self.vserver:
             return "vserver %s exec %s"%(self.vservername,command)
         else:
-            return "chroot /plc/root %s"%backslash_shell_specials(command)
+            return "chroot /plc/root %s"%utils.backslash_shell_specials(command)
 
     # command gets run on the right box
     def to_host(self,command):
         if self.is_local():
             return command
         else:
-            return "ssh %s %s"%(self.plc_spec['hostname'],backslash_shell_specials(command))
+            return "ssh %s %s"%(self.plc_spec['hostname'],utils.backslash_shell_specials(command))
 
     def full_command(self,command):
         return self.to_host(self.host_to_guest(command))
@@ -143,34 +133,55 @@ class TestPlc:
 
     # all different hostboxes used in this plc
     def gather_hostBoxes(self):
-        # maps on sites and nodes, return [ (host_box,hostname) ]
+        # maps on sites and nodes, return [ (host_box,test_node) ]
         tuples=[]
         for site_spec in self.plc_spec['sites']:
             test_site = TestSite (self,site_spec)
             for node_spec in site_spec['nodes']:
                 test_node = TestNode (self, test_site, node_spec)
                 if not test_node.is_real():
-                    tuples.append( (test_node.host_box(),node_spec['node_fields']['hostname']) )
+                    tuples.append( (test_node.host_box(),test_node) )
         # transform into a dict { 'host_box' -> [ hostnames .. ] }
         result = {}
-        for (box,hostname) in tuples:
+        for (box,node) in tuples:
             if not result.has_key(box):
-                result[box]=[hostname]
+                result[box]=[node]
             else:
-                result[box].append(hostname)
+                result[box].append(node)
         return result
                     
     # a step for checking this stuff
     def showboxes (self,options):
         print 'showboxes'
-        for (box,hosts) in self.gather_hostBoxes().iteritems():
-            print box,":"," + ".join(hosts)
+        for (box,nodes) in self.gather_hostBoxes().iteritems():
+            print box,":"," + ".join( [ node.name() for node in nodes ] )
         return True
 
-    def kill_all_qemus(self):
-        for (box,hosts) in self.gather_hostBoxes().iteritems():
+    # make this a valid step
+    def kill_all_qemus(self,options):
+        for (box,nodes) in self.gather_hostBoxes().iteritems():
             # this is the brute force version, kill all qemus on that host box
             TestBox(box).kill_all_qemus()
+        return True
+
+    # make this a valid step
+    def list_all_qemus(self,options):
+        for (box,nodes) in self.gather_hostBoxes().iteritems():
+           # push the script
+           TestBox(box).copy("qemu_kill.sh")   
+            # this is the brute force version, kill all qemus on that host box
+            TestBox(box).run("./qemu_kill.sh -l")
+        return True
+
+    # kill only the right qemus
+    def kill_qemus(self,options):
+        for (box,nodes) in self.gather_hostBoxes().iteritems():
+           # push the script
+           TestBox(box).copy("qemu_kill.sh")   
+            # the fine-grain version
+            for node in nodes:
+                node.kill_qemu()
+        return True
 
     def clear_ssh_config (self,options):
         # install local ssh_config file as root's .ssh/config - ssh should be quiet
@@ -348,7 +359,7 @@ class TestPlc:
             else:
                 utils.header("Creating nodes for site %s in %s"%(test_site.name(),self.name()))
                 for node_spec in site_spec['nodes']:
-                    utils.show_spec('Creating node %s'%node_spec,node_spec)
+                    utils.pprint('Creating node %s'%node_spec,node_spec)
                     test_node = TestNode (self,test_site,node_spec)
                     test_node.create_node ()
         return True
@@ -452,7 +463,6 @@ class TestPlc:
     def do_check_nodesSsh(self,minutes):
         # compute timeout
         timeout = datetime.datetime.now()+datetime.timedelta(minutes=minutes)
-        #graceout = datetime.datetime.now()+datetime.timedelta(minutes=gracetime)
         tocheck = self.all_hostnames()
         self.scan_publicKeys(tocheck)
         utils.header("checking Connectivity on nodes %r"%tocheck)
@@ -468,8 +478,8 @@ class TestPlc:
                     (site_spec,node_spec)=self.locate_node(hostname)
                     if TestNode.is_real_model(node_spec['node_fields']['model']):
                         utils.header ("WARNING : check ssh access into real node %s - skipped"%hostname)
-                    tocheck.remove(hostname)
-            if not tocheck:
+                       tocheck.remove(hostname)
+            if  not tocheck:
                 return True
             if datetime.datetime.now() > timeout:
                 for hostname in tocheck:
@@ -482,7 +492,7 @@ class TestPlc:
         
     def nodes_ssh(self, options):
         return  self.do_check_nodesSsh(minutes=2)
-            
+    
     def bootcd (self, options):
         for site_spec in self.plc_spec['sites']:
             test_site = TestSite (self,site_spec)
@@ -490,10 +500,25 @@ class TestPlc:
                 test_node=TestNode (self,test_site,node_spec)
                 test_node.create_boot_cd(options.path)
         return True
-                
+
+    def do_check_intiscripts(self):
+       for site_spec in self.plc_spec['sites']:
+               test_site = TestSite (self,site_spec)
+               test_node = TestNode (self,test_site,site_spec['nodes'])
+               for slice_spec in self.plc_spec['slices']:
+                       test_slice=TestSlice (self,test_site,slice_spec)
+                       test_sliver=TestSliver(self,test_node,test_slice)
+                       init_status=test_sliver.get_initscript(slice_spec)
+                       if (not init_status):
+                               return False
+               return init_status
+           
+    def check_initscripts(self, options):
+           return self.do_check_intiscripts()
+                   
     def initscripts (self, options):
         for initscript in self.plc_spec['initscripts']:
-            utils.show_spec('Adding Initscript in plc %s'%self.plc_spec['name'],initscript)
+            utils.pprint('Adding Initscript in plc %s'%self.plc_spec['name'],initscript)
             self.server.AddInitScript(self.auth_root(),initscript['initscript_fields'])
         return True
 
@@ -512,7 +537,7 @@ class TestPlc:
                 utils.header("Deleting slices in site %s"%test_site.name())
                 test_slice.delete_slice()
             else:    
-                utils.show_spec("Creating slice",slice)
+                utils.pprint("Creating slice",slice)
                 test_slice.create_slice()
                 utils.header('Created Slice %s'%slice['slice_fields']['name'])
         return True
@@ -528,7 +553,6 @@ class TestPlc:
         return status
     
     def start_nodes (self, options):
-        self.kill_all_qemus()
         utils.header("Starting  nodes")
         for site_spec in self.plc_spec['sites']:
             TestSite(self,site_spec).start_nodes (options)
@@ -538,6 +562,15 @@ class TestPlc:
         self.kill_all_qemus()
         return True
 
+    def check_tcp (self, options):
+           #we just need to create a sliver object nothing else
+           test_sliver=TestSliver(self,
+                                  TestNode(self, TestSite(self,self.plc_spec['sites'][0]),
+                                           self.plc_spec['sites'][0]['nodes'][0]),
+                                  TestSlice(self,TestSite(self,self.plc_spec['sites'][0]),
+                                            self.plc_spec['slices']))
+           return test_sliver.do_check_tcp(self.plc_spec['tcp_param'],options)
+
     # returns the filename to use for sql dump/restore, using options.dbname if set
     def dbfile (self, database, options):
         # uses options.dbname if it is found