ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.15
Committed: Tue Jun 27 16:26:07 2006 UTC (18 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.14: +7 -1 lines
Log Message:
minor fix in printout

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     common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for all available events '+str(self.total_number_of_events)+' events')
340    
341     else:
342 fanzago 1.12 #print "self.total_number_of_events = ", self.total_number_of_events
343     #print "evPerFile = ", evPerFile
344 gutsche 1.3 self.total_number_of_files = int(self.total_number_of_events/evPerFile)
345 fanzago 1.12 #print "self.total_number_of_files = int(self.total_number_of_events/evPerFile) = " , self.total_number_of_files
346 slacapra 1.15
347     ## SL: round the number of files to be processed to the ceiling
348     rem = self.total_number_of_events - self.total_number_of_files*evPerFile
349     if rem>0:
350     self.total_number_of_files = self.total_number_of_files + 1
351    
352 gutsche 1.3 ## SL: if ask for less event than what is computed to be available on a
353     ## file, process the first file anyhow.
354     if self.total_number_of_files == 0:
355     self.total_number_of_files = self.total_number_of_files + 1
356 fanzago 1.12
357 gutsche 1.3
358     common.logger.debug(5,'N files '+str(self.total_number_of_files))
359    
360     check = 0
361    
362     ## Compute the number of jobs
363     #self.total_number_of_jobs = int(n_tot_files)*1/int(self.filesPerJob)
364 fanzago 1.12 #print "self.total_number_of_files = ", self.total_number_of_files
365     #print "self.filesPerJob = ", self.filesPerJob
366 gutsche 1.3 self.total_number_of_jobs = int(self.total_number_of_files/self.filesPerJob)
367 fanzago 1.12 #print "self.total_number_of_jobs = ", self.total_number_of_jobs
368 gutsche 1.3 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
369    
370     ## is there any remainder?
371     check = int(self.total_number_of_files) - (int(self.total_number_of_jobs)*self.filesPerJob)
372    
373     common.logger.debug(5,'Check '+str(check))
374    
375     if check > 0:
376     self.total_number_of_jobs = self.total_number_of_jobs + 1
377     common.logger.message('Warning: last job will be created with '+str(check)+' files')
378    
379 fanzago 1.12 #common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str((self.total_number_of_jobs-1)*self.filesPerJob*evPerFile + check*evPerFile)+' events')
380 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')
381 gutsche 1.3 pass
382    
383     list_of_lists = []
384     for i in xrange(0, int(n_tot_files), self.filesPerJob):
385 slacapra 1.9 parString = "\\{"
386    
387     params = self.files[0][i: i+self.filesPerJob]
388     for i in range(len(params) - 1):
389     parString += '\\\"' + params[i] + '\\\"\,'
390    
391     parString += '\\\"' + params[len(params) - 1] + '\\\"\\}'
392     list_of_lists.append(parString)
393     pass
394    
395     self.list_of_args = list_of_lists
396 fanzago 1.11 #print self.list_of_args
397 slacapra 1.9 return
398    
399     def jobSplittingPerEvents(self):
400     """
401     Perform job splitting based on number of event per job
402     """
403     common.logger.debug(5,'Splitting per events')
404     common.logger.message('Required '+str(self.eventsPerJob)+' events per job ')
405     common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
406    
407 slacapra 1.10 if (self.total_number_of_events < 0):
408     msg='Cannot split jobs per Events with "-1" as total number of events'
409     raise CrabException(msg)
410    
411 slacapra 1.9 self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
412 fanzago 1.12
413     print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
414     print "self.total_number_of_events = ", self.total_number_of_events
415     print "self.eventsPerJob = ", self.eventsPerJob
416     print "self.total_number_of_jobs = ", self.total_number_of_jobs
417     print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
418 slacapra 1.9
419     common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
420    
421     # is there any remainder?
422     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
423    
424     common.logger.debug(5,'Check '+str(check))
425    
426     if check > 0:
427     common.logger.message('Warning: asked '+self.total_number_of_events+' but will do only '+(int(self.total_number_of_jobs)*self.eventsPerJob))
428    
429     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')
430    
431 slacapra 1.10 # argument is seed number.$i
432 slacapra 1.9 self.list_of_args = []
433     for i in range(self.total_number_of_jobs):
434 slacapra 1.10 self.list_of_args.append(int(str(self.sourceSeed)+str(i)))
435 slacapra 1.9 print self.list_of_args
436 gutsche 1.3
437     return
438    
439     def split(self, jobParams):
440    
441     common.jobDB.load()
442     #### Fabio
443     njobs = self.total_number_of_jobs
444 slacapra 1.9 arglist = self.list_of_args
445 gutsche 1.3 # create the empty structure
446     for i in range(njobs):
447     jobParams.append("")
448    
449     for job in range(njobs):
450 slacapra 1.9 jobParams[job] = str(arglist[job])
451 gutsche 1.3 common.jobDB.setArguments(job, jobParams[job])
452    
453     common.jobDB.save()
454     return
455    
456     def getJobTypeArguments(self, nj, sched):
457 slacapra 1.9 return common.jobDB.arguments(nj)
458 gutsche 1.3
459     def numberOfJobs(self):
460     # Fabio
461     return self.total_number_of_jobs
462    
463 slacapra 1.1 def checkBlackList(self, allSites):
464     if len(self.reCEBlackList)==0: return allSites
465     sites = []
466     for site in allSites:
467     common.logger.debug(10,'Site '+site)
468     good=1
469     for re in self.reCEBlackList:
470     if re.search(site):
471     common.logger.message('CE in black list, skipping site '+site)
472     good=0
473     pass
474     if good: sites.append(site)
475     if len(sites) == 0:
476     common.logger.debug(3,"No sites found after BlackList")
477     return sites
478    
479 gutsche 1.3 def checkWhiteList(self, allSites):
480 slacapra 1.1
481 gutsche 1.3 if len(self.reCEWhiteList)==0: return allSites
482 slacapra 1.1 sites = []
483 gutsche 1.3 for site in allSites:
484 slacapra 1.1 good=0
485     for re in self.reCEWhiteList:
486     if re.search(site):
487     common.logger.debug(5,'CE in white list, adding site '+site)
488     good=1
489     if not good: continue
490     sites.append(site)
491     if len(sites) == 0:
492     common.logger.message("No sites found after WhiteList\n")
493     else:
494     common.logger.debug(5,"Selected sites via WhiteList are "+str(sites)+"\n")
495     return sites
496    
497     def getTarBall(self, exe):
498     """
499     Return the TarBall with lib and exe
500     """
501    
502     # if it exist, just return it
503     self.tgzNameWithPath = common.work_space.shareDir()+self.tgz_name
504     if os.path.exists(self.tgzNameWithPath):
505     return self.tgzNameWithPath
506    
507     # Prepare a tar gzipped file with user binaries.
508     self.buildTar_(exe)
509    
510     return string.strip(self.tgzNameWithPath)
511    
512     def buildTar_(self, executable):
513    
514     # First of all declare the user Scram area
515     swArea = self.scram.getSWArea_()
516     #print "swArea = ", swArea
517     swVersion = self.scram.getSWVersion()
518     #print "swVersion = ", swVersion
519     swReleaseTop = self.scram.getReleaseTop_()
520     #print "swReleaseTop = ", swReleaseTop
521    
522     ## check if working area is release top
523     if swReleaseTop == '' or swArea == swReleaseTop:
524     return
525    
526     filesToBeTarred = []
527     ## First find the executable
528     if (self.executable != ''):
529     exeWithPath = self.scram.findFile_(executable)
530     # print exeWithPath
531     if ( not exeWithPath ):
532     raise CrabException('User executable '+executable+' not found')
533    
534     ## then check if it's private or not
535     if exeWithPath.find(swReleaseTop) == -1:
536     # the exe is private, so we must ship
537     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
538     path = swArea+'/'
539     exe = string.replace(exeWithPath, path,'')
540     filesToBeTarred.append(exe)
541     pass
542     else:
543     # the exe is from release, we'll find it on WN
544     pass
545    
546     ## Now get the libraries: only those in local working area
547     libDir = 'lib'
548     lib = swArea+'/' +libDir
549     common.logger.debug(5,"lib "+lib+" to be tarred")
550     if os.path.exists(lib):
551     filesToBeTarred.append(libDir)
552    
553 gutsche 1.3 ## Now check if module dir is present
554     moduleDir = 'module'
555     if os.path.isdir(swArea+'/'+moduleDir):
556     filesToBeTarred.append(moduleDir)
557    
558 slacapra 1.1 ## Now check if the Data dir is present
559     dataDir = 'src/Data/'
560     if os.path.isdir(swArea+'/'+dataDir):
561     filesToBeTarred.append(dataDir)
562    
563     ## Create the tar-ball
564     if len(filesToBeTarred)>0:
565     cwd = os.getcwd()
566     os.chdir(swArea)
567     tarcmd = 'tar zcvf ' + self.tgzNameWithPath + ' '
568     for line in filesToBeTarred:
569     tarcmd = tarcmd + line + ' '
570     cout = runCommand(tarcmd)
571     if not cout:
572     raise CrabException('Could not create tar-ball')
573     os.chdir(cwd)
574     else:
575     common.logger.debug(5,"No files to be to be tarred")
576    
577     return
578    
579     def wsSetupEnvironment(self, nj):
580     """
581     Returns part of a job script which prepares
582     the execution environment for the job 'nj'.
583     """
584     # Prepare JobType-independent part
585 gutsche 1.3 txt = ''
586    
587     ## OLI_Daniele at this level middleware already known
588    
589     txt += 'if [ $middleware == LCG ]; then \n'
590     txt += self.wsSetupCMSLCGEnvironment_()
591     txt += 'elif [ $middleware == OSG ]; then\n'
592     txt += ' time=`date -u +"%s"`\n'
593     txt += ' WORKING_DIR=$OSG_WN_TMP/cms_$time\n'
594     txt += ' echo "Creating working directory: $WORKING_DIR"\n'
595     txt += ' /bin/mkdir -p $WORKING_DIR\n'
596     txt += ' if [ ! -d $WORKING_DIR ] ;then\n'
597 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
598     txt += ' echo "JOB_EXIT_STATUS = 10016"\n'
599     txt += ' echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
600     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
601 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
602     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
603     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
604 gutsche 1.3 txt += ' exit 1\n'
605     txt += ' fi\n'
606     txt += '\n'
607     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
608     txt += ' cd $WORKING_DIR\n'
609     txt += self.wsSetupCMSOSGEnvironment_()
610     txt += 'fi\n'
611 slacapra 1.1
612     # Prepare JobType-specific part
613     scram = self.scram.commandName()
614     txt += '\n\n'
615     txt += 'echo "### SPECIFIC JOB SETUP ENVIRONMENT ###"\n'
616     txt += scram+' project CMSSW '+self.version+'\n'
617     txt += 'status=$?\n'
618     txt += 'if [ $status != 0 ] ; then\n'
619 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
620 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
621 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
622 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
623 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
624     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
625     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
626 gutsche 1.3 ## OLI_Daniele
627     txt += ' if [ $middleware == OSG ]; then \n'
628     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
629     txt += ' cd $RUNTIME_AREA\n'
630     txt += ' /bin/rm -rf $WORKING_DIR\n'
631     txt += ' if [ -d $WORKING_DIR ] ;then\n'
632 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'
633     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
634     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
635     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
636 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
637     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
638     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
639 gutsche 1.3 txt += ' fi\n'
640     txt += ' fi \n'
641     txt += ' exit 1 \n'
642 slacapra 1.1 txt += 'fi \n'
643     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
644     txt += 'cd '+self.version+'\n'
645     ### needed grep for bug in scramv1 ###
646     txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
647    
648     # Handle the arguments:
649     txt += "\n"
650 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
651 slacapra 1.1 txt += "\n"
652     txt += "narg=$#\n"
653 gutsche 1.3 txt += "if [ $narg -lt 2 ]\n"
654 slacapra 1.1 txt += "then\n"
655     txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$narg+ \n"
656 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
657 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
658 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
659 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
660     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
661     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
662 gutsche 1.3 ## OLI_Daniele
663     txt += ' if [ $middleware == OSG ]; then \n'
664     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
665     txt += ' cd $RUNTIME_AREA\n'
666     txt += ' /bin/rm -rf $WORKING_DIR\n'
667     txt += ' if [ -d $WORKING_DIR ] ;then\n'
668 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'
669     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
670     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
671     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
672 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
673     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
674     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
675 gutsche 1.3 txt += ' fi\n'
676     txt += ' fi \n'
677 slacapra 1.1 txt += " exit 1\n"
678     txt += "fi\n"
679     txt += "\n"
680    
681     # Prepare job-specific part
682     job = common.job_list[nj]
683     pset = os.path.basename(job.configFilename())
684     txt += '\n'
685 slacapra 1.10 if (self.datasetPath): # standard job
686     txt += 'InputFiles=$2\n'
687     txt += 'echo "Inputfiles:<$InputFiles>"\n'
688     txt += 'sed "s#{\'INPUT\'}#$InputFiles#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
689     else: # pythia like job
690     txt += 'Seed=$2\n'
691     txt += 'echo "Seed: <$Seed>"\n'
692     txt += 'sed "s#INPUT#$Seed#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
693 slacapra 1.1
694     if len(self.additional_inbox_files) > 0:
695     for file in self.additional_inbox_files:
696     txt += 'if [ -e $RUNTIME_AREA/'+file+' ] ; then\n'
697     txt += ' cp $RUNTIME_AREA/'+file+' .\n'
698     txt += ' chmod +x '+file+'\n'
699     txt += 'fi\n'
700     pass
701    
702     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
703    
704     txt += '\n'
705     txt += 'echo "***** cat pset.cfg *********"\n'
706     txt += 'cat pset.cfg\n'
707     txt += 'echo "****** end pset.cfg ********"\n'
708 gutsche 1.3 txt += '\n'
709     # txt += 'echo "***** cat pset1.cfg *********"\n'
710     # txt += 'cat pset1.cfg\n'
711     # txt += 'echo "****** end pset1.cfg ********"\n'
712     return txt
713    
714     def wsBuildExe(self, nj):
715     """
716     Put in the script the commands to build an executable
717     or a library.
718     """
719    
720     txt = ""
721    
722     if os.path.isfile(self.tgzNameWithPath):
723     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
724     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
725     txt += 'untar_status=$? \n'
726     txt += 'if [ $untar_status -ne 0 ]; then \n'
727     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
728     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
729 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
730 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
731     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
732     txt += ' cd $RUNTIME_AREA\n'
733     txt += ' /bin/rm -rf $WORKING_DIR\n'
734     txt += ' if [ -d $WORKING_DIR ] ;then\n'
735 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
736     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
737     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
738     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
739     txt += ' rm -f $RUNTIME_AREA/$repo \n'
740     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
741     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
742 gutsche 1.3 txt += ' fi\n'
743     txt += ' fi \n'
744     txt += ' \n'
745 gutsche 1.7 txt += ' exit 1 \n'
746 gutsche 1.3 txt += 'else \n'
747     txt += ' echo "Successful untar" \n'
748     txt += 'fi \n'
749     pass
750    
751 slacapra 1.1 return txt
752    
753     def modifySteeringCards(self, nj):
754     """
755     modify the card provided by the user,
756     writing a new card into share dir
757     """
758    
759     def executableName(self):
760     return self.executable
761    
762     def executableArgs(self):
763 gutsche 1.3 return " -p pset.cfg"
764 slacapra 1.1
765     def inputSandbox(self, nj):
766     """
767     Returns a list of filenames to be put in JDL input sandbox.
768     """
769     inp_box = []
770     # dict added to delete duplicate from input sandbox file list
771     seen = {}
772     ## code
773     if os.path.isfile(self.tgzNameWithPath):
774     inp_box.append(self.tgzNameWithPath)
775     ## config
776     inp_box.append(common.job_list[nj].configFilename())
777     ## additional input files
778 gutsche 1.3 #for file in self.additional_inbox_files:
779     # inp_box.append(common.work_space.cwdDir()+file)
780 slacapra 1.1 return inp_box
781    
782     def outputSandbox(self, nj):
783     """
784     Returns a list of filenames to be put in JDL output sandbox.
785     """
786     out_box = []
787    
788     stdout=common.job_list[nj].stdout()
789     stderr=common.job_list[nj].stderr()
790    
791     ## User Declared output files
792     for out in self.output_file:
793     n_out = nj + 1
794     out_box.append(self.numberFile_(out,str(n_out)))
795     return out_box
796     return []
797    
798     def prepareSteeringCards(self):
799     """
800     Make initial modifications of the user's steering card file.
801     """
802     return
803    
804     def wsRenameOutput(self, nj):
805     """
806     Returns part of a job script which renames the produced files.
807     """
808    
809     txt = '\n'
810 gutsche 1.7 txt += '# directory content\n'
811     txt += 'ls \n'
812 slacapra 1.1 file_list = ''
813     for fileWithSuffix in self.output_file:
814     output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
815 gutsche 1.7 file_list=file_list+output_file_num+' '
816 slacapra 1.1 txt += '\n'
817 gutsche 1.7 txt += '# check output file\n'
818 slacapra 1.1 txt += 'ls '+fileWithSuffix+'\n'
819     txt += 'exe_result=$?\n'
820     txt += 'if [ $exe_result -ne 0 ] ; then\n'
821     txt += ' echo "ERROR: No output file to manage"\n'
822 gutsche 1.7 txt += ' echo "JOB_EXIT_STATUS = $exe_result"\n'
823     txt += ' echo "JobExitCode=60302" | tee -a $RUNTIME_AREA/$repo\n'
824     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
825 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
826     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
827     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
828 gutsche 1.3 ### OLI_DANIELE
829 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
830     txt += ' if [ $middleware == OSG ]; then \n'
831     txt += ' echo "prepare dummy output file"\n'
832     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
833     txt += ' fi \n'
834 slacapra 1.1 txt += 'else\n'
835     txt += ' cp '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
836     txt += 'fi\n'
837    
838 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
839 slacapra 1.1 file_list=file_list[:-1]
840 slacapra 1.2 txt += 'file_list="'+file_list+'"\n'
841 gutsche 1.3 ### OLI_DANIELE
842     txt += 'if [ $middleware == OSG ]; then\n'
843     txt += ' cd $RUNTIME_AREA\n'
844     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
845     txt += ' /bin/rm -rf $WORKING_DIR\n'
846     txt += ' if [ -d $WORKING_DIR ] ;then\n'
847 gutsche 1.7 txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
848     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
849     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
850     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
851 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
852     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
853     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
854 gutsche 1.3 txt += ' fi\n'
855     txt += 'fi\n'
856     txt += '\n'
857 slacapra 1.1 return txt
858    
859     def numberFile_(self, file, txt):
860     """
861     append _'txt' before last extension of a file
862     """
863     p = string.split(file,".")
864     # take away last extension
865     name = p[0]
866     for x in p[1:-1]:
867     name=name+"."+x
868     # add "_txt"
869     if len(p)>1:
870     ext = p[len(p)-1]
871     #result = name + '_' + str(txt) + "." + ext
872     result = name + '_' + txt + "." + ext
873     else:
874     #result = name + '_' + str(txt)
875     result = name + '_' + txt
876    
877     return result
878    
879     def getRequirements(self):
880     """
881     return job requirements to add to jdl files
882     """
883     req = ''
884 slacapra 1.10 if common.analisys_common_info['sw_version']:
885     req='Member("VO-cms-' + \
886     common.analisys_common_info['sw_version'] + \
887     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
888 slacapra 1.1 if common.analisys_common_info['sites']:
889     if len(common.analisys_common_info['sites'])>0:
890     req = req + ' && ('
891     for i in range(len(common.analisys_common_info['sites'])):
892     req = req + 'other.GlueCEInfoHostName == "' \
893     + common.analisys_common_info['sites'][i] + '"'
894     if ( i < (int(len(common.analisys_common_info['sites']) - 1)) ):
895     req = req + ' || '
896     req = req + ')'
897     #print "req = ", req
898     return req
899 gutsche 1.3
900     def configFilename(self):
901     """ return the config filename """
902     return self.name()+'.cfg'
903    
904     ### OLI_DANIELE
905     def wsSetupCMSOSGEnvironment_(self):
906     """
907     Returns part of a job script which is prepares
908     the execution environment and which is common for all CMS jobs.
909     """
910     txt = '\n'
911     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
912     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
913     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
914     txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
915     txt += ' elif [ -f $OSG_APP/cmssoft/cmsset_default.sh ] ;then\n'
916     txt += ' # Use $OSG_APP/cmssoft/cmsset_default.sh to setup cms software\n'
917     txt += ' source $OSG_APP/cmssoft/cmsset_default.sh '+self.version+'\n'
918     txt += ' else\n'
919     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'
920     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
921     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
922     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
923 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
924     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
925     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
926 gutsche 1.7 txt += ' exit 1\n'
927 gutsche 1.3 txt += '\n'
928     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
929     txt += ' cd $RUNTIME_AREA\n'
930     txt += ' /bin/rm -rf $WORKING_DIR\n'
931     txt += ' if [ -d $WORKING_DIR ] ;then\n'
932 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'
933     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
934     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
935     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
936 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
937     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
938     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
939 gutsche 1.3 txt += ' fi\n'
940     txt += '\n'
941 gutsche 1.7 txt += ' exit 1\n'
942 gutsche 1.3 txt += ' fi\n'
943     txt += '\n'
944     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
945     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
946    
947     return txt
948    
949     ### OLI_DANIELE
950     def wsSetupCMSLCGEnvironment_(self):
951     """
952     Returns part of a job script which is prepares
953     the execution environment and which is common for all CMS jobs.
954     """
955     txt = ' \n'
956     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
957     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
958     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
959     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
960     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
961     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
962 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
963     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
964     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
965 gutsche 1.7 txt += ' exit 1\n'
966 gutsche 1.3 txt += ' else\n'
967     txt += ' echo "Sourcing environment... "\n'
968     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
969     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
970     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
971     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
972     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
973 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
974     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
975     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
976 gutsche 1.7 txt += ' exit 1\n'
977 gutsche 1.3 txt += ' fi\n'
978     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
979     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
980     txt += ' result=$?\n'
981     txt += ' if [ $result -ne 0 ]; then\n'
982     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
983     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
984     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
985     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
986 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
987     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
988     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
989 gutsche 1.7 txt += ' exit 1\n'
990 gutsche 1.3 txt += ' fi\n'
991     txt += ' fi\n'
992     txt += ' \n'
993     txt += ' string=`cat /etc/redhat-release`\n'
994     txt += ' echo $string\n'
995     txt += ' if [[ $string = *alhalla* ]]; then\n'
996     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
997     txt += ' elif [[ $string = *Enterprise* ]] || [[ $string = *cientific* ]]; then\n'
998     txt += ' export SCRAM_ARCH=slc3_ia32_gcc323\n'
999     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
1000     txt += ' else\n'
1001 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10033 ==> ERROR OS unknown, LCG environment not initialized"\n'
1002 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10033"\n'
1003     txt += ' echo "JobExitCode=10033" | tee -a $RUNTIME_AREA/$repo\n'
1004     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1005 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1006     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1007     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1008 gutsche 1.7 txt += ' exit 1\n'
1009 gutsche 1.3 txt += ' fi\n'
1010     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1011     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1012     return txt
1013 gutsche 1.5
1014     def setParam_(self, param, value):
1015     self._params[param] = value
1016    
1017     def getParams(self):
1018     return self._params
1019 gutsche 1.8
1020     def setTaskid_(self):
1021     self._taskId = self.cfg_params['taskId']
1022    
1023     def getTaskid(self):
1024     return self._taskId