From 40f7f4dd8405311f3f6ab127b34b71656e8307cb Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 27 Jul 2017 17:27:43 -0500 Subject: [PATCH] Update SQL reporter to store results Instead of a configuration of "score" - just store the build_set.result field. Change-Id: Iadac7d2660ba068c08e0888d2421deb435e9e833 --- doc/source/admin/drivers/sql.rst | 15 ------ tests/unit/test_connection.py | 10 ++-- .../60c119eb1e3f_use_build_set_results.py | 49 +++++++++++++++++++ zuul/driver/sql/sqlconnection.py | 2 +- zuul/driver/sql/sqlreporter.py | 8 +-- 5 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 zuul/driver/sql/alembic_reporter/versions/60c119eb1e3f_use_build_set_results.py diff --git a/doc/source/admin/drivers/sql.rst b/doc/source/admin/drivers/sql.rst index b890f08fac..17bfa8d67a 100644 --- a/doc/source/admin/drivers/sql.rst +++ b/doc/source/admin/drivers/sql.rst @@ -27,18 +27,3 @@ database. The SQL reporter does nothing on "start" or "merge-failure"; it only acts on "success" or "failure" reporting stages. - -**score** - A score to store for the result of the build. eg: -1 might indicate a failed - build. - -For example :: - - - pipeline: - name: post-merge - success: - mydb_conn: - score: 1 - failure: - mydb_conn: - score: -1 diff --git a/tests/unit/test_connection.py b/tests/unit/test_connection.py index 77b13a591a..4214e9f065 100644 --- a/tests/unit/test_connection.py +++ b/tests/unit/test_connection.py @@ -86,7 +86,7 @@ class TestSQLConnection(ZuulDBTestCase): self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) self.waitUntilSettled() - # Add a failed result for a negative score + # Add a failed result B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B') self.executor_server.failJob('project-test1', B) @@ -106,7 +106,7 @@ class TestSQLConnection(ZuulDBTestCase): self.assertEqual('org/project', buildset0['project']) self.assertEqual(1, buildset0['change']) self.assertEqual(1, buildset0['patchset']) - self.assertEqual(1, buildset0['score']) + self.assertEqual('SUCCESS', buildset0['result']) self.assertEqual('Build succeeded.', buildset0['message']) self.assertEqual('tenant-one', buildset0['tenant']) @@ -130,7 +130,7 @@ class TestSQLConnection(ZuulDBTestCase): self.assertEqual('org/project', buildset1['project']) self.assertEqual(2, buildset1['change']) self.assertEqual(1, buildset1['patchset']) - self.assertEqual(-1, buildset1['score']) + self.assertEqual('FAILURE', buildset1['result']) self.assertEqual('Build failed.', buildset1['message']) buildset1_builds = conn.execute( @@ -183,7 +183,7 @@ class TestSQLConnection(ZuulDBTestCase): self.assertEqual('org/project', buildsets_resultsdb[0]['project']) self.assertEqual(1, buildsets_resultsdb[0]['change']) self.assertEqual(1, buildsets_resultsdb[0]['patchset']) - self.assertEqual(1, buildsets_resultsdb[0]['score']) + self.assertEqual('SUCCESS', buildsets_resultsdb[0]['result']) self.assertEqual('Build succeeded.', buildsets_resultsdb[0]['message']) # Grab the sa tables for resultsdb_failures @@ -204,7 +204,7 @@ class TestSQLConnection(ZuulDBTestCase): 'org/project', buildsets_resultsdb_failures[0]['project']) self.assertEqual(2, buildsets_resultsdb_failures[0]['change']) self.assertEqual(1, buildsets_resultsdb_failures[0]['patchset']) - self.assertEqual(-1, buildsets_resultsdb_failures[0]['score']) + self.assertEqual('FAILURE', buildsets_resultsdb_failures[0]['result']) self.assertEqual( 'Build failed.', buildsets_resultsdb_failures[0]['message']) diff --git a/zuul/driver/sql/alembic_reporter/versions/60c119eb1e3f_use_build_set_results.py b/zuul/driver/sql/alembic_reporter/versions/60c119eb1e3f_use_build_set_results.py new file mode 100644 index 0000000000..8e8142f8de --- /dev/null +++ b/zuul/driver/sql/alembic_reporter/versions/60c119eb1e3f_use_build_set_results.py @@ -0,0 +1,49 @@ +"""Use build_set results + +Revision ID: 60c119eb1e3f +Revises: f86c9871ee67 +Create Date: 2017-07-27 17:09:20.374782 + +""" + +# revision identifiers, used by Alembic. +revision = '60c119eb1e3f' +down_revision = 'f86c9871ee67' +branch_labels = None +depends_on = None + +from alembic import op +import sqlalchemy as sa + +BUILDSET_TABLE = 'zuul_buildset' + + +def upgrade(): + op.add_column(BUILDSET_TABLE, sa.Column('result', sa.String(255))) + + connection = op.get_bind() + connection.execute( + """ + UPDATE {buildset_table} + SET result=( + SELECT CASE score + WHEN 1 THEN 'SUCCESS' + ELSE 'FAILURE' END) + """.format(buildset_table=BUILDSET_TABLE)) + + op.drop_column(BUILDSET_TABLE, 'score') + + +def downgrade(): + op.add_column(BUILDSET_TABLE, sa.Column('score', sa.Integer)) + + connection = op.get_bind() + connection.execute( + """ + UPDATE {buildset_table} + SET score=( + SELECT CASE result + WHEN 'SUCCESS' THEN 1 + ELSE -1 END) + """.format(buildset_table=BUILDSET_TABLE)) + op.drop_column(BUILDSET_TABLE, 'result') diff --git a/zuul/driver/sql/sqlconnection.py b/zuul/driver/sql/sqlconnection.py index 0e3f0ddb43..1187c2d59a 100644 --- a/zuul/driver/sql/sqlconnection.py +++ b/zuul/driver/sql/sqlconnection.py @@ -83,7 +83,7 @@ class SQLConnection(BaseConnection): sa.Column('change', sa.Integer, nullable=True), sa.Column('patchset', sa.Integer, nullable=True), sa.Column('ref', sa.String(255)), - sa.Column('score', sa.Integer, nullable=True), + sa.Column('result', sa.String(255)), sa.Column('message', sa.TEXT()), sa.Column('tenant', sa.String(255)), ) diff --git a/zuul/driver/sql/sqlreporter.py b/zuul/driver/sql/sqlreporter.py index aca1b069ba..6ec05a8723 100644 --- a/zuul/driver/sql/sqlreporter.py +++ b/zuul/driver/sql/sqlreporter.py @@ -25,12 +25,6 @@ class SQLReporter(BaseReporter): name = 'sql' log = logging.getLogger("zuul.reporter.mysql.SQLReporter") - def __init__(self, driver, connection, config={}): - super(SQLReporter, self).__init__( - driver, connection, config) - # TODO(jeblair): document this is stored as NULL if unspecified - self.result_score = config.get('score', None) - def report(self, item): """Create an entry into a database.""" @@ -49,7 +43,7 @@ class SQLReporter(BaseReporter): change=change, patchset=patchset, ref=ref, - score=self.result_score, + result=item.current_build_set.result, message=self._formatItemReport( item, with_jobs=False), tenant=item.pipeline.layout.tenant.name,