ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.13
Committed: Tue Jun 27 02:31:31 2006 UTC (18 years, 10 months ago) by gutsche
Content type: text/x-python
Branch: MAIN
Changes since 1.12: +60 -4 lines
Log Message:
changes WN wrapper script ML reporting to report only the relevant information (repo is deleted after report to ML) at any stage of WN script

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