commit:     500c23afb393cc5330b82ba9d86a966e0abe6289
Author:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Sun Jan 17 21:20:23 2021 +0000
Commit:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Sun Jan 17 21:20:23 2021 +0000
URL:        
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=500c23af

Add BuildFactory build_request_check and start of run_build_request

Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org>

 buildbot_gentoo_ci/config/builders.py      |  8 +++
 buildbot_gentoo_ci/config/buildfactorys.py | 12 ++++
 buildbot_gentoo_ci/config/schedulers.py    |  3 +
 buildbot_gentoo_ci/db/model.py             |  6 +-
 buildbot_gentoo_ci/db/projects.py          | 37 ++++++++++-
 buildbot_gentoo_ci/steps/builders.py       | 98 ++++++++++++++++++++++++++++++
 buildbot_gentoo_ci/steps/version.py        |  4 +-
 7 files changed, 163 insertions(+), 5 deletions(-)

diff --git a/buildbot_gentoo_ci/config/builders.py 
b/buildbot_gentoo_ci/config/builders.py
index 9fef46a..69dd840 100644
--- a/buildbot_gentoo_ci/config/builders.py
+++ b/buildbot_gentoo_ci/config/builders.py
@@ -38,4 +38,12 @@ def gentoo_builders(b=[]):
         factory=buildfactorys.build_request_check()
         )
     )
+    # FIXME: get workers from db
+    # Use multiplay workers
+    b.append(util.BuilderConfig(
+        name='run_build_request',
+        workername='updatedb_1',
+        factory=buildfactorys.run_build_request()
+        )
+    )
     return b

diff --git a/buildbot_gentoo_ci/config/buildfactorys.py 
b/buildbot_gentoo_ci/config/buildfactorys.py
index ba96e5a..e0a6634 100644
--- a/buildbot_gentoo_ci/config/buildfactorys.py
+++ b/buildbot_gentoo_ci/config/buildfactorys.py
@@ -8,6 +8,7 @@ from buildbot_gentoo_ci.steps import update_db
 from buildbot_gentoo_ci.steps import category
 from buildbot_gentoo_ci.steps import package
 from buildbot_gentoo_ci.steps import version
+from buildbot_gentoo_ci.steps import builders
 
 def update_db_check():
     f = util.BuildFactory()
@@ -78,4 +79,15 @@ def update_db_v():
 def build_request_check():
     f = util.BuildFactory()
     # FIXME: 4
+    # get project_data
+    # check what tests to do
+    # triggger build request
+    f.addStep(builders.GetProjectRepositoryData())
+    return f
+
+def run_build_request():
+    f = util.BuildFactory()
+    # FIXME: 5
+    # Check if all is setup on the worker
+    f.addStep(builders.SetupBuildWorker())
     return f

diff --git a/buildbot_gentoo_ci/config/schedulers.py 
b/buildbot_gentoo_ci/config/schedulers.py
index 687b52f..7cfb122 100644
--- a/buildbot_gentoo_ci/config/schedulers.py
+++ b/buildbot_gentoo_ci/config/schedulers.py
@@ -56,10 +56,13 @@ def gentoo_schedulers():
                                builderNames=["update_v_data"])
     build_request_data = schedulers.Triggerable(name="build_request_data",
                                builderNames=["build_request_data"])
+    run_build_request = schedulers.Triggerable(name="run_build_request",
+                               builderNames=["run_build_request"])
     s = []
     s.append(test_updatedb)
     #s.append(scheduler_update_db)
     s.append(update_cpv_data)
     s.append(update_v_data)
     s.append(build_request_data)
+    s.append(run_build_request)
     return s

diff --git a/buildbot_gentoo_ci/db/model.py b/buildbot_gentoo_ci/db/model.py
index 9ad1331..b051b23 100644
--- a/buildbot_gentoo_ci/db/model.py
+++ b/buildbot_gentoo_ci/db/model.py
@@ -109,7 +109,7 @@ class Model(base.DBConnectorComponent):
         sa.Column('keyword_id', sa.Integer,
                   sa.ForeignKey('keywords.id', ondelete='CASCADE'),
                   nullable=False),
-        sa.Column('unstable', sa.Boolean, default=False),
+        sa.Column('status', sa.Enum('stable','unstable','all'), 
nullable=False),
         sa.Column('auto', sa.Boolean, default=False),
         sa.Column('enabled', sa.Boolean, default=False),
         sa.Column('created_by', sa.Integer,
@@ -121,12 +121,14 @@ class Model(base.DBConnectorComponent):
     projects_repositorys = sautils.Table(
         "projects_repositorys", metadata,
         sa.Column('id', sa.Integer, primary_key=True),
-        sa.Column('projects_uuid', sa.String(36),
+        sa.Column('project_uuid', sa.String(36),
                   sa.ForeignKey('projects.uuid', ondelete='CASCADE'),
                   nullable=False),
         sa.Column('repository_uuid', sa.String(36),
                   sa.ForeignKey('repositorys.uuid', ondelete='CASCADE'),
                   nullable=False),
+        sa.Column('auto', sa.Boolean, default=False),
+        sa.Column('pkgcheck', sa.Boolean, default=False),
     )
 
     keywords = sautils.Table(

diff --git a/buildbot_gentoo_ci/db/projects.py 
b/buildbot_gentoo_ci/db/projects.py
index 4a14bac..065c9a0 100644
--- a/buildbot_gentoo_ci/db/projects.py
+++ b/buildbot_gentoo_ci/db/projects.py
@@ -53,6 +53,32 @@ class ProjectsConnectorComponent(base.DBConnectorComponent):
         res = yield self.db.pool.do(thd)
         return res
 
+    @defer.inlineCallbacks
+    def getProjectByUuid(self, uuid):
+        def thd(conn):
+            tbl = self.db.model.projects
+            q = tbl.select()
+            q = q.where(tbl.c.uuid == uuid)
+            res = conn.execute(q)
+            row = res.fetchone()
+            if not row:
+                return None
+            return self._row2dict(conn, row)
+        res = yield self.db.pool.do(thd)
+        return res
+
+    @defer.inlineCallbacks
+    def getProjectRepositorysByUuid(self, uuid, auto=True):
+        def thd(conn):
+            tbl = self.db.model.projects_repositorys
+            q = tbl.select()
+            q = q.where(tbl.c.repository_uuid == uuid)
+            q = q.where(tbl.c.auto == auto)
+            return [self._row2dict_projects_repositorys(conn, row)
+                for row in conn.execute(q).fetchall()]
+        res = yield self.db.pool.do(thd)
+        return res
+
     def _row2dict(self, conn, row):
         return dict(
             uuid=row.uuid,
@@ -62,8 +88,17 @@ class ProjectsConnectorComponent(base.DBConnectorComponent):
             profile=row.profile,
             profile_repository_uuid=row.profile_repository_uuid,
             keyword_id=row.keyword_id,
-            unstable=row.unstable,
+            status=row.status,
             auto=row.auto,
             enabled=row.enabled,
             created_by=row.created_by
             )
+
+    def _row2dict_projects_repositorys(self, conn, row):
+        return dict(
+            id=row.id,
+            project_uuid=row.project_uuid,
+            repository_uuid=row.repository_uuid,
+            auto=row.auto,
+            pkgcheck=row.pkgcheck
+            )

diff --git a/buildbot_gentoo_ci/steps/builders.py 
b/buildbot_gentoo_ci/steps/builders.py
new file mode 100644
index 0000000..29389a1
--- /dev/null
+++ b/buildbot_gentoo_ci/steps/builders.py
@@ -0,0 +1,98 @@
+# Copyright 2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+from twisted.internet import defer
+from twisted.python import log
+
+from buildbot.process.buildstep import BuildStep
+from buildbot.process.results import SUCCESS
+from buildbot.process.results import FAILURE
+from buildbot.plugins import steps
+
+class TriggerRunBuildRequest(BuildStep):
+    
+    name = 'TriggerRunBuildRequest'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        yield self.build.addStepsAfterCurrentStep([
+                steps.Trigger(
+                    schedulerNames=['run_build_request'],
+                        waitForFinish=False,
+                        updateSourceStamp=False,
+                        set_properties={
+                            'cpv' : self.getProperty("cpv"),
+                            'version_data' : self.getProperty("version_data"),
+                            'projectrepository_data' : 
self.getProperty('projectrepository_data'),
+                            'repository_data' : 
self.getProperty("repository_data"),
+                            'use_data' : self.getProperty("use_data"),
+                            'fullcheck' : self.getProperty("fullcheck"),
+                        }
+                )])
+        return SUCCESS
+
+class GetProjectRepositoryData(BuildStep):
+    
+    name = 'GetProjectRepositoryData'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        self.projectrepositorys_data = yield 
self.gentooci.db.projects.getProjectRepositorysByUuid(self.getProperty("repository_data")['uuid'])
+        if self.projectrepositorys_data is None:
+            print('No Projects have this %s repository for testing' % 
self.getProperty("repository_data")['name'])
+            return SUCCESS
+        # for loop to get all the projects that have the repository
+        for projectrepository_data in self.projectrepositorys_data:
+            # get project data
+            project_data = yield 
self.gentooci.db.projects.getProjectByUuid(projectrepository_data['project_uuid'])
+            # check if auto, enabled and not in config.project['project']
+            if project_data['auto'] is True and project_data['enabled'] is 
True and project_data['name'] != self.gentooci.config.project['project']:
+                # set Property projectrepository_data so we can use it in the 
trigger
+                self.setProperty('projectrepository_data', 
projectrepository_data, 'projectrepository_data')
+                self.setProperty('use_data', None, 'use_data')
+                # get name o project keyword
+                project_keyword_data = yield 
self.gentooci.db.keywords.getKeywordById(project_data['keyword_id'])
+                # if not * (all keywords)
+                if project_keyword_data['name'] != '*' or 
project_data['status'] == 'all':
+                    self.setProperty('fullcheck', False, 'fullcheck')
+                    # get status of the keyword on cpv
+                    version_keywords_data = 
self.getProperty("version_keyword_dict")[project_keyword_data['name']]
+                    # if unstable trigger BuildRequest on cpv
+                    if project_data['status'] == 
version_keywords_data['status']:
+                        yield 
self.build.addStepsAfterCurrentStep([TriggerRunBuildRequest()])
+        return SUCCESS
+
+class SetupBuildWorker(BuildStep):
+    
+    name = 'SetupBuildWorker'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        print('build this %s' % self.getProperty("cpv"))
+        return SUCCESS

diff --git a/buildbot_gentoo_ci/steps/version.py 
b/buildbot_gentoo_ci/steps/version.py
index e274e65..5430e6e 100644
--- a/buildbot_gentoo_ci/steps/version.py
+++ b/buildbot_gentoo_ci/steps/version.py
@@ -194,7 +194,7 @@ class TriggerBuildCheck(BuildStep):
 
     @defer.inlineCallbacks
     def run(self):
-        yield steps.Trigger(
+        yield self.build.addStepsAfterCurrentStep([steps.Trigger(
                 schedulerNames=['build_request_data'],
                         waitForFinish=False,
                         updateSourceStamp=False,
@@ -204,7 +204,7 @@ class TriggerBuildCheck(BuildStep):
                             'version_keyword_dict' : 
self.getProperty('version_keyword_dict'),
                             'repository_data' : 
self.getProperty("repository_data"),
                         }
-                )
+                )])
         return SUCCESS
 
 class DeleteOldVersion(BuildStep):

Reply via email to