zuul/zuul/reporter/sql.py

95 lines
3.4 KiB
Python

# Copyright 2015 Rackspace Australia
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import datetime
import logging
import voluptuous as v
from zuul.reporter import BaseReporter
class SQLReporter(BaseReporter):
"""Sends off reports to a database."""
name = 'sql'
log = logging.getLogger("zuul.reporter.mysql.SQLReporter")
def __init__(self, reporter_config={}, sched=None, connection=None):
super(SQLReporter, self).__init__(
reporter_config, sched, connection)
self.result_score = reporter_config.get('score', None)
def report(self, source, pipeline, item):
"""Create an entry into a database."""
if not self.connection.tables_established:
self.log.warn("SQL reporter (%s) is disabled " % self)
return
if self.sched.config.has_option('zuul', 'url_pattern'):
url_pattern = self.sched.config.get('zuul', 'url_pattern')
else:
url_pattern = None
score = self.reporter_config['score']\
if 'score' in self.reporter_config else 0
with self.connection.engine.begin() as conn:
buildset_ins = self.connection.zuul_buildset_table.insert().values(
zuul_ref=item.current_build_set.ref,
pipeline=item.pipeline.name,
project=item.change.project.name,
change=item.change.number,
patchset=item.change.patchset,
ref=item.change.refspec,
score=score,
message=self._formatItemReport(
pipeline, item, with_jobs=False),
)
buildset_ins_result = conn.execute(buildset_ins)
build_inserts = []
for job in pipeline.getJobs(item):
build = item.current_build_set.getBuild(job.name)
if not build:
# build hasn't began. The sql reporter can only send back
# stats about builds. It doesn't understand how to store
# information about the change.
continue
(result, url) = item.formatJobResult(job, url_pattern)
build_inserts.append({
'buildset_id': buildset_ins_result.inserted_primary_key,
'uuid': build.uuid,
'job_name': build.job.name,
'result': result,
'start_time': datetime.datetime.fromtimestamp(
build.start_time),
'end_time': datetime.datetime.fromtimestamp(
build.end_time),
'voting': build.job.voting,
'log_url': url,
'node_name': build.node_name,
})
conn.execute(self.connection.zuul_build_table.insert(),
build_inserts)
def getSchema():
sql_reporter = v.Schema({
'score': int,
})
return sql_reporter