*correct a syntax bug in qemu config file.
[tests.git] / system / TestPlc.py
index 4be0646..97e9215 100644 (file)
@@ -16,11 +16,11 @@ from TestKey import TestKey
 from TestSlice import TestSlice
 
 # 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
@@ -128,21 +128,28 @@ 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')
 
+    #this to catch up all different hostboxes used in this plc
+    def locate_hostBoxes(self,site_spec):
+        #Get The first host box to avoid returning a long list with the same host box
+        #in case  only one is used for all the nodes
+        HostBoxes=[site_spec['nodes'][0]['host_box']]
+        for node_spec in site_spec['nodes']:
+            if node_spec['host_box']!= HostBoxes[0]:
+                HostBoxes.append( node_spec['host_box'])
+
+        return HostBoxes
+            
     def kill_all_qemus(self):
         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()
-                    
+            hostboxes_list=self.locate_hostBoxes(site_spec)
+            if (hostboxes_list):
+                for node_spec in site_spec['nodes']:
+                    TestNode(self,test_site,node_spec).stop_qemu(node_spec)
+            else:
+                utils.header("No emulated node running on this PLC config ignore the kill() step")
+            
     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,18 +366,15 @@ class TestPlc:
         return hostnames
 
     # gracetime : during the first <gracetime> minutes nothing gets printed
-    def do_check_nodes (self, minutes, gracetime=2):
-
+    def do_check_nodesStatus (self, minutes, gracetime=2):
         # compute timeout
         timeout = datetime.datetime.now()+datetime.timedelta(minutes=minutes)
         graceout = datetime.datetime.now()+datetime.timedelta(minutes=gracetime)
-
         # the nodes that haven't checked yet - start with a full list and shrink over time
         tocheck = self.all_hostnames()
         utils.header("checking nodes %r"%tocheck)
         # create a dict hostname -> status
         status = dict ( [ (hostname,'undef') for hostname in tocheck ] )
-
         while tocheck:
             # get their status
             tocheck_status=self.server.GetNodes(self.auth_root(), tocheck, ['hostname','boot_state' ] )
@@ -383,17 +387,16 @@ 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'
                     if datetime.datetime.now() > graceout:
                         utils.header ("%s still in '%s' state"%(hostname,boot_state))
+                        graceout=datetime.datetime.now()+datetime.timedelta(1)
                 status[hostname] = boot_state
             # refresh tocheck
             tocheck = [ hostname for (hostname,boot_state) in status.iteritems() if boot_state != 'boot' ]
-
             if not tocheck:
                 return True
             if datetime.datetime.now() > timeout:
@@ -405,9 +408,66 @@ class TestPlc:
         # only useful in empty plcs
         return True
 
-    def check_nodes(self,options):
-        return self.do_check_nodes(minutes=5)
-
+    def check_nodesStatus(self,options):
+        return self.do_check_nodesStatus(minutes=5)
+    
+    #to scan and store the nodes's public keys and avoid to ask for confirmation when  ssh 
+    def scan_publicKeys(self,hostnames):
+        try:
+            temp_knownhosts="/root/known_hosts"
+            remote_knownhosts="/root/.ssh/known_hosts"
+            self.run_in_host("touch %s"%temp_knownhosts )
+            for hostname in hostnames:
+                utils.header("Scan Public %s key and store it in the known_host file(under the root image) "%hostname)
+                scan=self.run_in_host('ssh-keyscan -t rsa %s >> %s '%(hostname,temp_knownhosts))
+            #Store the public keys in the right root image
+            self.copy_in_guest(temp_knownhosts,remote_knownhosts,True)
+            #clean the temp keys file used
+            self.run_in_host('rm -f  %s '%temp_knownhosts )
+        except Exception, err:
+            print err
+            
+    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)
+        while tocheck:
+            for hostname in tocheck:
+                # try to ssh in nodes
+                access=self.run_in_guest('ssh -i /etc/planetlab/root_ssh_key.rsa root@%s date'%hostname )
+                if (not access):
+                    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:
+                for hostname in tocheck:
+                    utils.header("FAILURE to ssh into %s"%hostname)
+                return False
+            # otherwise, sleep for a while
+            time.sleep(15)
+        # only useful in empty plcs
+        return True
+        
+    def check_nodesConnectivity(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 for 10min at %s'%datetime.datetime.now())
+        time.sleep(600)
+        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)
@@ -447,19 +507,17 @@ 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()
+            status=test_slice.do_check_slice(options)
             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