ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.381
Committed: Fri Mar 16 13:51:33 2012 UTC (13 years, 1 month ago) by belforte
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_8_2_pre1, CRAB_2_8_1
Changes since 1.380: +3 -3 lines
Log Message:
last fix was missing self. :-(

File Contents

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