]> git.ipfire.org Git - people/jschlag/pbs.git/blame - backend/builders.py
Initial import.
[people/jschlag/pbs.git] / backend / builders.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
3import datetime
4import hashlib
5import logging
6import random
7import string
8import time
9
10import base
11
12class Builders(base.Object):
13 def get_all(self):
14 builders = self.db.query("SELECT id FROM builders WHERE deleted = 'N' ORDER BY name")
15
16 return [Builder(self.pakfire, b.id) for b in builders]
17
18 def get_by_id(self, id):
19 if not id:
20 return
21
22 return Builder(self.pakfire, id)
23
24 def get_by_name(self, name):
25 builder = self.db.get("SELECT id FROM builders WHERE name = %s LIMIT 1", name)
26
27 if builder:
28 return Builder(self.pakfire, builder.id)
29
30 def get_all_arches(self):
31 arches = set()
32
33 for result in self.db.query("SELECT DISTINCT arches FROM builders"):
34 if not result.arches:
35 continue
36
37 _arches = result.arches.split()
38
39 for arch in _arches:
40 arches.add(arch)
41
42 return sorted(arches)
43
44
45class Builder(base.Object):
46 def __init__(self, pakfire, id):
47 base.Object.__init__(self, pakfire)
48
49 self.id = id
50
51 self.data = self.db.get("SELECT * FROM builders WHERE id = %s", self.id)
52
53 def __cmp__(self, other):
54 return cmp(self.id, other.id)
55
56 @classmethod
57 def new(cls, pakfire, name):
58 id = pakfire.db.execute("INSERT INTO builders(name) VALUES(%s)", name)
59
60 builder = cls(pakfire, id)
61 builder.regenerate_passphrase()
62
63 return builder
64
65 def set(self, key, value):
66 self.db.execute("UPDATE builders SET %s = %%s WHERE id = %%s LIMIT 1" % key,
67 value, self.id)
68 self.data[key] = value
69
70 def delete(self):
71 self.set("disabled", "Y")
72 self.set("deleted", "Y")
73
74 def regenerate_passphrase(self):
75 source = string.ascii_letters + string.digits
76 passphrase = "".join(random.sample(source * 30, 20))
77
78 self.set("passphrase", passphrase)
79
80 def validate_passphrase(self, passphrase):
81 return self.passphrase == passphrase
82
83 def update_info(self, loadavg, cpu_model, memory, arches):
84 self.set("loadavg", loadavg)
85 self.set("cpu_model", cpu_model)
86 self.set("memory", memory)
87 self.set("arches", arches)
88
89 def get_enabled(self):
90 return not self.disabled
91
92 def set_enabled(self, value):
93 if value:
94 value = "N"
95 else:
96 value = "Y"
97
98 self.set("disabled", value)
99
100 enabled = property(get_enabled, set_enabled)
101
102 @property
103 def disabled(self):
104 return self.data.disabled == "Y"
105
106 @property
107 def arches(self):
108 arches = ["noarch",]
109
110 if self.build_src:
111 arches.append("src")
112
113 if self.data.arches:
114 arches += self.data.arches.split()
115
116 return sorted(arches)
117
118 def get_build_src(self):
119 return self.data.build_src == "Y"
120
121 def set_build_src(self, value):
122 if value:
123 value = "Y"
124 else:
125 value = "N"
126
127 self.set("build_src", value)
128
129 build_src = property(get_build_src, set_build_src)
130
131 def get_build_bin(self):
132 return self.data.build_bin == "Y"
133
134 def set_build_bin(self, value):
135 if value:
136 value = "Y"
137 else:
138 value = "N"
139
140 self.set("build_bin", value)
141
142 build_bin = property(get_build_bin, set_build_bin)
143
144 def get_build_test(self):
145 return self.data.build_test == "Y"
146
147 def set_build_test(self, value):
148 if value:
149 value = "Y"
150 else:
151 value = "N"
152
153 self.set("build_test", value)
154
155 build_test = property(get_build_test, set_build_test)
156
157 def get_max_jobs(self):
158 return self.data.max_jobs
159
160 def set_max_jobs(self, value):
161 self.set("max_jobs", value)
162
163 max_jobs = property(get_max_jobs, set_max_jobs)
164
165 @property
166 def name(self):
167 return self.data.name
168
169 @property
170 def hostname(self):
171 return self.name
172
173 @property
174 def passphrase(self):
175 return self.data.passphrase
176
177 @property
178 def loadavg(self):
179 if not self.status == "ONLINE":
180 return 0
181
182 return self.data.loadavg
183
184 @property
185 def cpu_model(self):
186 return self.data.cpu_model
187
188 @property
189 def memory(self):
190 return self.data.memory * 1024
191
192 @property
193 def status(self):
194 if self.disabled:
195 return "DISABLED"
196
197 threshhold = datetime.datetime.utcnow() - datetime.timedelta(minutes=6)
198
199 if self.data.updated < threshhold:
200 return "OFFLINE"
201
202 return "ONLINE"
203
204 @property
205 def builds(self):
206 return self.pakfire.builds.get_by_host(self.id)
207
208 @property
209 def active_builds(self):
210 return self.pakfire.builds.get_active(host_id=self.id)