ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/Creator.py
Revision: 1.4
Committed: Tue Jun 21 11:06:51 2005 UTC (19 years, 10 months ago) by nsmirnov
Content type: text/x-python
Branch: MAIN
Changes since 1.3: +13 -8 lines
Log Message:
Job submission implemented

File Contents

# User Rev Content
1 nsmirnov 1.1 from Actor import Actor
2     from WorkSpace import WorkSpace
3     from JobList import JobList
4     from JobDB import JobDB
5     from ScriptWriter import ScriptWriter
6     from Scheduler import Scheduler
7     from crab_logger import Logger
8     from crab_exceptions import *
9     from crab_util import *
10     import common
11    
12     import os, string
13    
14     class Creator(Actor):
15     def __init__(self, job_type_name, cfg_params, ncjobs):
16     self.job_type_name = job_type_name
17     self.job_type = None
18     self.cfg_params = cfg_params
19 nsmirnov 1.2 self.total_njobs = 0
20     self.ncjobs = 0 # nb of jobs to be created
21     self.total_number_of_events = 0
22     self.job_number_of_events = 0
23    
24 nsmirnov 1.1 #
25    
26     self.createJobTypeObject()
27 nsmirnov 1.3 common.logger.debug(5, __name__+": JobType "+self.job_type.name()+" created")
28 nsmirnov 1.1
29     self.job_type.prepareSteeringCards()
30 nsmirnov 1.3 common.logger.debug(5, __name__+": Steering cards prepared")
31 nsmirnov 1.1
32 nsmirnov 1.2 self.defineTotalNumberOfJobs_()
33 nsmirnov 1.3 common.logger.debug(5, __name__+": total # of jobs = "+`self.total_njobs`)
34 nsmirnov 1.1
35     # Set number of jobs to be created
36    
37     self.ncjobs = ncjobs
38     if ncjobs == 'all' : self.ncjobs = self.total_njobs
39     if ncjobs > self.total_njobs : self.ncjobs = self.total_njobs
40    
41     # Create and initialize JobList
42    
43     common.job_list = JobList(self.total_njobs, self.job_type)
44    
45     common.job_list.setScriptNames(self.job_type_name+'.sh')
46     common.job_list.setJDLNames(self.job_type_name+'.jdl')
47    
48     #TODO: Should be moved into JobType.
49     # Probable use-case -- more than one cfg-file.
50     # job_list.setCfgNames() -> job_list.addCfgNames()
51     try:
52     dataset = self.cfg_params['USER.dataset']
53     except KeyError:
54     msg = 'dataset must be defined in the section [USER]'
55     raise CrabException(msg)
56     common.job_list.setCfgNames(dataset+'.orcarc')
57    
58     #TODO: deprecated code, not needed,
59     # will be eliminated when WorkSpace.saveConfiguration()
60     # will be improved.
61     #
62     # Set/Save Job Type name
63    
64     jt_fname = common.work_space.shareDir() + 'jobtype'
65     if os.path.exists(jt_fname):
66     # Read stored job type name
67     jt_file = open(jt_fname, 'r')
68     jt = jt_file.read()
69     if self.job_type_name:
70     if ( jt != self.job_type_name+'\n' ):
71     msg = 'Job Type mismatch: requested <' + self.job_type_name
72     msg += '>, found <' + jt[:-1] + '>.'
73     raise CrabException(msg)
74     pass
75     else:
76     self.job_type_name = jt[:-1]
77     pass
78     jt_file.close()
79     pass
80     else:
81     # Save job type name
82     jt_file = open(jt_fname, 'w')
83     jt_file.write(self.job_type_name+'\n')
84     jt_file.close()
85     pass
86     #end of deprecated code
87    
88 nsmirnov 1.3 common.logger.debug(5, "Creator constructor finished")
89 nsmirnov 1.1 return
90    
91 nsmirnov 1.2 def defineTotalNumberOfJobs_(self):
92     """
93     Calculates the total number of jobs to be created.
94     """
95    
96     try:
97     n = self.cfg_params['USER.total_number_of_events']
98     if n == 'all': n = '-1'
99     self.total_number_of_events = int(n)
100     except KeyError:
101     self.total_number_of_events = -1
102     pass
103    
104     try:
105     n = self.cfg_params['USER.job_number_of_events']
106     self.job_number_of_events = int(n)
107     except KeyError:
108     msg = 'Warning. '
109     msg += 'Number of events per job is not defined by user.\n'
110     msg += 'Set to the total number of events.'
111     common.logger.message(msg)
112     self.job_number_of_events = self.total_number_of_events
113     pass
114    
115     self.total_njobs = int((self.total_number_of_events-1)/self.job_number_of_events)+1
116     return
117    
118 nsmirnov 1.1 def nJobs(self):
119     return self.total_njobs
120    
121     def createJobTypeObject(self):
122     file_name = 'cms_'+ string.lower(self.job_type_name)
123     klass_name = string.capitalize(self.job_type_name)
124    
125     try:
126     klass = importName(file_name, klass_name)
127     except KeyError:
128     msg = 'No `class '+klass_name+'` found in file `'+file_name+'.py`'
129     raise CrabException(msg)
130     except ImportError, e:
131     msg = 'Cannot create job type '+self.job_type_name
132     msg += ' (file: '+file_name+', class '+klass_name+'):\n'
133     msg += str(e)
134     raise CrabException(msg)
135    
136     self.job_type = klass(self.cfg_params)
137     return
138    
139    
140     def run(self):
141 nsmirnov 1.4 """
142     The main method of the class.
143     """
144 nsmirnov 1.1
145 nsmirnov 1.3 common.logger.debug(5, "Creator::run() called")
146    
147 nsmirnov 1.1 # Instantiate ScriptWriter
148    
149     script_writer = ScriptWriter('crab_template.sh')
150    
151     # Loop over jobs
152    
153     njc = 0
154 nsmirnov 1.4 for nj in range(self.total_njobs):
155 nsmirnov 1.1 if njc == self.ncjobs : break
156 nsmirnov 1.4 st = common.jobDB.status(nj)
157 nsmirnov 1.1 if st != 'X': continue
158    
159 nsmirnov 1.4 common.logger.debug(6, "Creator::run(): job # "+`nj`)
160 nsmirnov 1.3
161 nsmirnov 1.1 # Prepare configuration file
162    
163 nsmirnov 1.4 self.job_type.modifySteeringCards(nj)
164 nsmirnov 1.1
165     # Create JDL
166 nsmirnov 1.4 # Maybe, it worths to move this call into Submitter,
167     # i.e. to create scheduler-specific file at submission time ?
168 nsmirnov 1.1
169 nsmirnov 1.4 common.scheduler.createJDL(nj)
170 nsmirnov 1.1
171     # Create script
172    
173 nsmirnov 1.4 script_writer.modifyTemplateScript(nj)
174     os.chmod(common.job_list[nj].scriptFilename(), 0744)
175 nsmirnov 1.1
176 nsmirnov 1.4 common.jobDB.setStatus(nj, 'C')
177 nsmirnov 1.1 njc = njc + 1
178     pass
179    
180     ####
181    
182     common.jobDB.save()
183    
184     msg = '\nTotal of %d jobs created'%njc
185     if njc != self.ncjobs: msg = msg + ' from %d requested'%self.ncjobs
186     msg = msg + '.\n'
187     common.logger.message(msg)
188     return