ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.397
Committed: Thu Aug 8 08:01:36 2013 UTC (11 years, 8 months ago) by belforte
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_9_0, CRAB_2_9_0_pre2
Changes since 1.396: +4 -3 lines
Log Message:
do not allow to exceed 100MB ISB, users with a real neeed now have Crab3: https://savannah.cern.ch/bugs/index.php?102210

File Contents

# User Rev Content
1 spiga 1.358
2 belforte 1.397 __revision__ = "$Id: cms_cmssw.py,v 1.396 2013/04/02 13:53:44 belforte Exp $"
3     __version__ = "$Revision: 1.396 $"
4 spiga 1.358
5 slacapra 1.1 from JobType import JobType
6     from crab_exceptions import *
7     from crab_util import *
8     import common
9 ewv 1.363 import re
10 slacapra 1.1 import Scram
11 spiga 1.269 from Splitter import JobSplitter
12 ewv 1.355 from Downloader import Downloader
13 ewv 1.363 try:
14 fanzago 1.360 import json
15     except:
16     import simplejson as json
17 slacapra 1.1
18 spiga 1.293 from IMProv.IMProvNode import IMProvNode
19 ewv 1.355 from IMProv.IMProvLoader import loadIMProvFile
20 belforte 1.388 from WMCore.SiteScreening.BlackWhiteListParser import SEBlackWhiteListParser
21    
22 slacapra 1.105 import os, string, glob
23 ewv 1.355 from xml.dom import pulldom
24 slacapra 1.1
25     class Cmssw(JobType):
26 spiga 1.208 def __init__(self, cfg_params, ncjobs,skip_blocks, isNew):
27 slacapra 1.1 JobType.__init__(self, 'CMSSW')
28 spiga 1.304 common.logger.debug('CMSSW::__init__')
29 spiga 1.208 self.skip_blocks = skip_blocks
30 farinafa 1.346 self.argsList = 2
31 spiga 1.315 self.NumEvents=0
32 gutsche 1.3 self._params = {}
33     self.cfg_params = cfg_params
34 fanzago 1.368 ### FOR MULTI ###
35 fanzago 1.360 self.var_filter=''
36 ewv 1.254
37 spiga 1.234 ### Temporary patch to automatically skip the ISB size check:
38 ewv 1.319 self.server = self.cfg_params.get('CRAB.server_name',None) or \
39     self.cfg_params.get('CRAB.use_server',0)
40 mcinquil 1.340 self.local = common.scheduler.name().upper() in ['LSF','CAF','CONDOR','SGE','PBS']
41 ewv 1.250 size = 9.5
42 belforte 1.395 if self.server or \
43     common.scheduler.name().upper() == 'REMOTEGLIDEIN' :
44 spiga 1.366 size = 100
45 spiga 1.365 elif self.local:
46     size = 9999999
47 belforte 1.397
48     self.MaxTarBallSize = size
49 gutsche 1.72
50 gutsche 1.44 # number of jobs requested to be created, limit obj splitting
51 gutsche 1.38 self.ncjobs = ncjobs
52    
53 slacapra 1.1 self.scram = Scram.Scram(cfg_params)
54     self.additional_inbox_files = []
55     self.scriptExe = ''
56     self.executable = ''
57 slacapra 1.71 self.executable_arch = self.scram.getArch()
58 spiga 1.320 self.tgz_name = 'default.tgz'
59 corvo 1.56 self.scriptName = 'CMSSW.sh'
60 ewv 1.192 self.pset = ''
61 spiga 1.187 self.datasetPath = ''
62 gutsche 1.3
63 spiga 1.300 self.tgzNameWithPath = common.work_space.pathForTgz()+self.tgz_name
64 gutsche 1.50 # set FJR file name
65     self.fjrFileName = 'crab_fjr.xml'
66    
67 slacapra 1.1 self.version = self.scram.getSWVersion()
68 spiga 1.304 common.logger.log(10-1,"CMSSW version is: "+str(self.version))
69 spiga 1.324 version_array = self.version.split('_')
70     self.CMSSW_major = 0
71     self.CMSSW_minor = 0
72     self.CMSSW_patch = 0
73 ewv 1.182 try:
74 spiga 1.324 self.CMSSW_major = int(version_array[1])
75     self.CMSSW_minor = int(version_array[2])
76     self.CMSSW_patch = int(version_array[3])
77 ewv 1.182 except:
78 ewv 1.184 msg = "Cannot parse CMSSW version string: " + self.version + " for major and minor release number!"
79 ewv 1.182 raise CrabException(msg)
80    
81 ewv 1.334 if self.CMSSW_major < 2 or (self.CMSSW_major == 2 and self.CMSSW_minor < 1):
82     msg = "CRAB supports CMSSW >= 2_1_x only. Use an older CRAB version."
83 ewv 1.276 raise CrabException(msg)
84     """
85     As CMSSW versions are dropped we can drop more code:
86 ewv 1.334 2.x dropped: drop check for lumi range setting
87 ewv 1.276 """
88 ewv 1.355 self.checkCMSSWVersion()
89 slacapra 1.1 ### collect Data cards
90 gutsche 1.66
91 fanzago 1.221 ### Temporary: added to remove input file control in the case of PU
92 farinafa 1.224 self.dataset_pu = cfg_params.get('CMSSW.dataset_pu', None)
93 ewv 1.226
94 fanzago 1.368 if not cfg_params.has_key('CMSSW.datasetpath'):
95     msg = "Error: datasetpath not defined in the section [CMSSW] of crab.cfg file "
96 spiga 1.236 raise CrabException(msg)
97 fanzago 1.368 else:
98     tmp = cfg_params['CMSSW.datasetpath']
99     common.logger.log(10-1, "CMSSW::CMSSW(): datasetPath = "+tmp)
100     if string.lower(tmp)=='none':
101     self.datasetPath = None
102     self.selectNoInput = 1
103     self.primaryDataset = 'null'
104     else:
105     self.datasetPath = tmp
106     self.selectNoInput = 0
107     ll = len(self.datasetPath.split("/"))
108 belforte 1.381 if (ll != 4) or self.datasetPath[0] != '/' or self.datasetPath[-1] == '/':
109 fanzago 1.368 msg = 'Your datasetpath has a invalid format ' + self.datasetPath + '\n'
110 belforte 1.380 msg += 'Expected a path in format /PRIMARY/PROCESSED/TIER'
111 fanzago 1.368 raise CrabException(msg)
112     self.primaryDataset = self.datasetPath.split("/")[1]
113     self.dataTier = self.datasetPath.split("/")[2]
114 gutsche 1.5
115 ewv 1.326 # Analysis dataset is primary/processed/tier/definition
116 ewv 1.330 self.ads = False
117     if self.datasetPath:
118     self.ads = len(self.datasetPath.split("/")) > 4
119 spiga 1.354 self.lumiMask = self.cfg_params.get('CMSSW.lumi_mask',None)
120 ewv 1.356 self.lumiParams = self.cfg_params.get('CMSSW.total_number_of_lumis',None) or \
121     self.cfg_params.get('CMSSW.lumis_per_job',None)
122 spiga 1.358
123 ewv 1.327 # FUTURE: Can remove this check
124     if self.ads and self.CMSSW_major < 3:
125     common.logger.info('Warning: Analysis dataset support is incomplete in CMSSW 2_x.')
126     common.logger.info(' Only file level, not lumi level, granularity is supported.')
127    
128 spiga 1.288 self.debugWrap=''
129 fanzago 1.285 self.debug_wrapper = int(cfg_params.get('USER.debug_wrapper',0))
130     if self.debug_wrapper == 1: self.debugWrap='--debug'
131 slacapra 1.291
132 slacapra 1.1 ## now the application
133 ewv 1.313 self.managedGenerators = ['madgraph', 'comphep', 'lhe']
134 ewv 1.258 self.generator = cfg_params.get('CMSSW.generator','pythia').lower()
135 slacapra 1.153 self.executable = cfg_params.get('CMSSW.executable','cmsRun')
136 spiga 1.305 common.logger.log(10-1, "CMSSW::CMSSW(): executable = "+self.executable)
137 slacapra 1.1
138 slacapra 1.153 if not cfg_params.has_key('CMSSW.pset'):
139 slacapra 1.1 raise CrabException("PSet file missing. Cannot run cmsRun ")
140 slacapra 1.153 self.pset = cfg_params['CMSSW.pset']
141 spiga 1.305 common.logger.log(10-1, "Cmssw::Cmssw(): PSet file = "+self.pset)
142 slacapra 1.153 if self.pset.lower() != 'none' :
143     if (not os.path.exists(self.pset)):
144     raise CrabException("User defined PSet file "+self.pset+" does not exist")
145     else:
146     self.pset = None
147 slacapra 1.1
148     # output files
149 slacapra 1.53 ## stuff which must be returned always via sandbox
150     self.output_file_sandbox = []
151    
152     # add fjr report by default via sandbox
153     self.output_file_sandbox.append(self.fjrFileName)
154    
155     # other output files to be returned via sandbox or copied to SE
156 mcinquil 1.216 outfileflag = False
157 slacapra 1.153 self.output_file = []
158     tmp = cfg_params.get('CMSSW.output_file',None)
159     if tmp :
160 slacapra 1.207 self.output_file = [x.strip() for x in tmp.split(',')]
161 mcinquil 1.216 outfileflag = True #output found
162 slacapra 1.1
163 slacapra 1.153 self.scriptExe = cfg_params.get('USER.script_exe',None)
164     if self.scriptExe :
165 slacapra 1.176 if not os.path.isfile(self.scriptExe):
166     msg ="ERROR. file "+self.scriptExe+" not found"
167     raise CrabException(msg)
168     self.additional_inbox_files.append(string.strip(self.scriptExe))
169 slacapra 1.70
170 spiga 1.314 self.AdditionalArgs = cfg_params.get('USER.script_arguments',None)
171     if self.AdditionalArgs : self.AdditionalArgs = string.replace(self.AdditionalArgs,',',' ')
172    
173 spiga 1.42 if self.datasetPath == None and self.pset == None and self.scriptExe == '' :
174 slacapra 1.176 msg ="Error. script_exe not defined"
175     raise CrabException(msg)
176 spiga 1.42
177 ewv 1.226 # use parent files...
178 spiga 1.269 self.useParent = int(self.cfg_params.get('CMSSW.use_parent',0))
179 spiga 1.204
180 slacapra 1.1 ## additional input files
181 slacapra 1.153 if cfg_params.has_key('USER.additional_input_files'):
182 slacapra 1.29 tmpAddFiles = string.split(cfg_params['USER.additional_input_files'],',')
183 slacapra 1.70 for tmp in tmpAddFiles:
184     tmp = string.strip(tmp)
185     dirname = ''
186     if not tmp[0]=="/": dirname = "."
187 corvo 1.85 files = []
188     if string.find(tmp,"*")>-1:
189     files = glob.glob(os.path.join(dirname, tmp))
190     if len(files)==0:
191     raise CrabException("No additional input file found with this pattern: "+tmp)
192     else:
193     files.append(tmp)
194 slacapra 1.70 for file in files:
195     if not os.path.exists(file):
196     raise CrabException("Additional input file not found: "+file)
197 slacapra 1.45 pass
198 slacapra 1.105 self.additional_inbox_files.append(string.strip(file))
199 slacapra 1.1 pass
200     pass
201 spiga 1.304 common.logger.debug("Additional input files: "+str(self.additional_inbox_files))
202 slacapra 1.153 pass
203 gutsche 1.3
204 gutsche 1.35
205 ewv 1.160 ## New method of dealing with seeds
206     self.incrementSeeds = []
207     self.preserveSeeds = []
208     if cfg_params.has_key('CMSSW.preserve_seeds'):
209     tmpList = cfg_params['CMSSW.preserve_seeds'].split(',')
210     for tmp in tmpList:
211     tmp.strip()
212     self.preserveSeeds.append(tmp)
213     if cfg_params.has_key('CMSSW.increment_seeds'):
214     tmpList = cfg_params['CMSSW.increment_seeds'].split(',')
215     for tmp in tmpList:
216     tmp.strip()
217     self.incrementSeeds.append(tmp)
218    
219 fanzago 1.318 # Copy/return/publish
220 slacapra 1.153 self.copy_data = int(cfg_params.get('USER.copy_data',0))
221     self.return_data = int(cfg_params.get('USER.return_data',0))
222 fanzago 1.318 self.publish_data = int(cfg_params.get('USER.publish_data',0))
223     if (self.publish_data == 1):
224     if not cfg_params.has_key('USER.publish_data_name'):
225     raise CrabException('Cannot publish output data, because you did not specify USER.publish_data_name parameter in the crab.cfg file')
226     else:
227     self.processedDataset = cfg_params['USER.publish_data_name']
228 ewv 1.276
229     self.conf = {}
230     self.conf['pubdata'] = None
231 spiga 1.269 # number of jobs requested to be created, limit obj splitting DD
232 slacapra 1.1 #DBSDLS-start
233 ewv 1.131 ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
234 slacapra 1.1 self.maxEvents=0 # max events available ( --> check the requested nb. of evts in Creator.py)
235     self.DBSPaths={} # all dbs paths requested ( --> input to the site local discovery script)
236 gutsche 1.35 self.jobDestination=[] # Site destination(s) for each job (list of lists)
237 slacapra 1.1 ## Perform the data location and discovery (based on DBS/DLS)
238 slacapra 1.9 ## SL: Don't if NONE is specified as input (pythia use case)
239 gutsche 1.35 blockSites = {}
240 spiga 1.342 #wmbs
241     self.automation = int(self.cfg_params.get('WMBS.automation',0))
242     if self.automation == 0:
243 belforte 1.388 self.seListParser= SEBlackWhiteListParser(logger=common.logger())
244 spiga 1.342 if self.datasetPath:
245     blockSites = self.DataDiscoveryAndLocation(cfg_params)
246     #DBSDLS-end
247 belforte 1.388 # insert here site override from crab.cfg
248     # note that b/w lists will still be applied
249     if cfg_params.has_key('GRID.data_location_override'):
250     sitesOverride = cfg_params['GRID.data_location_override'].split(',')
251     common.logger.info("DataSite overridden by user to: %s" % sitesOverride)
252     seOverride = self.seListParser.expandList(sitesOverride)
253     common.logger.info("DataLocation overridden by user to: %s\n" % seOverride)
254     for block in blockSites.keys():
255     blockSites[block] = seOverride
256    
257 spiga 1.342 self.conf['blockSites']=blockSites
258 belforte 1.388
259 spiga 1.342 ## Select Splitting
260     splitByRun = int(cfg_params.get('CMSSW.split_by_run',0))
261 ewv 1.347
262 spiga 1.342 if self.selectNoInput:
263     if self.pset == None:
264     self.algo = 'ForScript'
265     else:
266     self.algo = 'NoInput'
267     self.conf['managedGenerators']=self.managedGenerators
268     self.conf['generator']=self.generator
269 ewv 1.356 elif self.ads or self.lumiMask or self.lumiParams:
270 spiga 1.342 self.algo = 'LumiBased'
271 ewv 1.359 if splitByRun:
272     msg = "Cannot combine split by run with lumi_mask, ADS, " \
273     "or lumis_per_job. Use split by lumi mode instead."
274     raise CrabException(msg)
275    
276 spiga 1.342 elif splitByRun ==1:
277     self.algo = 'RunBased'
278 spiga 1.42 else:
279 spiga 1.342 self.algo = 'EventBased'
280     common.logger.debug("Job splitting method: %s" % self.algo)
281 ewv 1.347
282 spiga 1.342 splitter = JobSplitter(self.cfg_params,self.conf)
283     self.dict = splitter.Algos()[self.algo]()
284 gutsche 1.5
285 spiga 1.300 self.argsFile= '%s/arguments.xml'%common.work_space.shareDir()
286     self.rootArgsFilename= 'arguments'
287 spiga 1.208 # modify Pset only the first time
288 spiga 1.320 if isNew:
289     if self.pset != None: self.ModifyPset()
290 spiga 1.300
291 spiga 1.320 ## Prepare inputSandbox TarBall (only the first time)
292     self.tarNameWithPath = self.getTarBall(self.executable)
293 spiga 1.293
294    
295     def ModifyPset(self):
296     import PsetManipulator as pp
297 ewv 1.335
298     # If pycfg_params set, fake out the config script
299     # to make it think it was called with those args
300     pycfg_params = self.cfg_params.get('CMSSW.pycfg_params',None)
301     if pycfg_params:
302     trueArgv = sys.argv
303     sys.argv = [self.pset]
304     sys.argv.extend(pycfg_params.split(' '))
305 spiga 1.293 PsetEdit = pp.PsetManipulator(self.pset)
306 ewv 1.335 if pycfg_params: # Restore original sys.argv
307     sys.argv = trueArgv
308    
309 spiga 1.293 try:
310     # Add FrameworkJobReport to parameter-set, set max events.
311     # Reset later for data jobs by writeCFG which does all modifications
312 ewv 1.295 PsetEdit.maxEvent(1)
313 spiga 1.293 PsetEdit.skipEvent(0)
314     PsetEdit.psetWriter(self.configFilename())
315     ## If present, add TFileService to output files
316 slacapra 1.349 if not int(self.cfg_params.get('CMSSW.skip_tfileservice_output',0)):
317 spiga 1.293 tfsOutput = PsetEdit.getTFileService()
318     if tfsOutput:
319     if tfsOutput in self.output_file:
320 spiga 1.304 common.logger.debug("Output from TFileService "+tfsOutput+" already in output files")
321 spiga 1.293 else:
322     outfileflag = True #output found
323     self.output_file.append(tfsOutput)
324 spiga 1.304 common.logger.info("Adding "+tfsOutput+" (from TFileService) to list of output files")
325 spiga 1.293 pass
326     pass
327 fanzago 1.360
328     # If requested, add PoolOutputModule to output files
329 fanzago 1.368 ### FOR MULTI ###
330 fanzago 1.360 #edmOutput = PsetEdit.getPoolOutputModule()
331     edmOutputDict = PsetEdit.getPoolOutputModule()
332     common.logger.debug("(test) edmOutputDict = "+str(edmOutputDict))
333     filter_dict = {}
334     for key in edmOutputDict.keys():
335     filter_dict[key]=edmOutputDict[key]['dataset']
336     common.logger.debug("(test) filter_dict for multi = "+str(filter_dict))
337    
338     #### in CMSSW.sh: export var_filter
339    
340     self.var_filter = json.dumps(filter_dict)
341     common.logger.debug("(test) var_filter for multi = "+self.var_filter)
342 ewv 1.363
343 fanzago 1.360 edmOutput = edmOutputDict.keys()
344 spiga 1.293 if int(self.cfg_params.get('CMSSW.get_edm_output',0)):
345     if edmOutput:
346 ewv 1.321 for outputFile in edmOutput:
347     if outputFile in self.output_file:
348 ewv 1.325 common.logger.debug("Output from PoolOutputModule "+outputFile+" already in output files")
349 ewv 1.321 else:
350     self.output_file.append(outputFile)
351     common.logger.info("Adding "+outputFile+" (from PoolOutputModule) to list of output files")
352     # not requested, check anyhow to avoid accidental T2 overload
353 slacapra 1.297 else:
354 ewv 1.321 if edmOutput:
355     missedFiles = []
356     for outputFile in edmOutput:
357     if outputFile not in self.output_file:
358     missedFiles.append(outputFile)
359     if missedFiles:
360     msg = "ERROR: PoolOutputModule(s) are present in your ParameteSet %s \n"%self.pset
361     msg += " but the file(s) produced ( %s ) are not in the list of output files\n" % ', '.join(missedFiles)
362     msg += "WARNING: please remove them. If you want to keep them, add the file(s) to output_files or use CMSSW.get_edm_output = 1\n"
363     if int(self.cfg_params.get('CMSSW.ignore_edm_output',0)):
364     msg += " CMSSW.ignore_edm_output==1 : Hope you know what you are doing...\n"
365     common.logger.info(msg)
366 spiga 1.322 else :
367 ewv 1.321 raise CrabException(msg)
368 ewv 1.301
369     if (PsetEdit.getBadFilesSetting()):
370     msg = "WARNING: You have set skipBadFiles to True. This will continue processing on some errors and you may not be notified."
371 spiga 1.304 common.logger.info(msg)
372 ewv 1.301
373 slacapra 1.297 except CrabException, msg:
374 spiga 1.304 common.logger.info(str(msg))
375 slacapra 1.297 msg='Error while manipulating ParameterSet (see previous message, if any): exiting...'
376 spiga 1.293 raise CrabException(msg)
377    
378 ewv 1.363 valid = re.compile('^[\w\.\-]+$')
379     for fileName in self.output_file:
380     if not valid.match(fileName):
381     msg = "The file %s may only contain alphanumeric characters and -, _, ." % fileName
382     raise CrabException(msg)
383    
384 gutsche 1.3
385 slacapra 1.1 def DataDiscoveryAndLocation(self, cfg_params):
386    
387 slacapra 1.86 import DataDiscovery
388     import DataLocation
389 spiga 1.304 common.logger.log(10-1,"CMSSW::DataDiscoveryAndLocation()")
390 gutsche 1.3
391     datasetPath=self.datasetPath
392    
393 slacapra 1.1 ## Contact the DBS
394 spiga 1.304 common.logger.info("Contacting Data Discovery Services ...")
395 slacapra 1.1 try:
396 spiga 1.208 self.pubdata=DataDiscovery.DataDiscovery(datasetPath, cfg_params,self.skip_blocks)
397 slacapra 1.1 self.pubdata.fetchDBSInfo()
398    
399 slacapra 1.41 except DataDiscovery.NotExistingDatasetError, ex :
400 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
401     raise CrabException(msg)
402 slacapra 1.41 except DataDiscovery.NoDataTierinProvenanceError, ex :
403 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
404     raise CrabException(msg)
405 slacapra 1.41 except DataDiscovery.DataDiscoveryError, ex:
406 gutsche 1.66 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
407 slacapra 1.1 raise CrabException(msg)
408    
409 gutsche 1.35 self.filesbyblock=self.pubdata.getFiles()
410 spiga 1.269 self.conf['pubdata']=self.pubdata
411 gutsche 1.3
412 slacapra 1.1 ## get max number of events
413 ewv 1.192 self.maxEvents=self.pubdata.getMaxEvents()
414 slacapra 1.1
415     ## Contact the DLS and build a list of sites hosting the fileblocks
416     try:
417 slacapra 1.41 dataloc=DataLocation.DataLocation(self.filesbyblock.keys(),cfg_params)
418 gutsche 1.6 dataloc.fetchDLSInfo()
419 slacapra 1.263
420 slacapra 1.41 except DataLocation.DataLocationError , ex:
421 slacapra 1.1 msg = 'ERROR ***: failed Data Location in DLS \n %s '%ex.getErrorMessage()
422     raise CrabException(msg)
423 ewv 1.131
424 slacapra 1.1
425 slacapra 1.270 unsorted_sites = dataloc.getSites()
426     sites = self.filesbyblock.fromkeys(self.filesbyblock,'')
427     for lfn in self.filesbyblock.keys():
428     if unsorted_sites.has_key(lfn):
429     sites[lfn]=unsorted_sites[lfn]
430     else:
431     sites[lfn]=[]
432    
433 slacapra 1.264 if len(sites)==0:
434 spiga 1.267 msg = 'ERROR ***: no location for any of the blocks of this dataset: \n\t %s \n'%datasetPath
435     msg += "\tMaybe the dataset is located only at T1's (or at T0), where analysis jobs are not allowed\n"
436     msg += "\tPlease check DataDiscovery page https://cmsweb.cern.ch/dbs_discovery/\n"
437 slacapra 1.264 raise CrabException(msg)
438    
439 gutsche 1.35 allSites = []
440     listSites = sites.values()
441 slacapra 1.63 for listSite in listSites:
442     for oneSite in listSite:
443 gutsche 1.35 allSites.append(oneSite)
444 slacapra 1.291 [allSites.append(it) for it in allSites if not allSites.count(it)]
445 ewv 1.295
446 gutsche 1.3
447 gutsche 1.92 # screen output
448 spiga 1.354 if self.ads or self.lumiMask:
449     common.logger.info("Requested (A)DS %s has %s block(s)." %
450 ewv 1.350 (datasetPath, len(self.filesbyblock.keys())))
451     else:
452     common.logger.info("Requested dataset: " + datasetPath + \
453     " has " + str(self.maxEvents) + " events in " + \
454     str(len(self.filesbyblock.keys())) + " blocks.\n")
455 gutsche 1.92
456 gutsche 1.35 return sites
457 ewv 1.131
458 spiga 1.42
459 spiga 1.208 def split(self, jobParams,firstJobID):
460 ewv 1.276
461 spiga 1.293 jobParams = self.dict['args']
462 spiga 1.269 njobs = self.dict['njobs']
463     self.jobDestination = self.dict['jobDestination']
464 ewv 1.131
465 ewv 1.333 if njobs == 0:
466     raise CrabException("Asked to split zero jobs: aborting")
467 belforte 1.387 if not self.server and not self.local :
468     if common.scheduler.name().upper() == 'REMOTEGLIDEIN' :
469     if njobs > 5000 :
470     raise CrabException("too many jobs. remoteGlidein has a limit at 5000")
471     else :
472     if njobs > 500:
473     msg = "Error: this task contains more than 500 jobs. \n"
474     msg += " The CRAB SA does not submit more than 500 jobs.\n"
475     msg += " Use the server mode. \n"
476     raise CrabException(msg)
477 belforte 1.389 if self.server and njobs > 5000 :
478     raise CrabException("too many jobs. CrabServer has a limit at 5000")
479 gutsche 1.3 # create the empty structure
480     for i in range(njobs):
481     jobParams.append("")
482 ewv 1.131
483 spiga 1.165 listID=[]
484     listField=[]
485 spiga 1.293 listDictions=[]
486 spiga 1.300 exist= os.path.exists(self.argsFile)
487 spiga 1.208 for id in range(njobs):
488     job = id + int(firstJobID)
489 spiga 1.167 listID.append(job+1)
490 spiga 1.162 job_ToSave ={}
491 spiga 1.169 concString = ' '
492 spiga 1.165 argu=''
493 spiga 1.293 str_argu = str(job+1)
494 spiga 1.208 if len(jobParams[id]):
495 ewv 1.295 argu = {'JobID': job+1}
496 spiga 1.293 for i in range(len(jobParams[id])):
497     argu[self.dict['params'][i]]=jobParams[id][i]
498 spiga 1.315 if len(jobParams[id])==1: self.NumEvents = jobParams[id][i]
499 ewv 1.295 # just for debug
500 spiga 1.293 str_argu += concString.join(jobParams[id])
501 spiga 1.314 if argu != '': listDictions.append(argu)
502 ewv 1.347 job_ToSave['arguments']= '%d %d'%( (job+1), 0)
503 spiga 1.208 job_ToSave['dlsDestination']= self.jobDestination[id]
504 spiga 1.165 listField.append(job_ToSave)
505 slacapra 1.311 from ProdCommon.SiteDB.CmsSiteMapper import CmsSEMap
506     cms_se = CmsSEMap()
507 ewv 1.295 msg="Job %s Arguments: %s\n"%(str(job+1),str_argu)
508 spiga 1.293 msg+="\t Destination: %s "%(str(self.jobDestination[id]))
509 slacapra 1.311 SEDestination = [cms_se[dest] for dest in self.jobDestination[id]]
510     msg+="\t CMSDestination: %s "%(str(SEDestination))
511 spiga 1.307 common.logger.log(10-1,msg)
512 spiga 1.293 # write xml
513 ewv 1.295 if len(listDictions):
514 spiga 1.293 if exist==False: self.CreateXML()
515     self.addEntry(listDictions)
516 spiga 1.187 common._db.updateJob_(listID,listField)
517 spiga 1.293 return
518 ewv 1.313
519 spiga 1.293 def CreateXML(self):
520     """
521 ewv 1.295 """
522 spiga 1.300 result = IMProvNode( self.rootArgsFilename )
523     outfile = file( self.argsFile, 'w').write(str(result))
524 ewv 1.295 return
525 spiga 1.293
526     def addEntry(self, listDictions):
527     """
528     _addEntry_
529 ewv 1.295
530 spiga 1.293 add an entry to the xml file
531     """
532     ## load xml
533 spiga 1.300 improvDoc = loadIMProvFile(self.argsFile)
534 spiga 1.293 entrname= 'Job'
535     for dictions in listDictions:
536     report = IMProvNode(entrname , None, **dictions)
537     improvDoc.addNode(report)
538 spiga 1.300 outfile = file( self.argsFile, 'w').write(str(improvDoc))
539 gutsche 1.3 return
540 ewv 1.131
541 gutsche 1.3 def numberOfJobs(self):
542 spiga 1.342 #wmbs
543 ewv 1.347 if self.automation==0:
544 spiga 1.342 return self.dict['njobs']
545     else:
546     return None
547 ewv 1.347
548 slacapra 1.1 def getTarBall(self, exe):
549     """
550     Return the TarBall with lib and exe
551     """
552 spiga 1.320 self.tgzNameWithPath = common.work_space.pathForTgz()+self.tgz_name
553     if os.path.exists(self.tgzNameWithPath):
554     return self.tgzNameWithPath
555 slacapra 1.1
556     # Prepare a tar gzipped file with user binaries.
557     self.buildTar_(exe)
558    
559 spiga 1.320 return string.strip(self.tgzNameWithPath)
560 slacapra 1.1
561     def buildTar_(self, executable):
562    
563     # First of all declare the user Scram area
564     swArea = self.scram.getSWArea_()
565     swReleaseTop = self.scram.getReleaseTop_()
566 ewv 1.131
567 slacapra 1.1 ## check if working area is release top
568     if swReleaseTop == '' or swArea == swReleaseTop:
569 spiga 1.304 common.logger.debug("swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
570 slacapra 1.1 return
571    
572 slacapra 1.61 import tarfile
573     try: # create tar ball
574 spiga 1.320 tar = tarfile.open(self.tgzNameWithPath, "w:gz")
575 slacapra 1.61 ## First find the executable
576 slacapra 1.86 if (self.executable != ''):
577 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
578     if ( not exeWithPath ):
579     raise CrabException('User executable '+executable+' not found')
580 ewv 1.131
581 slacapra 1.61 ## then check if it's private or not
582     if exeWithPath.find(swReleaseTop) == -1:
583     # the exe is private, so we must ship
584 spiga 1.304 common.logger.debug("Exe "+exeWithPath+" to be tarred")
585 slacapra 1.61 path = swArea+'/'
586 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
587     if exeWithPath.find(path) >= 0 :
588     exe = string.replace(exeWithPath, path,'')
589 slacapra 1.129 tar.add(path+exe,exe)
590 corvo 1.85 else :
591     tar.add(exeWithPath,os.path.basename(executable))
592 slacapra 1.61 pass
593     else:
594     # the exe is from release, we'll find it on WN
595     pass
596 ewv 1.131
597 slacapra 1.61 ## Now get the libraries: only those in local working area
598 slacapra 1.256 tar.dereference=True
599 slacapra 1.61 libDir = 'lib'
600     lib = swArea+'/' +libDir
601 spiga 1.304 common.logger.debug("lib "+lib+" to be tarred")
602 slacapra 1.61 if os.path.exists(lib):
603     tar.add(lib,libDir)
604 ewv 1.131
605 slacapra 1.61 ## Now check if module dir is present
606     moduleDir = 'module'
607     module = swArea + '/' + moduleDir
608     if os.path.isdir(module):
609     tar.add(module,moduleDir)
610 slacapra 1.256 tar.dereference=False
611 slacapra 1.61
612     ## Now check if any data dir(s) is present
613 spiga 1.374 self.dataExist = False
614 slacapra 1.212 todo_list = [(i, i) for i in os.listdir(swArea+"/src")]
615 slacapra 1.206 while len(todo_list):
616     entry, name = todo_list.pop()
617 slacapra 1.211 if name.startswith('crab_0_') or name.startswith('.') or name == 'CVS':
618 slacapra 1.206 continue
619 slacapra 1.212 if os.path.isdir(swArea+"/src/"+entry):
620 slacapra 1.206 entryPath = entry + '/'
621 slacapra 1.212 todo_list += [(entryPath + i, i) for i in os.listdir(swArea+"/src/"+entry)]
622 spiga 1.374 if name == 'data':
623     self.dataExist=True
624     common.logger.debug("data "+entry+" to be tarred")
625     tar.add(swArea+"/src/"+entry,"src/"+entry)
626     pass
627 slacapra 1.206 pass
628 ewv 1.182
629 spiga 1.179 ### CMSSW ParameterSet
630     if not self.pset is None:
631     cfg_file = common.work_space.jobDir()+self.configFilename()
632 ewv 1.357 pickleFile = common.work_space.jobDir()+self.configFilename() + '.pkl'
633 ewv 1.182 tar.add(cfg_file,self.configFilename())
634 ewv 1.357 tar.add(pickleFile,self.configFilename() + '.pkl')
635 ewv 1.313
636 spiga 1.309 try:
637     crab_cfg_file = common.work_space.shareDir()+'/crab.cfg'
638     tar.add(crab_cfg_file,'crab.cfg')
639     except:
640     pass
641 fanzago 1.93
642 fanzago 1.152 ## Add ProdCommon dir to tar
643 slacapra 1.211 prodcommonDir = './'
644     prodcommonPath = os.environ['CRABDIR'] + '/' + 'external/'
645 spiga 1.244 neededStuff = ['ProdCommon/__init__.py','ProdCommon/FwkJobRep', 'ProdCommon/CMSConfigTools', \
646 spiga 1.298 'ProdCommon/Core', 'ProdCommon/MCPayloads', 'IMProv', 'ProdCommon/Storage', \
647     'WMCore/__init__.py','WMCore/Algorithms']
648 slacapra 1.214 for file in neededStuff:
649     tar.add(prodcommonPath+file,prodcommonDir+file)
650 spiga 1.179
651     ##### ML stuff
652     ML_file_list=['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py']
653     path=os.environ['CRABDIR'] + '/python/'
654     for file in ML_file_list:
655     tar.add(path+file,file)
656    
657     ##### Utils
658 belforte 1.382 Utils_file_list=['parseCrabFjr.py','writeCfg.py', 'fillCrabFjr.py','cmscp.py','crabWatchdog.sh']
659 spiga 1.179 for file in Utils_file_list:
660     tar.add(path+file,file)
661 ewv 1.131
662 ewv 1.182 ##### AdditionalFiles
663 slacapra 1.253 tar.dereference=True
664 spiga 1.179 for file in self.additional_inbox_files:
665     tar.add(file,string.split(file,'/')[-1])
666 slacapra 1.253 tar.dereference=False
667 spiga 1.320 common.logger.log(10-1,"Files in "+self.tgzNameWithPath+" : "+str(tar.getnames()))
668 ewv 1.182
669 slacapra 1.61 tar.close()
670 mcinquil 1.241 except IOError, exc:
671 spiga 1.320 msg = 'Could not create tar-ball %s \n'%self.tgzNameWithPath
672 spiga 1.304 msg += str(exc)
673     raise CrabException(msg)
674 mcinquil 1.241 except tarfile.TarError, exc:
675 spiga 1.320 msg = 'Could not create tar-ball %s \n'%self.tgzNameWithPath
676 spiga 1.304 msg += str(exc)
677     raise CrabException(msg)
678 spiga 1.300
679 gutsche 1.72 tarballinfo = os.stat(self.tgzNameWithPath)
680     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
681 fanzago 1.385 #### FEDE FOR SAVANNAH BUG 94491 ########
682     cmdOut = runCommand('tar -ztvf %s|sort -n -k3'%self.tgzNameWithPath)
683 spiga 1.365 if not self.server:
684     msg = 'Input sandbox size of ' + str(float(tarballinfo.st_size)/1024.0/1024.0) + ' MB is larger than the allowed ' + \
685     str(self.MaxTarBallSize) +'MB input sandbox limit \n'
686     msg += ' and not supported by the direct GRID submission system.\n'
687 belforte 1.386 msg += ' Please use the CRAB server mode by setting use_server=1 in section [CRAB] of your crab.cfg.\n'
688 fanzago 1.385 msg += ' Content of your default.tgz archive is \n'
689     msg += cmdOut
690 ewv 1.367 else:
691 spiga 1.365 msg = 'Input sandbox size of ' + str(float(tarballinfo.st_size)/1024.0/1024.0) + ' MB is larger than the allowed ' + \
692     str(self.MaxTarBallSize) +'MB input sandbox limit in the server.'
693 fanzago 1.385 msg += 'Content of your default.tgz archive is \n'
694     msg += cmdOut
695 spiga 1.238 raise CrabException(msg)
696 gutsche 1.72
697 slacapra 1.61 ## create tar-ball with ML stuff
698 slacapra 1.97
699 spiga 1.165 def wsSetupEnvironment(self, nj=0):
700 slacapra 1.1 """
701     Returns part of a job script which prepares
702     the execution environment for the job 'nj'.
703     """
704 ewv 1.334 psetName = 'pset.py'
705    
706 slacapra 1.1 # Prepare JobType-independent part
707 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
708 fanzago 1.133 txt += 'echo ">>> setup environment"\n'
709 ewv 1.347 txt += 'echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
710     txt += 'export SCRAM_ARCH=' + self.executable_arch + '\n'
711     txt += 'echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
712 spiga 1.290 txt += 'if [ $middleware == LCG ] || [ $middleware == CAF ] || [ $middleware == LSF ]; then \n'
713 gutsche 1.3 txt += self.wsSetupCMSLCGEnvironment_()
714 ewv 1.283 txt += 'elif [ $middleware == OSG ]; then\n'
715 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
716 ewv 1.132 txt += ' if [ ! $? == 0 ] ;then\n'
717 fanzago 1.161 txt += ' echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
718     txt += ' job_exit_code=10016\n'
719     txt += ' func_exit\n'
720 gutsche 1.3 txt += ' fi\n'
721 fanzago 1.133 txt += ' echo ">>> Created working directory: $WORKING_DIR"\n'
722 gutsche 1.3 txt += '\n'
723     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
724     txt += ' cd $WORKING_DIR\n'
725 fanzago 1.133 txt += ' echo ">>> current directory (WORKING_DIR): $WORKING_DIR"\n'
726 ewv 1.131 txt += self.wsSetupCMSOSGEnvironment_()
727 spiga 1.282 #Setup SGE Environment
728 ewv 1.283 txt += 'elif [ $middleware == SGE ]; then\n'
729 spiga 1.282 txt += self.wsSetupCMSLCGEnvironment_()
730    
731 edelmann 1.289 txt += 'elif [ $middleware == ARC ]; then\n'
732     txt += self.wsSetupCMSLCGEnvironment_()
733    
734 mcinquil 1.340 #Setup PBS Environment
735 mcinquil 1.343 txt += 'elif [ $middleware == PBS ]; then\n'
736 mcinquil 1.340 txt += self.wsSetupCMSLCGEnvironment_()
737    
738 gutsche 1.3 txt += 'fi\n'
739 slacapra 1.1
740     # Prepare JobType-specific part
741     scram = self.scram.commandName()
742     txt += '\n\n'
743 fanzago 1.133 txt += 'echo ">>> specific cmssw setup environment:"\n'
744     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
745 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
746     txt += 'status=$?\n'
747     txt += 'if [ $status != 0 ] ; then\n'
748 fanzago 1.161 txt += ' echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
749     txt += ' job_exit_code=10034\n'
750 fanzago 1.163 txt += ' func_exit\n'
751 slacapra 1.1 txt += 'fi \n'
752     txt += 'cd '+self.version+'\n'
753 spiga 1.277 txt += 'SOFTWARE_DIR=`pwd`; export SOFTWARE_DIR\n'
754 fanzago 1.133 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
755 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
756 fanzago 1.180 txt += 'if [ $? != 0 ] ; then\n'
757     txt += ' echo "ERROR ==> Problem with the command: "\n'
758     txt += ' echo "eval \`'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME \` at `hostname`"\n'
759     txt += ' job_exit_code=10034\n'
760     txt += ' func_exit\n'
761     txt += 'fi \n'
762 slacapra 1.1 # Handle the arguments:
763     txt += "\n"
764 farinafa 1.346 txt += "## number of arguments (first argument always jobnumber, the second is the resubmission number)\n"
765 slacapra 1.1 txt += "\n"
766 spiga 1.165 txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
767 slacapra 1.1 txt += "then\n"
768 fanzago 1.161 txt += " echo 'ERROR ==> Too few arguments' +$nargs+ \n"
769     txt += ' job_exit_code=50113\n'
770     txt += " func_exit\n"
771 slacapra 1.1 txt += "fi\n"
772     txt += "\n"
773    
774     # Prepare job-specific part
775     job = common.job_list[nj]
776 ewv 1.131 if (self.datasetPath):
777 fanzago 1.93 txt += '\n'
778     txt += 'DatasetPath='+self.datasetPath+'\n'
779    
780 spiga 1.238 txt += 'PrimaryDataset='+self.primaryDataset +'\n'
781 fanzago 1.318 txt += 'DataTier='+self.dataTier+'\n'
782 fanzago 1.96 txt += 'ApplicationFamily=cmsRun\n'
783 fanzago 1.93
784     else:
785     txt += 'DatasetPath=MCDataTier\n'
786     txt += 'PrimaryDataset=null\n'
787     txt += 'DataTier=null\n'
788     txt += 'ApplicationFamily=MCDataTier\n'
789 ewv 1.170 if self.pset != None:
790 spiga 1.42 pset = os.path.basename(job.configFilename())
791 ewv 1.357 pkl = os.path.basename(job.configFilename()) + '.pkl'
792 spiga 1.42 txt += '\n'
793 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
794 ewv 1.357 txt += 'cp $RUNTIME_AREA/'+pkl+' .\n'
795 spiga 1.296
796 ewv 1.295 txt += 'PreserveSeeds=' + ','.join(self.preserveSeeds) + '; export PreserveSeeds\n'
797     txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
798     txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
799     txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
800 slacapra 1.90
801 ewv 1.184 txt += 'mv -f ' + pset + ' ' + psetName + '\n'
802 fanzago 1.360 if self.var_filter:
803     #print "self.var_filter = ",self.var_filter
804     txt += "export var_filter="+"'"+self.var_filter+"'\n"
805     txt += 'echo $var_filter'
806 ewv 1.319 else:
807 spiga 1.314 txt += '\n'
808 spiga 1.331 if self.AdditionalArgs: txt += 'export AdditionalArgs=\"%s\"\n'%(self.AdditionalArgs)
809 spiga 1.315 if int(self.NumEvents) != 0: txt += 'export MaxEvents=%s\n'%str(self.NumEvents)
810 gutsche 1.3 return txt
811 slacapra 1.176
812 fanzago 1.166 def wsUntarSoftware(self, nj=0):
813 gutsche 1.3 """
814     Put in the script the commands to build an executable
815     or a library.
816     """
817    
818 fanzago 1.166 txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
819 gutsche 1.3
820     if os.path.isfile(self.tgzNameWithPath):
821 belforte 1.393 txt += 'echo ">>> tar --no-same-permissions -xf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
822     txt += 'tar --no-same-permissions -xf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
823 fanzago 1.375 txt += 'untar_status=$? \n'
824 fanzago 1.285 if self.debug_wrapper==1 :
825 fanzago 1.375 txt += 'echo "----------------" \n'
826     txt += 'ls -AlR $RUNTIME_AREA \n'
827     txt += 'echo "----------------" \n'
828 gutsche 1.3 txt += 'if [ $untar_status -ne 0 ]; then \n'
829 fanzago 1.161 txt += ' echo "ERROR ==> Untarring .tgz file failed"\n'
830     txt += ' job_exit_code=$untar_status\n'
831     txt += ' func_exit\n'
832 gutsche 1.3 txt += 'else \n'
833     txt += ' echo "Successful untar" \n'
834     txt += 'fi \n'
835 gutsche 1.50 txt += '\n'
836 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
837 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
838 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
839 gutsche 1.50 txt += 'else\n'
840 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
841 fanzago 1.93 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
842 gutsche 1.50 txt += 'fi\n'
843     txt += '\n'
844    
845 gutsche 1.3 pass
846 ewv 1.131
847 belforte 1.396 # add the cpuLimi, wallLimit and rssLimit file for the watchdog
848     if self.cfg_params.get('GRID.max_rss'):
849     max_rss = int(self.cfg_params.get('GRID.max_rss')) * 1000
850     txt += 'echo "%d" > rssLimit\n' % max_rss
851     txt += 'maxrss=`cat rssLimit`\n'
852     txt += 'echo "RSS limit set to: ${maxrss} KBytes"\n'
853     if self.cfg_params.get('GRID.max_cpu_time'):
854     cpu_sec = int(self.cfg_params.get('GRID.max_cpu_time')) * 60
855     txt += 'echo "%d" > cpuLimit\n' % cpu_sec
856     txt += 'maxcpus=`cat cpuLimit`\n'
857     txt += 'maxcpuhms=`printf "%dh:%dm:%ds" $(($maxcpus/3600)) $(($maxcpus%3600/60)) $(($maxcpus%60))`\n'
858     txt += 'echo "Cpu Time limit set to: ${maxcpus} seconds '
859     txt += 'i.e. ${maxcpuhms}"\n'
860     if self.cfg_params.get('GRID.max_wall_clock_time'):
861     max_wall_sec = int(self.cfg_params.get('GRID.max_wall_clock_time')) * 60
862     txt += 'echo "%d" > wallLimit\n' % max_wall_sec
863     txt += 'maxwalls=`cat wallLimit`\n'
864     txt += 'maxwallhms=`printf "%dh:%dm:%ds" $(($maxwalls/3600)) $(($maxwalls%3600/60)) $(($maxwalls%60))`\n'
865     txt += 'echo "Wall Time limit set to: ${maxwalls} seconds '
866     txt += 'i.e. ${maxwallhms}"\n'
867 belforte 1.390
868 slacapra 1.1 return txt
869 ewv 1.170
870 fanzago 1.166 def wsBuildExe(self, nj=0):
871     """
872     Put in the script the commands to build an executable
873     or a library.
874     """
875    
876     txt = '\n#Written by cms_cmssw::wsBuildExe\n'
877     txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
878 fanzago 1.375
879     txt += 'rm -rf lib/ module/ \n'
880 ewv 1.170 txt += 'mv $RUNTIME_AREA/lib/ . \n'
881     txt += 'mv $RUNTIME_AREA/module/ . \n'
882 spiga 1.374 if self.dataExist == True:
883 fanzago 1.375 txt += 'rm -rf src/ \n'
884 spiga 1.374 txt += 'mv $RUNTIME_AREA/src/ . \n'
885 ewv 1.182 if len(self.additional_inbox_files)>0:
886 belforte 1.394 #files used by Watchdog must not be moved
887     watchdogFiles=['rssLimit','vszLimit','diskLimit','cpuLimit','wallLimit']
888 spiga 1.179 for file in self.additional_inbox_files:
889 belforte 1.394 if file in watchdogFiles :
890     pass
891     else:
892     txt += 'mv $RUNTIME_AREA/'+os.path.basename(file)+' . \n'
893 ewv 1.170
894 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
895 fanzago 1.166 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
896 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
897 fanzago 1.166 txt += 'else\n'
898 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
899 fanzago 1.166 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
900     txt += 'fi\n'
901     txt += '\n'
902    
903 slacapra 1.302 if self.pset != None:
904 ewv 1.334 psetName = 'pset.py'
905    
906 slacapra 1.302 txt += '\n'
907     if self.debug_wrapper == 1:
908     txt += 'echo "***** cat ' + psetName + ' *********"\n'
909     txt += 'cat ' + psetName + '\n'
910     txt += 'echo "****** end ' + psetName + ' ********"\n'
911     txt += '\n'
912     txt += 'echo "***********************" \n'
913     txt += 'which edmConfigHash \n'
914     txt += 'echo "***********************" \n'
915 ewv 1.334 txt += 'edmConfigHash ' + psetName + ' \n'
916     txt += 'PSETHASH=`edmConfigHash ' + psetName + '` \n'
917 slacapra 1.302 txt += 'echo "PSETHASH = $PSETHASH" \n'
918 fanzago 1.368 #### temporary fix for noEdm files #####
919 slacapra 1.302 txt += 'if [ -z "$PSETHASH" ]; then \n'
920     txt += ' export PSETHASH=null\n'
921     txt += 'fi \n'
922     #############################################
923     txt += '\n'
924 fanzago 1.166 return txt
925 slacapra 1.1
926 ewv 1.131
927 slacapra 1.1 def executableName(self):
928 ewv 1.192 if self.scriptExe:
929 spiga 1.42 return "sh "
930     else:
931     return self.executable
932 slacapra 1.1
933     def executableArgs(self):
934 ewv 1.276 if self.scriptExe:
935 spiga 1.370 return os.path.basename(self.scriptExe) + " $NJob $AdditionalArgs"
936 fanzago 1.115 else:
937 ewv 1.334 return " -j $RUNTIME_AREA/crab_fjr_$NJob.xml -p pset.py"
938 slacapra 1.1
939     def inputSandbox(self, nj):
940     """
941     Returns a list of filenames to be put in JDL input sandbox.
942     """
943     inp_box = []
944     if os.path.isfile(self.tgzNameWithPath):
945     inp_box.append(self.tgzNameWithPath)
946 spiga 1.320 if os.path.isfile(self.argsFile):
947     inp_box.append(self.argsFile)
948 spiga 1.243 inp_box.append(common.work_space.jobDir() + self.scriptName)
949 slacapra 1.1 return inp_box
950    
951     def outputSandbox(self, nj):
952     """
953     Returns a list of filenames to be put in JDL output sandbox.
954     """
955     out_box = []
956    
957     ## User Declared output files
958 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
959 ewv 1.131 n_out = nj + 1
960 slacapra 1.207 out_box.append(numberFile(out,str(n_out)))
961 slacapra 1.1 return out_box
962    
963    
964     def wsRenameOutput(self, nj):
965     """
966     Returns part of a job script which renames the produced files.
967     """
968    
969 ewv 1.160 txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
970 belforte 1.386 txt += 'echo ">>> current directory $PWD" \n'
971     txt += 'echo ">>> (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
972     txt += 'echo ">>> (WORKING_DIR): $WORKING_DIR" \n'
973 fanzago 1.148 txt += 'echo ">>> current directory content:"\n'
974 fanzago 1.378 #if self.debug_wrapper==1:
975     txt += 'ls -Al\n'
976 fanzago 1.145 txt += '\n'
977 slacapra 1.54
978 fanzago 1.128 for fileWithSuffix in (self.output_file):
979 farinafa 1.346 output_file_num = numberFile(fileWithSuffix, '$OutUniqueID')
980 slacapra 1.1 txt += '\n'
981 gutsche 1.7 txt += '# check output file\n'
982 slacapra 1.106 txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
983 ewv 1.147 if (self.copy_data == 1): # For OSG nodes, file is in $WORKING_DIR, should not be moved to $RUNTIME_AREA
984     txt += ' mv '+fileWithSuffix+' '+output_file_num+'\n'
985 spiga 1.209 txt += ' ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
986 ewv 1.147 else:
987     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
988     txt += ' ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
989 slacapra 1.106 txt += 'else\n'
990 fanzago 1.161 txt += ' job_exit_code=60302\n'
991     txt += ' echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
992 ewv 1.156 if common.scheduler.name().upper() == 'CONDOR_G':
993 gutsche 1.7 txt += ' if [ $middleware == OSG ]; then \n'
994     txt += ' echo "prepare dummy output file"\n'
995     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
996     txt += ' fi \n'
997 slacapra 1.1 txt += 'fi\n'
998 slacapra 1.105 file_list = []
999     for fileWithSuffix in (self.output_file):
1000 farinafa 1.346 file_list.append(numberFile('$SOFTWARE_DIR/'+fileWithSuffix, '$OutUniqueID'))
1001 ewv 1.131
1002 spiga 1.245 txt += 'file_list="'+string.join(file_list,',')+'"\n'
1003 fanzago 1.149 txt += '\n'
1004 belforte 1.386 txt += 'echo ">>> current directory $PWD" \n'
1005     txt += 'echo ">>> (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
1006     txt += 'echo ">>> (WORKING_DIR): $WORKING_DIR" \n'
1007 fanzago 1.148 txt += 'echo ">>> current directory content:"\n'
1008 fanzago 1.378 #if self.debug_wrapper==1:
1009     txt += 'ls -Al\n'
1010 fanzago 1.148 txt += '\n'
1011 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
1012 fanzago 1.133 txt += 'echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1013 slacapra 1.1 return txt
1014    
1015 slacapra 1.63 def getRequirements(self, nj=[]):
1016 slacapra 1.1 """
1017 ewv 1.131 return job requirements to add to jdl files
1018 slacapra 1.1 """
1019     req = ''
1020 slacapra 1.47 if self.version:
1021 slacapra 1.10 req='Member("VO-cms-' + \
1022 slacapra 1.47 self.version + \
1023 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1024 ewv 1.192 if self.executable_arch:
1025 gutsche 1.107 req+=' && Member("VO-cms-' + \
1026 slacapra 1.105 self.executable_arch + \
1027     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1028 gutsche 1.35
1029     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1030 spiga 1.353 if ( common.scheduler.name() in ["glite"] ):
1031 slacapra 1.316 ## 25-Jun-2009 SL: patch to use Cream enabled WMS
1032     if ( self.cfg_params.get('GRID.use_cream',None) ):
1033     req += ' && (other.GlueCEStateStatus == "Production" || other.GlueCEStateStatus == "Special")'
1034     else:
1035     req += ' && other.GlueCEStateStatus == "Production" '
1036 gutsche 1.35
1037 slacapra 1.1 return req
1038 gutsche 1.3
1039     def configFilename(self):
1040     """ return the config filename """
1041 ewv 1.334 return self.name()+'.py'
1042 gutsche 1.3
1043     def wsSetupCMSOSGEnvironment_(self):
1044     """
1045     Returns part of a job script which is prepares
1046     the execution environment and which is common for all CMS jobs.
1047     """
1048 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
1049     txt += ' echo ">>> setup CMS OSG environment:"\n'
1050 fanzago 1.133 txt += ' echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
1051     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1052 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1053 belforte 1.383 txt += ' echo "OSG_APP is $OSG_APP"\n'
1054 ewv 1.135 txt += ' if [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
1055 belforte 1.382 txt += ' cmsSetupFile=$OSG_APP/cmssoft/cms/cmsset_default.sh\n'
1056     txt += ' elif [ -f $CVMFS/cms.cern.ch/cmsset_default.sh ] ; then \n'
1057     txt += ' cmsSetupFile=$CVMFS/cms.cern.ch/cmsset_default.sh\n'
1058     txt += ' elif [ -f /cvmfs/cms.cern.ch/cmsset_default.sh ] ; then \n'
1059     txt += ' cmsSetupFile=/cvmfs/cms.cern.ch/cmsset_default.sh\n'
1060 fanzago 1.133 txt += ' else\n'
1061 belforte 1.383 txt += ' echo "CVMSF = $CVMFS"\n'
1062     txt += ' echo "/cvmfs/ is"\n'
1063     txt += ' echo "ls /"\n'
1064     txt += ' ls /\n'
1065     txt += ' echo "ls /cvmfs"\n'
1066     txt += ' ls /cvmfs\n'
1067     txt += ' echo "ls /cvmfs/cms.cern.ch"\n'
1068     txt += ' ls /cvmfs/cms.cern.ch\n'
1069     txt += ' ls /cvmfs/cms.cern.ch/cmsset*\n'
1070     txt += ' ls /cvmfs/cms.cern.ch/cmsset_default.sh\n'
1071 belforte 1.382 txt += ' echo "ERROR ==> cmsset_default.sh file not found"\n'
1072 fanzago 1.161 txt += ' job_exit_code=10020\n'
1073     txt += ' func_exit\n'
1074 fanzago 1.133 txt += ' fi\n'
1075 gutsche 1.3 txt += '\n'
1076 belforte 1.382 txt += ' echo "sourcing $cmsSetupFile ..."\n'
1077     txt += ' source $cmsSetupFile\n'
1078     txt += ' result=$?\n'
1079     txt += ' if [ $result -ne 0 ]; then\n'
1080     txt += ' echo "ERROR ==> problem sourcing $cmsSetupFile"\n'
1081     txt += ' job_exit_code=10032\n'
1082     txt += ' func_exit\n'
1083     txt += ' else\n'
1084     txt += ' echo "==> setup cms environment ok"\n'
1085     txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1086     txt += ' fi\n'
1087 gutsche 1.3
1088     return txt
1089 ewv 1.131
1090 gutsche 1.3 def wsSetupCMSLCGEnvironment_(self):
1091     """
1092     Returns part of a job script which is prepares
1093     the execution environment and which is common for all CMS jobs.
1094     """
1095 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
1096     txt += ' echo ">>> setup CMS LCG environment:"\n'
1097 fanzago 1.133 txt += ' echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
1098     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1099     txt += ' export BUILD_ARCH='+self.executable_arch+'\n'
1100     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
1101 fanzago 1.161 txt += ' echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
1102     txt += ' job_exit_code=10031\n'
1103     txt += ' func_exit\n'
1104 fanzago 1.133 txt += ' else\n'
1105     txt += ' echo "Sourcing environment... "\n'
1106     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1107 fanzago 1.161 txt += ' echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1108     txt += ' job_exit_code=10020\n'
1109     txt += ' func_exit\n'
1110 fanzago 1.133 txt += ' fi\n'
1111     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1112     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1113     txt += ' result=$?\n'
1114     txt += ' if [ $result -ne 0 ]; then\n'
1115 fanzago 1.161 txt += ' echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1116     txt += ' job_exit_code=10032\n'
1117     txt += ' func_exit\n'
1118 fanzago 1.133 txt += ' fi\n'
1119     txt += ' fi\n'
1120     txt += ' \n'
1121 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
1122 gutsche 1.3 return txt
1123 gutsche 1.5
1124 spiga 1.238 def wsModifyReport(self, nj):
1125 fanzago 1.93 """
1126 ewv 1.131 insert the part of the script that modifies the FrameworkJob Report
1127 fanzago 1.93 """
1128 ewv 1.250
1129 fanzago 1.281 txt = ''
1130 fanzago 1.292 if (self.copy_data == 1):
1131 fanzago 1.281 txt = '\n#Written by cms_cmssw::wsModifyReport\n'
1132 ewv 1.283
1133 fanzago 1.175 txt += 'echo ">>> Modify Job Report:" \n'
1134 fanzago 1.217 txt += 'chmod a+x $RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
1135 fanzago 1.175 txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1136 fanzago 1.344
1137 fanzago 1.360 args = 'fjr $RUNTIME_AREA/crab_fjr_$NJob.xml json $RUNTIME_AREA/resultCopyFile n_job $OutUniqueID PrimaryDataset $PrimaryDataset ApplicationFamily $ApplicationFamily ApplicationName $executable cmssw_version $CMSSW_VERSION psethash $PSETHASH'
1138 fanzago 1.281
1139 fanzago 1.318 if (self.publish_data == 1):
1140     txt += 'ProcessedDataset='+self.processedDataset+'\n'
1141 fanzago 1.292 txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1142     args += ' UserProcessedDataset $USER-$ProcessedDataset-$PSETHASH'
1143 fanzago 1.281
1144 fanzago 1.247 txt += 'echo "$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'"\n'
1145     txt += '$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'\n'
1146 fanzago 1.175 txt += 'modifyReport_result=$?\n'
1147     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1148     txt += ' modifyReport_result=70500\n'
1149     txt += ' job_exit_code=$modifyReport_result\n'
1150     txt += ' echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
1151     txt += ' echo "WARNING: Problem with ModifyJobReport"\n'
1152     txt += 'else\n'
1153     txt += ' mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1154 spiga 1.103 txt += 'fi\n'
1155 fanzago 1.93 return txt
1156 ewv 1.283
1157 ewv 1.192 def wsParseFJR(self):
1158 spiga 1.189 """
1159 ewv 1.192 Parse the FrameworkJobReport to obtain useful infos
1160 spiga 1.189 """
1161     txt = '\n#Written by cms_cmssw::wsParseFJR\n'
1162     txt += 'echo ">>> Parse FrameworkJobReport crab_fjr.xml"\n'
1163     txt += 'if [ -s $RUNTIME_AREA/crab_fjr_$NJob.xml ]; then\n'
1164     txt += ' if [ -s $RUNTIME_AREA/parseCrabFjr.py ]; then\n'
1165 spiga 1.197 txt += ' cmd_out=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --dashboard $MonitorID,$MonitorJobID '+self.debugWrap+'`\n'
1166 fanzago 1.285 if self.debug_wrapper==1 :
1167 spiga 1.197 txt += ' echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out"\n'
1168 spiga 1.371 txt += ' cmd_out_1=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --popularity $MonitorID,$MonitorJobID,$RUNTIME_AREA/inputsReport.txt '+self.debugWrap+'`\n'
1169 spiga 1.372 # if self.debug_wrapper==1 :
1170     txt += ' echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out_1"\n'
1171 spiga 1.197 txt += ' executable_exit_status=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --exitcode`\n'
1172 spiga 1.189 txt += ' if [ $executable_exit_status -eq 50115 ];then\n'
1173     txt += ' echo ">>> crab_fjr.xml contents: "\n'
1174 spiga 1.222 txt += ' cat $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1175 spiga 1.189 txt += ' echo "Wrong FrameworkJobReport --> does not contain useful info. ExitStatus: $executable_exit_status"\n'
1176 spiga 1.197 txt += ' elif [ $executable_exit_status -eq -999 ];then\n'
1177     txt += ' echo "ExitStatus from FrameworkJobReport not available. not available. Using exit code of executable from command line."\n'
1178 spiga 1.189 txt += ' else\n'
1179     txt += ' echo "Extracted ExitStatus from FrameworkJobReport parsing output: $executable_exit_status"\n'
1180     txt += ' fi\n'
1181     txt += ' else\n'
1182     txt += ' echo "CRAB python script to parse CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1183     txt += ' fi\n'
1184     #### Patch to check input data reading for CMSSW16x Hopefully we-ll remove it asap
1185 spiga 1.232 txt += ' if [ $executable_exit_status -eq 0 ];then\n'
1186 fanzago 1.273 txt += ' echo ">>> Executable succeded $executable_exit_status"\n'
1187 spiga 1.232 txt += ' fi\n'
1188 spiga 1.189 txt += 'else\n'
1189     txt += ' echo "CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1190     txt += 'fi\n'
1191     txt += '\n'
1192 fanzago 1.364 txt += 'if [ $executable_exit_status -ne 0 ];then\n'
1193 fanzago 1.273 txt += ' echo ">>> Executable failed $executable_exit_status"\n'
1194     txt += ' echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1195     txt += ' echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1196     txt += ' job_exit_code=$executable_exit_status\n'
1197     txt += ' func_exit\n'
1198     txt += 'fi\n\n'
1199 spiga 1.189 txt += 'echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1200     txt += 'echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1201     txt += 'job_exit_code=$executable_exit_status\n'
1202    
1203     return txt
1204    
1205 gutsche 1.5 def setParam_(self, param, value):
1206     self._params[param] = value
1207    
1208     def getParams(self):
1209     return self._params
1210 gutsche 1.8
1211 spiga 1.257 def outList(self,list=False):
1212 mcinquil 1.121 """
1213     check the dimension of the output files
1214     """
1215 spiga 1.169 txt = ''
1216     txt += 'echo ">>> list of expected files on output sandbox"\n'
1217 mcinquil 1.121 listOutFiles = []
1218 ewv 1.170 stdout = 'CMSSW_$NJob.stdout'
1219 spiga 1.169 stderr = 'CMSSW_$NJob.stderr'
1220 spiga 1.268 if len(self.output_file) <= 0:
1221     msg ="WARNING: no output files name have been defined!!\n"
1222     msg+="\tno output files will be reported back/staged\n"
1223 spiga 1.304 common.logger.info(msg)
1224 ewv 1.350
1225 fanzago 1.148 if (self.return_data == 1):
1226 farinafa 1.348 for file in (self.output_file):
1227     listOutFiles.append(numberFile(file, '$OutUniqueID'))
1228     for file in (self.output_file_sandbox):
1229     listOutFiles.append(numberFile(file, '$NJob'))
1230     listOutFiles.append(stdout)
1231     listOutFiles.append(stderr)
1232 belforte 1.384 listOutFiles.append('Watchdog_$NJob.log.gz')
1233 farinafa 1.348
1234 fanzago 1.161 txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1235 spiga 1.157 txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1236 spiga 1.169 txt += 'export filesToCheck\n'
1237 spiga 1.341 taskinfo={}
1238     taskinfo['outfileBasename'] = self.output_file
1239     common._db.updateTask_(taskinfo)
1240 ewv 1.276
1241 spiga 1.257 if list : return self.output_file
1242 ewv 1.170 return txt
1243 ewv 1.355
1244 fanzago 1.369 def checkCMSSWVersion(self, url = "https://cmstags.cern.ch/tc/", fileName = "ReleasesXML"):
1245 ewv 1.355 """
1246     compare current CMSSW release and arch with allowed releases
1247     """
1248    
1249     downloader = Downloader(url)
1250     goodRelease = False
1251 ewv 1.367 tagCollectorUrl = url + fileName
1252 ewv 1.355
1253     try:
1254     result = downloader.config(fileName)
1255     except:
1256     common.logger.info("ERROR: Problem reading file of allowed CMSSW releases.")
1257    
1258     try:
1259     events = pulldom.parseString(result)
1260    
1261     arch = None
1262     release = None
1263     relState = None
1264     for (event, node) in events:
1265     if event == pulldom.START_ELEMENT:
1266     if node.tagName == 'architecture':
1267     arch = node.attributes.getNamedItem('name').nodeValue
1268     if node.tagName == 'project':
1269     relState = node.attributes.getNamedItem('state').nodeValue
1270 ewv 1.367 if relState == 'Announced':
1271 ewv 1.355 release = node.attributes.getNamedItem('label').nodeValue
1272     if self.executable_arch == arch and self.version == release:
1273     goodRelease = True
1274     return goodRelease
1275    
1276     if not goodRelease:
1277 ewv 1.367 msg = "WARNING: %s on %s is not among supported releases listed at %s ." % \
1278     (self.version, self.executable_arch, tagCollectorUrl)
1279 ewv 1.355 msg += "Submission may fail."
1280     common.logger.info(msg)
1281     except:
1282     common.logger.info("Problems parsing file of allowed CMSSW releases.")
1283    
1284     return goodRelease
1285