ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.17
Committed: Wed Jun 28 13:39:03 2006 UTC (18 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.16: +18 -12 lines
Log Message:
fix problem in job arguments definition

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