introduces the TestBox class - review how qemu gets stopped
[tests.git] / system / TestPlc.py
index fd061a3..4694d1c 100644 (file)
@@ -14,13 +14,14 @@ from TestNode import TestNode
 from TestUser import TestUser
 from TestKey import TestKey
 from TestSlice import TestSlice
+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 "\\\"'<>&|;()$*":
+        if char in "\\\"'<>&|;()$*~":
             result +='\\'+char
         else:
             result +=char
@@ -28,6 +29,17 @@ def backslash_shell_specials (command):
 
 # step methods must take (self, options) and return a boolean
 
+def standby(minutes):
+        utils.header('Entering StandBy for %d mn'%minutes)
+        time.sleep(60*minutes)
+        return True
+
+def standby_generic (func):
+    def actual(self,options):
+        minutes=int(func.__name__.split("_")[1])
+        return standby(minutes)
+    return actual
+
 class TestPlc:
 
     def __init__ (self,plc_spec):
@@ -128,21 +140,38 @@ class TestPlc:
             if key['name'] == keyname:
                 return key
         raise Exception,"Cannot locate key %s"%keyname
-        
-    # this should be run on the nodes' host_box, not locally to the plc
-    def kill_all_vmwares(self):
-        utils.header('Killing any running vmware or vmplayer instance')
-        utils.system('pgrep vmware | xargs -r kill')
-        utils.system('pgrep vmplayer | xargs -r kill ')
-        utils.system('pgrep vmware | xargs -r kill -9')
-        utils.system('pgrep vmplayer | xargs -r kill -9')
 
-    def kill_all_qemus(self):
+    # all different hostboxes used in this plc
+    def gather_hostBoxes(self):
+        # maps on sites and nodes, return [ (host_box,hostname) ]
+        tuples=[]
         for site_spec in self.plc_spec['sites']:
             test_site = TestSite (self,site_spec)
             for node_spec in site_spec['nodes']:
-                TestNode (self,test_site,node_spec).stop_qemu()
+                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']) )
+        # transform into a dict { 'host_box' -> [ hostnames .. ] }
+        result = {}
+        for (box,hostname) in tuples:
+            if not result.has_key(box):
+                result[box]=[hostname]
+            else:
+                result[box].append(hostname)
+        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)
+        return True
+
+    def kill_all_qemus(self):
+        for (box,hosts) in self.gather_hostBoxes().iteritems():
+            # this is the brute force version, kill all qemus on that host box
+            TestBox(box).kill_all_qemus()
+
     def clear_ssh_config (self,options):
         # install local ssh_config file as root's .ssh/config - ssh should be quiet
         # dir might need creation first
@@ -359,7 +388,7 @@ class TestPlc:
         return hostnames
 
     # gracetime : during the first <gracetime> minutes nothing gets printed
-    def do_check_nodesStatus (self, minutes, gracetime=2):
+    def do_nodes_booted (self, minutes, gracetime=2):
         # compute timeout
         timeout = datetime.datetime.now()+datetime.timedelta(minutes=minutes)
         graceout = datetime.datetime.now()+datetime.timedelta(minutes=gracetime)
@@ -380,8 +409,7 @@ class TestPlc:
                 else:
                     # if it's a real node, never mind
                     (site_spec,node_spec)=self.locate_node(hostname)
-                    test_node = TestNode(self,site_spec,node_spec)
-                    if test_node.is_real():
+                    if TestNode.is_real_model(node_spec['node_fields']['model']):
                         utils.header("WARNING - Real node %s in %s - ignored"%(hostname,boot_state))
                         # let's cheat
                         boot_state = 'boot'
@@ -402,8 +430,8 @@ class TestPlc:
         # only useful in empty plcs
         return True
 
-    def check_nodesStatus(self,options):
-        return self.do_check_nodesStatus(minutes=5)
+    def nodes_booted(self,options):
+        return self.do_nodes_booted(minutes=5)
     
     #to scan and store the nodes's public keys and avoid to ask for confirmation when  ssh 
     def scan_publicKeys(self,hostnames):
@@ -436,6 +464,11 @@ class TestPlc:
                     utils.header('The node %s is sshable -->'%hostname)
                     # refresh tocheck
                     tocheck.remove(hostname)
+                else:
+                    (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:
                 return True
             if datetime.datetime.now() > timeout:
@@ -447,16 +480,9 @@ class TestPlc:
         # only useful in empty plcs
         return True
         
-    def check_nodesConnectivity(self, options):
+    def nodes_ssh(self, options):
         return  self.do_check_nodesSsh(minutes=2)
             
-    def standby(self,options):
-        #Method for waiting a while when nodes are booting and being sshable,giving time to NM to be up
-        utils.header('Entering in StanbdBy mode at %s'%datetime.datetime.now())
-        time.sleep(900)
-        utils.header('Exist StandBy mode at %s'%datetime.datetime.now())
-        return True
-    
     def bootcd (self, options):
         for site_spec in self.plc_spec['sites']:
             test_site = TestSite (self,site_spec)
@@ -496,19 +522,19 @@ class TestPlc:
             site_spec = self.locate_site (slice_spec['sitename'])
             test_site = TestSite(self,site_spec)
             test_slice=TestSlice(self,test_site,slice_spec)
-            status=test_slice.do_check_slices(options)
-            return status
+            status=test_slice.do_check_slice(options)
+            if (not status):
+                return False
+        return status
     
     def start_nodes (self, options):
-        self.kill_all_vmwares()
         self.kill_all_qemus()
-        utils.header("Starting vmware nodes")
+        utils.header("Starting  nodes")
         for site_spec in self.plc_spec['sites']:
             TestSite(self,site_spec).start_nodes (options)
         return True
 
     def stop_nodes (self, options):
-        self.kill_all_vmwares ()
         self.kill_all_qemus()
         return True
 
@@ -544,3 +570,45 @@ class TestPlc:
         self.run_in_guest('service httpd start')
 
         utils.header('Database restored from ' + dump)
+
+    @standby_generic 
+    def standby_1(): pass
+    @standby_generic 
+    def standby_2(): pass
+    @standby_generic 
+    def standby_3(): pass
+    @standby_generic 
+    def standby_4(): pass
+    @standby_generic 
+    def standby_5(): pass
+    @standby_generic 
+    def standby_6(): pass
+    @standby_generic 
+    def standby_7(): pass
+    @standby_generic 
+    def standby_8(): pass
+    @standby_generic 
+    def standby_9(): pass
+    @standby_generic 
+    def standby_10(): pass
+    @standby_generic 
+    def standby_11(): pass
+    @standby_generic 
+    def standby_12(): pass
+    @standby_generic 
+    def standby_13(): pass
+    @standby_generic 
+    def standby_14(): pass
+    @standby_generic 
+    def standby_15(): pass
+    @standby_generic 
+    def standby_16(): pass
+    @standby_generic 
+    def standby_17(): pass
+    @standby_generic 
+    def standby_18(): pass
+    @standby_generic 
+    def standby_19(): pass
+    @standby_generic 
+    def standby_20(): pass
+