Completed
Push — master ( b2e90b...7da7db )
by James
13s
created

mycluster/persist.py (1 issue)

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
0 ignored issues
show
Unable to import 'version' (invalid syntax (<string>, line 135))

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.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

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.

Loading history...
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