ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.317
Committed: Mon Jun 29 13:19:11 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.316: +11 -9 lines
Log Message:
remove default.tar after zipping

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