ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.20
Committed: Fri Jun 30 11:31:27 2006 UTC (18 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.19: +4 -2 lines
Log Message:
simplify and fix handling of list in JobDB

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