1
|
|
|
|
2
|
|
|
from persistent import Persistent |
|
|
|
|
3
|
|
|
from ZODB import FileStorage, DB |
|
|
|
|
4
|
|
|
from .mycluster import get_directory, scheduler |
5
|
|
|
# from BTrees.OOBTree import OOBTree |
6
|
|
|
import transaction |
|
|
|
|
7
|
|
|
import logging |
8
|
|
|
|
9
|
|
|
|
10
|
|
|
class JobDB(object): |
11
|
|
|
|
12
|
|
|
def __init__(self): |
13
|
|
|
|
14
|
|
|
directory = get_directory() |
15
|
|
|
|
16
|
|
|
self.logger = logging.getLogger('ZODB.FileStorage') |
17
|
|
|
fh = logging.FileHandler(directory + 'db.log') |
18
|
|
|
self.logger.addHandler(fh) |
19
|
|
|
|
20
|
|
|
self.storage = FileStorage.FileStorage(directory + 'db.fs') |
21
|
|
|
self.db = DB(self.storage) |
22
|
|
|
self.connection = self.db.open() |
23
|
|
|
|
24
|
|
|
dbroot = self.connection.root() |
25
|
|
|
|
26
|
|
|
if 'job_key' not in dbroot: |
27
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
28
|
|
|
dbroot['job_key'] = OOBTree() |
29
|
|
|
dbroot['job_key']['val'] = 0 |
30
|
|
|
|
31
|
|
|
self.job_key = dbroot['job_key'] |
32
|
|
|
|
33
|
|
|
# Ensure that a 'job_db' key is present |
34
|
|
|
# in the root |
35
|
|
|
if 'job_db' not in dbroot: |
36
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
37
|
|
|
dbroot['job_db'] = OOBTree() |
38
|
|
|
|
39
|
|
|
self.job_db = dbroot['job_db'] |
40
|
|
|
|
41
|
|
|
if 'user_db' not in dbroot: |
42
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
43
|
|
|
dbroot['user_db'] = OOBTree() |
44
|
|
|
self.user_db = dbroot['user_db'] |
45
|
|
|
self.user_db['user'] = User('unknown', 'unknown', 'unknown') |
46
|
|
|
|
47
|
|
|
self.user_db = dbroot['user_db'] |
48
|
|
|
|
49
|
|
|
if 'site_db' not in dbroot: |
50
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
51
|
|
|
dbroot['site_db'] = OOBTree() |
52
|
|
|
self.site_db = dbroot['site_db'] |
53
|
|
|
|
54
|
|
|
self.site_db = dbroot['site_db'] |
55
|
|
|
|
56
|
|
|
if scheduler is not None: |
57
|
|
|
self.site_db[scheduler.name()] = Site(scheduler.name(), |
58
|
|
|
scheduler.scheduler_type()) |
59
|
|
|
|
60
|
|
|
if 'queue_db' not in dbroot: |
61
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
62
|
|
|
dbroot['queue_db'] = OOBTree() |
63
|
|
|
self.queue_db = dbroot['queue_db'] |
64
|
|
|
|
65
|
|
|
self.queue_db = dbroot['queue_db'] |
66
|
|
|
|
67
|
|
|
from .version import get_git_version |
|
|
|
|
68
|
|
|
if 'version' not in dbroot: |
69
|
|
|
dbroot['version'] = get_git_version() |
70
|
|
|
else: |
71
|
|
|
current_version = dbroot['version'] |
72
|
|
|
new_version = get_git_version() |
73
|
|
|
# Add any migrations required here |
74
|
|
|
if current_version != new_version: |
75
|
|
|
pass |
76
|
|
|
|
77
|
|
|
dbroot['version'] = new_version |
78
|
|
|
|
79
|
|
|
if 'remote_site_db' not in dbroot: |
80
|
|
|
from BTrees.OOBTree import OOBTree |
|
|
|
|
81
|
|
|
dbroot['remote_site_db'] = OOBTree() |
82
|
|
|
self.remote_site_db = dbroot['remote_site_db'] |
83
|
|
|
|
84
|
|
|
self.remote_site_db = dbroot['remote_site_db'] |
85
|
|
|
|
86
|
|
|
def add_job(self, job): |
87
|
|
|
# Get unique key |
88
|
|
|
job_key = self.job_key['val'] |
89
|
|
|
self.job_key['val'] = job_key + 1 |
90
|
|
|
transaction.commit() |
91
|
|
|
# Add job |
92
|
|
|
self.job_db[job_key] = job |
93
|
|
|
transaction.commit() |
94
|
|
|
|
95
|
|
|
def add_queue(self, queue, site): |
96
|
|
|
if queue not in self.queue_db: |
97
|
|
|
self.queue_db[queue] = Queue(queue, site) |
98
|
|
|
transaction.commit() |
99
|
|
|
|
100
|
|
|
def add_remote(self, remote_site): |
101
|
|
|
if remote_site not in self.remote_site_db: |
102
|
|
|
user = remote_site.split('@')[0] |
103
|
|
|
site = remote_site.split('@')[1] |
104
|
|
|
self.remote_site_db[site] = RemoteSite(site, user) |
105
|
|
|
transaction.commit() |
106
|
|
|
|
107
|
|
|
def get(self, job_id): |
108
|
|
|
# Find |
109
|
|
|
for key in list(self.job_db.keys()): |
110
|
|
|
if self.job_db[key].job_id == job_id: |
111
|
|
|
return self.job_db[key] |
112
|
|
|
|
113
|
|
|
raise KeyError('Key: ' + str(job_id) + ' not found') |
114
|
|
|
|
115
|
|
|
def list(self): |
116
|
|
|
pass |
117
|
|
|
|
118
|
|
|
def commit(self): |
|
|
|
|
119
|
|
|
transaction.commit() |
120
|
|
|
|
121
|
|
|
def close(self): |
122
|
|
|
self.connection.close() |
123
|
|
|
self.db.close() |
124
|
|
|
self.storage.close() |
125
|
|
|
|
126
|
|
|
|
127
|
|
|
class RemoteSite(Persistent): |
128
|
|
|
|
129
|
|
|
def __init__(self, name, user): |
130
|
|
|
self.name = name |
131
|
|
|
self.user = user |
132
|
|
|
|
133
|
|
|
|
134
|
|
|
class Site(Persistent): |
135
|
|
|
|
136
|
|
|
def __init__(self, name, scheduler_type): |
137
|
|
|
self.name = name |
138
|
|
|
self.PUE = 0.0 |
139
|
|
|
self.total_num_nodes = 0 |
140
|
|
|
self.total_storage_power = 0.0 |
141
|
|
|
self.total_network_power = 0.0 |
142
|
|
|
self.total_management_power = 0.0 |
143
|
|
|
self.scheduler_type = scheduler_type |
144
|
|
|
|
145
|
|
|
|
146
|
|
|
class Queue(Persistent): |
147
|
|
|
|
148
|
|
|
def __init__(self, name, site_name): |
149
|
|
|
self.name = name |
150
|
|
|
self.site_name = site_name |
151
|
|
|
self.node_power = 0.0 |
152
|
|
|
self.node_charge = 0.0 |
153
|
|
|
|
154
|
|
|
|
155
|
|
|
class User(Persistent): |
156
|
|
|
|
157
|
|
|
def __init__(self, first_name, last_name, email): |
158
|
|
|
self.first_name = first_name |
159
|
|
|
self.last_name = last_name |
160
|
|
|
self.email = email |
161
|
|
|
|
162
|
|
|
def update_email(self, email): |
163
|
|
|
self.email = email |
164
|
|
|
transaction.commit() |
165
|
|
|
|
166
|
|
|
def firstname(self, name): |
167
|
|
|
self.first_name = name |
168
|
|
|
transaction.commit() |
169
|
|
|
|
170
|
|
|
def lastname(self, name): |
171
|
|
|
self.last_name = name |
172
|
|
|
transaction.commit() |
173
|
|
|
|
174
|
|
|
|
175
|
|
|
class Job(Persistent): |
176
|
|
|
|
177
|
|
|
def __init__(self, job_id, time_stamp): |
178
|
|
|
self.job_id = job_id |
179
|
|
|
self.time_stamp = time_stamp |
180
|
|
|
self.status = 'submitted' |
181
|
|
|
self.num_tasks = 0 |
182
|
|
|
self.tasks_per_node = 0 |
183
|
|
|
self.threads_per_task = 0 |
184
|
|
|
self.num_nodes = 0 |
185
|
|
|
self.stats = {} |
186
|
|
|
self.sysscribe = None |
187
|
|
|
self.app_name = 'unknown' |
188
|
|
|
self.app_data_metric = 0 |
189
|
|
|
self.job_script_name = 'unknown' |
190
|
|
|
self.job_name = 'unknown' |
191
|
|
|
self.job_dir = 'unknown' |
192
|
|
|
self.queue = 'unknown' |
193
|
|
|
|
194
|
|
|
def update_status(self, new_status): |
195
|
|
|
|
196
|
|
|
self.status = new_status |
197
|
|
|
transaction.commit() |
198
|
|
|
|
199
|
|
|
def update_sysscribe(self, sys_dict): |
200
|
|
|
self.sysscribe = sys_dict |
201
|
|
|
self._p_changed = True |
202
|
|
|
transaction.commit() |
203
|
|
|
|
204
|
|
|
def update_stats(self, stats): |
205
|
|
|
self.stats = stats |
206
|
|
|
self._p_changed = True |
207
|
|
|
transaction.commit() |
208
|
|
|
|
209
|
|
|
def appname(self, name): |
210
|
|
|
self.app_name = name |
211
|
|
|
transaction.commit() |
212
|
|
|
|
213
|
|
|
def appdata(self, data): |
214
|
|
|
|
215
|
|
|
self.app_data_metric = data |
216
|
|
|
transaction.commit() |
217
|
|
|
|
This can be caused by one of the following:
1. Missing Dependencies
This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.
2. Missing __init__.py files
This error could also result from missing
__init__.py
files in your module folders. Make sure that you place one file in each sub-folder.