class JobSubmit(ErrataInfo): allTests = 'tps srpm tier1 tier2 regression fj virt' def __init__(self): self.jobType2Tested = { 'tps' : 'n', 'srpm' : 'n', 'tier1' : 'n', 'tier2' : 'n', 'regression' : 'n', 'fj' : 'n', 'virt' : 'n', } self.type2Tested = '' self.errataName = '' self.errataLname = '' self.yang = '' self.__parseArgs() ErrataInfo.__init__(self, self.errataName) self.resultPath = "./result" self.jobStatePath = '%s/%s.%s' %(self.resultPath, \ self.errataId, 'jobstate') if not os.path.exists(self.jobStatePath): os.mknod(self.jobStatePath) self.jobState = ConfigObj(self.jobStatePath, encoding="utf8") @classmethod def usage(cls): print "Usage: %s -T submitJobs -e errataName [-l lastErrataName] [-t "\ "[%s] -y -h]" %(sys.argv[0], cls.allTests) exit(1) def __parseArgs(self): opts,args = getopt.getopt(sys.argv[1:], "T:e:l:t:yh") for opt, arg in opts: if opt == '-h': self.usage() elif opt == '-e': self.errataName = arg elif opt == '-l': self.errataLname = arg elif opt == '-t': self.type2Tested = arg elif opt == '-y': self.yang = 'y' if not self.errataName: self.usage() if not self.type2Tested: self.type2Tested = self.allTests self.type2Tested = self.type2Tested.split(' ') for type in self.type2Tested: if type not in self.allTests.split(' '): self.usage() self.jobType2Tested[type] = 'y' def __add2jobState(self, type, id): if not self.jobState.has_key(type): if len(self.jobState): add_blank_line = 'echo >> %s' %self.jobStatePath shellCmd(add_blank_line) self.jobState.reload() self.jobState[type] = {} self.jobState[type][id] = {'wb': '', 'status': ''} self.jobState.write() return self.jobState[type][id] = {'wb': '', 'status': ''} self.jobState.write() def submTps(self): genLogger.info("Tps submiting...") task = '--task=/kernel/errata/kernel-tps '\ '--taskparam="REL=%sServer-%s.%s.%s" '\ '--taskparam="TESTARGS=%s" '\ %(self.major, self.major, self.minor, self.zflag, self.errataId) wboard = '--whiteboard="%s Kernel TPS Testing for Errata" ' %self.distro extra = '--lite --nvr=%s ' %self.lversion bkrcommand = "%s %s %s %s" %(self.bkrcommon, task, wboard, extra) self.__submbkr(bkrcommand, "Tps") def submSrpm(self): genLogger.info("Srpm submiting...") task = '--task=/kernel/errata/srpm-rebuild '\ '--taskparam="TESTARGS=%s" ' %self.version wboard = '--whiteboard="%s Kernel SRPM Testing for Errata" ' %self.distro extra = '--lite --nvr=%s ' %self.lversion bkrcommand = "%s %s %s %s" %(self.bkrcommon, task, wboard, extra) self.__submbkr(bkrcommand, "Srpm") def submTier1(self): genLogger.info("Tier1 submiting...") task = '--type=KernelTier1 ' version = '--nvr=%s ' %self.version extra = '--kvm --hostrequire="labcontroller != lab-02.rhts.eng.nay.redhat.com"' bkrcommand = "%s %s %s %s" %(self.bkrcommon, task, version, extra) self.__submbkr(bkrcommand, "Tier1") def submTier2(self): genLogger.info("Tier2 submiting...") task = '--type=KernelTier2 ' version = '--nvr=%s ' %self.version extra = '--kvm ' bkrcommand = "%s %s %s %s" %(self.bkrcommon, task, version, extra) self.__submbkrShirk(bkrcommand, "Tier2") if self.yang == 'y': self.submTier2Xfs() def submTier2Xfs(self): genLogger.info("Tier2 xfs submiting...") task = '--task=/kernel/errata/xfstests ' version = '--nvr=%s ' %self.version extra = '--kvm ' wboard = '--whiteboard="%s tier2 xfs test" ' %self.version bkrcommand = "%s %s %s %s %s" %(self.bkrcommon, task, version, extra, wboard) self.__submbkr(bkrcommand, "Tier2") def submRegression(self): genLogger.info("Regression submiting...") task = '' task_z = '' for i in range(0, int(self.minor) + 1): task = '--task=/kernel/errata/%s.%d %s' %(self.major, i, task) task_z = '--task=/kernel/errata/%s.%d.z %s' %(self.major, i, task_z) wboard = '--whiteboard="%s Kernel Regression Testing for Errata %s" ' %(self.distro, self.errataId) version = '--nvr=%s ' %self.version extra = '--kvm ' bkrcommand = "%s %s %s %s %s %s" %(self.bkrcommon, task, task_z, version, wboard, extra) self.__submbkr(bkrcommand, "Regression") def submVirt(self): genLogger.info("Virt submiting...") # FIXME: Use external program, implement later internal. cmd = 'cd ./misc && ./virt.py -d %s.%s -k %s | bkr job-submit -' %(self.major, self.minor, self.version) self.__submbkr(cmd, "Virt") def submFJ(self): if self.major != 5: genLogger.warn("Only For RHEL-5, skip Fujitsu test") return genLogger.info("Fujitsu submiting...") task = '--task=/kernel/misc/gdb-simple '\ '--task=/kernel/misc/module-load '\ '--task=/kernel/errata/%s.%s ' %(self.major, self.minor) task = '%s --task=/kernel/errata/%s.%s.z ' %(task, self.major, self.minor) wboard = '--whiteboard="Kernel Regression Testing for the Fujitsu Machine for Errata %s" ' %self.errataId version = '--nvr=%s ' %self.version extra = '--arch=ia64 --keyvalue="HOSTNAME=pq0-0.lab.bos.redhat.com"' bkrcommand = "%s %s %s %s %s" %(self.bkrfj, task, version, wboard, extra) self.__submbkrShirk(bkrcommand, "FJ") def submAll(self): if self.jobType2Tested['tps'] == 'y': self.submTps() if self.jobType2Tested['srpm'] == 'y': self.submSrpm() if self.jobType2Tested['tier1'] == 'y': self.submTier1() if self.jobType2Tested['tier2'] == 'y': self.submTier2() if self.jobType2Tested['regression'] == 'y': self.submRegression() if self.jobType2Tested['fj'] == 'y': self.submFJ() if self.jobType2Tested['virt'] == 'y': self.submVirt() def start(self): genLogger.info("Now going to submit jobs...") self.submAll() genLogger.info("All jobs submited :)") def __submbkrShirk(self, cmd, type): file = "./%s_tmp.xml" %type cmd_dry = "%s --dryrun > %s" %(cmd, file) genLogger.info(cmd_dry) self.__shellCmd(cmd_dry) if type == 'Tier2': self.__Tier2Shirk(file) if type == 'FJ': self.__FjShirk(file) cmd = "bkr job-submit %s" %file jobid = self.__submbkr(cmd, type) cmd = 'rm -f %s' %file genLogger.debug(cmd) self.__shellCmd(cmd) return jobid def __submbkr(self, cmd, type): genLogger.info(cmd) output = self.__shellCmd(cmd) pattern = re.compile(r'Submitted:.*(J:\d+).*\]') m = pattern.search(output) jobid = m.group(1) genLogger.info("%s submited, %s" %(type, jobid)) self.__add2jobState(type, jobid) return jobid def __Tier2Shirk(self, file): ''' Use /kernel/errata/xfstests to instead of /kernel/filesystems/xfs/xfstests or submit xfstests in another job ''' if self.yang == 'y': cmd = "sed -i '/\/kernel\/filesystems\/xfs\/xfstests/, +2d' %s" %file else: cmd = "sed -i 's/\/kernel\/filesystems\/xfs\/xfstests/\/kernel\/errata\/xfstests/g' %s" %file genLogger.debug(cmd) self.__shellCmd(cmd) def __FjShirk(self, file): ''' remove the virt host test from xml ''' cmd = ''' grep -n "xen DOM0" FJ_tmp.xml | awk -F ":" '{print $1}' ''' genLogger.debug(cmd) line1 = int(self.__shellCmd(cmd)) - 1 cmd = "sed -n '%d, ${/<\/recipeSet>/=}' %s" %(line1, file) genLogger.debug(cmd) line2 = int(self.__shellCmd(cmd)) cmd = "sed -i '%d,%d d' %s" %(line1, line2, file) genLogger.debug(cmd) self.__shellCmd(cmd) def __shellCmd(self, cmd): (ret, output) = commands.getstatusoutput(cmd) if ret: genLogger.error("========CMD ERR INFO=============") genLogger.error("======== %s =============" %cmd) genLogger.error(output) genLogger.error("=============================") exit(1) return output