Source code for changes.models.failurereason
from __future__ import absolute_import, division
from uuid import uuid4
from datetime import datetime
from sqlalchemy import Column, DateTime, ForeignKey, String
from sqlalchemy.orm import relationship
from sqlalchemy.schema import Index, UniqueConstraint
from changes.config import db
from changes.db.types.guid import GUID
from changes.db.types.json import JSONEncodedDict
[docs]class FailureReason(db.Model):
"""
Always associated with a single jobstep. failurereason is not required to
fail a build. But if a jobstep fails, it can record why here. reason
column can be: [test_failures, missing_test, missing_artifact, timeout,
malformed_artifact, duplicate_test_name]
"""
__tablename__ = 'failurereason'
__table_args__ = (
Index('idx_failurereason_job_id', 'job_id'),
Index('idx_failurereason_build_id', 'build_id'),
Index('idx_failurereason_project_id', 'project_id'),
UniqueConstraint('step_id', 'reason', name='unq_failurereason_key'),
)
id = Column(GUID, nullable=False, primary_key=True, default=uuid4)
step_id = Column(GUID, ForeignKey('jobstep.id', ondelete="CASCADE"), nullable=False)
job_id = Column(GUID, ForeignKey('job.id', ondelete="CASCADE"), nullable=False)
build_id = Column(GUID, ForeignKey('build.id', ondelete="CASCADE"), nullable=False)
project_id = Column(GUID, ForeignKey('project.id', ondelete="CASCADE"), nullable=False)
reason = Column(String(32), nullable=False)
date_created = Column(DateTime, default=datetime.utcnow, server_default='now()', nullable=False)
data = Column(JSONEncodedDict) # extra metadata/info about the failure
step = relationship('JobStep')
job = relationship('Job')
build = relationship('Build')
project = relationship('Project')
def __init__(self, **kwargs):
super(FailureReason, self).__init__(**kwargs)
if self.id is None:
self.id = uuid4()