1 |
commit: 396cbf6ec3c530541c278155828677a341fda248 |
2 |
Author: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
3 |
AuthorDate: Wed Sep 8 00:21:03 2021 +0000 |
4 |
Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Sep 8 00:21:03 2021 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=396cbf6e |
7 |
|
8 |
Support dynamically projects and worker in run_build_request |
9 |
|
10 |
Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org> |
11 |
|
12 |
buildbot_gentoo_ci/config/builders.py | 24 +++++++++++++++++++++--- |
13 |
buildbot_gentoo_ci/db/model.py | 20 ++++++++++++++++++++ |
14 |
buildbot_gentoo_ci/db/projects.py | 18 ++++++++++++++++++ |
15 |
buildbot_gentoo_ci/steps/builders.py | 28 +++++++++++++++++++--------- |
16 |
4 files changed, 78 insertions(+), 12 deletions(-) |
17 |
|
18 |
diff --git a/buildbot_gentoo_ci/config/builders.py b/buildbot_gentoo_ci/config/builders.py |
19 |
index 56cdde1..c28d016 100644 |
20 |
--- a/buildbot_gentoo_ci/config/builders.py |
21 |
+++ b/buildbot_gentoo_ci/config/builders.py |
22 |
@@ -1,16 +1,34 @@ |
23 |
# Copyright 2021 Gentoo Authors |
24 |
# Distributed under the terms of the GNU General Public License v2 |
25 |
|
26 |
+from twisted.internet import defer |
27 |
+ |
28 |
from buildbot.plugins import util |
29 |
from buildbot_gentoo_ci.config import buildfactorys |
30 |
|
31 |
-# FIXME: get workers from db or file |
32 |
+# FIXME: get LocalWorkers and BuildWorkers from db or file |
33 |
LocalWorkers = [] |
34 |
LocalWorkers.append('updatedb_1') |
35 |
LocalWorkers.append('updatedb_2') |
36 |
LocalWorkers.append('updatedb_3') |
37 |
LocalWorkers.append('updatedb_4') |
38 |
|
39 |
+BuildWorkers = [] |
40 |
+BuildWorkers.append('a89c2c1a-46e0-4ded-81dd-c51afeb7fcfd') |
41 |
+ |
42 |
+@×××××.inlineCallbacks |
43 |
+def CanWorkerBuildProject(builder, wfb, request): |
44 |
+ gentooci = builder.master.namedServices['services'].namedServices['gentooci'] |
45 |
+ project_build_data = request.properties['project_build_data'] |
46 |
+ project_workers = yield gentooci.db.projects.getWorkersByProjectUuid(project_build_data['project_uuid']) |
47 |
+ print(project_workers) |
48 |
+ print(wfb) |
49 |
+ for worker in project_workers: |
50 |
+ if wfb.worker.workername == worker['worker_uuid']: |
51 |
+ return True |
52 |
+ print('no worker') |
53 |
+ return False |
54 |
+ |
55 |
def gentoo_builders(b=[]): |
56 |
b.append(util.BuilderConfig( |
57 |
name='update_db_check', |
58 |
@@ -57,11 +75,11 @@ def gentoo_builders(b=[]): |
59 |
factory=buildfactorys.build_request_check() |
60 |
) |
61 |
) |
62 |
- # FIXME: get workers from db or file |
63 |
# Use multiplay workers |
64 |
b.append(util.BuilderConfig( |
65 |
name='run_build_request', |
66 |
- workername='bot-test', |
67 |
+ workernames=BuildWorkers, |
68 |
+ canStartBuild=CanWorkerBuildProject, |
69 |
collapseRequests=False, |
70 |
factory=buildfactorys.run_build_request() |
71 |
) |
72 |
|
73 |
diff --git a/buildbot_gentoo_ci/db/model.py b/buildbot_gentoo_ci/db/model.py |
74 |
index ca9932a..d9a3972 100644 |
75 |
--- a/buildbot_gentoo_ci/db/model.py |
76 |
+++ b/buildbot_gentoo_ci/db/model.py |
77 |
@@ -232,6 +232,17 @@ class Model(base.DBConnectorComponent): |
78 |
sa.Column('search_type', sa.Enum('in', 'startswith', 'endswith', 'search'), default='in'), |
79 |
) |
80 |
|
81 |
+ projects_workers = sautils.Table( |
82 |
+ "projects_workers", metadata, |
83 |
+ sa.Column('id', sa.Integer, primary_key=True), |
84 |
+ sa.Column('project_uuid', sa.String(36), |
85 |
+ sa.ForeignKey('projects.uuid', ondelete='CASCADE'), |
86 |
+ nullable=False), |
87 |
+ sa.Column('worker_uuid', sa.String(36), |
88 |
+ sa.ForeignKey('workers.uuid', ondelete='CASCADE'), |
89 |
+ nullable=False), |
90 |
+ ) |
91 |
+ |
92 |
keywords = sautils.Table( |
93 |
"keywords", metadata, |
94 |
# unique uuid per keyword |
95 |
@@ -289,6 +300,15 @@ class Model(base.DBConnectorComponent): |
96 |
sa.Column('status', sa.Enum('stable','unstable','negative','all'), nullable=False), |
97 |
) |
98 |
|
99 |
+ workers = sautils.Table( |
100 |
+ "workers", metadata, |
101 |
+ # unique id per project |
102 |
+ sa.Column('uuid', sa.String(36), primary_key=True, |
103 |
+ default=lambda: str(uuid.uuid4())), |
104 |
+ sa.Column('type', sa.Enum('local','default','latent'), nullable=False), |
105 |
+ sa.Column('enabled', sa.Boolean, default=False), |
106 |
+ ) |
107 |
+ |
108 |
# Tables related to users |
109 |
# ----------------------- |
110 |
|
111 |
|
112 |
diff --git a/buildbot_gentoo_ci/db/projects.py b/buildbot_gentoo_ci/db/projects.py |
113 |
index 176be92..fbef435 100644 |
114 |
--- a/buildbot_gentoo_ci/db/projects.py |
115 |
+++ b/buildbot_gentoo_ci/db/projects.py |
116 |
@@ -189,6 +189,17 @@ class ProjectsConnectorComponent(base.DBConnectorComponent): |
117 |
res = yield self.db.pool.do(thd) |
118 |
return res |
119 |
|
120 |
+ @defer.inlineCallbacks |
121 |
+ def getWorkersByProjectUuid(self, uuid): |
122 |
+ def thd(conn): |
123 |
+ tbl = self.db.model.projects_workers |
124 |
+ q = tbl.select() |
125 |
+ q = q.where(tbl.c.project_uuid == uuid) |
126 |
+ return [self._row2dict_projects_workers(conn, row) |
127 |
+ for row in conn.execute(q).fetchall()] |
128 |
+ res = yield self.db.pool.do(thd) |
129 |
+ return res |
130 |
+ |
131 |
def _row2dict(self, conn, row): |
132 |
return dict( |
133 |
uuid=row.uuid, |
134 |
@@ -217,6 +228,13 @@ class ProjectsConnectorComponent(base.DBConnectorComponent): |
135 |
build=row.build |
136 |
) |
137 |
|
138 |
+ def _row2dict_projects_workers(self, conn, row): |
139 |
+ return dict( |
140 |
+ id=row.id, |
141 |
+ project_uuid=row.project_uuid, |
142 |
+ worker_uuid=row.worker_uuid, |
143 |
+ ) |
144 |
+ |
145 |
def _row2dict_projects_portage(self, conn, row): |
146 |
return dict( |
147 |
id=row.id, |
148 |
|
149 |
diff --git a/buildbot_gentoo_ci/steps/builders.py b/buildbot_gentoo_ci/steps/builders.py |
150 |
index 5b53018..9918938 100644 |
151 |
--- a/buildbot_gentoo_ci/steps/builders.py |
152 |
+++ b/buildbot_gentoo_ci/steps/builders.py |
153 |
@@ -186,7 +186,10 @@ class TriggerRunBuildRequest(BuildStep): |
154 |
haltOnFailure = True |
155 |
flunkOnFailure = True |
156 |
|
157 |
- def __init__(self, **kwargs): |
158 |
+ def __init__(self, projectrepository_data, use_data, project_data, **kwargs): |
159 |
+ self.projectrepository_data = projectrepository_data |
160 |
+ self.use_data = use_data |
161 |
+ self.project_data = project_data |
162 |
super().__init__(**kwargs) |
163 |
|
164 |
@defer.inlineCallbacks |
165 |
@@ -194,7 +197,7 @@ class TriggerRunBuildRequest(BuildStep): |
166 |
self.gentooci = self.master.namedServices['services'].namedServices['gentooci'] |
167 |
if self.getProperty('project_build_data') is None: |
168 |
project_build_data = {} |
169 |
- project_build_data['project_uuid'] = self.getProperty('project_data')['uuid'] |
170 |
+ project_build_data['project_uuid'] = self.project_data['uuid'] |
171 |
project_build_data['version_uuid'] = self.getProperty("version_data")['uuid'] |
172 |
project_build_data['status'] = 'waiting' |
173 |
project_build_data['requested'] = False |
174 |
@@ -210,8 +213,8 @@ class TriggerRunBuildRequest(BuildStep): |
175 |
set_properties={ |
176 |
'cpv' : self.getProperty("cpv"), |
177 |
'version_data' : self.getProperty("version_data"), |
178 |
- 'projectrepository_data' : self.getProperty('projectrepository_data'), |
179 |
- 'use_data' : self.getProperty("use_data"), |
180 |
+ 'projectrepository_data' : self.projectrepository_data, |
181 |
+ 'use_data' : self.use_data, |
182 |
'fullcheck' : self.getProperty("fullcheck"), |
183 |
'project_build_data' : project_build_data |
184 |
} |
185 |
@@ -239,14 +242,17 @@ class GetProjectRepositoryData(BuildStep): |
186 |
return SUCCESS |
187 |
# for loop to get all the projects that have the repository |
188 |
for projectrepository_data in self.projectrepositorys_data: |
189 |
+ print(projectrepository_data) |
190 |
# get project data |
191 |
project_data = yield self.gentooci.db.projects.getProjectByUuid(projectrepository_data['project_uuid']) |
192 |
+ #FIXME: check if we have working workers |
193 |
+ project_workers = yield self.gentooci.db.projects.getWorkersByProjectUuid(project_data['uuid']) |
194 |
+ if project_workers == []: |
195 |
+ print('No Workers on this profile') |
196 |
+ continue |
197 |
# check if auto, enabled and not in config.project['project'] |
198 |
- if project_data['auto'] is True and project_data['enabled'] is True and project_data['name'] != self.gentooci.config.project['project']: |
199 |
+ if project_data['auto'] is True and project_data['enabled'] is True and project_data['name'] != self.gentooci.config.project['project']['update_db']: |
200 |
# set Property projectrepository_data so we can use it in the trigger |
201 |
- self.setProperty('projectrepository_data', projectrepository_data, 'projectrepository_data') |
202 |
- self.setProperty('use_data', None, 'use_data') |
203 |
- self.setProperty('project_data', project_data, 'project_data') |
204 |
# get name o project keyword |
205 |
project_keyword_data = yield self.gentooci.db.keywords.getKeywordById(project_data['keyword_id']) |
206 |
# if not * (all keywords) |
207 |
@@ -258,7 +264,11 @@ class GetProjectRepositoryData(BuildStep): |
208 |
version_keywords_data = self.getProperty("version_keyword_dict")[project_keyword_data['name']] |
209 |
# if match trigger BuildRequest on cpv |
210 |
if project_data['status'] == version_keywords_data['status']: |
211 |
- yield self.build.addStepsAfterCurrentStep([TriggerRunBuildRequest()]) |
212 |
+ yield self.build.addStepsAfterCurrentStep([TriggerRunBuildRequest( |
213 |
+ projectrepository_data = projectrepository_data, |
214 |
+ use_data = None, |
215 |
+ project_data = project_data |
216 |
+ )]) |
217 |
return SUCCESS |
218 |
|
219 |
class SetupPropertys(BuildStep): |