]>
Commit | Line | Data |
---|---|---|
9137135a MT |
1 | #!/usr/bin/python |
2 | ||
3 | import datetime | |
4 | import hashlib | |
5 | import logging | |
6 | import random | |
7 | import string | |
8 | import time | |
9 | ||
10 | import base | |
11 | ||
12 | class 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 | ||
45 | class 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) |