fix typo
[tests.git] / system / TestPlc.py
index 03aeee9..33cade1 100644 (file)
@@ -52,7 +52,7 @@ def node_mapper (method):
     actual.__doc__=method.__doc__
     return actual
 
-def slice_mapper_options (method):
+def slice_mapper (method):
     def actual(self):
         overall=True
         slice_method = TestSlice.__dict__[method.__name__]
@@ -66,15 +66,14 @@ def slice_mapper_options (method):
     actual.__doc__=method.__doc__
     return actual
 
-def slice_mapper_options_sfa (method):
+def slice_sfa_mapper (method):
     def actual(self):
-       test_plc=self
         overall=True
         slice_method = TestSliceSfa.__dict__[method.__name__]
         for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']:
             site_spec = self.locate_site (slice_spec['sitename'])
             test_site = TestSite(self,site_spec)
-            test_slice=TestSliceSfa(test_plc,test_site,slice_spec)
+            test_slice=TestSliceSfa(self,test_site,slice_spec)
             if not slice_method(test_slice,self.options): overall=False
         return overall
     # restore the doc text
@@ -91,15 +90,17 @@ class TestPlc:
         'delete_vs','create_vs','install', 'configure', 'start', SEP,
         'fetch_keys', 'store_keys', 'clear_known_hosts', SEP,
         'initscripts', 'sites', 'nodes', 'slices', 'nodegroups', 'leases', SEP,
-        'reinstall_node', 'init_node','bootcd', 'configure_qemu', 'export_qemu',
-        'kill_all_qemus', 'start_node', SEP,
-        # better use of time: do this now that the nodes are taking off
-        'plcsh_stress_test', SEP,
+        'reinstall_node', 'init_node','bootcd', 'configure_qemu', 'export_qemu', 'kill_all_qemus', 'start_node', SEP,
        'install_sfa', 'configure_sfa', 'cross_configure_sfa', 'import_sfa', 'start_sfa', SEPSFA,
-        'configure_sfi', 'add_sfa', 'update_sfa', 'view_sfa', SEPSFA,
-        'nodes_ssh_debug', 'nodes_ssh_boot', 'check_slice', 'check_initscripts', SEPSFA,
-        'check_slice_sfa', 'delete_sfa', 'stop_sfa', SEPSFA,
-        'check_tcp',  'check_hooks',  SEP,
+        'configure_sfi@1', 'add_user_sfa@1', 'add_sfa@1', 'create_sfa@1', SEPSFA, 
+        'update_user_sfa@1', 'update_sfa@1', 'view_sfa@1', SEPSFA,
+        'install_unittest_sfa@1','unittest_sfa@1',SEPSFA,
+        # we used to run plcsh_stress_test, and then nodes_ssh_debug and nodes_ssh_boot
+        # but as the stress test might take a while, we sometimes missed the debug mode..
+        'nodes_ssh_debug', 'plcsh_stress_test@1', SEP,
+        'nodes_ssh_boot', 'check_slice', 'check_initscripts', SEP,
+        'check_slice_sfa@1', 'delete_slice_sfa@1', 'delete_user_sfa@1', SEPSFA,
+        'check_tcp',  'check_hooks@1',  SEP,
         'force_gather_logs', 'force_resources_post', SEP,
         ]
     other_steps = [ 
@@ -110,7 +111,7 @@ class TestPlc:
         'clean_leases', 'list_leases', SEP,
         'populate' , SEP,
         'list_all_qemus', 'list_qemus', 'kill_qemus', SEP,
-        'plcclean_sfa', 'dbclean_sfa', 'uninstall_sfa', 'clean_sfi', SEP,
+        'plcclean_sfa', 'dbclean_sfa', 'stop_sfa','uninstall_sfa', 'clean_sfi', SEP,
         'db_dump' , 'db_restore', SEP,
         'standby_1 through 20',SEP,
         ]
@@ -516,22 +517,23 @@ class TestPlc:
         if self.options.fcdistro == "centos5":
             self.run_in_guest("rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm")
 
+        # compute nodefamily
         if self.options.personality == "linux32":
             arch = "i386"
         elif self.options.personality == "linux64":
             arch = "x86_64"
         else:
             raise Exception, "Unsupported personality %r"%self.options.personality
-        
         nodefamily="%s-%s-%s"%(self.options.pldistro,self.options.fcdistro,arch)
 
-        # try to install slicerepo - not fatal yet
-        self.run_in_guest("yum -y install slicerepo-%s"%nodefamily)
-        
-        return \
-            self.run_in_guest("yum -y install myplc")==0 and \
-            self.run_in_guest("yum -y install noderepo-%s"%nodefamily)==0 and \
-            self.run_in_guest("yum -y install bootstrapfs-%s-plain"%nodefamily)==0 
+        pkgs_list=[]
+        pkgs_list.append ("slicerepo-%s"%nodefamily)
+        pkgs_list.append ("myplc")
+        pkgs_list.append ("noderepo-%s"%nodefamily)
+        pkgs_list.append ("bootstrapfs-%s-plain"%nodefamily)
+        pkgs_string=" ".join(pkgs_list)
+        self.run_in_guest("yum -y install %s"%pkgs_string)
+        return self.run_in_guest("rpm -q %s"%pkgs_string)==0
 
     ### 
     def configure(self):
@@ -759,8 +761,7 @@ class TestPlc:
                     tag_type_id = self.apiserver.AddTagType(auth,
                                                             {'tagname':nodegroupname,
                                                              'description': 'for nodegroup %s'%nodegroupname,
-                                                             'category':'test',
-                                                             'min_role_id':10})
+                                                             'category':'test'})
                 print 'located tag (type)',nodegroupname,'as',tag_type_id
                 # create nodegroup
                 nodegroups = self.apiserver.GetNodeGroups (auth, {'groupname':nodegroupname})
@@ -1011,7 +1012,7 @@ class TestPlc:
                 utils.header('Created Slice %s'%slice['slice_fields']['name'])
         return True
         
-    @slice_mapper_options
+    @slice_mapper
     def check_slice(self): 
         "tries to ssh-enter the slice with the user key, to ensure slice creation"
         pass
@@ -1070,7 +1071,8 @@ class TestPlc:
 
     def dbclean_sfa(self):
         "thoroughly wipes off the SFA database"
-        return self.run_in_guest("sfa-nuke-plc.py")==0
+        self.run_in_guest("sfa-nuke-plc.py")==0
+        return True
 
     def plcclean_sfa(self):
         "cleans the PLC entries that were created as a side effect of running the script"
@@ -1092,12 +1094,52 @@ class TestPlc:
         "uses rpm to uninstall sfa - ignore result"
         self.run_in_guest("rpm -e sfa sfa-sfatables sfa-client sfa-plc")
         self.run_in_guest("rm -rf /var/lib/sfa")
+        self.run_in_guest("rm -rf /etc/sfa")
+        self.run_in_guest("rm -rf /var/log/sfa_access.log /var/log/sfa_import_plc.log /var/log/sfa.daemon")
+        # xxx tmp 
+        self.run_in_guest("rpm -e --noscripts sfa-plc")
         return True
 
+    ### install_sfa_rpm
+    def install_unittest_sfa(self):
+        "yum install sfa-tests"
+        # ignore yum retcod
+        self.run_in_guest("yum -y install sfa-tests")
+        return  self.run_in_guest("rpm -q sfa-tests")==0
+
+    def unittest_sfa(self):
+        "run SFA unittests"
+        return self.run_in_guest("/usr/share/sfa/tests/testAll.py")==0
+
+    ###
+    def confdir(self):
+        dirname="conf.%s"%self.plc_spec['name']
+        if not os.path.isdir(dirname):
+            utils.system("mkdir -p %s"%dirname)
+        if not os.path.isdir(dirname):
+            raise "Cannot create config dir for plc %s"%self.name()
+        return dirname
+
+    def conffile(self,filename):
+        return "%s/%s"%(self.confdir(),filename)
+    def confsubdir(self,dirname,clean):
+        subdirname="%s/%s"%(self.confdir(),dirname)
+        if clean:
+            utils.system("rm -rf %s"%subdirname)
+        if not os.path.isdir(subdirname): 
+            utils.system("mkdir -p %s"%subdirname)
+        if not os.path.isdir(subdirname):
+            raise "Cannot create config subdir %s for plc %s"%(dirname,self.name())
+        return subdirname
+        
+    def conffile_clean (self,filename):
+        filename=self.conffile(filename)
+        return utils.system("rm -rf %s"%filename)==0
+    
     ###
     def configure_sfa(self):
         "run sfa-config-tty"
-        tmpname='%s.sfa-config-tty'%(self.name())
+        tmpname=self.conffile("sfa-config-tty")
         fileconf=open(tmpname,'w')
         for var in [ 'SFA_REGISTRY_ROOT_AUTH',
                      'SFA_INTERFACE_HRN',
@@ -1113,13 +1155,17 @@ class TestPlc:
                     'SFA_PLC_URL',
                      ]:
             fileconf.write ('e %s\n%s\n'%(var,self.plc_spec['sfa'][var]))
+        # the way plc_config handles booleans just sucks..
+        for var in ['SFA_API_DEBUG']:
+            val='false'
+            if self.plc_spec['sfa'][var]: val='true'
+            fileconf.write ('e %s\n%s\n'%(var,val))
         fileconf.write('w\n')
         fileconf.write('R\n')
         fileconf.write('q\n')
         fileconf.close()
         utils.system('cat %s'%tmpname)
         self.run_in_guest_piped('cat %s'%tmpname,'sfa-config-tty')
-        utils.system('rm %s'%tmpname)
         return True
 
     def aggregate_xml_line(self):
@@ -1134,21 +1180,18 @@ class TestPlc:
     # a cross step that takes all other plcs in argument
     def cross_configure_sfa(self, other_plcs):
         # of course with a single plc, other_plcs is an empty list
-        if other_plcs:
-            filename="%s-agg.xml"%self.name()
-            agg_file=file(filename,"w")
-            agg_file.write("<aggregates>%s</aggregates>\n" % \
-                               " ".join([ plc.aggregate_xml_line() for plc in other_plcs ]))
-            agg_file.close()
-            if self.test_ssh.copy_abs(filename,'/vservers/%s/etc/sfa/aggregates.xml'%self.vservername) !=0 : return False
-
-            filename="%s-reg.xml"%self.name()
-            agg_file=file(filename,"w")
-            agg_file.write("<registries>%s</registries>\n" % \
-                               " ".join([ plc.registry_xml_line() for plc in other_plcs ]))
-            agg_file.close()
-            if self.test_ssh.copy_abs(filename,'/vservers/%s/etc/sfa/aggregates.xml'%self.vservername) !=0 : return False
-        return True
+        if not other_plcs:
+            return True
+        agg_fname=self.conffile("agg.xml")
+        file(agg_fname,"w").write("<aggregates>%s</aggregates>\n" % \
+                                     " ".join([ plc.aggregate_xml_line() for plc in other_plcs ]))
+        utils.header ("(Over)wrote %s"%agg_fname)
+        reg_fname=self.conffile("reg.xml")
+        file(reg_fname,"w").write("<registries>%s</registries>\n" % \
+                                     " ".join([ plc.registry_xml_line() for plc in other_plcs ]))
+        utils.header ("(Over)wrote %s"%reg_fname)
+        return self.test_ssh.copy_abs(agg_fname,'/vservers/%s/etc/sfa/aggregates.xml'%self.vservername)==0 \
+            and  self.test_ssh.copy_abs(reg_fname,'/vservers/%s/etc/sfa/registries.xml'%self.vservername)==0
 
     def import_sfa(self):
         "sfa-import-plc"
@@ -1164,14 +1207,12 @@ class TestPlc:
     def configure_sfi(self):
         sfa_spec=self.plc_spec['sfa']
         "sfi client configuration"
-       dir_name=".sfi"
-       if os.path.exists(dir_name):
-           utils.system('rm -rf %s'%dir_name)
-       utils.system('mkdir %s'%dir_name)
+       dir_name=self.confsubdir("dot-sfi",clean=True)
        file_name=dir_name + os.sep + sfa_spec['piuser'] + '.pkey'
         fileconf=open(file_name,'w')
         fileconf.write (self.plc_spec['keys'][0]['private'])
         fileconf.close()
+        utils.header ("(Over)wrote %s"%file_name)
 
        file_name=dir_name + os.sep + 'sfi_config'
         fileconf=open(file_name,'w')
@@ -1188,6 +1229,7 @@ class TestPlc:
         fileconf.write ("SFI_SM='%s'"%SFI_SM)
        fileconf.write('\n')
         fileconf.close()
+        utils.header ("(Over)wrote %s"%file_name)
 
        file_name=dir_name + os.sep + 'person.xml'
         fileconf=open(file_name,'w')
@@ -1196,6 +1238,7 @@ class TestPlc:
        fileconf.write(person_record)
        fileconf.write('\n')
         fileconf.close()
+        utils.header ("(Over)wrote %s"%file_name)
 
        file_name=dir_name + os.sep + 'slice.xml'
         fileconf=open(file_name,'w')
@@ -1204,6 +1247,7 @@ class TestPlc:
        #slice_record=sfa_spec['sfa_slice_xml']
        fileconf.write(slice_record)
        fileconf.write('\n')
+        utils.header ("(Over)wrote %s"%file_name)
         fileconf.close()
 
        file_name=dir_name + os.sep + 'slice.rspec'
@@ -1214,42 +1258,39 @@ class TestPlc:
        fileconf.write(slice_rspec)
        fileconf.write('\n')
         fileconf.close()
-        location = "root/"
+        utils.header ("(Over)wrote %s"%file_name)
+        
+        # push to the remote root's .sfi
+        location = "root/.sfi"
         remote="/vservers/%s/%s"%(self.vservername,location)
        self.test_ssh.copy_abs(dir_name, remote, recursive=True)
 
-        #utils.system('cat %s'%tmpname)
-        utils.system('rm -rf %s'%dir_name)
         return True
 
     def clean_sfi (self):
         self.run_in_guest("rm -rf /root/.sfi")
         return True
 
+    def add_user_sfa(self):
+        return TestUserSfa(self).add_user()
+
+    @slice_sfa_mapper
     def add_sfa(self):
-        "run sfi.py add (on Registry) and sfi.py create (on SM) to form new objects"
-        test_user_sfa=TestUserSfa(self)
-        if not test_user_sfa.add_user(): return False
+        "run sfi.py add (on Registry)"
+        pass
 
-       for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']:
-            site_spec = self.locate_site (slice_spec['sitename'])
-            test_site = TestSite(self,site_spec)
-           test_slice_sfa=TestSliceSfa(self,test_site,slice_spec)
-           if not test_slice_sfa.add_slice(): return False
-           if not test_slice_sfa.create_slice(): return False
-        return True
+    @slice_sfa_mapper
+    def create_sfa(self):
+        "run sfi.py create (on SM) for 1st-time creation"
+        pass
+
+    def update_user_sfa(self):
+        return TestUserSfa(self).update_user()
 
+    @slice_sfa_mapper
     def update_sfa(self):
-        "run sfi.py update (on Registry) and sfi.py create (on SM) on existing objects"
-       test_user_sfa=TestUserSfa(self)
-       if not test_user_sfa.update_user(): return False
-       
-       for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']:
-           site_spec = self.locate_site (slice_spec['sitename'])
-           test_site = TestSite(self,site_spec)
-           test_slice_sfa=TestSliceSfa(self,test_site,slice_spec)
-           if not test_slice_sfa.update_slice(): return False
-        return True
+        "run sfi.py create (on SM) on existing object"
+        pass
 
     def view_sfa(self):
         "run sfi.py list and sfi.py show (both on Registry) and sfi.py slices and sfi.py resources (both on SM)"
@@ -1261,26 +1302,25 @@ class TestPlc:
        self.run_in_guest("sfi.py -d /root/.sfi/ slices")==0 and \
        self.run_in_guest("sfi.py -d /root/.sfi/ resources -o resources")==0
 
-    @slice_mapper_options_sfa
+    @slice_sfa_mapper
     def check_slice_sfa(self): 
        "tries to ssh-enter the SFA slice"
         pass
 
-    def delete_sfa(self):
-       "run sfi.py delete (on SM), sfi.py remove (on Registry)"
+    def delete_user_sfa(self):
+       "run sfi.py delete (on SM) for user"
        test_user_sfa=TestUserSfa(self)
-       success1=test_user_sfa.delete_user()
-       for slice_spec in self.plc_spec['sfa']['sfa_slice_specs']:
-            site_spec = self.locate_site (slice_spec['sitename'])
-            test_site = TestSite(self,site_spec)
-           test_slice_sfa=TestSliceSfa(self,test_site,slice_spec)
-           success2=test_slice_sfa.delete_slice()
+       return test_user_sfa.delete_user()
 
-       return success1 and success2
+    @slice_sfa_mapper
+    def delete_slice_sfa(self):
+       "run sfi.py delete (on SM), sfi.py remove (on Registry) to clean slices"
+        pass
 
     def stop_sfa(self):
         "service sfa stop"
-        return self.run_in_guest('service sfa stop')==0
+        self.run_in_guest('service sfa stop')==0
+        return True
 
     def populate (self):
         "creates random entries in the PLCAPI"