ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.18
Committed: Wed Jun 28 14:14:45 2006 UTC (18 years, 10 months ago) by fanzago
Content type: text/x-python
Branch: MAIN
Changes since 1.17: +12 -17 lines
Log Message:
fixed bug related to total number of file and jobs

File Contents

# User Rev Content
1 slacapra 1.1 from JobType import JobType
2     from crab_logger import Logger
3     from crab_exceptions import *
4     from crab_util import *
5     import common
6 gutsche 1.3 import PsetManipulator
7 slacapra 1.1
8 gutsche 1.3 import DBSInfo_EDM
9     import DataDiscovery_EDM
10     import DataLocation_EDM
11 slacapra 1.1 import Scram
12    
13     import os, string, re
14    
15     class Cmssw(JobType):
16     def __init__(self, cfg_params):
17     JobType.__init__(self, 'CMSSW')
18     common.logger.debug(3,'CMSSW::__init__')
19    
20     self.analisys_common_info = {}
21 gutsche 1.3 # Marco.
22     self._params = {}
23     self.cfg_params = cfg_params
24 slacapra 1.1 log = common.logger
25    
26     self.scram = Scram.Scram(cfg_params)
27     scramArea = ''
28     self.additional_inbox_files = []
29     self.scriptExe = ''
30     self.executable = ''
31     self.tgz_name = 'default.tgz'
32    
33 gutsche 1.3
34 slacapra 1.1 self.version = self.scram.getSWVersion()
35 gutsche 1.5 self.setParam_('application', self.version)
36 slacapra 1.1 common.analisys_common_info['sw_version'] = self.version
37 gutsche 1.3 ### FEDE
38     common.analisys_common_info['copy_input_data'] = 0
39     common.analisys_common_info['events_management'] = 1
40 slacapra 1.1
41     ### collect Data cards
42     try:
43 slacapra 1.9 tmp = cfg_params['CMSSW.datasetpath']
44     log.debug(6, "CMSSW::CMSSW(): datasetPath = "+tmp)
45     if string.lower(tmp)=='none':
46     self.datasetPath = None
47     else:
48     self.datasetPath = tmp
49 slacapra 1.1 except KeyError:
50 gutsche 1.3 msg = "Error: datasetpath not defined "
51 slacapra 1.1 raise CrabException(msg)
52 gutsche 1.5
53     # ML monitoring
54     # split dataset path style: /PreProdR3Minbias/SIM/GEN-SIM
55 slacapra 1.9 if not self.datasetPath:
56     self.setParam_('dataset', 'None')
57     self.setParam_('owner', 'None')
58     else:
59     datasetpath_split = self.datasetPath.split("/")
60     self.setParam_('dataset', datasetpath_split[1])
61     self.setParam_('owner', datasetpath_split[-1])
62    
63 gutsche 1.8 self.setTaskid_()
64     self.setParam_('taskId', self.cfg_params['taskId'])
65 gutsche 1.5
66 slacapra 1.1 self.dataTiers = []
67    
68     ## now the application
69     try:
70     self.executable = cfg_params['CMSSW.executable']
71 gutsche 1.5 self.setParam_('exe', self.executable)
72 slacapra 1.1 log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
73     msg = "Default executable cmsRun overridden. Switch to " + self.executable
74     log.debug(3,msg)
75     except KeyError:
76     self.executable = 'cmsRun'
77 gutsche 1.5 self.setParam_('exe', self.executable)
78 slacapra 1.1 msg = "User executable not defined. Use cmsRun"
79     log.debug(3,msg)
80     pass
81    
82     try:
83     self.pset = cfg_params['CMSSW.pset']
84     log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
85     if (not os.path.exists(self.pset)):
86     raise CrabException("User defined PSet file "+self.pset+" does not exist")
87     except KeyError:
88     raise CrabException("PSet file missing. Cannot run cmsRun ")
89    
90     # output files
91     try:
92     self.output_file = []
93    
94     tmp = cfg_params['CMSSW.output_file']
95     if tmp != '':
96     tmpOutFiles = string.split(cfg_params['CMSSW.output_file'],',')
97     log.debug(7, 'cmssw::cmssw(): output files '+str(tmpOutFiles))
98     for tmp in tmpOutFiles:
99     tmp=string.strip(tmp)
100     self.output_file.append(tmp)
101     pass
102     else:
103     log.message("No output file defined: only stdout/err will be available")
104     pass
105     pass
106     except KeyError:
107     log.message("No output file defined: only stdout/err will be available")
108     pass
109    
110     # script_exe file as additional file in inputSandbox
111     try:
112 slacapra 1.10 self.scriptExe = cfg_params['USER.script_exe']
113     self.additional_inbox_files.append(self.scriptExe)
114     if self.scriptExe != '':
115     if not os.path.isfile(self.scriptExe):
116     msg ="WARNING. file "+self.scriptExe+" not found"
117     raise CrabException(msg)
118 slacapra 1.1 except KeyError:
119     pass
120    
121     ## additional input files
122     try:
123     tmpAddFiles = string.split(cfg_params['CMSSW.additional_input_files'],',')
124     for tmp in tmpAddFiles:
125 gutsche 1.3 if not os.path.exists(tmp):
126     raise CrabException("Additional input file not found: "+tmp)
127 slacapra 1.1 tmp=string.strip(tmp)
128     self.additional_inbox_files.append(tmp)
129     pass
130     pass
131     except KeyError:
132     pass
133    
134 slacapra 1.9 # files per job
135 slacapra 1.1 try:
136 gutsche 1.3 self.filesPerJob = int(cfg_params['CMSSW.files_per_jobs']) #Daniele
137 slacapra 1.9 self.selectFilesPerJob = 1
138 gutsche 1.3 except KeyError:
139 slacapra 1.9 self.filesPerJob = 0
140     self.selectFilesPerJob = 0
141 gutsche 1.3
142 slacapra 1.9 ## Events per job
143 gutsche 1.3 try:
144 slacapra 1.10 self.eventsPerJob =int( cfg_params['CMSSW.events_per_job'])
145 slacapra 1.9 self.selectEventsPerJob = 1
146 gutsche 1.3 except KeyError:
147 slacapra 1.9 self.eventsPerJob = -1
148     self.selectEventsPerJob = 0
149    
150 slacapra 1.10 # To be implemented
151     # ## number of jobs
152     # try:
153     # self.numberOfJobs =int( cfg_params['CMSSW.number_of_job'])
154     # self.selectNumberOfJobs = 1
155     # except KeyError:
156     # self.selectNumberOfJobs = 0
157    
158 slacapra 1.9 if (self.selectFilesPerJob == self.selectEventsPerJob):
159 slacapra 1.10 msg = 'Must define either files_per_jobs or events_per_job'
160 slacapra 1.9 raise CrabException(msg)
161    
162 slacapra 1.10 if (self.selectEventsPerJob and not self.datasetPath == None):
163     msg = 'Splitting according to events_per_job available only with None as datasetpath'
164     raise CrabException(msg)
165    
166 gutsche 1.3 try:
167 slacapra 1.1 self.total_number_of_events = int(cfg_params['CMSSW.total_number_of_events'])
168     except KeyError:
169 gutsche 1.3 msg = 'Must define total_number_of_events'
170 slacapra 1.1 raise CrabException(msg)
171    
172     CEBlackList = []
173     try:
174     tmpBad = string.split(cfg_params['EDG.ce_black_list'],',')
175     for tmp in tmpBad:
176     tmp=string.strip(tmp)
177     CEBlackList.append(tmp)
178     except KeyError:
179     pass
180    
181     self.reCEBlackList=[]
182     for bad in CEBlackList:
183     self.reCEBlackList.append(re.compile( bad ))
184    
185     common.logger.debug(5,'CEBlackList: '+str(CEBlackList))
186    
187     CEWhiteList = []
188     try:
189     tmpGood = string.split(cfg_params['EDG.ce_white_list'],',')
190     for tmp in tmpGood:
191     tmp=string.strip(tmp)
192     CEWhiteList.append(tmp)
193     except KeyError:
194     pass
195    
196     #print 'CEWhiteList: ',CEWhiteList
197     self.reCEWhiteList=[]
198     for Good in CEWhiteList:
199     self.reCEWhiteList.append(re.compile( Good ))
200    
201     common.logger.debug(5,'CEWhiteList: '+str(CEWhiteList))
202    
203 gutsche 1.3 self.PsetEdit = PsetManipulator.PsetManipulator(self.pset) #Daniele Pset
204    
205 slacapra 1.1 #DBSDLS-start
206     ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
207     self.maxEvents=0 # max events available ( --> check the requested nb. of evts in Creator.py)
208     self.DBSPaths={} # all dbs paths requested ( --> input to the site local discovery script)
209     ## Perform the data location and discovery (based on DBS/DLS)
210 slacapra 1.9 ## SL: Don't if NONE is specified as input (pythia use case)
211     common.analisys_common_info['sites']=None
212     if self.datasetPath:
213     self.DataDiscoveryAndLocation(cfg_params)
214 slacapra 1.1 #DBSDLS-end
215    
216     self.tgzNameWithPath = self.getTarBall(self.executable)
217    
218 slacapra 1.10 # modify Pset
219     if (self.datasetPath): # standard job
220     self.PsetEdit.maxEvent(self.eventsPerJob) #Daniele
221     self.PsetEdit.inputModule("INPUT") #Daniele
222    
223     else: # pythia like job
224     self.PsetEdit.maxEvent(self.eventsPerJob) #Daniele
225     self.PsetEdit.pythiaSeed("INPUT") #Daniele
226     try:
227     self.sourceSeed = int(cfg_params['CMSSW.pythia_seed'])
228     except KeyError:
229     self.sourceSeed = 123456
230     common.logger.message("No seed given, will use "+str(self.sourceSeed))
231    
232     self.PsetEdit.psetWriter(self.configFilename())
233    
234 slacapra 1.9 ## Select Splitting
235     if self.selectFilesPerJob: self.jobSplittingPerFiles()
236     elif self.selectEventsPerJob: self.jobSplittingPerEvents()
237     else:
238     msg = 'Don\'t know how to split...'
239     raise CrabException(msg)
240 gutsche 1.5
241 gutsche 1.3
242 slacapra 1.1 def DataDiscoveryAndLocation(self, cfg_params):
243    
244 gutsche 1.3 common.logger.debug(10,"CMSSW::DataDiscoveryAndLocation()")
245    
246     datasetPath=self.datasetPath
247    
248     ## TODO
249     dataTiersList = ""
250     dataTiers = dataTiersList.split(',')
251 slacapra 1.1
252     ## Contact the DBS
253     try:
254 afanfani 1.4 self.pubdata=DataDiscovery_EDM.DataDiscovery_EDM(datasetPath, dataTiers, cfg_params)
255 slacapra 1.1 self.pubdata.fetchDBSInfo()
256    
257 gutsche 1.3 except DataDiscovery_EDM.NotExistingDatasetError, ex :
258 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
259     raise CrabException(msg)
260    
261 gutsche 1.3 except DataDiscovery_EDM.NoDataTierinProvenanceError, ex :
262 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
263     raise CrabException(msg)
264 gutsche 1.3 except DataDiscovery_EDM.DataDiscoveryError, ex:
265 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS %s'%ex.getErrorMessage()
266     raise CrabException(msg)
267    
268     ## get list of all required data in the form of dbs paths (dbs path = /dataset/datatier/owner)
269 gutsche 1.3 ## self.DBSPaths=self.pubdata.getDBSPaths()
270     common.logger.message("Required data are :"+self.datasetPath)
271    
272     filesbyblock=self.pubdata.getFiles()
273     self.AllInputFiles=filesbyblock.values()
274     self.files = self.AllInputFiles
275    
276     ## TEMP
277     # self.filesTmp = filesbyblock.values()
278     # self.files = []
279     # locPath='rfio:cmsbose2.bo.infn.it:/flatfiles/SE00/cms/fanfani/ProdTest/'
280     # locPath=''
281     # tmp = []
282     # for file in self.filesTmp[0]:
283     # tmp.append(locPath+file)
284     # self.files.append(tmp)
285     ## END TEMP
286 slacapra 1.1
287     ## get max number of events
288 gutsche 1.3 #common.logger.debug(10,"number of events for primary fileblocks %i"%self.pubdata.getMaxEvents())
289 slacapra 1.1 self.maxEvents=self.pubdata.getMaxEvents() ## self.maxEvents used in Creator.py
290     common.logger.message("\nThe number of available events is %s"%self.maxEvents)
291    
292     ## Contact the DLS and build a list of sites hosting the fileblocks
293     try:
294 gutsche 1.6 dataloc=DataLocation_EDM.DataLocation_EDM(filesbyblock.keys(),cfg_params)
295     dataloc.fetchDLSInfo()
296 gutsche 1.3 except DataLocation_EDM.DataLocationError , ex:
297 slacapra 1.1 msg = 'ERROR ***: failed Data Location in DLS \n %s '%ex.getErrorMessage()
298     raise CrabException(msg)
299    
300     allsites=dataloc.getSites()
301     common.logger.debug(5,"sites are %s"%allsites)
302     sites=self.checkBlackList(allsites)
303     common.logger.debug(5,"sites are (after black list) %s"%sites)
304     sites=self.checkWhiteList(sites)
305     common.logger.debug(5,"sites are (after white list) %s"%sites)
306    
307     if len(sites)==0:
308     msg = 'No sites hosting all the needed data! Exiting... '
309     raise CrabException(msg)
310 gutsche 1.3
311 slacapra 1.1 common.logger.message("List of Sites hosting the data : "+str(sites))
312     common.logger.debug(6, "List of Sites: "+str(sites))
313     common.analisys_common_info['sites']=sites ## used in SchedulerEdg.py in createSchScript
314 gutsche 1.5 self.setParam_('TargetCE', ','.join(sites))
315 slacapra 1.1 return
316 gutsche 1.3
317 slacapra 1.9 def jobSplittingPerFiles(self):
318     """
319     Perform job splitting based on number of files to be accessed per job
320 gutsche 1.3 """
321 slacapra 1.9 common.logger.debug(5,'Splitting per input files')
322 gutsche 1.3 common.logger.message('Required '+str(self.filesPerJob)+' files per job ')
323     common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
324    
325     ## TODO: SL need to have (from DBS) a detailed list of how many events per each file
326     n_tot_files = (len(self.files[0]))
327 fanzago 1.12 #print "n_tot_files = ", n_tot_files
328 gutsche 1.3 ## SL: this is wrong if the files have different number of events
329 fanzago 1.12 #print "self.maxEvents = ", self.maxEvents
330 gutsche 1.3 evPerFile = int(self.maxEvents)/n_tot_files
331 fanzago 1.12 #print "evPerFile = int(self.maxEvents)/n_tot_files = ", evPerFile
332    
333 gutsche 1.3 common.logger.debug(5,'Events per File '+str(evPerFile))
334    
335     ## if asked to process all events, do it
336     if self.total_number_of_events == -1:
337     self.total_number_of_events=self.maxEvents
338     self.total_number_of_jobs = int(n_tot_files)*1/int(self.filesPerJob)
339 slacapra 1.16 check = int(n_tot_files) - (int(self.total_number_of_jobs)*self.filesPerJob)
340     if check > 0:
341     self.total_number_of_jobs = self.total_number_of_jobs + 1
342     common.logger.message('Warning: last job will be created with '+str(check)+' files')
343 gutsche 1.3 common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for all available events '+str(self.total_number_of_events)+' events')
344    
345     else:
346 fanzago 1.12 #print "self.total_number_of_events = ", self.total_number_of_events
347     #print "evPerFile = ", evPerFile
348 gutsche 1.3 self.total_number_of_files = int(self.total_number_of_events/evPerFile)
349 fanzago 1.12 #print "self.total_number_of_files = int(self.total_number_of_events/evPerFile) = " , self.total_number_of_files
350 slacapra 1.15
351     ## SL: round the number of files to be processed to the ceiling
352     rem = self.total_number_of_events - self.total_number_of_files*evPerFile
353     if rem>0:
354     self.total_number_of_files = self.total_number_of_files + 1
355    
356 gutsche 1.3 ## SL: if ask for less event than what is computed to be available on a
357     ## file, process the first file anyhow.
358     if self.total_number_of_files == 0:
359     self.total_number_of_files = self.total_number_of_files + 1
360 fanzago 1.18 #### FEDE
361     if self.total_number_of_files > n_tot_files:
362     self.total_number_of_files = n_tot_files
363     #####
364 gutsche 1.3 common.logger.debug(5,'N files '+str(self.total_number_of_files))
365    
366     check = 0
367    
368     ## Compute the number of jobs
369     #self.total_number_of_jobs = int(n_tot_files)*1/int(self.filesPerJob)
370 fanzago 1.12 #print "self.total_number_of_files = ", self.total_number_of_files
371     #print "self.filesPerJob = ", self.filesPerJob
372 gutsche 1.3 self.total_number_of_jobs = int(self.total_number_of_files/self.filesPerJob)
373 fanzago 1.12 #print "self.total_number_of_jobs = ", self.total_number_of_jobs
374 gutsche 1.3 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
375    
376     ## is there any remainder?
377     check = int(self.total_number_of_files) - (int(self.total_number_of_jobs)*self.filesPerJob)
378    
379     common.logger.debug(5,'Check '+str(check))
380    
381     if check > 0:
382     self.total_number_of_jobs = self.total_number_of_jobs + 1
383     common.logger.message('Warning: last job will be created with '+str(check)+' files')
384    
385 slacapra 1.15 common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str((self.total_number_of_jobs-check)*self.filesPerJob*evPerFile + check*evPerFile)+' events')
386 gutsche 1.3 pass
387    
388     list_of_lists = []
389     for i in xrange(0, int(n_tot_files), self.filesPerJob):
390 slacapra 1.9 parString = "\\{"
391    
392     params = self.files[0][i: i+self.filesPerJob]
393     for i in range(len(params) - 1):
394     parString += '\\\"' + params[i] + '\\\"\,'
395    
396     parString += '\\\"' + params[len(params) - 1] + '\\\"\\}'
397 slacapra 1.17 #print parString
398     list_of_lists.append([parString])
399     #print list_of_lists
400 slacapra 1.9 pass
401    
402     self.list_of_args = list_of_lists
403 slacapra 1.17 # print self.list_of_args
404 slacapra 1.9 return
405    
406     def jobSplittingPerEvents(self):
407     """
408     Perform job splitting based on number of event per job
409     """
410     common.logger.debug(5,'Splitting per events')
411     common.logger.message('Required '+str(self.eventsPerJob)+' events per job ')
412     common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
413    
414 slacapra 1.10 if (self.total_number_of_events < 0):
415     msg='Cannot split jobs per Events with "-1" as total number of events'
416     raise CrabException(msg)
417    
418 slacapra 1.9 self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
419 fanzago 1.12
420 slacapra 1.9 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
421    
422     # is there any remainder?
423     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
424    
425     common.logger.debug(5,'Check '+str(check))
426    
427     if check > 0:
428     common.logger.message('Warning: asked '+self.total_number_of_events+' but will do only '+(int(self.total_number_of_jobs)*self.eventsPerJob))
429    
430     common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str(self.total_number_of_jobs*self.eventsPerJob)+' events')
431    
432 slacapra 1.10 # argument is seed number.$i
433 slacapra 1.9 self.list_of_args = []
434     for i in range(self.total_number_of_jobs):
435 slacapra 1.17 self.list_of_args.append([int(str(self.sourceSeed)+str(i))])
436     #print self.list_of_args
437 gutsche 1.3
438     return
439    
440     def split(self, jobParams):
441    
442     common.jobDB.load()
443     #### Fabio
444     njobs = self.total_number_of_jobs
445 slacapra 1.9 arglist = self.list_of_args
446 gutsche 1.3 # create the empty structure
447     for i in range(njobs):
448     jobParams.append("")
449    
450     for job in range(njobs):
451 slacapra 1.17 jobParams[job] = arglist[job]
452     # print str(arglist[job])
453     # print jobParams[job]
454 gutsche 1.3 common.jobDB.setArguments(job, jobParams[job])
455    
456     common.jobDB.save()
457     return
458    
459     def getJobTypeArguments(self, nj, sched):
460 slacapra 1.17 result = ''
461     for i in common.jobDB.arguments(nj):
462     result=result+str(i)+" "
463     return result
464 gutsche 1.3
465     def numberOfJobs(self):
466     # Fabio
467     return self.total_number_of_jobs
468    
469 slacapra 1.1 def checkBlackList(self, allSites):
470     if len(self.reCEBlackList)==0: return allSites
471     sites = []
472     for site in allSites:
473     common.logger.debug(10,'Site '+site)
474     good=1
475     for re in self.reCEBlackList:
476     if re.search(site):
477     common.logger.message('CE in black list, skipping site '+site)
478     good=0
479     pass
480     if good: sites.append(site)
481     if len(sites) == 0:
482     common.logger.debug(3,"No sites found after BlackList")
483     return sites
484    
485 gutsche 1.3 def checkWhiteList(self, allSites):
486 slacapra 1.1
487 gutsche 1.3 if len(self.reCEWhiteList)==0: return allSites
488 slacapra 1.1 sites = []
489 gutsche 1.3 for site in allSites:
490 slacapra 1.1 good=0
491     for re in self.reCEWhiteList:
492     if re.search(site):
493     common.logger.debug(5,'CE in white list, adding site '+site)
494     good=1
495     if not good: continue
496     sites.append(site)
497     if len(sites) == 0:
498     common.logger.message("No sites found after WhiteList\n")
499     else:
500     common.logger.debug(5,"Selected sites via WhiteList are "+str(sites)+"\n")
501     return sites
502    
503     def getTarBall(self, exe):
504     """
505     Return the TarBall with lib and exe
506     """
507    
508     # if it exist, just return it
509     self.tgzNameWithPath = common.work_space.shareDir()+self.tgz_name
510     if os.path.exists(self.tgzNameWithPath):
511     return self.tgzNameWithPath
512    
513     # Prepare a tar gzipped file with user binaries.
514     self.buildTar_(exe)
515    
516     return string.strip(self.tgzNameWithPath)
517    
518     def buildTar_(self, executable):
519    
520     # First of all declare the user Scram area
521     swArea = self.scram.getSWArea_()
522     #print "swArea = ", swArea
523     swVersion = self.scram.getSWVersion()
524     #print "swVersion = ", swVersion
525     swReleaseTop = self.scram.getReleaseTop_()
526     #print "swReleaseTop = ", swReleaseTop
527    
528     ## check if working area is release top
529     if swReleaseTop == '' or swArea == swReleaseTop:
530     return
531    
532     filesToBeTarred = []
533     ## First find the executable
534     if (self.executable != ''):
535     exeWithPath = self.scram.findFile_(executable)
536     # print exeWithPath
537     if ( not exeWithPath ):
538     raise CrabException('User executable '+executable+' not found')
539    
540     ## then check if it's private or not
541     if exeWithPath.find(swReleaseTop) == -1:
542     # the exe is private, so we must ship
543     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
544     path = swArea+'/'
545     exe = string.replace(exeWithPath, path,'')
546     filesToBeTarred.append(exe)
547     pass
548     else:
549     # the exe is from release, we'll find it on WN
550     pass
551    
552     ## Now get the libraries: only those in local working area
553     libDir = 'lib'
554     lib = swArea+'/' +libDir
555     common.logger.debug(5,"lib "+lib+" to be tarred")
556     if os.path.exists(lib):
557     filesToBeTarred.append(libDir)
558    
559 gutsche 1.3 ## Now check if module dir is present
560     moduleDir = 'module'
561     if os.path.isdir(swArea+'/'+moduleDir):
562     filesToBeTarred.append(moduleDir)
563    
564 slacapra 1.1 ## Now check if the Data dir is present
565     dataDir = 'src/Data/'
566     if os.path.isdir(swArea+'/'+dataDir):
567     filesToBeTarred.append(dataDir)
568    
569     ## Create the tar-ball
570     if len(filesToBeTarred)>0:
571     cwd = os.getcwd()
572     os.chdir(swArea)
573     tarcmd = 'tar zcvf ' + self.tgzNameWithPath + ' '
574     for line in filesToBeTarred:
575     tarcmd = tarcmd + line + ' '
576     cout = runCommand(tarcmd)
577     if not cout:
578     raise CrabException('Could not create tar-ball')
579     os.chdir(cwd)
580     else:
581     common.logger.debug(5,"No files to be to be tarred")
582    
583     return
584    
585     def wsSetupEnvironment(self, nj):
586     """
587     Returns part of a job script which prepares
588     the execution environment for the job 'nj'.
589     """
590     # Prepare JobType-independent part
591 gutsche 1.3 txt = ''
592    
593     ## OLI_Daniele at this level middleware already known
594    
595     txt += 'if [ $middleware == LCG ]; then \n'
596     txt += self.wsSetupCMSLCGEnvironment_()
597     txt += 'elif [ $middleware == OSG ]; then\n'
598     txt += ' time=`date -u +"%s"`\n'
599     txt += ' WORKING_DIR=$OSG_WN_TMP/cms_$time\n'
600     txt += ' echo "Creating working directory: $WORKING_DIR"\n'
601     txt += ' /bin/mkdir -p $WORKING_DIR\n'
602     txt += ' if [ ! -d $WORKING_DIR ] ;then\n'
603 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
604     txt += ' echo "JOB_EXIT_STATUS = 10016"\n'
605     txt += ' echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
606     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
607 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
608     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
609     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
610 gutsche 1.3 txt += ' exit 1\n'
611     txt += ' fi\n'
612     txt += '\n'
613     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
614     txt += ' cd $WORKING_DIR\n'
615     txt += self.wsSetupCMSOSGEnvironment_()
616     txt += 'fi\n'
617 slacapra 1.1
618     # Prepare JobType-specific part
619     scram = self.scram.commandName()
620     txt += '\n\n'
621     txt += 'echo "### SPECIFIC JOB SETUP ENVIRONMENT ###"\n'
622     txt += scram+' project CMSSW '+self.version+'\n'
623     txt += 'status=$?\n'
624     txt += 'if [ $status != 0 ] ; then\n'
625 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
626 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
627 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
628 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
629 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
630     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
631     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
632 gutsche 1.3 ## OLI_Daniele
633     txt += ' if [ $middleware == OSG ]; then \n'
634     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
635     txt += ' cd $RUNTIME_AREA\n'
636     txt += ' /bin/rm -rf $WORKING_DIR\n'
637     txt += ' if [ -d $WORKING_DIR ] ;then\n'
638 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10018 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after CMSSW CMSSW_0_6_1 not found on `hostname`"\n'
639     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
640     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
641     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
642 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
643     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
644     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
645 gutsche 1.3 txt += ' fi\n'
646     txt += ' fi \n'
647     txt += ' exit 1 \n'
648 slacapra 1.1 txt += 'fi \n'
649     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
650     txt += 'cd '+self.version+'\n'
651     ### needed grep for bug in scramv1 ###
652     txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
653    
654     # Handle the arguments:
655     txt += "\n"
656 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
657 slacapra 1.1 txt += "\n"
658     txt += "narg=$#\n"
659 gutsche 1.3 txt += "if [ $narg -lt 2 ]\n"
660 slacapra 1.1 txt += "then\n"
661     txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$narg+ \n"
662 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
663 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
664 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
665 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
666     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
667     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
668 gutsche 1.3 ## OLI_Daniele
669     txt += ' if [ $middleware == OSG ]; then \n'
670     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
671     txt += ' cd $RUNTIME_AREA\n'
672     txt += ' /bin/rm -rf $WORKING_DIR\n'
673     txt += ' if [ -d $WORKING_DIR ] ;then\n'
674 gutsche 1.7 txt += ' echo "SET_EXE_ENV 50114 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Too few arguments for CRAB job wrapper"\n'
675     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
676     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
677     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
678 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
679     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
680     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
681 gutsche 1.3 txt += ' fi\n'
682     txt += ' fi \n'
683 slacapra 1.1 txt += " exit 1\n"
684     txt += "fi\n"
685     txt += "\n"
686    
687     # Prepare job-specific part
688     job = common.job_list[nj]
689     pset = os.path.basename(job.configFilename())
690     txt += '\n'
691 slacapra 1.10 if (self.datasetPath): # standard job
692     txt += 'InputFiles=$2\n'
693     txt += 'echo "Inputfiles:<$InputFiles>"\n'
694     txt += 'sed "s#{\'INPUT\'}#$InputFiles#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
695     else: # pythia like job
696     txt += 'Seed=$2\n'
697     txt += 'echo "Seed: <$Seed>"\n'
698     txt += 'sed "s#INPUT#$Seed#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
699 slacapra 1.1
700     if len(self.additional_inbox_files) > 0:
701     for file in self.additional_inbox_files:
702     txt += 'if [ -e $RUNTIME_AREA/'+file+' ] ; then\n'
703     txt += ' cp $RUNTIME_AREA/'+file+' .\n'
704     txt += ' chmod +x '+file+'\n'
705     txt += 'fi\n'
706     pass
707    
708     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
709    
710     txt += '\n'
711     txt += 'echo "***** cat pset.cfg *********"\n'
712     txt += 'cat pset.cfg\n'
713     txt += 'echo "****** end pset.cfg ********"\n'
714 gutsche 1.3 txt += '\n'
715     # txt += 'echo "***** cat pset1.cfg *********"\n'
716     # txt += 'cat pset1.cfg\n'
717     # txt += 'echo "****** end pset1.cfg ********"\n'
718     return txt
719    
720     def wsBuildExe(self, nj):
721     """
722     Put in the script the commands to build an executable
723     or a library.
724     """
725    
726     txt = ""
727    
728     if os.path.isfile(self.tgzNameWithPath):
729     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
730     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
731     txt += 'untar_status=$? \n'
732     txt += 'if [ $untar_status -ne 0 ]; then \n'
733     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
734     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
735 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
736 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
737     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
738     txt += ' cd $RUNTIME_AREA\n'
739     txt += ' /bin/rm -rf $WORKING_DIR\n'
740     txt += ' if [ -d $WORKING_DIR ] ;then\n'
741 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
742     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
743     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
744     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
745     txt += ' rm -f $RUNTIME_AREA/$repo \n'
746     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
747     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
748 gutsche 1.3 txt += ' fi\n'
749     txt += ' fi \n'
750     txt += ' \n'
751 gutsche 1.7 txt += ' exit 1 \n'
752 gutsche 1.3 txt += 'else \n'
753     txt += ' echo "Successful untar" \n'
754     txt += 'fi \n'
755     pass
756    
757 slacapra 1.1 return txt
758    
759     def modifySteeringCards(self, nj):
760     """
761     modify the card provided by the user,
762     writing a new card into share dir
763     """
764    
765     def executableName(self):
766     return self.executable
767    
768     def executableArgs(self):
769 gutsche 1.3 return " -p pset.cfg"
770 slacapra 1.1
771     def inputSandbox(self, nj):
772     """
773     Returns a list of filenames to be put in JDL input sandbox.
774     """
775     inp_box = []
776     # dict added to delete duplicate from input sandbox file list
777     seen = {}
778     ## code
779     if os.path.isfile(self.tgzNameWithPath):
780     inp_box.append(self.tgzNameWithPath)
781     ## config
782     inp_box.append(common.job_list[nj].configFilename())
783     ## additional input files
784 gutsche 1.3 #for file in self.additional_inbox_files:
785     # inp_box.append(common.work_space.cwdDir()+file)
786 slacapra 1.1 return inp_box
787    
788     def outputSandbox(self, nj):
789     """
790     Returns a list of filenames to be put in JDL output sandbox.
791     """
792     out_box = []
793    
794     stdout=common.job_list[nj].stdout()
795     stderr=common.job_list[nj].stderr()
796    
797     ## User Declared output files
798     for out in self.output_file:
799     n_out = nj + 1
800     out_box.append(self.numberFile_(out,str(n_out)))
801     return out_box
802     return []
803    
804     def prepareSteeringCards(self):
805     """
806     Make initial modifications of the user's steering card file.
807     """
808     return
809    
810     def wsRenameOutput(self, nj):
811     """
812     Returns part of a job script which renames the produced files.
813     """
814    
815     txt = '\n'
816 gutsche 1.7 txt += '# directory content\n'
817     txt += 'ls \n'
818 slacapra 1.1 file_list = ''
819     for fileWithSuffix in self.output_file:
820     output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
821 gutsche 1.7 file_list=file_list+output_file_num+' '
822 slacapra 1.1 txt += '\n'
823 gutsche 1.7 txt += '# check output file\n'
824 slacapra 1.1 txt += 'ls '+fileWithSuffix+'\n'
825 fanzago 1.18 txt += 'ls_result=$?\n'
826     #txt += 'exe_result=$?\n'
827     txt += 'if [ $ls_result -ne 0 ] ; then\n'
828     txt += ' echo "ERROR: Problem with output file"\n'
829     #txt += ' echo "JOB_EXIT_STATUS = $exe_result"\n'
830     #txt += ' echo "JobExitCode=60302" | tee -a $RUNTIME_AREA/$repo\n'
831     #txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
832 gutsche 1.3 ### OLI_DANIELE
833 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
834     txt += ' if [ $middleware == OSG ]; then \n'
835     txt += ' echo "prepare dummy output file"\n'
836     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
837     txt += ' fi \n'
838 slacapra 1.1 txt += 'else\n'
839     txt += ' cp '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
840     txt += 'fi\n'
841    
842 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
843 slacapra 1.1 file_list=file_list[:-1]
844 slacapra 1.2 txt += 'file_list="'+file_list+'"\n'
845 fanzago 1.18 txt += 'cd $RUNTIME_AREA\n'
846 gutsche 1.3 ### OLI_DANIELE
847     txt += 'if [ $middleware == OSG ]; then\n'
848     txt += ' cd $RUNTIME_AREA\n'
849     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
850     txt += ' /bin/rm -rf $WORKING_DIR\n'
851     txt += ' if [ -d $WORKING_DIR ] ;then\n'
852 gutsche 1.7 txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
853     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
854     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
855     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
856 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
857     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
858     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
859 gutsche 1.3 txt += ' fi\n'
860     txt += 'fi\n'
861     txt += '\n'
862 slacapra 1.1 return txt
863    
864     def numberFile_(self, file, txt):
865     """
866     append _'txt' before last extension of a file
867     """
868     p = string.split(file,".")
869     # take away last extension
870     name = p[0]
871     for x in p[1:-1]:
872     name=name+"."+x
873     # add "_txt"
874     if len(p)>1:
875     ext = p[len(p)-1]
876     #result = name + '_' + str(txt) + "." + ext
877     result = name + '_' + txt + "." + ext
878     else:
879     #result = name + '_' + str(txt)
880     result = name + '_' + txt
881    
882     return result
883    
884     def getRequirements(self):
885     """
886     return job requirements to add to jdl files
887     """
888     req = ''
889 slacapra 1.10 if common.analisys_common_info['sw_version']:
890     req='Member("VO-cms-' + \
891     common.analisys_common_info['sw_version'] + \
892     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
893 slacapra 1.1 if common.analisys_common_info['sites']:
894     if len(common.analisys_common_info['sites'])>0:
895     req = req + ' && ('
896     for i in range(len(common.analisys_common_info['sites'])):
897     req = req + 'other.GlueCEInfoHostName == "' \
898     + common.analisys_common_info['sites'][i] + '"'
899     if ( i < (int(len(common.analisys_common_info['sites']) - 1)) ):
900     req = req + ' || '
901     req = req + ')'
902     #print "req = ", req
903     return req
904 gutsche 1.3
905     def configFilename(self):
906     """ return the config filename """
907     return self.name()+'.cfg'
908    
909     ### OLI_DANIELE
910     def wsSetupCMSOSGEnvironment_(self):
911     """
912     Returns part of a job script which is prepares
913     the execution environment and which is common for all CMS jobs.
914     """
915     txt = '\n'
916     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
917     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
918     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
919     txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
920     txt += ' elif [ -f $OSG_APP/cmssoft/cmsset_default.sh ] ;then\n'
921     txt += ' # Use $OSG_APP/cmssoft/cmsset_default.sh to setup cms software\n'
922     txt += ' source $OSG_APP/cmssoft/cmsset_default.sh '+self.version+'\n'
923     txt += ' else\n'
924     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR $GRID3_APP_DIR/cmssoft/cmsset_default.sh and $OSG_APP/cmssoft/cmsset_default.sh file not found"\n'
925     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
926     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
927     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
928 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
929     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
930     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
931 gutsche 1.7 txt += ' exit 1\n'
932 gutsche 1.3 txt += '\n'
933     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
934     txt += ' cd $RUNTIME_AREA\n'
935     txt += ' /bin/rm -rf $WORKING_DIR\n'
936     txt += ' if [ -d $WORKING_DIR ] ;then\n'
937 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10017 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after $GRID3_APP_DIR/cmssoft/cmsset_default.sh and $OSG_APP/cmssoft/cmsset_default.sh file not found"\n'
938     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
939     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
940     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
941 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
942     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
943     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
944 gutsche 1.3 txt += ' fi\n'
945     txt += '\n'
946 gutsche 1.7 txt += ' exit 1\n'
947 gutsche 1.3 txt += ' fi\n'
948     txt += '\n'
949     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
950     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
951    
952     return txt
953    
954     ### OLI_DANIELE
955     def wsSetupCMSLCGEnvironment_(self):
956     """
957     Returns part of a job script which is prepares
958     the execution environment and which is common for all CMS jobs.
959     """
960     txt = ' \n'
961     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
962     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
963     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
964     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
965     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
966     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
967 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
968     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
969     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
970 gutsche 1.7 txt += ' exit 1\n'
971 gutsche 1.3 txt += ' else\n'
972     txt += ' echo "Sourcing environment... "\n'
973     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
974     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
975     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
976     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
977     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
978 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
979     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
980     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
981 gutsche 1.7 txt += ' exit 1\n'
982 gutsche 1.3 txt += ' fi\n'
983     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
984     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
985     txt += ' result=$?\n'
986     txt += ' if [ $result -ne 0 ]; then\n'
987     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
988     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
989     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
990     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
991 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
992     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
993     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
994 gutsche 1.7 txt += ' exit 1\n'
995 gutsche 1.3 txt += ' fi\n'
996     txt += ' fi\n'
997     txt += ' \n'
998     txt += ' string=`cat /etc/redhat-release`\n'
999     txt += ' echo $string\n'
1000     txt += ' if [[ $string = *alhalla* ]]; then\n'
1001     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
1002     txt += ' elif [[ $string = *Enterprise* ]] || [[ $string = *cientific* ]]; then\n'
1003     txt += ' export SCRAM_ARCH=slc3_ia32_gcc323\n'
1004     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
1005     txt += ' else\n'
1006 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10033 ==> ERROR OS unknown, LCG environment not initialized"\n'
1007 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10033"\n'
1008     txt += ' echo "JobExitCode=10033" | tee -a $RUNTIME_AREA/$repo\n'
1009     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1010 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1011     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1012     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1013 gutsche 1.7 txt += ' exit 1\n'
1014 gutsche 1.3 txt += ' fi\n'
1015     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1016     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1017     return txt
1018 gutsche 1.5
1019     def setParam_(self, param, value):
1020     self._params[param] = value
1021    
1022     def getParams(self):
1023     return self._params
1024 gutsche 1.8
1025     def setTaskid_(self):
1026     self._taskId = self.cfg_params['taskId']
1027    
1028     def getTaskid(self):
1029     return self._taskId