Changes for code review

This commit is contained in:
Joseph Schorr 2018-02-26 15:12:18 -05:00
parent 3438c1bfad
commit ed84835d23
4 changed files with 25 additions and 15 deletions

View file

@ -892,6 +892,13 @@ class BUILD_PHASE(object):
phase == cls.CANCELLED) phase == cls.CANCELLED)
class TRIGGER_DISABLE_REASON(object):
""" Build trigger disable reason enum """
BUILD_FALURES = 'successive_build_failures'
INTERNAL_ERRORS = 'successive_build_internal_errors'
USER_TOGGLED = 'user_toggled'
class QueueItem(BaseModel): class QueueItem(BaseModel):
queue_name = CharField(index=True, max_length=1024) queue_name = CharField(index=True, max_length=1024)
body = TextField() body = TextField()

View file

@ -1,24 +1,25 @@
"""Add ability for build triggers to be disabled """Add ability for build triggers to be disabled
Revision ID: 61cadbacb9fc Revision ID: 61cadbacb9fc
Revises: d8989249f8f6 Revises: b4c2d45bc132
Create Date: 2017-10-18 12:07:26.190901 Create Date: 2017-10-18 12:07:26.190901
""" """
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = '61cadbacb9fc' revision = '61cadbacb9fc'
down_revision = 'd8989249f8f6' down_revision = 'b4c2d45bc132'
from alembic import op from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.dialects import mysql from sqlalchemy.dialects import mysql
from util.migrate import UTF8CharField
def upgrade(tables): def upgrade(tables):
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('disablereason', op.create_table('disablereason',
sa.Column('id', sa.Integer(), nullable=False), sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=255), nullable=False), sa.Column('name', UTF8CharField(length=255), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_disablereason')) sa.PrimaryKeyConstraint('id', name=op.f('pk_disablereason'))
) )
op.create_index('disablereason_name', 'disablereason', ['name'], unique=True) op.create_index('disablereason_name', 'disablereason', ['name'], unique=True)

View file

@ -7,7 +7,7 @@ from peewee import JOIN_LEFT_OUTER
import features import features
from data.database import (BuildTriggerService, RepositoryBuildTrigger, Repository, Namespace, User, from data.database import (BuildTriggerService, RepositoryBuildTrigger, Repository, Namespace, User,
RepositoryBuild, BUILD_PHASE, db_random_func, UseThenDisconnect, RepositoryBuild, BUILD_PHASE, db_random_func, UseThenDisconnect,
DisableReason) DisableReason, TRIGGER_DISABLE_REASON)
from data.model import (InvalidBuildTriggerException, InvalidRepositoryBuildException, from data.model import (InvalidBuildTriggerException, InvalidRepositoryBuildException,
db_transaction, user as user_model, config) db_transaction, user as user_model, config)
@ -258,12 +258,13 @@ def mark_build_archived(build_uuid):
.execute()) > 0 .execute()) > 0
def toggle_build_trigger(trigger, enabled, reason='user_toggled'): def toggle_build_trigger(trigger, enabled, reason=TRIGGER_DISABLE_REASON.USER_TOGGLED):
""" Toggles the enabled status of a build trigger. """ """ Toggles the enabled status of a build trigger. """
trigger.enabled = enabled trigger.enabled = enabled
if not enabled: if not enabled:
trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id(reason) trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id(reason)
trigger.disabled_datetime = datetime.utcnow()
trigger.save() trigger.save()
@ -275,6 +276,12 @@ def update_trigger_disable_status(trigger, final_phase):
ensures that triggers that continue to error are eventually automatically disabled. ensures that triggers that continue to error are eventually automatically disabled.
""" """
with db_transaction(): with db_transaction():
try:
trigger = RepositoryBuildTrigger.get(id=trigger.id)
except RepositoryBuildTrigger.DoesNotExist:
# Already deleted.
return
# If the build completed successfully, then reset the successive counters. # If the build completed successfully, then reset the successive counters.
if final_phase == BUILD_PHASE.COMPLETE: if final_phase == BUILD_PHASE.COMPLETE:
trigger.successive_failure_count = 0 trigger.successive_failure_count = 0
@ -287,7 +294,6 @@ def update_trigger_disable_status(trigger, final_phase):
trigger.successive_failure_count = trigger.successive_failure_count + 1 trigger.successive_failure_count = trigger.successive_failure_count + 1
trigger.successive_internal_error_count = 0 trigger.successive_internal_error_count = 0
elif final_phase == BUILD_PHASE.INTERNAL_ERROR: elif final_phase == BUILD_PHASE.INTERNAL_ERROR:
trigger.successive_failure_count = 0
trigger.successive_internal_error_count = trigger.successive_internal_error_count + 1 trigger.successive_internal_error_count = trigger.successive_internal_error_count + 1
# Check if we need to disable the trigger. # Check if we need to disable the trigger.
@ -295,15 +301,11 @@ def update_trigger_disable_status(trigger, final_phase):
error_threshold = config.app_config.get('SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD') error_threshold = config.app_config.get('SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD')
if failure_threshold and trigger.successive_failure_count >= failure_threshold: if failure_threshold and trigger.successive_failure_count >= failure_threshold:
trigger.disabled_datetime = datetime.utcnow() toggle_build_trigger(trigger, False, TRIGGER_DISABLE_REASON.BUILD_FALURES)
trigger.enabled = False
trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_failures')
elif (error_threshold and elif (error_threshold and
trigger.successive_internal_error_count >= error_threshold): trigger.successive_internal_error_count >= error_threshold):
trigger.disabled_datetime = datetime.utcnow() toggle_build_trigger(trigger, False, TRIGGER_DISABLE_REASON.INTERNAL_ERRORS)
trigger.enabled = False else:
trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_internal_errors')
# Save the trigger changes. # Save the trigger changes.
trigger.save() trigger.save()

Binary file not shown.