2 |
|
from crab_logger import Logger |
3 |
|
from crab_exceptions import * |
4 |
|
from crab_util import * |
5 |
+ |
from BlackWhiteListParser import BlackWhiteListParser |
6 |
|
import common |
7 |
|
import Scram |
8 |
|
|
16 |
|
self._params = {} |
17 |
|
self.cfg_params = cfg_params |
18 |
|
|
19 |
+ |
# init BlackWhiteListParser |
20 |
+ |
self.blackWhiteListParser = BlackWhiteListParser(cfg_params) |
21 |
+ |
|
22 |
|
try: |
23 |
|
self.MaxTarBallSize = float(self.cfg_params['EDG.maxtarballsize']) |
24 |
|
except KeyError: |
44 |
|
self.fjrFileName = 'crab_fjr.xml' |
45 |
|
|
46 |
|
self.version = self.scram.getSWVersion() |
47 |
+ |
|
48 |
+ |
# |
49 |
+ |
# Try to block creation in case of arch/version mismatch |
50 |
+ |
# |
51 |
+ |
|
52 |
+ |
a = string.split(self.version, "_") |
53 |
+ |
|
54 |
+ |
if int(a[1]) == 1 and (int(a[2]) < 5 and self.executable_arch.find('slc4') == 0): |
55 |
+ |
msg = "Error: CMS does not support %s with %s architecture"%(self.version, self.executable_arch) |
56 |
+ |
raise CrabException(msg) |
57 |
+ |
if int(a[1]) == 1 and (int(a[2]) >= 5 and self.executable_arch.find('slc3') == 0): |
58 |
+ |
msg = "Error: CMS does not support %s with %s architecture"%(self.version, self.executable_arch) |
59 |
+ |
raise CrabException(msg) |
60 |
+ |
|
61 |
|
common.taskDB.setDict('codeVersion',self.version) |
62 |
|
self.setParam_('application', self.version) |
63 |
|
|
91 |
|
try: |
92 |
|
datasetpath_split = self.datasetPath.split("/") |
93 |
|
# standard style |
94 |
+ |
self.setParam_('datasetFull', self.datasetPath) |
95 |
|
if self.use_dbs_1 == 1 : |
96 |
|
self.setParam_('dataset', datasetpath_split[1]) |
97 |
|
self.setParam_('owner', datasetpath_split[-1]) |
319 |
|
if (self.sourceSeedVtx) : |
320 |
|
PsetEdit.vtxSeed("INPUTVTX") |
321 |
|
if (self.sourceSeedG4) : |
322 |
< |
self.PsetEdit.g4Seed("INPUTG4") |
322 |
> |
PsetEdit.g4Seed("INPUTG4") |
323 |
|
if (self.sourceSeedMix) : |
324 |
< |
self.PsetEdit.mixSeed("INPUTMIX") |
324 |
> |
PsetEdit.mixSeed("INPUTMIX") |
325 |
|
# add FrameworkJobReport to parameter-set |
326 |
|
PsetEdit.addCrabFJR(self.fjrFileName) |
327 |
|
PsetEdit.psetWriter(self.configFilename()) |
583 |
|
# screen output |
584 |
|
screenOutput = "List of jobs and available destination sites:\n\n" |
585 |
|
|
586 |
+ |
# keep trace of block with no sites to print a warning at the end |
587 |
+ |
noSiteBlock = [] |
588 |
+ |
bloskNoSite = [] |
589 |
+ |
|
590 |
|
blockCounter = 0 |
591 |
|
for block in blocks: |
592 |
|
if block in jobsOfBlock.keys() : |
593 |
|
blockCounter += 1 |
594 |
< |
screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(blockSites[block])) |
595 |
< |
|
594 |
> |
screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block))) |
595 |
> |
if len(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)) == 0: |
596 |
> |
noSiteBlock.append( spanRanges(jobsOfBlock[block]) ) |
597 |
> |
bloskNoSite.append( blockCounter ) |
598 |
> |
|
599 |
|
common.logger.message(screenOutput) |
600 |
+ |
if len(noSiteBlock) > 0 and len(bloskNoSite) > 0: |
601 |
+ |
msg = 'WARNING: No sites are hosting any part of data for block:\n ' |
602 |
+ |
virgola = "" |
603 |
+ |
if len(bloskNoSite) > 1: |
604 |
+ |
virgola = "," |
605 |
+ |
for block in bloskNoSite: |
606 |
+ |
msg += ' ' + str(block) + virgola |
607 |
+ |
msg += '\n Related jobs:\n ' |
608 |
+ |
virgola = "" |
609 |
+ |
if len(noSiteBlock) > 1: |
610 |
+ |
virgola = "," |
611 |
+ |
for range_jobs in noSiteBlock: |
612 |
+ |
msg += str(range_jobs) + virgola |
613 |
+ |
msg += '\n will not be submitted and this block of data can not be analyzed!\n' |
614 |
+ |
common.logger.message(msg) |
615 |
|
|
616 |
|
self.list_of_args = list_of_lists |
617 |
|
return |
879 |
|
|
880 |
|
## OLI_Daniele at this level middleware already known |
881 |
|
|
841 |
– |
txt += 'echo "### Firtst set SCRAM ARCH and BUILD_ARCH ###"\n' |
842 |
– |
txt += 'echo "Setting SCRAM_ARCH='+self.executable_arch+'"\n' |
843 |
– |
txt += 'export SCRAM_ARCH='+self.executable_arch+'\n' |
844 |
– |
txt += 'export BUILD_ARCH='+self.executable_arch+'\n' |
882 |
|
txt += 'if [ $middleware == LCG ]; then \n' |
883 |
+ |
txt += ' echo "### First set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n' |
884 |
+ |
txt += ' export SCRAM_ARCH='+self.executable_arch+'\n' |
885 |
+ |
txt += ' export BUILD_ARCH='+self.executable_arch+'\n' |
886 |
|
txt += self.wsSetupCMSLCGEnvironment_() |
887 |
|
txt += 'elif [ $middleware == OSG ]; then\n' |
888 |
|
txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n' |
901 |
|
txt += ' echo "Change to working directory: $WORKING_DIR"\n' |
902 |
|
txt += ' cd $WORKING_DIR\n' |
903 |
|
txt += self.wsSetupCMSOSGEnvironment_() |
904 |
+ |
txt += ' echo "### Set SCRAM ARCH to ' + self.executable_arch + ' ###"\n' |
905 |
+ |
txt += ' export SCRAM_ARCH='+self.executable_arch+'\n' |
906 |
|
txt += 'fi\n' |
907 |
|
|
908 |
|
# Prepare JobType-specific part |
1141 |
|
def executableArgs(self): |
1142 |
|
if self.scriptExe:#CarlosDaniele |
1143 |
|
return self.scriptExe + " $NJob" |
1144 |
< |
else: |
1145 |
< |
return " -p pset.cfg" |
1144 |
> |
else: |
1145 |
> |
# if >= CMSSW_1_5_X, add -e |
1146 |
> |
version_array = self.scram.getSWVersion().split('_') |
1147 |
> |
major = 0 |
1148 |
> |
minor = 0 |
1149 |
> |
try: |
1150 |
> |
major = int(version_array[1]) |
1151 |
> |
minor = int(version_array[2]) |
1152 |
> |
except: |
1153 |
> |
msg = "Cannot parse CMSSW version string: " + "_".join(version_array) + " for major and minor release number!" |
1154 |
> |
raise CrabException(msg) |
1155 |
> |
if major >= 1 and minor >= 5 : |
1156 |
> |
return " -e -p pset.cfg" |
1157 |
> |
else: |
1158 |
> |
return " -p pset.cfg" |
1159 |
|
|
1160 |
|
def inputSandbox(self, nj): |
1161 |
|
""" |
1204 |
|
txt += '# directory content\n' |
1205 |
|
txt += 'ls \n' |
1206 |
|
|
1207 |
< |
for fileWithSuffix in (self.output_file+self.output_file_sandbox): |
1207 |
> |
txt += 'output_exit_status=0\n' |
1208 |
> |
|
1209 |
> |
for fileWithSuffix in (self.output_file_sandbox): |
1210 |
|
output_file_num = self.numberFile_(fileWithSuffix, '$NJob') |
1211 |
|
txt += '\n' |
1212 |
|
txt += '# check output file\n' |
1156 |
– |
# txt += 'ls '+fileWithSuffix+'\n' |
1157 |
– |
# txt += 'ls_result=$?\n' |
1213 |
|
txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n' |
1214 |
< |
txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n' |
1214 |
> |
txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA\n' |
1215 |
> |
txt += ' cp $RUNTIME_AREA/'+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n' |
1216 |
|
txt += 'else\n' |
1217 |
< |
txt += ' exit_status=60302\n' |
1218 |
< |
txt += ' echo "ERROR: Problem with output file '+fileWithSuffix+'"\n' |
1217 |
> |
txt += ' exit_status=60302\n' |
1218 |
> |
txt += ' echo "ERROR: Problem with output file '+fileWithSuffix+'"\n' |
1219 |
> |
if common.scheduler.boss_scheduler_name == 'condor_g': |
1220 |
> |
txt += ' if [ $middleware == OSG ]; then \n' |
1221 |
> |
txt += ' echo "prepare dummy output file"\n' |
1222 |
> |
txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n' |
1223 |
> |
txt += ' fi \n' |
1224 |
> |
txt += 'fi\n' |
1225 |
> |
|
1226 |
> |
for fileWithSuffix in (self.output_file): |
1227 |
> |
output_file_num = self.numberFile_(fileWithSuffix, '$NJob') |
1228 |
> |
txt += '\n' |
1229 |
> |
txt += '# check output file\n' |
1230 |
> |
txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n' |
1231 |
> |
txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA\n' |
1232 |
> |
txt += ' cp $RUNTIME_AREA/'+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n' |
1233 |
> |
txt += 'else\n' |
1234 |
> |
txt += ' exit_status=60302\n' |
1235 |
> |
txt += ' echo "ERROR: Problem with output file '+fileWithSuffix+'"\n' |
1236 |
> |
txt += ' echo "JOB_EXIT_STATUS = $exit_status"\n' |
1237 |
> |
txt += ' output_exit_status=$exit_status\n' |
1238 |
|
if common.scheduler.boss_scheduler_name == 'condor_g': |
1239 |
|
txt += ' if [ $middleware == OSG ]; then \n' |
1240 |
|
txt += ' echo "prepare dummy output file"\n' |
1244 |
|
file_list = [] |
1245 |
|
for fileWithSuffix in (self.output_file): |
1246 |
|
file_list.append(self.numberFile_(fileWithSuffix, '$NJob')) |
1247 |
+ |
|
1248 |
|
txt += 'file_list="'+string.join(file_list,' ')+'"\n' |
1173 |
– |
|
1249 |
|
txt += 'cd $RUNTIME_AREA\n' |
1175 |
– |
#### FEDE this is the cleanEnv function |
1176 |
– |
### OLI_DANIELE |
1177 |
– |
#txt += 'if [ $middleware == OSG ]; then\n' |
1178 |
– |
#txt += ' cd $RUNTIME_AREA\n' |
1179 |
– |
#txt += ' echo "Remove working directory: $WORKING_DIR"\n' |
1180 |
– |
#txt += ' /bin/rm -rf $WORKING_DIR\n' |
1181 |
– |
#txt += ' if [ -d $WORKING_DIR ] ;then\n' |
1182 |
– |
#txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n' |
1183 |
– |
#txt += ' echo "JOB_EXIT_STATUS = 60999"\n' |
1184 |
– |
#txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n' |
1185 |
– |
#txt += ' dumpStatus $RUNTIME_AREA/$repo\n' |
1186 |
– |
#txt += ' rm -f $RUNTIME_AREA/$repo \n' |
1187 |
– |
#txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n' |
1188 |
– |
#txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n' |
1189 |
– |
#txt += ' fi\n' |
1190 |
– |
#txt += 'fi\n' |
1191 |
– |
#txt += '\n' |
1192 |
– |
|
1193 |
– |
|
1250 |
|
return txt |
1251 |
|
|
1252 |
|
def numberFile_(self, file, txt): |
1277 |
|
self.version + \ |
1278 |
|
'", other.GlueHostApplicationSoftwareRunTimeEnvironment)' |
1279 |
|
## SL add requirement for OS version only if SL4 |
1280 |
< |
reSL4 = re.compile( r'slc4' ) |
1281 |
< |
if self.executable_arch and reSL4.search(self.executable_arch): |
1282 |
< |
req='Member("VO-cms-' + \ |
1280 |
> |
#reSL4 = re.compile( r'slc4' ) |
1281 |
> |
if self.executable_arch: # and reSL4.search(self.executable_arch): |
1282 |
> |
req+=' && Member("VO-cms-' + \ |
1283 |
|
self.executable_arch + \ |
1284 |
|
'", other.GlueHostApplicationSoftwareRunTimeEnvironment)' |
1285 |
|
|
1393 |
|
""" |
1394 |
|
|
1395 |
|
txt = '' |
1340 |
– |
txt += 'echo "Modify Job Report" \n' |
1341 |
– |
#txt += 'chmod a+x $RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n' |
1342 |
– |
################ FEDE FOR DBS2 ############################################# |
1343 |
– |
txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n' |
1344 |
– |
############################################################################# |
1396 |
|
try: |
1397 |
|
publish_data = int(self.cfg_params['USER.publish_data']) |
1398 |
|
except KeyError: |
1399 |
|
publish_data = 0 |
1400 |
+ |
if (publish_data == 1): |
1401 |
+ |
txt += 'echo "Modify Job Report" \n' |
1402 |
+ |
#txt += 'chmod a+x $RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n' |
1403 |
+ |
################ FEDE FOR DBS2 ############################################# |
1404 |
+ |
txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n' |
1405 |
+ |
############################################################################# |
1406 |
+ |
#try: |
1407 |
+ |
# publish_data = int(self.cfg_params['USER.publish_data']) |
1408 |
+ |
#except KeyError: |
1409 |
+ |
# publish_data = 0 |
1410 |
|
|
1411 |
< |
txt += 'if [ -z "$SE" ]; then\n' |
1412 |
< |
txt += ' SE="" \n' |
1413 |
< |
txt += 'fi \n' |
1414 |
< |
txt += 'if [ -z "$SE_PATH" ]; then\n' |
1415 |
< |
txt += ' SE_PATH="" \n' |
1416 |
< |
txt += 'fi \n' |
1417 |
< |
txt += 'echo "SE = $SE"\n' |
1418 |
< |
txt += 'echo "SE_PATH = $SE_PATH"\n' |
1411 |
> |
txt += 'if [ -z "$SE" ]; then\n' |
1412 |
> |
txt += ' SE="" \n' |
1413 |
> |
txt += 'fi \n' |
1414 |
> |
txt += 'if [ -z "$SE_PATH" ]; then\n' |
1415 |
> |
txt += ' SE_PATH="" \n' |
1416 |
> |
txt += 'fi \n' |
1417 |
> |
txt += 'echo "SE = $SE"\n' |
1418 |
> |
txt += 'echo "SE_PATH = $SE_PATH"\n' |
1419 |
|
|
1420 |
< |
if (publish_data == 1): |
1420 |
> |
#if (publish_data == 1): |
1421 |
|
#processedDataset = self.cfg_params['USER.processed_datasetname'] |
1422 |
|
processedDataset = self.cfg_params['USER.publish_data_name'] |
1423 |
|
txt += 'ProcessedDataset='+processedDataset+'\n' |
1447 |
|
txt += ' mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n' |
1448 |
|
txt += 'fi\n' |
1449 |
|
else: |
1450 |
< |
txt += 'ProcessedDataset=no_data_to_publish \n' |
1450 |
> |
txt += 'echo "no data publication required"\n' |
1451 |
> |
#txt += 'ProcessedDataset=no_data_to_publish \n' |
1452 |
|
#### FEDE: added slash in LFN ############## |
1453 |
< |
txt += 'FOR_LFN=/local/ \n' |
1454 |
< |
txt += 'echo "ProcessedDataset = $ProcessedDataset"\n' |
1455 |
< |
txt += 'echo "FOR_LFN = $FOR_LFN" \n' |
1453 |
> |
#txt += 'FOR_LFN=/local/ \n' |
1454 |
> |
#txt += 'echo "ProcessedDataset = $ProcessedDataset"\n' |
1455 |
> |
#txt += 'echo "FOR_LFN = $FOR_LFN" \n' |
1456 |
|
return txt |
1457 |
|
|
1458 |
|
def cleanEnv(self): |
1495 |
|
for e in old: |
1496 |
|
nd[e]=0 |
1497 |
|
return nd.keys() |
1498 |
+ |
|
1499 |
+ |
|
1500 |
+ |
def checkOut(self, limit): |
1501 |
+ |
""" |
1502 |
+ |
check the dimension of the output files |
1503 |
+ |
""" |
1504 |
+ |
txt = 'echo "*****************************************"\n' |
1505 |
+ |
txt += 'echo "** Starting output sandbox limit check **"\n' |
1506 |
+ |
txt += 'echo "*****************************************"\n' |
1507 |
+ |
allOutFiles = "" |
1508 |
+ |
listOutFiles = [] |
1509 |
+ |
for fileOut in (self.output_file+self.output_file_sandbox): |
1510 |
+ |
if fileOut.find('crab_fjr') == -1: |
1511 |
+ |
allOutFiles = allOutFiles + " " + self.numberFile_(fileOut, '$NJob') |
1512 |
+ |
listOutFiles.append(self.numberFile_(fileOut, '$NJob')) |
1513 |
+ |
txt += 'echo "OUTPUT files: '+str(allOutFiles)+'";\n' |
1514 |
+ |
txt += 'ls -gGhrta;\n' |
1515 |
+ |
txt += 'sum=0;\n' |
1516 |
+ |
txt += 'for file in '+str(allOutFiles)+' ; do\n' |
1517 |
+ |
txt += ' if [ -e $file ]; then\n' |
1518 |
+ |
txt += ' tt=`ls -gGrta $file | awk \'{ print $3 }\'`\n' |
1519 |
+ |
txt += ' sum=`expr $sum + $tt`\n' |
1520 |
+ |
txt += ' else\n' |
1521 |
+ |
txt += ' echo "WARNING: output file $file not found!"\n' |
1522 |
+ |
txt += ' fi\n' |
1523 |
+ |
txt += 'done\n' |
1524 |
+ |
txt += 'echo "Total Output dimension: $sum";\n' |
1525 |
+ |
txt += 'limit='+str(limit)+';\n' |
1526 |
+ |
txt += 'echo "OUTPUT FILES LIMIT SET TO: $limit";\n' |
1527 |
+ |
txt += 'if [ $limit -lt $sum ]; then\n' |
1528 |
+ |
txt += ' echo "WARNING: output files have to big size - something will be lost;"\n' |
1529 |
+ |
txt += ' echo " checking the output file sizes..."\n' |
1530 |
+ |
""" |
1531 |
+ |
txt += ' dim=0;\n' |
1532 |
+ |
txt += ' exclude=0;\n' |
1533 |
+ |
txt += ' for files in '+str(allOutFiles)+' ; do\n' |
1534 |
+ |
txt += ' sumTemp=0;\n' |
1535 |
+ |
txt += ' for file2 in '+str(allOutFiles)+' ; do\n' |
1536 |
+ |
txt += ' if [ $file != $file2 ]; then\n' |
1537 |
+ |
txt += ' tt=`ls -gGrta $file2 | awk \'{ print $3 }\';`\n' |
1538 |
+ |
txt += ' sumTemp=`expr $sumTemp + $tt`;\n' |
1539 |
+ |
txt += ' fi\n' |
1540 |
+ |
txt += ' done\n' |
1541 |
+ |
txt += ' if [ $sumTemp -lt $limit ]; then\n' |
1542 |
+ |
txt += ' if [ $dim -lt $sumTemp ]; then\n' |
1543 |
+ |
txt += ' dim=$sumTemp;\n' |
1544 |
+ |
txt += ' exclude=$file;\n' |
1545 |
+ |
txt += ' fi\n' |
1546 |
+ |
txt += ' fi\n' |
1547 |
+ |
txt += ' done\n' |
1548 |
+ |
txt += ' echo "Dimension calculated: $dim"; echo "File to exclude: $exclude";\n' |
1549 |
+ |
""" |
1550 |
+ |
txt += ' tot=0;\n' |
1551 |
+ |
txt += ' for file2 in '+str(allOutFiles)+' ; do\n' |
1552 |
+ |
txt += ' tt=`ls -gGrta $file2 | awk \'{ print $3 }\';`\n' |
1553 |
+ |
txt += ' tot=`expr $tot + $tt`;\n' |
1554 |
+ |
txt += ' if [ $limit -lt $tot ]; then\n' |
1555 |
+ |
txt += ' tot=`expr $tot - $tt`;\n' |
1556 |
+ |
txt += ' fileLast=$file;\n' |
1557 |
+ |
txt += ' break;\n' |
1558 |
+ |
txt += ' fi\n' |
1559 |
+ |
txt += ' done\n' |
1560 |
+ |
txt += ' echo "Dimension calculated: $tot"; echo "First file to exclude: $file";\n' |
1561 |
+ |
txt += ' flag=0;\n' |
1562 |
+ |
txt += ' for filess in '+str(allOutFiles)+' ; do\n' |
1563 |
+ |
txt += ' if [ $fileLast = $filess ]; then\n' |
1564 |
+ |
txt += ' flag=1;\n' |
1565 |
+ |
txt += ' fi\n' |
1566 |
+ |
txt += ' if [ $flag -eq 1 ]; then\n' |
1567 |
+ |
txt += ' rm -f $filess;\n' |
1568 |
+ |
txt += ' fi\n' |
1569 |
+ |
txt += ' done\n' |
1570 |
+ |
txt += ' ls -agGhrt;\n' |
1571 |
+ |
txt += ' echo "WARNING: output files are too big in dimension: can not put in the output_sandbox.";\n' |
1572 |
+ |
txt += ' echo "JOB_EXIT_STATUS = 70000";\n' |
1573 |
+ |
txt += ' exit_status=70000;\n' |
1574 |
+ |
txt += 'else' |
1575 |
+ |
txt += ' echo "Total Output dimension $sum is fine.";\n' |
1576 |
+ |
txt += 'fi\n' |
1577 |
+ |
txt += 'echo "*****************************************"\n' |
1578 |
+ |
txt += 'echo "*** Ending output sandbox limit check ***"\n' |
1579 |
+ |
txt += 'echo "*****************************************"\n' |
1580 |
+ |
return txt |