fixed kill_qemus : uses qemu -pidfile for locating pids
[tests.git] / system / TestPlc.py
index c590fdb..75a90cd 100644 (file)
@@ -16,6 +16,7 @@ from TestKey import TestKey
 from TestSlice import TestSlice
 from TestSliver import TestSliver
 from TestBox import TestBox
+from TestSsh import TestSsh
 
 # step methods must take (self, options) and return a boolean
 
@@ -35,6 +36,7 @@ class TestPlc:
     def __init__ (self,plc_spec):
        self.plc_spec=plc_spec
        self.path=os.path.dirname(sys.argv[0])
+       self.test_ssh=TestSsh(self.plc_spec['hostname'],self.path)
         try:
             self.vserverip=plc_spec['vserverip']
             self.vservername=plc_spec['vservername']
@@ -43,7 +45,7 @@ class TestPlc:
         except:
             self.vserver=False
             self.url="https://%s:443/PLCAPI/"%plc_spec['hostname']
-        utils.header('Using API url %s'%self.url)
+#        utils.header('Using API url %s'%self.url)
        self.server=xmlrpclib.Server(self.url,allow_none=True)
         
     def name(self):
@@ -53,40 +55,33 @@ class TestPlc:
         else:
             return name+"[chroot]"
 
+    def hostname(self):
+        return self.plc_spec['hostname']
+
     def is_local (self):
-        return self.plc_spec['hostname'] == 'localhost'
+        return self.test_ssh.is_local()
 
     # define the API methods on this object through xmlrpc
     # would help, but not strictly necessary
     def connect (self):
        pass
-    
-    # command gets run in the chroot/vserver
-    def host_to_guest(self,command):
-        if self.vserver:
-            return "vserver %s exec %s"%(self.vservername,command)
-        else:
-            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'],utils.backslash_shell_specials(command))
 
     def full_command(self,command):
-        return self.to_host(self.host_to_guest(command))
+        return self.test_ssh.to_host(self.host_to_guest(command))
 
     def run_in_guest (self,command):
         return utils.system(self.full_command(command))
+    
     def run_in_host (self,command):
-        return utils.system(self.to_host(command))
-
-    # xxx quick n dirty
-    def run_in_guest_piped (self,local,remote):
-        return utils.system(local+" | "+self.full_command(remote))
+        return utils.system(self.test_ssh.to_host(command))
 
+    #command gets run in the chroot/vserver
+    def host_to_guest(self,command):
+        if self.vserver:
+            return "vserver %s exec %s"%(self.vservername,command)
+        else:
+            return "chroot /plc/root %s"%TestSsh.backslash_shell_specials(command)
+    
     # copy a file to the myplc root image - pass in_data=True if the file must go in /plc/data
     def copy_in_guest (self, localfile, remotefile, in_data=False):
         if in_data:
@@ -100,9 +95,15 @@ class TestPlc:
                 utils.system("cp %s /vservers/%s/%s"%(localfile,self.vservername,remotefile))
         else:
             if not self.vserver:
-                utils.system("scp %s %s:%s/%s"%(localfile,self.plc_spec['hostname'],chroot_dest,remotefile))
+                utils.system("scp %s %s:%s/%s"%(localfile,self.hostname(),chroot_dest,remotefile))
             else:
-                utils.system("scp %s %s@/vservers/%s/%s"%(localfile,self.plc_spec['hostname'],self.vservername,remotefile))
+                utils.system("scp %s %s@/vservers/%s/%s"%(localfile,self.hostname(),self.vservername,remotefile))
+
+
+        # xxx quick n dirty
+    def run_in_guest_piped (self,local,remote):
+        return utils.system(local+" | "+self.full_command(remote))
+       
 
     def auth_root (self):
        return {'Username':self.plc_spec['PLC_ROOT_USER'],
@@ -161,23 +162,27 @@ class TestPlc:
     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()
+            TestBox(box,options.buildname).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")
+            TestBox(box,options.buildname).run_in_buildname("qemu-%s/kill-qemu-node -l %s"%(node.name(),node.name()))
+        return True
+
+    # kill only the right qemus
+    def list_qemus(self,options):
+        for (box,nodes) in self.gather_hostBoxes().iteritems():
+            # the fine-grain version
+            for node in nodes:
+                node.list_qemu()
         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()
@@ -226,7 +231,6 @@ class TestPlc:
         # nothing to do
         return True
 
-    # xxx this would not work with hostname != localhost as mylc-init-vserver was extracted locally
     def install_vserver(self,options):
         # we need build dir for vtest-init-vserver
         if self.is_local():
@@ -234,15 +238,16 @@ class TestPlc:
             build_dir=self.path+"/build"
         else:
             # use a standard name - will be relative to HOME 
-            build_dir="tests-system-build"
+            build_dir="options.buildname"
+       # run checkout in any case - would do an update if already exists
         build_checkout = "svn checkout %s %s"%(options.build_url,build_dir)
         if self.run_in_host(build_checkout) != 0:
             raise Exception,"Cannot checkout build dir"
         # the repo url is taken from myplc-url 
         # with the last two steps (i386/myplc...) removed
         repo_url = options.myplc_url
-        repo_url = os.path.dirname(repo_url)
-        repo_url = os.path.dirname(repo_url)
+        for level in [ 'rpmname','arch' ]:
+           repo_url = os.path.dirname(repo_url)
         create_vserver="%s/vtest-init-vserver.sh %s %s -- --interface eth0:%s"%\
             (build_dir,self.vservername,repo_url,self.vserverip)
         if self.run_in_host(create_vserver) != 0:
@@ -254,12 +259,23 @@ class TestPlc:
             return self.install_vserver(options)
         else:
             return self.install_chroot(options)
-
+    
     ### install_rpm
+    def cache_rpm(self,url):
+        self.run_in_host('rm -rf *.rpm')
+       utils.header('Curling rpm from %s'%url)
+       id= self.run_in_host('curl -O '+url)
+       if (id != 0):
+               raise Exception,"Could not get rpm from  %s"%url
+               return False
+       return True
+
     def install_rpm_chroot(self,options):
-        utils.header('Installing from %s'%options.myplc_url)
-        url=options.myplc_url
-        self.run_in_host('rpm -Uvh '+url)
+        rpm = os.path.basename(options.myplc_url)
+       if (not os.path.isfile(rpm)):
+               self.cache_rpm(options.myplc_url)
+       utils.header('Installing the :  %s'%rpm)
+        self.run_in_host('rpm -Uvh '+rpm)
         self.run_in_host('service plc mount')
         return True
 
@@ -275,7 +291,7 @@ class TestPlc:
 
     ### 
     def configure(self,options):
-        tmpname='%s/%s.plc-config-tty'%(options.path,self.name())
+        tmpname='%s.plc-config-tty'%(self.name())
         fileconf=open(tmpname,'w')
         for var in [ 'PLC_NAME',
                      'PLC_ROOT_PASSWORD',
@@ -315,7 +331,7 @@ class TestPlc:
     # could use a TestKey class
     def store_keys(self, options):
         for key_spec in self.plc_spec['keys']:
-            TestKey(self,key_spec).store_key()
+               TestKey(self,key_spec).store_key()
         return True
 
     def clean_keys(self, options):
@@ -359,7 +375,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
@@ -498,7 +514,9 @@ class TestPlc:
             test_site = TestSite (self,site_spec)
             for node_spec in site_spec['nodes']:
                 test_node=TestNode (self,test_site,node_spec)
-                test_node.create_boot_cd(options.path)
+                test_node.prepare_area()
+                test_node.create_boot_cd()
+               test_node.configure_qemu()
         return True
 
     def do_check_intiscripts(self):
@@ -518,7 +536,7 @@ class TestPlc:
                    
     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
 
@@ -537,7 +555,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
@@ -559,7 +577,7 @@ class TestPlc:
         return True
 
     def stop_nodes (self, options):
-        self.kill_all_qemus()
+        self.kill_all_qemus(options)
         return True
 
     def check_tcp (self, options):