commit:     f5cbe07ace4abc03c04e21a43e028f1edc24121d
Author:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 25 21:24:51 2021 +0000
Commit:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Mon Oct 25 21:24:51 2021 +0000
URL:        
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=f5cbe07a

Add AddVersionRestrictions and AddVersionIUse to Version buildstep

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

 buildbot_gentoo_ci/db/model.py      | 10 ++++++
 buildbot_gentoo_ci/db/versions.py   | 38 ++++++++++++++++++++
 buildbot_gentoo_ci/steps/version.py | 72 +++++++++++++++++++++++++++++++++++++
 3 files changed, 120 insertions(+)

diff --git a/buildbot_gentoo_ci/db/model.py b/buildbot_gentoo_ci/db/model.py
index 12d5ee9..9e380c8 100644
--- a/buildbot_gentoo_ci/db/model.py
+++ b/buildbot_gentoo_ci/db/model.py
@@ -301,6 +301,16 @@ class Model(base.DBConnectorComponent):
         sa.Column('status', sa.Enum('stable','unstable','negative','all'), 
nullable=False),
     )
 
+    versions_metadata = sautils.Table(
+        "versions_metadata", metadata,
+        # unique id per project
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('version_uuid', sa.String(36),
+                  sa.ForeignKey('versions.uuid', ondelete='CASCADE')),
+        sa.Column('metadata', sa.Enum('restrict', 'properties', 'iuse', 
'required use', 'keyword'), nullable=False),
+        sa.Column('value', sa.String(255), nullable=False),
+    )
+
     workers = sautils.Table(
         "workers", metadata,
         # unique id per project

diff --git a/buildbot_gentoo_ci/db/versions.py 
b/buildbot_gentoo_ci/db/versions.py
index fcc19ee..6b534f3 100644
--- a/buildbot_gentoo_ci/db/versions.py
+++ b/buildbot_gentoo_ci/db/versions.py
@@ -101,6 +101,36 @@ class 
VersionsConnectorComponent(base.DBConnectorComponent):
         res = yield self.db.pool.do(thd)
         return res
 
+    @defer.inlineCallbacks
+    def addMetadata(self, version_uuid, metadata, value):
+        def thd(conn, no_recurse=False):
+            try:
+                tbl = self.db.model.versions_metadata
+                q = tbl.insert()
+                r = conn.execute(q, dict(version_uuid=version_uuid,
+                                         metadata=metadata,
+                                         value=value))
+            except (sa.exc.IntegrityError, sa.exc.ProgrammingError):
+                id = None
+            else:
+                id = r.inserted_primary_key[0]
+            return uuid
+        res = yield self.db.pool.do(thd)
+        return res
+
+    #FIXME: return sorted by id
+    @defer.inlineCallbacks
+    def getMetadataByUuidAndMatadata(self, uuid, metadata):
+        def thd(conn):
+            tbl = self.db.model.versions_metadata
+            q = tbl.select()
+            q = q.where(tbl.c.version_uuid == uuid)
+            q = q.where(tbl.c.metadata == metadata)
+            return [self._row2dict_version_metadata(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,
@@ -111,3 +141,11 @@ class 
VersionsConnectorComponent(base.DBConnectorComponent):
             deleted=row.deleted,
             deleted_at=row.deleted_at
             )
+
+    def _row2dict_version_metadata(self, conn, row):
+        return dict(
+            id=row.id,
+            version_uuid=row.version_uuid,
+            metadata=row.metadata,
+            value=row.value
+            )

diff --git a/buildbot_gentoo_ci/steps/version.py 
b/buildbot_gentoo_ci/steps/version.py
index df97536..bff1e57 100644
--- a/buildbot_gentoo_ci/steps/version.py
+++ b/buildbot_gentoo_ci/steps/version.py
@@ -16,10 +16,21 @@ from buildbot.process.buildstep import BuildStep
 from buildbot.process.results import SUCCESS
 from buildbot.process.results import FAILURE
 from buildbot.process.results import WARNINGS
+from buildbot.process.results import SKIPPED
 from buildbot.plugins import steps
 
 from buildbot_gentoo_ci.steps import portage as portage_steps
 
+def getIUseValue(auxdb_iuse):
+    status = False
+    if auxdb_iuse[0] in ['+']:
+        status = True
+    if auxdb_iuse[0] in ['+'] or auxdb_iuse[0] in ['-']:
+        iuse = auxdb_iuse[1:]
+    else:
+        iuse = auxdb_iuse
+    return iuse, status
+
 class GetVData(BuildStep):
     
     name = 'GetVData'
@@ -96,6 +107,7 @@ class GetCommitdata(BuildStep):
         self.setProperty('commit_id', 
self.getProperty("change_data")['revision'], 'commit_id')
         return SUCCESS
 
+#FIXME: use versions_metadata table
 class AddVersionKeyword(BuildStep):
 
     name = 'AddVersionKeyword'
@@ -155,6 +167,64 @@ class AddVersionKeyword(BuildStep):
         self.setProperty('version_keyword_dict', self.version_keyword_dict, 
'version_keyword_dict')
         return SUCCESS
 
+class AddVersionRestrictions(BuildStep):
+
+    name = 'AddVersionRestrictions'
+    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']
+        auxdb = self.getProperty("auxdb")['RESTRICT']
+        if auxdb is None or not isinstance(auxdb, list):
+            return SKIPPED
+        for restrict in auxdb:
+            version_metadata_data = {}
+            version_metadata_data['version_uuid'] = 
self.getProperty("version_data")['uuid']
+            version_metadata_data['metadata'] = 'restrict'
+            version_metadata_data['value'] = restrict
+            version_metadata_data['id'] = yield 
self.gentooci.db.versions.addMetadata(
+                                                
version_metadata_data['version_uuid'],
+                                                
version_metadata_data['metadata'],
+                                                version_metadata_data['value'])
+        return SUCCESS
+
+class AddVersionIUse(BuildStep):
+
+    name = 'AddVersionIUse'
+    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']
+        auxdb = self.getProperty("auxdb")['IUSE']
+        if auxdb is None or not isinstance(auxdb, list):
+            return SKIPPED
+        for iuse in auxdb:
+            version_metadata_data = {}
+            version_metadata_data['version_uuid'] = 
self.getProperty("version_data")['uuid']
+            version_metadata_data['metadata'] = 'iuse'
+            version_metadata_data['value'] = iuse
+            version_metadata_data['id'] = yield 
self.gentooci.db.versions.addMetadata(
+                                                
version_metadata_data['version_uuid'],
+                                                
version_metadata_data['metadata'],
+                                                version_metadata_data['value'])
+        return SUCCESS
+
 class CheckPathHash(BuildStep):
     
     name = 'CheckPathHash'
@@ -272,6 +342,8 @@ class CheckV(BuildStep):
             addStepVData.append(portage_steps.GetAuxMetadata())
             addStepVData.append(AddVersion())
             addStepVData.append(AddVersionKeyword())
+            addStepVData.append(AddVersionRestrictions())
+            addStepVData.append(AddVersionIUse())
             addStepVData.append(TriggerBuildCheck())
         yield self.build.addStepsAfterCurrentStep(addStepVData)
         return SUCCESS

Reply via email to