ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.314
Committed: Thu Jun 18 17:23:02 2009 UTC (15 years, 10 months ago) by spiga
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre11
Changes since 1.313: +15 -4 lines
Log Message:
add support for script_arguments (to be used with script_exe). Fixed problem using CMSSW pre-release

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 mcinquil 1.144
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 ewv 1.295 # just for debug
390 spiga 1.293 str_argu += concString.join(jobParams[id])
391 spiga 1.314 if argu != '': listDictions.append(argu)
392 spiga 1.298 job_ToSave['arguments']= str(job+1)
393 spiga 1.208 job_ToSave['dlsDestination']= self.jobDestination[id]
394 spiga 1.165 listField.append(job_ToSave)
395 slacapra 1.311 from ProdCommon.SiteDB.CmsSiteMapper import CmsSEMap
396     cms_se = CmsSEMap()
397 ewv 1.295 msg="Job %s Arguments: %s\n"%(str(job+1),str_argu)
398 spiga 1.293 msg+="\t Destination: %s "%(str(self.jobDestination[id]))
399 slacapra 1.311 SEDestination = [cms_se[dest] for dest in self.jobDestination[id]]
400     msg+="\t CMSDestination: %s "%(str(SEDestination))
401 spiga 1.307 common.logger.log(10-1,msg)
402 spiga 1.293 # write xml
403 ewv 1.295 if len(listDictions):
404 spiga 1.293 if exist==False: self.CreateXML()
405     self.addEntry(listDictions)
406 spiga 1.300 self.addXMLfile()
407 spiga 1.187 common._db.updateJob_(listID,listField)
408 spiga 1.300 self.zipTarFile()
409 spiga 1.293 return
410 ewv 1.313
411 spiga 1.300 def addXMLfile(self):
412    
413     import tarfile
414 spiga 1.305 try:
415     tar = tarfile.open(self.tarNameWithPath, "a")
416     tar.add(self.argsFile, os.path.basename(self.argsFile))
417     tar.close()
418     except IOError, exc:
419     msg = 'Could not add %s to %s \n'%(self.argsFile,self.tarNameWithPath)
420     msg += str(exc)
421     raise CrabException(msg)
422     except tarfile.TarError, exc:
423     msg = 'Could not add %s to %s \n'%(self.argsFile,self.tarNameWithPath)
424     msg += str(exc)
425     raise CrabException(msg)
426 ewv 1.313
427 spiga 1.293 def CreateXML(self):
428     """
429 ewv 1.295 """
430 spiga 1.300 result = IMProvNode( self.rootArgsFilename )
431     outfile = file( self.argsFile, 'w').write(str(result))
432 ewv 1.295 return
433 spiga 1.293
434     def addEntry(self, listDictions):
435     """
436     _addEntry_
437 ewv 1.295
438 spiga 1.293 add an entry to the xml file
439     """
440     from IMProv.IMProvLoader import loadIMProvFile
441     ## load xml
442 spiga 1.300 improvDoc = loadIMProvFile(self.argsFile)
443 spiga 1.293 entrname= 'Job'
444     for dictions in listDictions:
445     report = IMProvNode(entrname , None, **dictions)
446     improvDoc.addNode(report)
447 spiga 1.300 outfile = file( self.argsFile, 'w').write(str(improvDoc))
448 gutsche 1.3 return
449 ewv 1.131
450 gutsche 1.3 def numberOfJobs(self):
451 spiga 1.269 return self.dict['njobs']
452 gutsche 1.3
453 slacapra 1.1 def getTarBall(self, exe):
454     """
455     Return the TarBall with lib and exe
456     """
457 spiga 1.300 self.tarNameWithPath = common.work_space.pathForTgz()+self.tar_name
458     if os.path.exists(self.tarNameWithPath):
459     return self.tarNameWithPath
460 slacapra 1.1
461     # Prepare a tar gzipped file with user binaries.
462     self.buildTar_(exe)
463    
464 spiga 1.300 return string.strip(self.tarNameWithPath)
465 slacapra 1.1
466     def buildTar_(self, executable):
467    
468     # First of all declare the user Scram area
469     swArea = self.scram.getSWArea_()
470     swReleaseTop = self.scram.getReleaseTop_()
471 ewv 1.131
472 slacapra 1.1 ## check if working area is release top
473     if swReleaseTop == '' or swArea == swReleaseTop:
474 spiga 1.304 common.logger.debug("swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
475 slacapra 1.1 return
476    
477 slacapra 1.61 import tarfile
478     try: # create tar ball
479 spiga 1.300 #tar = tarfile.open(self.tgzNameWithPath, "w:gz")
480     tar = tarfile.open(self.tarNameWithPath, "w")
481 slacapra 1.61 ## First find the executable
482 slacapra 1.86 if (self.executable != ''):
483 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
484     if ( not exeWithPath ):
485     raise CrabException('User executable '+executable+' not found')
486 ewv 1.131
487 slacapra 1.61 ## then check if it's private or not
488     if exeWithPath.find(swReleaseTop) == -1:
489     # the exe is private, so we must ship
490 spiga 1.304 common.logger.debug("Exe "+exeWithPath+" to be tarred")
491 slacapra 1.61 path = swArea+'/'
492 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
493     if exeWithPath.find(path) >= 0 :
494     exe = string.replace(exeWithPath, path,'')
495 slacapra 1.129 tar.add(path+exe,exe)
496 corvo 1.85 else :
497     tar.add(exeWithPath,os.path.basename(executable))
498 slacapra 1.61 pass
499     else:
500     # the exe is from release, we'll find it on WN
501     pass
502 ewv 1.131
503 slacapra 1.61 ## Now get the libraries: only those in local working area
504 slacapra 1.256 tar.dereference=True
505 slacapra 1.61 libDir = 'lib'
506     lib = swArea+'/' +libDir
507 spiga 1.304 common.logger.debug("lib "+lib+" to be tarred")
508 slacapra 1.61 if os.path.exists(lib):
509     tar.add(lib,libDir)
510 ewv 1.131
511 slacapra 1.61 ## Now check if module dir is present
512     moduleDir = 'module'
513     module = swArea + '/' + moduleDir
514     if os.path.isdir(module):
515     tar.add(module,moduleDir)
516 slacapra 1.256 tar.dereference=False
517 slacapra 1.61
518     ## Now check if any data dir(s) is present
519 spiga 1.179 self.dataExist = False
520 slacapra 1.212 todo_list = [(i, i) for i in os.listdir(swArea+"/src")]
521 slacapra 1.206 while len(todo_list):
522     entry, name = todo_list.pop()
523 slacapra 1.211 if name.startswith('crab_0_') or name.startswith('.') or name == 'CVS':
524 slacapra 1.206 continue
525 slacapra 1.212 if os.path.isdir(swArea+"/src/"+entry):
526 slacapra 1.206 entryPath = entry + '/'
527 slacapra 1.212 todo_list += [(entryPath + i, i) for i in os.listdir(swArea+"/src/"+entry)]
528 slacapra 1.206 if name == 'data':
529     self.dataExist=True
530 spiga 1.304 common.logger.debug("data "+entry+" to be tarred")
531 slacapra 1.212 tar.add(swArea+"/src/"+entry,"src/"+entry)
532 slacapra 1.206 pass
533     pass
534 ewv 1.182
535 spiga 1.179 ### CMSSW ParameterSet
536     if not self.pset is None:
537     cfg_file = common.work_space.jobDir()+self.configFilename()
538 ewv 1.182 tar.add(cfg_file,self.configFilename())
539 ewv 1.313
540 spiga 1.309 try:
541     crab_cfg_file = common.work_space.shareDir()+'/crab.cfg'
542     tar.add(crab_cfg_file,'crab.cfg')
543     except:
544     pass
545 fanzago 1.93
546 fanzago 1.152 ## Add ProdCommon dir to tar
547 slacapra 1.211 prodcommonDir = './'
548     prodcommonPath = os.environ['CRABDIR'] + '/' + 'external/'
549 spiga 1.244 neededStuff = ['ProdCommon/__init__.py','ProdCommon/FwkJobRep', 'ProdCommon/CMSConfigTools', \
550 spiga 1.298 'ProdCommon/Core', 'ProdCommon/MCPayloads', 'IMProv', 'ProdCommon/Storage', \
551     'WMCore/__init__.py','WMCore/Algorithms']
552 slacapra 1.214 for file in neededStuff:
553     tar.add(prodcommonPath+file,prodcommonDir+file)
554 spiga 1.179
555     ##### ML stuff
556     ML_file_list=['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py']
557     path=os.environ['CRABDIR'] + '/python/'
558     for file in ML_file_list:
559     tar.add(path+file,file)
560    
561     ##### Utils
562 spiga 1.238 Utils_file_list=['parseCrabFjr.py','writeCfg.py', 'fillCrabFjr.py','cmscp.py']
563 spiga 1.179 for file in Utils_file_list:
564     tar.add(path+file,file)
565 ewv 1.131
566 ewv 1.182 ##### AdditionalFiles
567 slacapra 1.253 tar.dereference=True
568 spiga 1.179 for file in self.additional_inbox_files:
569     tar.add(file,string.split(file,'/')[-1])
570 slacapra 1.253 tar.dereference=False
571 spiga 1.308 common.logger.log(10-1,"Files in "+self.tarNameWithPath+" : "+str(tar.getnames()))
572 ewv 1.182
573 slacapra 1.61 tar.close()
574 mcinquil 1.241 except IOError, exc:
575 spiga 1.304 msg = 'Could not create tar-ball %s \n'%self.tarNameWithPath
576     msg += str(exc)
577     raise CrabException(msg)
578 mcinquil 1.241 except tarfile.TarError, exc:
579 spiga 1.304 msg = 'Could not create tar-ball %s \n'%self.tarNameWithPath
580     msg += str(exc)
581     raise CrabException(msg)
582 spiga 1.300
583 ewv 1.313 def zipTarFile(self):
584    
585     cmd = "gzip -c %s > %s "%(self.tarNameWithPath,self.tgzNameWithPath)
586 spiga 1.300 res=runCommand(cmd)
587 gutsche 1.72
588     tarballinfo = os.stat(self.tgzNameWithPath)
589     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
590 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) \
591 ewv 1.250 +'MB input sandbox limit \n'
592 spiga 1.238 msg += ' and not supported by the direct GRID submission system.\n'
593     msg += ' Please use the CRAB server mode by setting server_name=<NAME> in section [CRAB] of your crab.cfg.\n'
594     msg += ' For further infos please see https://twiki.cern.ch/twiki/bin/view/CMS/CrabServer#CRABSERVER_for_Users'
595     raise CrabException(msg)
596 gutsche 1.72
597 slacapra 1.61 ## create tar-ball with ML stuff
598 slacapra 1.97
599 spiga 1.165 def wsSetupEnvironment(self, nj=0):
600 slacapra 1.1 """
601     Returns part of a job script which prepares
602     the execution environment for the job 'nj'.
603     """
604 ewv 1.276 # FUTURE: Drop support for .cfg when possible
605 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
606     psetName = 'pset.py'
607     else:
608     psetName = 'pset.cfg'
609 slacapra 1.1 # Prepare JobType-independent part
610 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
611 fanzago 1.133 txt += 'echo ">>> setup environment"\n'
612 spiga 1.290 txt += 'if [ $middleware == LCG ] || [ $middleware == CAF ] || [ $middleware == LSF ]; then \n'
613 gutsche 1.3 txt += self.wsSetupCMSLCGEnvironment_()
614 ewv 1.283 txt += 'elif [ $middleware == OSG ]; then\n'
615 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
616 ewv 1.132 txt += ' if [ ! $? == 0 ] ;then\n'
617 fanzago 1.161 txt += ' echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
618     txt += ' job_exit_code=10016\n'
619     txt += ' func_exit\n'
620 gutsche 1.3 txt += ' fi\n'
621 fanzago 1.133 txt += ' echo ">>> Created working directory: $WORKING_DIR"\n'
622 gutsche 1.3 txt += '\n'
623     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
624     txt += ' cd $WORKING_DIR\n'
625 fanzago 1.133 txt += ' echo ">>> current directory (WORKING_DIR): $WORKING_DIR"\n'
626 ewv 1.131 txt += self.wsSetupCMSOSGEnvironment_()
627 spiga 1.282 #Setup SGE Environment
628 ewv 1.283 txt += 'elif [ $middleware == SGE ]; then\n'
629 spiga 1.282 txt += self.wsSetupCMSLCGEnvironment_()
630    
631 edelmann 1.289 txt += 'elif [ $middleware == ARC ]; then\n'
632     txt += self.wsSetupCMSLCGEnvironment_()
633    
634 gutsche 1.3 txt += 'fi\n'
635 slacapra 1.1
636     # Prepare JobType-specific part
637     scram = self.scram.commandName()
638     txt += '\n\n'
639 fanzago 1.133 txt += 'echo ">>> specific cmssw setup environment:"\n'
640     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
641 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
642     txt += 'status=$?\n'
643     txt += 'if [ $status != 0 ] ; then\n'
644 fanzago 1.161 txt += ' echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
645     txt += ' job_exit_code=10034\n'
646 fanzago 1.163 txt += ' func_exit\n'
647 slacapra 1.1 txt += 'fi \n'
648     txt += 'cd '+self.version+'\n'
649 spiga 1.277 txt += 'SOFTWARE_DIR=`pwd`; export SOFTWARE_DIR\n'
650 fanzago 1.133 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
651 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
652 fanzago 1.180 txt += 'if [ $? != 0 ] ; then\n'
653     txt += ' echo "ERROR ==> Problem with the command: "\n'
654     txt += ' echo "eval \`'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME \` at `hostname`"\n'
655     txt += ' job_exit_code=10034\n'
656     txt += ' func_exit\n'
657     txt += 'fi \n'
658 slacapra 1.1 # Handle the arguments:
659     txt += "\n"
660 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
661 slacapra 1.1 txt += "\n"
662 spiga 1.165 txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
663 slacapra 1.1 txt += "then\n"
664 fanzago 1.161 txt += " echo 'ERROR ==> Too few arguments' +$nargs+ \n"
665     txt += ' job_exit_code=50113\n'
666     txt += " func_exit\n"
667 slacapra 1.1 txt += "fi\n"
668     txt += "\n"
669    
670     # Prepare job-specific part
671     job = common.job_list[nj]
672 ewv 1.131 if (self.datasetPath):
673 spiga 1.238 self.primaryDataset = self.datasetPath.split("/")[1]
674     DataTier = self.datasetPath.split("/")[2]
675 fanzago 1.93 txt += '\n'
676     txt += 'DatasetPath='+self.datasetPath+'\n'
677    
678 spiga 1.238 txt += 'PrimaryDataset='+self.primaryDataset +'\n'
679     txt += 'DataTier='+DataTier+'\n'
680 fanzago 1.96 txt += 'ApplicationFamily=cmsRun\n'
681 fanzago 1.93
682     else:
683 ewv 1.250 self.primaryDataset = 'null'
684 fanzago 1.93 txt += 'DatasetPath=MCDataTier\n'
685     txt += 'PrimaryDataset=null\n'
686     txt += 'DataTier=null\n'
687     txt += 'ApplicationFamily=MCDataTier\n'
688 ewv 1.170 if self.pset != None:
689 spiga 1.42 pset = os.path.basename(job.configFilename())
690     txt += '\n'
691 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
692 spiga 1.296
693 ewv 1.295 txt += 'PreserveSeeds=' + ','.join(self.preserveSeeds) + '; export PreserveSeeds\n'
694     txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
695     txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
696     txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
697 slacapra 1.90
698 ewv 1.184 txt += 'mv -f ' + pset + ' ' + psetName + '\n'
699 spiga 1.314 else:
700     txt += '\n'
701     txt += 'export AdditionalArgs=%s\n'%(self.AdditionalArgs)
702 slacapra 1.1
703 gutsche 1.3 return txt
704 slacapra 1.176
705 fanzago 1.166 def wsUntarSoftware(self, nj=0):
706 gutsche 1.3 """
707     Put in the script the commands to build an executable
708     or a library.
709     """
710    
711 fanzago 1.166 txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
712 gutsche 1.3
713     if os.path.isfile(self.tgzNameWithPath):
714 fanzago 1.133 txt += 'echo ">>> tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
715 spiga 1.300 txt += 'tar zxvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
716 fanzago 1.285 if self.debug_wrapper==1 :
717 spiga 1.199 txt += 'ls -Al \n'
718 gutsche 1.3 txt += 'untar_status=$? \n'
719     txt += 'if [ $untar_status -ne 0 ]; then \n'
720 fanzago 1.161 txt += ' echo "ERROR ==> Untarring .tgz file failed"\n'
721     txt += ' job_exit_code=$untar_status\n'
722     txt += ' func_exit\n'
723 gutsche 1.3 txt += 'else \n'
724     txt += ' echo "Successful untar" \n'
725     txt += 'fi \n'
726 gutsche 1.50 txt += '\n'
727 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
728 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
729 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
730 gutsche 1.50 txt += 'else\n'
731 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
732 fanzago 1.93 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
733 gutsche 1.50 txt += 'fi\n'
734     txt += '\n'
735    
736 gutsche 1.3 pass
737 ewv 1.131
738 slacapra 1.1 return txt
739 ewv 1.170
740 fanzago 1.166 def wsBuildExe(self, nj=0):
741     """
742     Put in the script the commands to build an executable
743     or a library.
744     """
745    
746     txt = '\n#Written by cms_cmssw::wsBuildExe\n'
747     txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
748    
749 ewv 1.170 txt += 'rm -r lib/ module/ \n'
750     txt += 'mv $RUNTIME_AREA/lib/ . \n'
751     txt += 'mv $RUNTIME_AREA/module/ . \n'
752 spiga 1.186 if self.dataExist == True:
753     txt += 'rm -r src/ \n'
754     txt += 'mv $RUNTIME_AREA/src/ . \n'
755 ewv 1.182 if len(self.additional_inbox_files)>0:
756 spiga 1.179 for file in self.additional_inbox_files:
757 spiga 1.191 txt += 'mv $RUNTIME_AREA/'+os.path.basename(file)+' . \n'
758 slacapra 1.214 # txt += 'mv $RUNTIME_AREA/ProdCommon/ . \n'
759     # txt += 'mv $RUNTIME_AREA/IMProv/ . \n'
760 ewv 1.170
761 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
762 fanzago 1.166 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
763 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
764 fanzago 1.166 txt += 'else\n'
765 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
766 fanzago 1.166 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
767     txt += 'fi\n'
768     txt += '\n'
769    
770 slacapra 1.302 if self.pset != None:
771 slacapra 1.303 # FUTURE: Drop support for .cfg when possible
772     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
773     psetName = 'pset.py'
774     else:
775     psetName = 'pset.cfg'
776 slacapra 1.302 # FUTURE: Can simply for 2_1_x and higher
777     txt += '\n'
778     if self.debug_wrapper == 1:
779     txt += 'echo "***** cat ' + psetName + ' *********"\n'
780     txt += 'cat ' + psetName + '\n'
781     txt += 'echo "****** end ' + psetName + ' ********"\n'
782     txt += '\n'
783     txt += 'echo "***********************" \n'
784     txt += 'which edmConfigHash \n'
785     txt += 'echo "***********************" \n'
786     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
787     txt += 'edmConfigHash ' + psetName + ' \n'
788     txt += 'PSETHASH=`edmConfigHash ' + psetName + '` \n'
789     else:
790     txt += 'PSETHASH=`edmConfigHash < ' + psetName + '` \n'
791     txt += 'echo "PSETHASH = $PSETHASH" \n'
792     #### FEDE temporary fix for noEdm files #####
793     txt += 'if [ -z "$PSETHASH" ]; then \n'
794     txt += ' export PSETHASH=null\n'
795     txt += 'fi \n'
796     #############################################
797     txt += '\n'
798 fanzago 1.166 return txt
799 slacapra 1.1
800 ewv 1.131
801 slacapra 1.1 def executableName(self):
802 ewv 1.192 if self.scriptExe:
803 spiga 1.42 return "sh "
804     else:
805     return self.executable
806 slacapra 1.1
807     def executableArgs(self):
808 ewv 1.160 # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
809 ewv 1.276 if self.scriptExe:
810 spiga 1.314 return self.scriptExe + " $NJob $AdditionalArgs"
811 fanzago 1.115 else:
812 ewv 1.160 ex_args = ""
813 ewv 1.276 ex_args += " -j $RUNTIME_AREA/crab_fjr_$NJob.xml"
814     # Type of config file depends on CMSSW version
815 ewv 1.184 if self.CMSSW_major >= 2 :
816 ewv 1.171 ex_args += " -p pset.py"
817 fanzago 1.115 else:
818 ewv 1.160 ex_args += " -p pset.cfg"
819     return ex_args
820 slacapra 1.1
821     def inputSandbox(self, nj):
822     """
823     Returns a list of filenames to be put in JDL input sandbox.
824     """
825     inp_box = []
826     if os.path.isfile(self.tgzNameWithPath):
827     inp_box.append(self.tgzNameWithPath)
828 spiga 1.243 inp_box.append(common.work_space.jobDir() + self.scriptName)
829 slacapra 1.1 return inp_box
830    
831     def outputSandbox(self, nj):
832     """
833     Returns a list of filenames to be put in JDL output sandbox.
834     """
835     out_box = []
836    
837     ## User Declared output files
838 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
839 ewv 1.131 n_out = nj + 1
840 slacapra 1.207 out_box.append(numberFile(out,str(n_out)))
841 slacapra 1.1 return out_box
842    
843    
844     def wsRenameOutput(self, nj):
845     """
846     Returns part of a job script which renames the produced files.
847     """
848    
849 ewv 1.160 txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
850 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
851     txt += 'echo ">>> current directory content:"\n'
852 fanzago 1.285 if self.debug_wrapper==1:
853 spiga 1.199 txt += 'ls -Al\n'
854 fanzago 1.145 txt += '\n'
855 slacapra 1.54
856 fanzago 1.128 for fileWithSuffix in (self.output_file):
857 slacapra 1.207 output_file_num = numberFile(fileWithSuffix, '$NJob')
858 slacapra 1.1 txt += '\n'
859 gutsche 1.7 txt += '# check output file\n'
860 slacapra 1.106 txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
861 ewv 1.147 if (self.copy_data == 1): # For OSG nodes, file is in $WORKING_DIR, should not be moved to $RUNTIME_AREA
862     txt += ' mv '+fileWithSuffix+' '+output_file_num+'\n'
863 spiga 1.209 txt += ' ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
864 ewv 1.147 else:
865     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
866     txt += ' ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
867 slacapra 1.106 txt += 'else\n'
868 fanzago 1.161 txt += ' job_exit_code=60302\n'
869     txt += ' echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
870 ewv 1.156 if common.scheduler.name().upper() == 'CONDOR_G':
871 gutsche 1.7 txt += ' if [ $middleware == OSG ]; then \n'
872     txt += ' echo "prepare dummy output file"\n'
873     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
874     txt += ' fi \n'
875 slacapra 1.1 txt += 'fi\n'
876 slacapra 1.105 file_list = []
877     for fileWithSuffix in (self.output_file):
878 spiga 1.246 file_list.append(numberFile('$SOFTWARE_DIR/'+fileWithSuffix, '$NJob'))
879 ewv 1.131
880 spiga 1.245 txt += 'file_list="'+string.join(file_list,',')+'"\n'
881 fanzago 1.149 txt += '\n'
882 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
883     txt += 'echo ">>> current directory content:"\n'
884 fanzago 1.285 if self.debug_wrapper==1:
885 spiga 1.199 txt += 'ls -Al\n'
886 fanzago 1.148 txt += '\n'
887 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
888 fanzago 1.133 txt += 'echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
889 slacapra 1.1 return txt
890    
891 slacapra 1.63 def getRequirements(self, nj=[]):
892 slacapra 1.1 """
893 ewv 1.131 return job requirements to add to jdl files
894 slacapra 1.1 """
895     req = ''
896 slacapra 1.47 if self.version:
897 slacapra 1.10 req='Member("VO-cms-' + \
898 slacapra 1.47 self.version + \
899 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
900 ewv 1.192 if self.executable_arch:
901 gutsche 1.107 req+=' && Member("VO-cms-' + \
902 slacapra 1.105 self.executable_arch + \
903     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
904 gutsche 1.35
905     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
906 afanfani 1.229 if ( common.scheduler.name() == "glitecoll" ) or ( common.scheduler.name() == "glite"):
907 afanfani 1.158 req += ' && other.GlueCEStateStatus == "Production" '
908 gutsche 1.35
909 slacapra 1.1 return req
910 gutsche 1.3
911     def configFilename(self):
912     """ return the config filename """
913 ewv 1.182 # FUTURE: Can remove cfg mode for CMSSW >= 2_1_x
914 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
915 ewv 1.182 return self.name()+'.py'
916     else:
917     return self.name()+'.cfg'
918 gutsche 1.3
919     def wsSetupCMSOSGEnvironment_(self):
920     """
921     Returns part of a job script which is prepares
922     the execution environment and which is common for all CMS jobs.
923     """
924 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
925     txt += ' echo ">>> setup CMS OSG environment:"\n'
926 fanzago 1.133 txt += ' echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
927     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
928 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
929 ewv 1.135 txt += ' if [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
930 mkirn 1.40 txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
931 fanzago 1.133 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
932     txt += ' else\n'
933 fanzago 1.161 txt += ' echo "ERROR ==> $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
934     txt += ' job_exit_code=10020\n'
935     txt += ' func_exit\n'
936 fanzago 1.133 txt += ' fi\n'
937 gutsche 1.3 txt += '\n'
938 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
939 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
940 gutsche 1.3
941     return txt
942 ewv 1.131
943 gutsche 1.3 def wsSetupCMSLCGEnvironment_(self):
944     """
945     Returns part of a job script which is prepares
946     the execution environment and which is common for all CMS jobs.
947     """
948 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
949     txt += ' echo ">>> setup CMS LCG environment:"\n'
950 fanzago 1.133 txt += ' echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
951     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
952     txt += ' export BUILD_ARCH='+self.executable_arch+'\n'
953     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
954 fanzago 1.161 txt += ' echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
955     txt += ' job_exit_code=10031\n'
956     txt += ' func_exit\n'
957 fanzago 1.133 txt += ' else\n'
958     txt += ' echo "Sourcing environment... "\n'
959     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
960 fanzago 1.161 txt += ' echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
961     txt += ' job_exit_code=10020\n'
962     txt += ' func_exit\n'
963 fanzago 1.133 txt += ' fi\n'
964     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
965     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
966     txt += ' result=$?\n'
967     txt += ' if [ $result -ne 0 ]; then\n'
968 fanzago 1.161 txt += ' echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
969     txt += ' job_exit_code=10032\n'
970     txt += ' func_exit\n'
971 fanzago 1.133 txt += ' fi\n'
972     txt += ' fi\n'
973     txt += ' \n'
974 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
975 gutsche 1.3 return txt
976 gutsche 1.5
977 spiga 1.238 def wsModifyReport(self, nj):
978 fanzago 1.93 """
979 ewv 1.131 insert the part of the script that modifies the FrameworkJob Report
980 fanzago 1.93 """
981 ewv 1.250
982 fanzago 1.281 txt = ''
983 fanzago 1.286 publish_data = int(self.cfg_params.get('USER.publish_data',0))
984 fanzago 1.292 #if (publish_data == 1):
985     if (self.copy_data == 1):
986 fanzago 1.281 txt = '\n#Written by cms_cmssw::wsModifyReport\n'
987 fanzago 1.292 publish_data = int(self.cfg_params.get('USER.publish_data',0))
988 ewv 1.283
989 spiga 1.238
990     txt += 'if [ $StageOutExitStatus -eq 0 ]; then\n'
991 fanzago 1.248 txt += ' FOR_LFN=$LFNBaseName\n'
992 fanzago 1.175 txt += 'else\n'
993     txt += ' FOR_LFN=/copy_problems/ \n'
994     txt += 'fi\n'
995 ewv 1.182
996 fanzago 1.175 txt += 'echo ">>> Modify Job Report:" \n'
997 fanzago 1.217 txt += 'chmod a+x $RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
998 fanzago 1.175 txt += 'echo "SE = $SE"\n'
999     txt += 'echo "SE_PATH = $SE_PATH"\n'
1000     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1001     txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1002 fanzago 1.281
1003    
1004     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'
1005 fanzago 1.292 if (publish_data == 1):
1006     processedDataset = self.cfg_params['USER.publish_data_name']
1007     txt += 'ProcessedDataset='+processedDataset+'\n'
1008     txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1009     args += ' UserProcessedDataset $USER-$ProcessedDataset-$PSETHASH'
1010 fanzago 1.281
1011 fanzago 1.247 txt += 'echo "$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'"\n'
1012     txt += '$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'\n'
1013 fanzago 1.175 txt += 'modifyReport_result=$?\n'
1014     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1015     txt += ' modifyReport_result=70500\n'
1016     txt += ' job_exit_code=$modifyReport_result\n'
1017     txt += ' echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
1018     txt += ' echo "WARNING: Problem with ModifyJobReport"\n'
1019     txt += 'else\n'
1020     txt += ' mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1021 spiga 1.103 txt += 'fi\n'
1022 fanzago 1.93 return txt
1023 ewv 1.283
1024 ewv 1.192 def wsParseFJR(self):
1025 spiga 1.189 """
1026 ewv 1.192 Parse the FrameworkJobReport to obtain useful infos
1027 spiga 1.189 """
1028     txt = '\n#Written by cms_cmssw::wsParseFJR\n'
1029     txt += 'echo ">>> Parse FrameworkJobReport crab_fjr.xml"\n'
1030     txt += 'if [ -s $RUNTIME_AREA/crab_fjr_$NJob.xml ]; then\n'
1031     txt += ' if [ -s $RUNTIME_AREA/parseCrabFjr.py ]; then\n'
1032 spiga 1.197 txt += ' cmd_out=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --dashboard $MonitorID,$MonitorJobID '+self.debugWrap+'`\n'
1033 fanzago 1.285 if self.debug_wrapper==1 :
1034 spiga 1.197 txt += ' echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out"\n'
1035     txt += ' executable_exit_status=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --exitcode`\n'
1036 spiga 1.189 txt += ' if [ $executable_exit_status -eq 50115 ];then\n'
1037     txt += ' echo ">>> crab_fjr.xml contents: "\n'
1038 spiga 1.222 txt += ' cat $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1039 spiga 1.189 txt += ' echo "Wrong FrameworkJobReport --> does not contain useful info. ExitStatus: $executable_exit_status"\n'
1040 spiga 1.197 txt += ' elif [ $executable_exit_status -eq -999 ];then\n'
1041     txt += ' echo "ExitStatus from FrameworkJobReport not available. not available. Using exit code of executable from command line."\n'
1042 spiga 1.189 txt += ' else\n'
1043     txt += ' echo "Extracted ExitStatus from FrameworkJobReport parsing output: $executable_exit_status"\n'
1044     txt += ' fi\n'
1045     txt += ' else\n'
1046     txt += ' echo "CRAB python script to parse CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1047     txt += ' fi\n'
1048     #### Patch to check input data reading for CMSSW16x Hopefully we-ll remove it asap
1049 spiga 1.232 txt += ' if [ $executable_exit_status -eq 0 ];then\n'
1050 fanzago 1.273 txt += ' echo ">>> Executable succeded $executable_exit_status"\n'
1051 ewv 1.301 ## This cannot more work given the changes on the Job argumentsJob
1052 spiga 1.296 """
1053 spiga 1.269 if (self.datasetPath and not (self.dataset_pu or self.useParent==1)) :
1054 spiga 1.189 # VERIFY PROCESSED DATA
1055 fanzago 1.273 txt += ' echo ">>> Verify list of processed files:"\n'
1056     txt += ' echo $InputFiles |tr -d \'\\\\\' |tr \',\' \'\\n\'|tr -d \'"\' > input-files.txt\n'
1057     txt += ' python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --lfn > processed-files.txt\n'
1058     txt += ' cat input-files.txt | sort | uniq > tmp.txt\n'
1059     txt += ' mv tmp.txt input-files.txt\n'
1060     txt += ' echo "cat input-files.txt"\n'
1061     txt += ' echo "----------------------"\n'
1062     txt += ' cat input-files.txt\n'
1063     txt += ' cat processed-files.txt | sort | uniq > tmp.txt\n'
1064     txt += ' mv tmp.txt processed-files.txt\n'
1065     txt += ' echo "----------------------"\n'
1066     txt += ' echo "cat processed-files.txt"\n'
1067     txt += ' echo "----------------------"\n'
1068     txt += ' cat processed-files.txt\n'
1069     txt += ' echo "----------------------"\n'
1070 spiga 1.278 txt += ' diff -qbB input-files.txt processed-files.txt\n'
1071 fanzago 1.273 txt += ' fileverify_status=$?\n'
1072     txt += ' if [ $fileverify_status -ne 0 ]; then\n'
1073     txt += ' executable_exit_status=30001\n'
1074     txt += ' echo "ERROR ==> not all input files processed"\n'
1075     txt += ' echo " ==> list of processed files from crab_fjr.xml differs from list in pset.cfg"\n'
1076     txt += ' echo " ==> diff input-files.txt processed-files.txt"\n'
1077     txt += ' fi\n'
1078 spiga 1.296 """
1079 spiga 1.232 txt += ' fi\n'
1080 spiga 1.189 txt += 'else\n'
1081     txt += ' echo "CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1082     txt += 'fi\n'
1083     txt += '\n'
1084 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'
1085 fanzago 1.273 txt += ' echo ">>> Executable failed $executable_exit_status"\n'
1086     txt += ' echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1087     txt += ' echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1088     txt += ' job_exit_code=$executable_exit_status\n'
1089     txt += ' func_exit\n'
1090     txt += 'fi\n\n'
1091 spiga 1.189 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    
1095     return txt
1096    
1097 gutsche 1.5 def setParam_(self, param, value):
1098     self._params[param] = value
1099    
1100     def getParams(self):
1101     return self._params
1102 gutsche 1.8
1103 spiga 1.257 def outList(self,list=False):
1104 mcinquil 1.121 """
1105     check the dimension of the output files
1106     """
1107 spiga 1.169 txt = ''
1108     txt += 'echo ">>> list of expected files on output sandbox"\n'
1109 mcinquil 1.121 listOutFiles = []
1110 ewv 1.170 stdout = 'CMSSW_$NJob.stdout'
1111 spiga 1.169 stderr = 'CMSSW_$NJob.stderr'
1112 spiga 1.268 if len(self.output_file) <= 0:
1113     msg ="WARNING: no output files name have been defined!!\n"
1114     msg+="\tno output files will be reported back/staged\n"
1115 spiga 1.304 common.logger.info(msg)
1116 fanzago 1.148 if (self.return_data == 1):
1117 spiga 1.157 for file in (self.output_file+self.output_file_sandbox):
1118 slacapra 1.207 listOutFiles.append(numberFile(file, '$NJob'))
1119 spiga 1.169 listOutFiles.append(stdout)
1120     listOutFiles.append(stderr)
1121 ewv 1.156 else:
1122 spiga 1.157 for file in (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 fanzago 1.161 txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1127 spiga 1.157 txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1128 spiga 1.169 txt += 'export filesToCheck\n'
1129 ewv 1.276
1130 spiga 1.257 if list : return self.output_file
1131 ewv 1.170 return txt