3 |
|
from crab_util import * |
4 |
|
import common |
5 |
|
import os, time, shutil |
6 |
+ |
import traceback |
7 |
|
|
8 |
|
from ProdCommon.BossLite.API.BossLiteAPI import BossLiteAPI |
9 |
< |
|
9 |
> |
from ProdCommon.BossLite.Common.Exceptions import DbError |
10 |
> |
from ProdCommon.BossLite.Common.Exceptions import TaskError |
11 |
|
|
12 |
|
from ProdCommon.BossLite.DbObjects.Job import Job |
13 |
|
from ProdCommon.BossLite.DbObjects.Task import Task |
28 |
|
dbname = common.work_space.shareDir()+'crabDB' |
29 |
|
dbConfig = {'dbName':dbname |
30 |
|
} |
31 |
+ |
try: |
32 |
+ |
common.bossSession = BossLiteAPI( self.db_type, dbConfig) |
33 |
+ |
except Exception, e : |
34 |
+ |
raise CrabException('Istantiate DB Session : '+str(e)) |
35 |
+ |
|
36 |
+ |
try: |
37 |
+ |
common.bossSession.installDB('$CRABPRODCOMMONPYTHON/ProdCommon/BossLite/DbObjects/setupDatabase-sqlite.sql') |
38 |
+ |
except Exception, e : |
39 |
+ |
raise CrabException('DB Installation error : '+str(e)) |
40 |
+ |
return |
41 |
|
|
30 |
– |
common.bossSession = BossLiteAPI( self.db_type, dbConfig) |
31 |
– |
common.bossSession.installDB('$CRABPRODCOMMONPYTHON/ProdCommon/BossLite/DbObjects/setupDatabase-sqlite.sql') |
32 |
– |
|
33 |
– |
return |
34 |
– |
|
42 |
|
def loadDB(self): |
43 |
|
|
44 |
|
dbname = common.work_space.shareDir()+'crabDB' |
45 |
|
dbConfig = {'dbName':dbname |
46 |
|
} |
47 |
< |
common.bossSession = BossLiteAPI( self.db_type, dbConfig) |
48 |
< |
self.task = common.bossSession.loadTaskByID(1) |
47 |
> |
try: |
48 |
> |
common.bossSession = BossLiteAPI( self.db_type, dbConfig) |
49 |
> |
except Exception, e : |
50 |
> |
raise CrabException('Istantiate DB Session : '+str(e)) |
51 |
> |
|
52 |
|
return |
53 |
|
|
54 |
< |
def getTask(self, jobsList='all'): #, cfg_params): |
55 |
< |
|
56 |
< |
#if jobsList == 'all': |
57 |
< |
# self.task = common.bossSession.loadTaskByID(1) |
58 |
< |
#else: |
59 |
< |
#self.task = common.bossSession.load('1','5') |
60 |
< |
#return self.task[0] |
61 |
< |
self.task = common.bossSession.loadTaskByID(1) |
62 |
< |
return self.task |
54 |
> |
def getTask(self, jobsList='all'): |
55 |
> |
""" |
56 |
> |
Return task with all/list of jobs |
57 |
> |
""" |
58 |
> |
try: |
59 |
> |
task = common.bossSession.load(1,jobsList)[0] |
60 |
> |
except Exception, e : |
61 |
> |
common.logger.debug(3, "Error while getting task : " +str(traceback.format_exc())) |
62 |
> |
raise CrabException('Error while getting task '+str(e)) |
63 |
> |
return task |
64 |
|
|
65 |
|
def getJob(self, n): |
66 |
< |
|
67 |
< |
self.job = common.bossSession.loadJobByID(1,n) |
68 |
< |
return self.job |
66 |
> |
""" |
67 |
> |
Return a task with a single job |
68 |
> |
""" |
69 |
> |
try: |
70 |
> |
task = common.bossSession.load(1,str(n))[0] |
71 |
> |
except Exception, e : |
72 |
> |
common.logger.debug(3, "Error while getting job : " +str(traceback.format_exc())) |
73 |
> |
raise CrabException('Error while getting job '+str(e)) |
74 |
> |
return task |
75 |
|
|
76 |
|
|
77 |
|
def createTask_(self, optsToSave): |
78 |
|
""" |
79 |
|
Task declaration |
80 |
|
with the first coniguration stuff |
64 |
– |
{'server_name': 'crabas.lnl.infn.it/data1/cms/', '-scheduler': 'glite', '-jobtype': 'cmssw', '-server_mode': '0'} |
65 |
– |
|
81 |
|
""" |
82 |
|
opt={} |
83 |
< |
if optsToSave['server_mode'] == 1: opt['serverName']=optsToSave['server_name'] |
83 |
> |
opt['serverName']=optsToSave['server_name'] |
84 |
|
opt[ 'name']=common.work_space.taskName() |
85 |
|
task = Task( opt ) |
86 |
< |
|
87 |
< |
common.bossSession.saveTask( task ) |
86 |
> |
try: |
87 |
> |
common.bossSession.saveTask( task ) |
88 |
> |
except Exception, e : |
89 |
> |
# common.logger.debug(3, "Error creating task : " +str(traceback.format_exc())) |
90 |
> |
# raise CrabException('Error creating task '+str(e)) |
91 |
> |
raise CrabException('Error creating task '+str(traceback.format_exc())) |
92 |
> |
|
93 |
|
return |
94 |
|
|
95 |
|
def updateTask_(self,optsToSave): |
96 |
|
""" |
97 |
|
Update task fields |
98 |
|
""" |
99 |
< |
#task = common.bossSession.loadTaskByName(common.work_space.taskName() ) |
100 |
< |
task = common.bossSession.loadTaskByID(1) |
81 |
< |
|
99 |
> |
task = self.getTask() |
100 |
> |
|
101 |
|
for key in optsToSave.keys(): |
102 |
|
task[key] = optsToSave[key] |
103 |
+ |
try: |
104 |
|
common.bossSession.updateDB( task ) |
105 |
+ |
except Exception, e : |
106 |
+ |
raise CrabException('Error updating task '+str(traceback.format_exc())) |
107 |
+ |
|
108 |
|
return |
109 |
|
|
110 |
< |
def createJobs_(self, nj): |
110 |
> |
def createJobs_(self, jobsL): |
111 |
|
""" |
112 |
|
Fill crab DB with the jobs filed |
113 |
|
""" |
114 |
< |
#task = common.bossSession.loadTaskByName(common.work_space.taskName()) |
115 |
< |
task = common.bossSession.loadTaskByID(1) |
114 |
> |
task = self.getTask() |
115 |
> |
|
116 |
|
jobs = [] |
117 |
< |
for id in range(nj): |
117 |
> |
for id in jobsL: |
118 |
|
parameters = {} |
119 |
+ |
parameters['jobId'] = str(id) |
120 |
|
parameters['name'] = 'job' + str(id) |
121 |
|
job = Job(parameters) |
122 |
< |
jobs.append(job) |
122 |
> |
jobs.append(job) |
123 |
|
task.addJobs(jobs) |
124 |
< |
common.bossSession.updateDB( task ) |
124 |
> |
try: |
125 |
> |
common.bossSession.updateDB( task ) |
126 |
> |
except Exception, e : |
127 |
> |
raise CrabException('Error updating task '+str(traceback.format_exc())) |
128 |
> |
|
129 |
|
return |
130 |
|
|
131 |
< |
def updateJob_(self, nj, optsToSave): |
131 |
> |
def updateJob_(self, jobsL, optsToSave): |
132 |
|
""" |
133 |
|
Update Job fields |
134 |
|
""" |
135 |
< |
task = common.bossSession.loadTaskByID(1) |
136 |
< |
#task = common.bossSession.loadTaskByName( common.work_space.taskName()) |
137 |
< |
for i in range(len(nj)): |
138 |
< |
# jobs = common.bossSession.loadJob(task['id'],i) |
139 |
< |
for key in optsToSave[i].keys(): |
140 |
< |
task.jobs[i][key] = optsToSave[i][key] |
141 |
< |
common.bossSession.updateDB( task ) |
135 |
> |
task = self.getTask(jobsL) |
136 |
> |
id =0 |
137 |
> |
for job in task.jobs: |
138 |
> |
for key in optsToSave[id].keys(): |
139 |
> |
job[key] = optsToSave[id][key] |
140 |
> |
id+=1 |
141 |
> |
try: |
142 |
> |
common.bossSession.updateDB( task ) |
143 |
> |
except Exception, e : |
144 |
> |
raise CrabException('Error updating task '+str(traceback.format_exc())) |
145 |
|
return |
146 |
|
|
147 |
< |
def updateRunJob_(self, nj, optsToSave): |
147 |
> |
def updateRunJob_(self, jobsL, optsToSave): |
148 |
|
""" |
149 |
|
Update Running Job fields |
150 |
|
""" |
151 |
< |
task = common.bossSession.loadTaskByID(1) |
152 |
< |
#task = common.bossSession.loadTaskByName( common.work_space.taskName()) |
153 |
< |
for i in nj: |
154 |
< |
common.bossSession.getRunningInstance(task.jobs[i]) |
155 |
< |
for key in optsToSave.keys(): |
156 |
< |
task.jobs[i].runningJob[key] = optsToSave[key] |
151 |
> |
task = self.getTask(jobsL) |
152 |
> |
|
153 |
> |
id=0 |
154 |
> |
for job in task.jobs: |
155 |
> |
common.bossSession.getRunningInstance(job) |
156 |
> |
for key in optsToSave[id].keys(): |
157 |
> |
job.runningJob[key] = optsToSave[id][key] |
158 |
> |
id+=1 |
159 |
|
common.bossSession.updateDB( task ) |
160 |
|
return |
161 |
|
|
162 |
< |
def nJobs(self): |
162 |
> |
def nJobs(self,list=''): |
163 |
|
|
164 |
< |
task = common.bossSession.loadTaskByID(1) |
165 |
< |
#task = common.bossSession.loadTaskByName( common.work_space.taskName()) |
166 |
< |
return len(task.jobs) |
164 |
> |
task = self.getTask() |
165 |
> |
listId=[] |
166 |
> |
if list == 'list': |
167 |
> |
for job in task.jobs:listId.append(int(job['jobId'])) |
168 |
> |
return listId |
169 |
> |
else: |
170 |
> |
return len(task.jobs) |
171 |
|
|
172 |
|
def dump(self,jobs): |
173 |
|
""" |
174 |
|
List a complete set of infos for a job/range of jobs |
175 |
|
""" |
176 |
< |
task = common.bossSession.loadTaskByID(1) |
140 |
< |
#task = common.bossSession.loadTaskByName( common.work_space.taskName()) |
176 |
> |
task = self.getTask() |
177 |
|
|
178 |
|
njobs = len(jobs) |
179 |
|
lines=[] |
196 |
|
|
197 |
|
def serializeTask(self, tmp_task = None): |
198 |
|
if tmp_task is None: |
199 |
< |
tmp_task = common.bossSession.loadTaskByID(1) |
199 |
> |
tmp_task = self.getTask() |
200 |
|
return common.bossSession.serialize(tmp_task) |
201 |
|
|
202 |
|
def queryID(self,server_mode=0): |
206 |
|
''' |
207 |
|
header='' |
208 |
|
lines=[] |
209 |
< |
task = common.bossSession.loadTaskByID(1) |
209 |
> |
task = self.getTask() |
210 |
|
if server_mode == 1: |
211 |
|
header= "Task Id = %-40s " %(task['name']) |
212 |
|
else: |
213 |
< |
# task = common.bossSession.loadTaskByName(common.work_space.taskName() ) |
214 |
< |
for i in range(len(task.job)): |
215 |
< |
common.bossSession.getRunningInstance(task.jobs[i]) |
216 |
< |
lines.append(task.jobs[i].runningJob['schedulerId']) |
217 |
< |
|
218 |
< |
header+= "Job: %-5s Id = %-40s: \n" |
219 |
< |
displayReport(header,lines) |
213 |
> |
for job in task.jobs: |
214 |
> |
toPrint='' |
215 |
> |
common.bossSession.getRunningInstance(job) |
216 |
> |
toPrint = "%-5s %-50s " % (job['id'],job.runningJob['schedulerId']) |
217 |
> |
lines.append(toPrint) |
218 |
> |
header+= "%-5s %-50s " % ('Job:','ID' ) |
219 |
> |
displayReport(self,header,lines) |
220 |
|
return |
221 |
|
|
222 |
|
def queryTask(self,attr): |
223 |
|
''' |
224 |
|
Perform a query over a generic task attribute |
225 |
|
''' |
226 |
< |
task = common.bossSession.loadTaskByID(1) |
226 |
> |
task = self.getTask() |
227 |
|
return task[attr] |
228 |
|
|
229 |
< |
def queryJob(self, attr, njobs): |
229 |
> |
def queryJob(self, attr, jobsL): |
230 |
|
''' |
231 |
|
Perform a query for a range/all/single job |
232 |
|
over a generic job attribute |
233 |
|
''' |
234 |
|
lines=[] |
235 |
< |
task = common.bossSession.loadTaskByID(1) |
236 |
< |
#task = common.bossSession.loadTaskByName( common.work_space.taskName()) |
237 |
< |
for i in njobs: |
202 |
< |
jobs = common.bossSession.loadJob(task['id'],i+1) |
203 |
< |
lines.append(task.jobs[i][attr]) |
235 |
> |
task = self.getTask(jobsL) |
236 |
> |
for job in task.jobs: |
237 |
> |
lines.append(eval(job[attr])) |
238 |
|
return lines |
239 |
|
|
240 |
< |
def queryRunJob(self, attr, jobs): |
240 |
> |
def queryRunJob(self, attr, jobsL): |
241 |
|
''' |
242 |
|
Perform a query for a range/all/single job |
243 |
|
over a generic job attribute |
244 |
|
''' |
245 |
|
lines=[] |
246 |
< |
task = common.bossSession.loadTaskByID(1) |
247 |
< |
# task = common.bossSession.loadTaskByName( common.work_space.taskName() ) |
248 |
< |
for i in jobs: |
249 |
< |
common.bossSession.getRunningInstance(task.jobs[i-1]) |
216 |
< |
lines.append(task.jobs[i-1].runningJob[attr]) |
246 |
> |
task = self.getTask(jobsL) |
247 |
> |
for job in task.jobs: |
248 |
> |
common.bossSession.getRunningInstance(job) |
249 |
> |
lines.append(job.runningJob[attr]) |
250 |
|
return lines |
251 |
|
|
252 |
|
def queryDistJob(self, attr): |
254 |
|
Returns the list of distinct value for a given job attributes |
255 |
|
''' |
256 |
|
distAttr=[] |
257 |
< |
task = common.bossSession.loadJobDist( 1, attr ) |
258 |
< |
for i in task: distAttr.append(i[attr]) |
257 |
> |
try: |
258 |
> |
task = common.bossSession.loadJobDist( 1, attr ) |
259 |
> |
except Exception, e : |
260 |
> |
common.logger.debug(3, "Error loading Jobs By distinct Attr : " +str(traceback.format_exc())) |
261 |
> |
raise CrabException('Error loading Jobs By distinct Attr '+str(e)) |
262 |
> |
|
263 |
> |
for i in task: distAttr.append(eval(i[attr])) |
264 |
|
return distAttr |
265 |
|
|
266 |
|
def queryDistJob_Attr(self, attr_1, attr_2, list): |
267 |
|
''' |
268 |
< |
Returns the list of distinct value for a given job attributes |
268 |
> |
Returns the list of distinct value for a given job attribute |
269 |
|
''' |
270 |
|
distAttr=[] |
271 |
< |
task = common.bossSession.loadJobDistAttr( 1, attr_1, attr_2, list ) |
272 |
< |
for i in task: distAttr.append(i[attr_1]) |
271 |
> |
try: |
272 |
> |
task = common.bossSession.loadJobDistAttr( 1, attr_1, attr_2, list ) |
273 |
> |
except Exception, e : |
274 |
> |
common.logger.debug(3, "Error loading Jobs By distinct Attr : " +str(traceback.format_exc())) |
275 |
> |
raise CrabException('Error loading Jobs By distinct Attr '+str(e)) |
276 |
> |
|
277 |
> |
for i in task: distAttr.append(eval(i[attr_1])) |
278 |
|
return distAttr |
279 |
|
|
280 |
|
def queryAttrJob(self, attr, field): |
282 |
|
Returns the list of jobs matching the given attribute |
283 |
|
''' |
284 |
|
matched=[] |
285 |
< |
task = common.bossSession.loadJobsByAttr(attr ) |
285 |
> |
try: |
286 |
> |
task = common.bossSession.loadJobsByAttr(attr ) |
287 |
> |
except Exception, e : |
288 |
> |
common.logger.debug(3, "Error loading Jobs By Attr : " +str(traceback.format_exc())) |
289 |
> |
raise CrabException('Error loading Jobs By Attr '+str(e)) |
290 |
|
for i in task: |
291 |
|
matched.append(i[field]) |
292 |
|
return matched |
297 |
|
Returns the list of jobs matching the given attribute |
298 |
|
''' |
299 |
|
matched=[] |
300 |
< |
task = common.bossSession.loadJobsByRunningAttr(attr) |
300 |
> |
try: |
301 |
> |
task = common.bossSession.loadJobsByRunningAttr(attr) |
302 |
> |
except Exception, e : |
303 |
> |
common.logger.debug(3, "Error loading Jobs By Running Attr : " +str(traceback.format_exc())) |
304 |
> |
raise CrabException('Error loading Jobs By Running Attr '+str(e)) |
305 |
|
for i in task: |
306 |
|
matched.append(i[field]) |
307 |
|
return matched |