diff --git a/Tools/PROCTools/python/RunTier0Tests.py b/Tools/PROCTools/python/RunTier0Tests.py index 10421ef843164b3a5dddccec56ab311ea4db4895..d950780fe5d27b5d092176dff50f46d4ceb3319d 100755 --- a/Tools/PROCTools/python/RunTier0Tests.py +++ b/Tools/PROCTools/python/RunTier0Tests.py @@ -24,7 +24,7 @@ formatter = logging.Formatter('%(levelname)-8s %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) -def RunCleanQTest(qtest,pwd,release,extraArg,CleanRunHeadDir,UniqID, doR2A=False): +def RunCleanQTest(qtest,pwd,release,extraArg,CleanRunHeadDir,UniqID, doR2A=False, trigConfig="2017"): q=qtest if q == 'q431' and doR2A: extraArg += " --steering='doRAWtoALL'" @@ -34,6 +34,9 @@ def RunCleanQTest(qtest,pwd,release,extraArg,CleanRunHeadDir,UniqID, doR2A=False elif q == 'q221': extraArg += " --conditionsTag all:OFLCOND-RUN12-SDR-25 " + if trigConfig == "2016": + extraArg += "--preExec \"all:from TriggerJobOpts.TriggerFlags import TriggerFlags as TF;TF.run2Config='2016'\"" + logging.info("Running clean in rel "+release+" \"Reco_tf.py --AMI "+q+" "+extraArg+"\"") #Check if CleanRunHead directory exists if not exist with a warning @@ -44,7 +47,7 @@ def RunCleanQTest(qtest,pwd,release,extraArg,CleanRunHeadDir,UniqID, doR2A=False logging.info("Finished clean \"Reco_tf.py --AMI "+q+"\"") pass -def RunPatchedQTest(qtest,pwd,release,theTestArea,extraArg, doR2A=False): +def RunPatchedQTest(qtest,pwd,release,theTestArea,extraArg, doR2A=False, trigConfig="2017"): q=qtest if q == 'q431' and doR2A: extraArg += " --steering='doRAWtoALL'" @@ -54,11 +57,15 @@ def RunPatchedQTest(qtest,pwd,release,theTestArea,extraArg, doR2A=False): elif q == 'q221': extraArg += " --conditionsTag all:OFLCOND-RUN12-SDR-25 " + if trigConfig == "2016": + extraArg += "--preExec \"all:from TriggerJobOpts.TriggerFlags import TriggerFlags as TF;TF.run2Config='2016'\"" + + logging.info("Running patched in rel "+release+" \"Reco_tf.py --AMI "+q+" "+extraArg+"\"") if 'WorkDir_DIR' in os.environ: cmake_build_dir = (os.environ['WorkDir_DIR']) - cmd = "cd "+pwd+"; source $AtlasSetup/scripts/asetup.sh "+release+" --testarea "+theTestArea+" >& /dev/null ; source "+cmake_build_dir+"/setup.sh ; mkdir -p run_"+q+"; cd run_"+q+"; Reco_tf.py --AMI="+q+" "+extraArg+" > "+q+".log 2>&1" + cmd = "cd "+pwd+"; source $AtlasSetup/scripts/asetup.sh "+release+" --testarea "+theTestArea+" >& /dev/null ; source "+cmake_build_dir+"/setup.sh ; mkdir -p run_"+q+"; cd run_"+q+"; Reco_tf.py --AMI="+q+" "+extraArg+" > "+q+".log 2>&1" subprocess.call(cmd,shell=True) else : cmd = "cd "+pwd+"; source $AtlasSetup/scripts/asetup.sh "+release+" --testarea "+theTestArea+" >& /dev/null ; mkdir -p run_"+q+"; cd run_"+q+"; Reco_tf.py --AMI="+q+" "+extraArg+" > "+q+".log 2>&1" @@ -74,39 +81,19 @@ def pwd(): def GetReleaseSetup(): - atlas_base_dir = os.environ['AtlasBaseDir'] - - if 'AtlasPatchVersion' in os.environ: - current_nightly = os.environ['AtlasPatchVersion'] - elif 'AtlasArea' in os.environ: - current_nightly = os.environ['AtlasArea'].split('/')[-1] - elif 'AtlasVersion' in os.environ: - current_nightly = os.environ['AtlasVersion'] - - if "rel" not in current_nightly: - platform = os.environ['GEANT4'].split('/')[-1] - setup="%s,%s"%(platform.replace("-", ","),current_nightly) - else : - latest_tag = "latest_copied_release" - if atlas_base_dir.split('/')[1] == 'cvmfs': - latest_tag = "latest" - latest_nightly = (os.environ['AtlasBaseDir'].split('rel')[:-1])[0]+latest_tag - elif atlas_base_dir.split('/')[1] == 'afs': - latest_nightly = (os.environ['AtlasArea'].split('rel')[:-1])[0]+latest_tag - - latest_nightly = subprocess.Popen(['/bin/bash', '-c',"ls -l "+latest_nightly], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[-1] - - release = os.environ['ATLAS_RELEASE_BASE'] - if 'afs' in release.split('/'): - release = release.split('/')[-1] - elif 'cvmfs' in release.split('/'): - release = release.split('/')[-2] + current_nightly = os.environ['AtlasBuildStamp'] + release_base=os.environ['AtlasBuildBranch'] + release_head=os.environ['Athena_VERSION'] + platform=os.environ['Athena_PLATFORM'] + project=os.environ['AtlasProject'] + builds_dir='/cvmfs/atlas-nightlies.cern.ch/repo/sw/'+release_base+'/*/'+project+'/'+release_head - platform = os.environ['GEANT4'].split('/')[-1] + latest_nightly = subprocess.Popen(['/bin/bash', '-c',"ls -ltr "+builds_dir+" | grep "+release_head], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split('/')[-3] - if current_nightly != latest_nightly: - logging.info("Please be aware that you are not testing your tags in the latest available nightly, which is "+latest_nightly ) - setup="%s,%s,%s"%(release,platform.replace("-", ","),current_nightly) + if current_nightly != latest_nightly: + logging.info("Please be aware that you are not testing your tags in the latest available nightly, which is "+latest_nightly ) + + setup="%s,%s,%s,Athena"%(release_base,platform.replace("-", ","),current_nightly) logging.info("Your tags will be tested in environment "+setup) @@ -150,7 +137,7 @@ def list_patch_packages(): ############################### ########### Was the q test successful? To check simply count the number of lines containing the string "successful run" -def QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqID): +def QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqID,RunPatchedOnly=False): logging.info("-----------------------------------------------------" ) logging.info("Did each step of the "+q+" test complete successfully?" ) @@ -159,14 +146,6 @@ def QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqID): _Test=True for step in qTestsToRun[q]: logging.info("") - cmd = "grep \"successful run\" " + test_dir + "/log."+str(step) - ref = subprocess.Popen(['/bin/bash', '-c',cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] - - if "successful run" in ref: - logging.info(step+" Reference test successful") - else : - logging.info(step+" Reference test failed") - _Test = False cmd = "grep \"successful run\" run_"+q+"/log."+str(step) test = subprocess.Popen(['/bin/bash', '-c',cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] @@ -177,6 +156,17 @@ def QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqID): logging.info(step+" Patched test failed") _Test = False + if RunPatchedOnly : continue # Skip checking reference test because in this mode the clean tests have not been run + + cmd = "grep \"successful run\" " + test_dir + "/log."+str(step) + ref = subprocess.Popen(['/bin/bash', '-c',cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] + + if "successful run" in ref: + logging.info(step+" Reference test successful") + else : + logging.info(step+" Reference test failed") + _Test = False + logging.info("") if _Test == True: logging.info("All "+q+" athena steps completed successfully") @@ -186,12 +176,15 @@ def QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqID): ############### Run Frozen Tier0 Policy Test -def RunFrozenTier0PolicyTest(q,inputFormat,maxEvents,CleanRunHeadDir,UniqID): +def RunFrozenTier0PolicyTest(q,inputFormat,maxEvents,CleanRunHeadDir,UniqID,RunPatchedOnly=False): logging.info("---------------------------------------------------------------------------------------" ) logging.info("Running "+q+" Frozen Tier0 Policy Test on "+inputFormat+" for "+str(maxEvents)+" events" ) clean_dir = CleanRunHeadDir+"/clean_run_"+q+"_"+UniqID + if RunPatchedOnly: #overwrite + clean_dir = '/afs/cern.ch/work/g/gencomm/public/referenceFiles/'+q + comparison_command = "acmd.py diff-root "+clean_dir+"/my"+inputFormat+".pool.root run_"+q+"/my"+inputFormat+".pool.root --error-mode resilient --ignore-leaves RecoTimingObj_p1_HITStoRDO_timings RecoTimingObj_p1_RAWtoESD_mems RecoTimingObj_p1_RAWtoESD_timings RAWtoESD_mems RAWtoESD_timings ESDtoAOD_mems ESDtoAOD_timings HITStoRDO_mems HITStoRDO_timings --entries "+str(maxEvents)+" > run_"+q+"/diff-root-"+q+"."+inputFormat+".log 2>&1" output,error = subprocess.Popen(['/bin/bash', '-c', comparison_command], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() @@ -379,6 +372,10 @@ def main(): parser.add_option("-c","--cleanDir" ,type="string" ,dest="cleanDir" ,default="/tmp/" ,help="specify the head directory for running the clean Tier0 tests. The default is /tmp/${USER}") parser.add_option("-r","--ref" ,type="string" ,dest="ref" ,default=None ,help="define a particular reference release") parser.add_option("-v","--val" ,type="string" ,dest="val" ,default=None ,help="define a particular validation release") + parser.add_option("-t","--trigRun2Config", type="string", dest="trigRun2Config_flag", default="2017" ,help="specify the value of run2Config variable used by trigger. Allowed values are \"2016\" and \"2017\" (default)") + + parser.add_option("-p","--patched" ,action="store_true" ,dest="patched_flag" ,default=False ,help="patched option will run q-tests just on your patched version of packages. Be warned! File output comparisons will only be performed against pre-defined reference files stored in the directory /afs/cern.ch/work/g/gencomm/public/referenceFiles and performance comparison tests will not be run.") + (options,args)=parser.parse_args() @@ -389,12 +386,21 @@ def main(): extraArg = options.extraArgs RunFast = options.fast_flag + RunPatchedOnly = options.patched_flag CleanRunHeadDir=options.cleanDir r2aMode = options.r2a_flag + trigRun2Config = options.trigRun2Config_flag + +# tct_ESD = "root://eosatlas//eos/atlas/atlascerngroupdisk/proj-sit/rtt/prod/tct/"+latest_nightly+"/"+release+"/"+platform+"/offline/Tier0ChainTests/"+q+"/myESD.pool.root" + +########### Is TriggerFlags.run2Config defined properly? + if trigRun2Config != "2016" and trigRun2Config != "2017": + logging.info("") + logging.info("Exit. The value of trigRun2Config can be \"2016\" or \"2017\"") + logging.info("") + sys.exit(0) + -# tct_ESD = "root://eosatlas//eos/atlas/atlascerngroupdisk/proj-sit/rtt/prod/tct/"+latest_nightly+"/"+release+"/"+platform+"/offline/Tier0ChainTests/"+q+"/myESD.pool.root" - - ########### Does the clean run head directory exist? if str(CleanRunHeadDir) == "/tmp/": myUser = os.environ['USER'] @@ -402,7 +408,16 @@ def main(): if os.path.exists(CleanRunHeadDir): logging.info("") - logging.info("The head directory for the output of the clean Tier0 q-tests will be "+CleanRunHeadDir) + if RunPatchedOnly: + logging.info("You are running in patched only mode whereby only q-tests against your build are being run.") + logging.info("In this mode ESD and AOD outputs are compared with pre-defined reference files found in the directory") + logging.info("/afs/cern.ch/work/g/gencomm/public/referenceFiles") + logging.info("") + if not os.path.exists('/afs/cern.ch/work/g/gencomm/public/referenceFiles'): + logging.error("Exit. Patched only mode can only be run on nodes with access to /afs/cern.ch/work/g/gencomm/public/referenceFiles") + sys.exit(0) + else: + logging.info("The head directory for the output of the clean Tier0 q-tests will be "+CleanRunHeadDir) logging.info("") else: logging.info("") @@ -435,8 +450,6 @@ def main(): if 'AtlasPatchVersion' not in os.environ and 'AtlasArea' not in os.environ and 'AtlasBaseDir' in os.environ: logging.info("Please be aware that you are running in a base release rather than a Tier0 release, where in general q-tests are not guaranteed to work.") - - ########### Define which q-tests to run @@ -476,17 +489,16 @@ def main(): # mysetup=mysetup+",builds" logging.info("------------------ Run Athena q-test jobs---------------" ) - if RunFast: for qtest in qTestsToRun: q=str(qtest) def mycleanqtest(): - RunCleanQTest(q,mypwd,cleanSetup,extraArg,CleanRunHeadDir,UniqName, doR2A=r2aMode) + RunCleanQTest(q,mypwd,cleanSetup,extraArg,CleanRunHeadDir,UniqName, doR2A=r2aMode, trigConfig=trigRun2Config) pass - + def mypatchedqtest(): - RunPatchedQTest(q,mypwd,mysetup,myTestArea,extraArg, doR2A=r2aMode) + RunPatchedQTest(q,mypwd,mysetup,myTestArea,extraArg, doR2A=r2aMode, trigConfig=trigRun2Config) pass mythreads[q+"_clean"] = threading.Thread(target=mycleanqtest) @@ -497,16 +509,34 @@ def main(): for thread in mythreads: mythreads[thread].join() + elif RunPatchedOnly: + + for qtest in qTestsToRun: + q=str(qtest) + + + def mypatchedqtest(): + RunPatchedQTest(q,mypwd,mysetup,myTestArea,extraArg, doR2A=r2aMode, trigConfig=trigRun2Config) + pass + + mythreads[q+"_patched"] = threading.Thread(target=mypatchedqtest) + mythreads[q+"_patched"].start() + + for thread in mythreads: + mythreads[thread].join() + + + else : for qtest in qTestsToRun: q=str(qtest) def mycleanqtest(): - RunCleanQTest(q,mypwd,cleanSetup,extraArg,CleanRunHeadDir,UniqName) + RunCleanQTest(q,mypwd,cleanSetup,extraArg,CleanRunHeadDir,UniqName,trigConfig=trigRun2Config) pass def mypatchedqtest(): - RunPatchedQTest(q,mypwd,mysetup,myTestArea,extraArg) + RunPatchedQTest(q,mypwd,mysetup,myTestArea,extraArg,trigConfig=trigRun2Config) pass mythreads[q+"_clean"] = threading.Thread(target=mycleanqtest) @@ -524,15 +554,17 @@ def main(): logging.info("-----------------------------------------------------" ) logging.info("----------- Post-processing of "+q+" Test -----------" ) - QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqName) + QTestsFailedOrPassed(q,qTestsToRun,CleanRunHeadDir,UniqName,RunPatchedOnly) + + RunFrozenTier0PolicyTest(q,"ESD",10,CleanRunHeadDir,UniqName,RunPatchedOnly) + + RunFrozenTier0PolicyTest(q,"AOD",20,CleanRunHeadDir,UniqName,RunPatchedOnly) + if RunPatchedOnly: continue # + if 'q221' in q: RunFrozenTier0PolicyTest(q,"RDO",10,CleanRunHeadDir,UniqName) - RunFrozenTier0PolicyTest(q,"ESD",10,CleanRunHeadDir,UniqName) - - RunFrozenTier0PolicyTest(q,"AOD",20,CleanRunHeadDir,UniqName) - RunTest(q,qTestsToRun,"CPU Time" ,"evtloop_time" ,"sec/event" ,4,0.4,CleanRunHeadDir,UniqName) RunTest(q,qTestsToRun,"Physical Memory","VmRSS" ,"kBytes" ,4,0.2,CleanRunHeadDir,UniqName)