ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.311
Committed: Wed Jun 10 11:31:33 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre10, CRAB_2_6_0_pre9, CRAB_2_6_0_pre8
Changes since 1.310: +4 -0 lines
Log Message:
print CMS names for destination SE rather than plain grid names

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