ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.316
Committed: Thu Jun 25 10:40:26 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0
Changes since 1.315: +7 -3 lines
Log Message:
changes to allows use of CREAM ce by setting GRID.use_cream = 1

File Contents

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