ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/DBinterface.py
Revision: 1.9
Committed: Fri Mar 21 16:28:07 2008 UTC (17 years, 1 month ago) by spiga
Content type: text/x-python
Branch: MAIN
Changes since 1.8: +60 -59 lines
Log Message:
allignment to bosslite changes. many improvments on db interaction, minor changes on list usage to avoid error on job index

File Contents

# User Rev Content
1 spiga 1.1 from crab_logger import Logger
2     from crab_exceptions import *
3     from crab_util import *
4     import common
5     import os, time, shutil
6    
7     from ProdCommon.BossLite.API.BossLiteAPI import BossLiteAPI
8    
9    
10     from ProdCommon.BossLite.DbObjects.Job import Job
11     from ProdCommon.BossLite.DbObjects.Task import Task
12     from ProdCommon.BossLite.DbObjects.RunningJob import RunningJob
13    
14    
15     class DBinterface:
16 spiga 1.2 def __init__(self, cfg_params):
17 spiga 1.1
18 spiga 1.2 self.cfg_params = cfg_params
19    
20     self.db_type = cfg_params.get("USER.use_db",'SQLite')
21 spiga 1.1 return
22    
23    
24 spiga 1.2 def configureDB(self):
25 spiga 1.1
26     dbname = common.work_space.shareDir()+'crabDB'
27     dbConfig = {'dbName':dbname
28     }
29    
30     common.bossSession = BossLiteAPI( self.db_type, dbConfig)
31     common.bossSession.installDB('$CRABPRODCOMMONPYTHON/ProdCommon/BossLite/DbObjects/setupDatabase-sqlite.sql')
32    
33     return
34    
35 spiga 1.2 def loadDB(self):
36    
37     dbname = common.work_space.shareDir()+'crabDB'
38     dbConfig = {'dbName':dbname
39     }
40     common.bossSession = BossLiteAPI( self.db_type, dbConfig)
41 spiga 1.9 self.task = common.bossSession.load(1)[0]
42 spiga 1.2 return
43 spiga 1.4
44 spiga 1.7 def getTask(self, jobsList='all'): #, cfg_params):
45 spiga 1.9 """
46     Return task with all/list of jobs
47     """
48 spiga 1.4
49 spiga 1.9 if jobsList == 'all':
50     task = common.bossSession.load(1)[0]
51     else:
52     if len(jobsList)>1: str_jobs=string.join(map(str,jobsList),",")
53     else: str_jobs=str(jobsList)
54     task = common.bossSession.load(1,jobsList)[0]
55     return task
56 spiga 1.2
57 slacapra 1.6 def getJob(self, n):
58 spiga 1.9 """
59     Return a task with a single job
60     """
61     task = common.bossSession.load(1,str(n))[0]
62     return task
63 spiga 1.2
64 spiga 1.1
65     def createTask_(self, optsToSave):
66     """
67     Task declaration
68     with the first coniguration stuff
69     """
70     opt={}
71 spiga 1.9 opt['serverName']=optsToSave['server_name']
72 spiga 1.1 opt[ 'name']=common.work_space.taskName()
73     task = Task( opt )
74    
75     common.bossSession.saveTask( task )
76     return
77    
78     def updateTask_(self,optsToSave):
79     """
80     Update task fields
81     """
82 spiga 1.9 task = common.bossSession.load(1)[0]
83 spiga 1.1
84     for key in optsToSave.keys():
85     task[key] = optsToSave[key]
86 spiga 1.9 common.bossSession.updateDB( task )
87 spiga 1.1 return
88    
89 spiga 1.9 def createJobs_(self, jobsL):
90 spiga 1.1 """
91     Fill crab DB with the jobs filed
92     """
93 spiga 1.9 task = common.bossSession.loadTask(1)
94 spiga 1.1 jobs = []
95 spiga 1.9 for id in jobsL:
96 spiga 1.1 parameters = {}
97 spiga 1.9 parameters['jobId'] = str(id)
98 spiga 1.7 parameters['name'] = 'job' + str(id)
99 spiga 1.1 job = Job(parameters)
100 spiga 1.9 jobs.append(job)
101 spiga 1.1 task.addJobs(jobs)
102     common.bossSession.updateDB( task )
103     return
104    
105 spiga 1.9 def updateJob_(self, jobsL, optsToSave):
106 spiga 1.1 """
107     Update Job fields
108     """
109 spiga 1.9 task = common.bossSession.load(1)[0]
110     for id in jobsL:
111     for key in optsToSave[id].keys():
112     task.jobs[id][key] = optsToSave[id][key]
113 spiga 1.7 common.bossSession.updateDB( task )
114 spiga 1.1 return
115    
116 spiga 1.9 def updateRunJob_(self, jobsL, optsToSave):
117 spiga 1.1 """
118     Update Running Job fields
119     """
120 spiga 1.9 task = common.bossSession.load(1)[0]
121     for id in jobsL:
122     common.bossSession.getRunningInstance(task.jobs[id])
123 spiga 1.7 for key in optsToSave.keys():
124 spiga 1.9 task.jobs[id].runningJob[key] = optsToSave[key]
125 spiga 1.1 common.bossSession.updateDB( task )
126     return
127    
128 spiga 1.9 def nJobs(self,list=''):
129 spiga 1.2
130 spiga 1.9 task = common.bossSession.load(1)[0]
131     listId=[]
132     if list == 'list':
133     for job in task.jobs:listId.append(int(job['jobId']))
134     return listId
135     else:
136     return len(task.jobs)
137 spiga 1.1
138     def dump(self,jobs):
139     """
140     List a complete set of infos for a job/range of jobs
141     """
142 spiga 1.9 task = common.bossSession.load(1)[0]
143 spiga 1.1
144     njobs = len(jobs)
145     lines=[]
146     header=''
147     # ##query the DB asking the right infos for runningJobs TODO DS
148     # for job in jobs:
149     # ## here the query over runngJobs
150     # pass
151    
152    
153     # ##Define Header to show and Pass the query results,
154     # ## header and format to displayReport() TODO DS
155     # if njobs == 1: plural = ''
156     # else: plural = 's'
157     # header += 'Listing %d job%s:\n' % (njobs, plural)
158     # header += ' :\n' % (---) ## TODO DS
159    
160     # displayReport(header, lines):
161     return
162 farinafa 1.8
163     def serializeTask(self, tmp_task = None):
164     if tmp_task is None:
165 spiga 1.9 #tmp_task = common.bossSession.loadTaskByID(1)
166     tmp_task = common.bossSession.load(1)[0]
167 farinafa 1.8 return common.bossSession.serialize(tmp_task)
168 spiga 1.1
169     def queryID(self,server_mode=0):
170     '''
171     Return the taskId if serevr_mode =1
172     Return the joblistId if serevr_mode =0
173     '''
174     header=''
175     lines=[]
176 spiga 1.9 task = common.bossSession.load(1)[0]
177 spiga 1.1 if server_mode == 1:
178 spiga 1.2 header= "Task Id = %-40s " %(task['name'])
179 spiga 1.1 else:
180     for i in range(len(task.job)):
181     common.bossSession.getRunningInstance(task.jobs[i])
182     lines.append(task.jobs[i].runningJob['schedulerId'])
183    
184     header+= "Job: %-5s Id = %-40s: \n"
185     displayReport(header,lines)
186     return
187    
188     def queryTask(self,attr):
189     '''
190     Perform a query over a generic task attribute
191     '''
192 spiga 1.9 task = common.bossSession.loadTask(1)
193 spiga 1.1 return task[attr]
194    
195 spiga 1.9 def queryJob(self, attr, jobs):
196 spiga 1.1 '''
197     Perform a query for a range/all/single job
198     over a generic job attribute
199     '''
200     lines=[]
201 spiga 1.9 str_jobs=string.join(map(str,jobs),",")
202     task = common.bossSession.load(1,str_jobs)[0]
203     for job in task.jobs:
204     lines.append(eval(job[attr]))
205 spiga 1.1 return lines
206    
207     def queryRunJob(self, attr, jobs):
208     '''
209     Perform a query for a range/all/single job
210     over a generic job attribute
211     '''
212     lines=[]
213 spiga 1.9 str_jobs=string.join(map(str,jobs),",")
214     task = common.bossSession.load(1,str_jobs)[0]
215     for job in task.jobs:
216     common.bossSession.getRunningInstance(job)
217     lines.append(job.runningJob[attr])
218 spiga 1.1 return lines
219 spiga 1.3
220     def queryDistJob(self, attr):
221     '''
222     Returns the list of distinct value for a given job attributes
223     '''
224     distAttr=[]
225 spiga 1.5 task = common.bossSession.loadJobDist( 1, attr )
226 spiga 1.9 for i in task: distAttr.append(eval(i[attr]))
227 spiga 1.3 return distAttr
228    
229 spiga 1.5 def queryDistJob_Attr(self, attr_1, attr_2, list):
230 spiga 1.4 '''
231 spiga 1.9 Returns the list of distinct value for a given job attribute
232 spiga 1.4 '''
233     distAttr=[]
234 slacapra 1.6 task = common.bossSession.loadJobDistAttr( 1, attr_1, attr_2, list )
235 spiga 1.9 for i in task: distAttr.append(eval(i[attr_1]))
236 spiga 1.4 return distAttr
237 slacapra 1.6
238 spiga 1.3 def queryAttrJob(self, attr, field):
239     '''
240     Returns the list of jobs matching the given attribute
241     '''
242     matched=[]
243     task = common.bossSession.loadJobsByAttr(attr )
244     for i in task:
245     matched.append(i[field])
246     return matched
247    
248 spiga 1.7
249     def queryAttrRunJob(self, attr,field):
250     '''
251     Returns the list of jobs matching the given attribute
252     '''
253     matched=[]
254     task = common.bossSession.loadJobsByRunningAttr(attr)
255     for i in task:
256     matched.append(i[field])
257     return matched