From c35eec0615b42206e5eb2213152efb48aebe7c8a Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 17 Oct 2017 17:01:59 -0400 Subject: [PATCH 1/6] Add ability for triggers to be disabled Will be used in the followup commit to automatically disable broken triggers --- data/database.py | 6 ++ ...c_add_ability_for_build_triggers_to_be_.py | 56 ++++++++++++++ ...463dfb9fe_back_fill_build_expand_config.py | 6 +- data/model/build.py | 13 +++- endpoints/api/build.py | 7 +- endpoints/api/test/test_security.py | 22 +++++- endpoints/api/test/test_trigger.py | 33 +++++++++ endpoints/api/trigger.py | 44 ++++++++++- endpoints/building.py | 12 +++ endpoints/test/test_building.py | 14 +++- endpoints/test/test_webhooks.py | 24 ++++++ endpoints/webhooks.py | 10 ++- initdb.py | 5 +- .../repo-view/repo-panel-builds.css | 20 ++++- .../repo-view/repo-panel-builds.html | 73 ++++++++++++------- .../directives/repo-view/repo-panel-builds.js | 38 ++++++++++ static/js/directives/ui/logs-view.js | 10 +++ test/fixtures.py | 2 + 18 files changed, 358 insertions(+), 37 deletions(-) create mode 100644 data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py create mode 100644 endpoints/test/test_webhooks.py diff --git a/data/database.py b/data/database.py index fa8fa88f8..6e41a9307 100644 --- a/data/database.py +++ b/data/database.py @@ -694,6 +694,10 @@ class BuildTriggerService(BaseModel): name = CharField(index=True, unique=True) +class DisableReason(BaseModel): + name = CharField(index=True, unique=True) + + class RepositoryBuildTrigger(BaseModel): uuid = CharField(default=uuid_generator) service = ForeignKeyField(BuildTriggerService) @@ -705,6 +709,8 @@ class RepositoryBuildTrigger(BaseModel): write_token = ForeignKeyField(AccessToken, null=True) pull_robot = QuayUserField(allows_robots=True, null=True, related_name='triggerpullrobot', robot_null_delete=True) + enabled = BooleanField(default=True) + disabled_reason = ForeignKeyField(DisableReason, null=True) class EmailConfirmation(BaseModel): diff --git a/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py b/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py new file mode 100644 index 000000000..0ff76ff08 --- /dev/null +++ b/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py @@ -0,0 +1,56 @@ +"""Add ability for build triggers to be disabled + +Revision ID: 61cadbacb9fc +Revises: d8989249f8f6 +Create Date: 2017-10-18 12:07:26.190901 + +""" + +# revision identifiers, used by Alembic. +revision = '61cadbacb9fc' +down_revision = 'd8989249f8f6' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('disablereason', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_disablereason')) + ) + op.create_index('disablereason_name', 'disablereason', ['name'], unique=True) + + op.bulk_insert( + tables.disablereason, + [ + {'id': 1, 'name': 'user_toggled'}, + ], + ) + + op.bulk_insert(tables.logentrykind, [ + {'name': 'toggle_repo_trigger'}, + ]) + + op.add_column(u'repositorybuildtrigger', sa.Column('disabled_reason_id', sa.Integer(), nullable=True)) + op.add_column(u'repositorybuildtrigger', sa.Column('enabled', sa.Boolean(), nullable=False)) + op.create_index('repositorybuildtrigger_disabled_reason_id', 'repositorybuildtrigger', ['disabled_reason_id'], unique=False) + op.create_foreign_key(op.f('fk_repositorybuildtrigger_disabled_reason_id_disablereason'), 'repositorybuildtrigger', 'disablereason', ['disabled_reason_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('fk_repositorybuildtrigger_disabled_reason_id_disablereason'), 'repositorybuildtrigger', type_='foreignkey') + op.drop_index('repositorybuildtrigger_disabled_reason_id', table_name='repositorybuildtrigger') + op.drop_column(u'repositorybuildtrigger', 'enabled') + op.drop_column(u'repositorybuildtrigger', 'disabled_reason_id') + op.drop_table('disablereason') + # ### end Alembic commands ### + + op.execute(tables + .logentrykind + .delete() + .where(tables.logentrykind.c.name == op.inline_literal('toggle_repo_trigger'))) diff --git a/data/migrations/versions/a6c463dfb9fe_back_fill_build_expand_config.py b/data/migrations/versions/a6c463dfb9fe_back_fill_build_expand_config.py index e682da932..425a20ad2 100644 --- a/data/migrations/versions/a6c463dfb9fe_back_fill_build_expand_config.py +++ b/data/migrations/versions/a6c463dfb9fe_back_fill_build_expand_config.py @@ -10,7 +10,8 @@ Create Date: 2017-03-17 10:00:19.739858 import json import os -from data.database import RepositoryBuildTrigger +from peewee import * +from data.database import BaseModel revision = 'a6c463dfb9fe' down_revision = 'b4df55dea4b3' @@ -18,6 +19,9 @@ down_revision = 'b4df55dea4b3' from alembic import op +class RepositoryBuildTrigger(BaseModel): + config = TextField(default='{}') + def upgrade(tables): repostioryBuildTriggers = RepositoryBuildTrigger.select() for repositoryBuildTrigger in repostioryBuildTriggers: diff --git a/data/model/build.py b/data/model/build.py index 73685aa1a..5d491389a 100644 --- a/data/model/build.py +++ b/data/model/build.py @@ -6,7 +6,8 @@ from peewee import JOIN_LEFT_OUTER import features from data.database import (BuildTriggerService, RepositoryBuildTrigger, Repository, Namespace, User, - RepositoryBuild, BUILD_PHASE, db_random_func, UseThenDisconnect) + RepositoryBuild, BUILD_PHASE, db_random_func, UseThenDisconnect, + DisableReason) from data.model import (InvalidBuildTriggerException, InvalidRepositoryBuildException, db_transaction, user as user_model, config) @@ -255,3 +256,13 @@ def mark_build_archived(build_uuid): .where(RepositoryBuild.uuid == build_uuid, RepositoryBuild.logs_archived == False) .execute()) > 0 + + +def toggle_build_trigger(trigger, enabled, reason='user_toggled'): + """ Toggles the enabled status of a build trigger. """ + trigger.enabled = enabled + + if not enabled: + trigger.disabled_reason = DisableReason.get(name=reason) + + trigger.save() diff --git a/endpoints/api/build.py b/endpoints/api/build.py index 5645236e6..86190fae8 100644 --- a/endpoints/api/build.py +++ b/endpoints/api/build.py @@ -22,7 +22,8 @@ from endpoints.api import (RepositoryParamResource, parse_args, query_param, nic require_repo_read, require_repo_write, validate_json_request, ApiResource, internal_only, format_date, api, path_param, require_repo_admin, abort, disallow_for_app_repositories) -from endpoints.building import start_build, PreparedBuild, MaximumBuildsQueuedException +from endpoints.building import (start_build, PreparedBuild, MaximumBuildsQueuedException, + BuildTriggerDisabledException) from endpoints.exception import Unauthorized, NotFound, InvalidRequest from util.names import parse_robot_username @@ -69,6 +70,8 @@ def trigger_view(trigger, can_read=False, can_admin=False, for_build=False): 'config': build_trigger.config if can_admin else {}, 'can_invoke': can_admin, + 'enabled': trigger.enabled, + 'disabled_reason': trigger.disabled_reason.name if trigger.disabled_reason else None, } if not for_build and can_admin and trigger.pull_robot: @@ -309,6 +312,8 @@ class RepositoryBuildList(RepositoryParamResource): build_request = start_build(repo, prepared, pull_robot_name=pull_robot_name) except MaximumBuildsQueuedException: abort(429, message='Maximum queued build rate exceeded.') + except BuildTriggerDisabledException: + abort(400, message='Build trigger is disabled') resp = build_status_view(build_request) repo_string = '%s/%s' % (namespace, repository) diff --git a/endpoints/api/test/test_security.py b/endpoints/api/test/test_security.py index b701f7856..9d24b0367 100644 --- a/endpoints/api/test/test_security.py +++ b/endpoints/api/test/test_security.py @@ -13,7 +13,11 @@ from endpoints.api.signing import RepositorySignatures from endpoints.api.search import ConductRepositorySearch from endpoints.api.superuser import SuperUserRepositoryBuildLogs, SuperUserRepositoryBuildResource from endpoints.api.superuser import SuperUserRepositoryBuildStatus +<<<<<<< HEAD from endpoints.api.appspecifictokens import AppTokens, AppToken +======= +from endpoints.api.trigger import BuildTrigger +>>>>>>> Add ability for triggers to be disabled from endpoints.test.shared import client_with_identity, toggle_feature from test.fixtures import * @@ -24,6 +28,7 @@ REPO_PARAMS = {'repository': 'devtable/someapp'} SEARCH_PARAMS = {'query': ''} NOTIFICATION_PARAMS = {'namespace': 'devtable', 'repository': 'devtable/simple', 'uuid': 'some uuid'} TOKEN_PARAMS = {'token_uuid': 'someuuid'} +TRIGGER_PARAMS = {'repository': 'devtable/simple', 'trigger_uuid': 'someuuid'} @pytest.mark.parametrize('resource,method,params,body,identity,expected', [ (AppTokens, 'GET', {}, {}, None, 401), @@ -89,7 +94,22 @@ TOKEN_PARAMS = {'token_uuid': 'someuuid'} (RepositoryTrust, 'POST', REPO_PARAMS, {'trust_enabled': True}, 'freshuser', 403), (RepositoryTrust, 'POST', REPO_PARAMS, {'trust_enabled': True}, 'reader', 403), (RepositoryTrust, 'POST', REPO_PARAMS, {'trust_enabled': True}, 'devtable', 404), - + + (BuildTrigger, 'GET', TRIGGER_PARAMS, {}, None, 401), + (BuildTrigger, 'GET', TRIGGER_PARAMS, {}, 'freshuser', 403), + (BuildTrigger, 'GET', TRIGGER_PARAMS, {}, 'reader', 403), + (BuildTrigger, 'GET', TRIGGER_PARAMS, {}, 'devtable', 404), + + (BuildTrigger, 'DELETE', TRIGGER_PARAMS, {}, None, 403), + (BuildTrigger, 'DELETE', TRIGGER_PARAMS, {}, 'freshuser', 403), + (BuildTrigger, 'DELETE', TRIGGER_PARAMS, {}, 'reader', 403), + (BuildTrigger, 'DELETE', TRIGGER_PARAMS, {}, 'devtable', 404), + + (BuildTrigger, 'PUT', TRIGGER_PARAMS, {}, None, 403), + (BuildTrigger, 'PUT', TRIGGER_PARAMS, {}, 'freshuser', 403), + (BuildTrigger, 'PUT', TRIGGER_PARAMS, {}, 'reader', 403), + (BuildTrigger, 'PUT', TRIGGER_PARAMS, {}, 'devtable', 400), + (RepositoryUserTransitivePermission, 'GET', {'username': 'A2O9','repository': 'public/publicrepo'}, None, None, 401), (RepositoryUserTransitivePermission, 'GET', {'username': 'A2O9','repository': 'public/publicrepo'}, None, 'freshuser', 403), (RepositoryUserTransitivePermission, 'GET', {'username': 'A2O9','repository': 'public/publicrepo'}, None, 'reader', 403), diff --git a/endpoints/api/test/test_trigger.py b/endpoints/api/test/test_trigger.py index 32086ffbf..946b34431 100644 --- a/endpoints/api/test/test_trigger.py +++ b/endpoints/api/test/test_trigger.py @@ -1,6 +1,12 @@ import pytest +import json +from data import model from endpoints.api.trigger_analyzer import is_parent +from endpoints.api.trigger import BuildTrigger +from endpoints.api.test.shared import conduct_api_call +from endpoints.test.shared import client_with_identity +from test.fixtures import * @pytest.mark.parametrize('context,dockerfile_path,expected', [ @@ -20,3 +26,30 @@ from endpoints.api.trigger_analyzer import is_parent ]) def test_super_user_build_endpoints(context, dockerfile_path, expected): assert is_parent(context, dockerfile_path) == expected + + +def test_enabled_disabled_trigger(app, client): + trigger = model.build.list_build_triggers('devtable', 'building')[0] + trigger.config = json.dumps({'hook_id': 'someid'}) + trigger.save() + + params = { + 'repository': 'devtable/building', + 'trigger_uuid': trigger.uuid, + } + + body = { + 'enabled': False, + } + + with client_with_identity('devtable', client) as cl: + result = conduct_api_call(cl, BuildTrigger, 'PUT', params, body, 200).json + assert not result['enabled'] + + body = { + 'enabled': True, + } + + with client_with_identity('devtable', client) as cl: + result = conduct_api_call(cl, BuildTrigger, 'PUT', params, body, 200).json + assert result['enabled'] diff --git a/endpoints/api/trigger.py b/endpoints/api/trigger.py index 79c3cced9..8fee8505a 100644 --- a/endpoints/api/trigger.py +++ b/endpoints/api/trigger.py @@ -22,7 +22,8 @@ from endpoints.api import (RepositoryParamResource, nickname, resource, require_ disallow_for_app_repositories) from endpoints.api.build import build_status_view, trigger_view, RepositoryBuildStatus from endpoints.api.trigger_analyzer import TriggerAnalyzer -from endpoints.building import start_build, MaximumBuildsQueuedException +from endpoints.building import (start_build, MaximumBuildsQueuedException, + BuildTriggerDisabledException) from endpoints.exception import NotFound, Unauthorized, InvalidRequest from util.names import parse_robot_username @@ -62,6 +63,21 @@ class BuildTriggerList(RepositoryParamResource): @path_param('trigger_uuid', 'The UUID of the build trigger') class BuildTrigger(RepositoryParamResource): """ Resource for managing specific build triggers. """ + schemas = { + 'UpdateTrigger': { + 'type': 'object', + 'description': 'Options for updating a build trigger', + 'required': [ + 'enabled', + ], + 'properties': { + 'enabled': { + 'type': 'boolean', + 'description': 'Whether the build trigger is enabled', + }, + } + }, + } @require_repo_admin @disallow_for_app_repositories @@ -70,6 +86,27 @@ class BuildTrigger(RepositoryParamResource): """ Get information for the specified build trigger. """ return trigger_view(get_trigger(trigger_uuid), can_admin=True) + @require_repo_admin + @disallow_for_app_repositories + @nickname('updateBuildTrigger') + @validate_json_request('UpdateTrigger') + def put(self, namespace_name, repo_name, trigger_uuid): + """ Updates the specified build trigger. """ + trigger = get_trigger(trigger_uuid) + + handler = BuildTriggerHandler.get_handler(trigger) + if not handler.is_active(): + raise InvalidRequest('Cannot update an unactivated trigger') + + enable = request.get_json()['enabled'] + model.build.toggle_build_trigger(trigger, enable) + log_action('toggle_repo_trigger', namespace_name, + {'repo': repo_name, 'trigger_id': trigger_uuid, + 'service': trigger.service.name, 'enabled': enable}, + repo=model.repository.get_repository(namespace_name, repo_name)) + + return trigger_view(trigger) + @require_repo_admin @disallow_for_app_repositories @nickname('deleteBuildTrigger') @@ -340,6 +377,8 @@ class ActivateBuildTrigger(RepositoryParamResource): def post(self, namespace_name, repo_name, trigger_uuid): """ Manually start a build from the specified trigger. """ trigger = get_trigger(trigger_uuid) + if not trigger.enabled: + raise InvalidRequest('Trigger is not enabled.') handler = BuildTriggerHandler.get_handler(trigger) if not handler.is_active(): @@ -356,6 +395,8 @@ class ActivateBuildTrigger(RepositoryParamResource): raise InvalidRequest(tse.message) except MaximumBuildsQueuedException: abort(429, message='Maximum queued build rate exceeded.') + except BuildTriggerDisabledException: + abort(400, message='Build trigger is disabled') resp = build_status_view(build_request) repo_string = '%s/%s' % (namespace_name, repo_name) @@ -485,3 +526,4 @@ class BuildTriggerSourceNamespaces(RepositoryParamResource): raise InvalidRequest(rre.message) else: raise Unauthorized() + diff --git a/endpoints/building.py b/endpoints/building.py index 071f261a5..05dfd64f9 100644 --- a/endpoints/building.py +++ b/endpoints/building.py @@ -25,10 +25,22 @@ class MaximumBuildsQueuedException(Exception): pass +class BuildTriggerDisabledException(Exception): + """ + This exception is raised when a build is required, but the build trigger has been disabled. + """ + pass + + def start_build(repository, prepared_build, pull_robot_name=None): + # Ensure that builds are only run in image repositories. if repository.kind.name != 'image': raise Exception('Attempt to start a build for application repository %s' % repository.id) + # Ensure that disabled triggers are not run. + if prepared_build.trigger is not None and not prepared_build.trigger.enabled: + raise BuildTriggerDisabledException + if repository.namespace_user.maximum_queued_builds_count is not None: queue_item_canonical_name = [repository.namespace_user.username] alive_builds = dockerfile_build_queue.num_alive_jobs(queue_item_canonical_name) diff --git a/endpoints/test/test_building.py b/endpoints/test/test_building.py index 079bb8ca8..8058517ea 100644 --- a/endpoints/test/test_building.py +++ b/endpoints/test/test_building.py @@ -1,7 +1,8 @@ import pytest from data import model -from endpoints.building import start_build, PreparedBuild, MaximumBuildsQueuedException +from endpoints.building import (start_build, PreparedBuild, MaximumBuildsQueuedException, + BuildTriggerDisabledException) from test.fixtures import * @@ -29,3 +30,14 @@ def test_maximum_builds(app): # Try to queue a second build; should fail. with pytest.raises(MaximumBuildsQueuedException): start_build(repo, prepared_build) + + +def test_start_build_disabled_trigger(app): + trigger = model.build.list_build_triggers('devtable', 'building')[0] + trigger.enabled = False + trigger.save() + + build = PreparedBuild(trigger=trigger) + + with pytest.raises(BuildTriggerDisabledException): + start_build(trigger.repository, build) diff --git a/endpoints/test/test_webhooks.py b/endpoints/test/test_webhooks.py new file mode 100644 index 000000000..1061f106b --- /dev/null +++ b/endpoints/test/test_webhooks.py @@ -0,0 +1,24 @@ +import base64 +import pytest + +from flask import url_for + +from data import model +from endpoints.test.shared import conduct_call +from test.fixtures import * + +def test_start_build_disabled_trigger(app, client): + trigger = model.build.list_build_triggers('devtable', 'building')[0] + trigger.enabled = False + trigger.save() + + params = { + 'trigger_uuid': trigger.uuid, + } + + headers = { + 'Authorization': 'Basic ' + base64.b64encode('devtable:password'), + } + + conduct_call(client, 'webhooks.build_trigger_webhook', url_for, 'POST', params, None, 400, + headers=headers) diff --git a/endpoints/webhooks.py b/endpoints/webhooks.py index 8b65e6b69..48e5d3752 100644 --- a/endpoints/webhooks.py +++ b/endpoints/webhooks.py @@ -12,7 +12,8 @@ from util.http import abort from buildtrigger.basehandler import BuildTriggerHandler from buildtrigger.triggerutil import (ValidationRequestException, SkipRequestException, InvalidPayloadException) -from endpoints.building import start_build, MaximumBuildsQueuedException +from endpoints.building import (start_build, MaximumBuildsQueuedException, + BuildTriggerDisabledException) logger = logging.getLogger(__name__) @@ -91,9 +92,7 @@ def build_trigger_webhook(trigger_uuid, **kwargs): namespace = trigger.repository.namespace_user.username repository = trigger.repository.name - permission = ModifyRepositoryPermission(namespace, repository) - - if permission.can(): + if ModifyRepositoryPermission(namespace, repository).can(): handler = BuildTriggerHandler.get_handler(trigger) if trigger.repository.kind.name != 'image': @@ -121,6 +120,9 @@ def build_trigger_webhook(trigger_uuid, **kwargs): start_build(repo, prepared, pull_robot_name=pull_robot_name) except MaximumBuildsQueuedException: abort(429, message='Maximum queued build rate exceeded.') + except BuildTriggerDisabledException: + logger.debug('Build trigger %s is disabled', trigger_uuid) + abort(400, message='This build trigger is currently disabled. Please re-enable to continue.') return make_response('Okay') diff --git a/initdb.py b/initdb.py index aecdddfb7..e42d599e4 100644 --- a/initdb.py +++ b/initdb.py @@ -20,7 +20,7 @@ from data.database import (db, all_models, beta_classes, Role, TeamRole, Visibil ExternalNotificationEvent, ExternalNotificationMethod, NotificationKind, QuayRegion, QuayService, UserRegion, OAuthAuthorizationCode, ServiceKeyApprovalType, MediaType, LabelSourceType, UserPromptKind, - RepositoryKind, TagKind, BlobPlacementLocation, User, + RepositoryKind, TagKind, BlobPlacementLocation, User, DisableReason, DeletedNamespace) from data import model from data.queue import WorkQueue @@ -353,6 +353,7 @@ def initialize_database(): LogEntryKind.create(name='manifest_label_delete') LogEntryKind.create(name='change_tag_expiration') + LogEntryKind.create(name='toggle_repo_trigger') LogEntryKind.create(name='create_app_specific_token') LogEntryKind.create(name='revoke_app_specific_token') @@ -434,6 +435,8 @@ def initialize_database(): TagKind.create(name='release') TagKind.create(name='channel') + DisableReason.create(name='user_toggled') + def wipe_database(): logger.debug('Wiping all data from the DB.') diff --git a/static/css/directives/repo-view/repo-panel-builds.css b/static/css/directives/repo-view/repo-panel-builds.css index ec4c9dd3c..c50f5db45 100644 --- a/static/css/directives/repo-view/repo-panel-builds.css +++ b/static/css/directives/repo-view/repo-panel-builds.css @@ -13,4 +13,22 @@ .repo-panel-builds .heading-controls { white-space: nowrap; -} \ No newline at end of file +} + +.repo-panel-builds .trigger-disabled { + background-color: #fcfcfc; +} + +.repo-panel-builds .trigger-disabled td { + border-bottom: 0px; + color: #ccc; +} + +.repo-panel-builds .trigger-disabled-message { + font-size: 13px; +} + +.repo-panel-builds i.fa-exclamation-triangle { + color: #f5c77d; + margin-right: 4px; +} diff --git a/static/directives/repo-view/repo-panel-builds.html b/static/directives/repo-view/repo-panel-builds.html index 5653a92eb..1e7577ffc 100644 --- a/static/directives/repo-view/repo-panel-builds.html +++ b/static/directives/repo-view/repo-panel-builds.html @@ -137,31 +137,45 @@ Delete Trigger - - - - {{ trigger.config.dockerfile_path || '/Dockerfile' }} - {{ trigger.config.context || '/' }} - {{ trigger.config.branchtag_regex || 'All' }} - - - (None) - - - - - View Credentials + + + + + {{ trigger.config.dockerfile_path || '/Dockerfile' }} + {{ trigger.config.context || '/' }} + {{ trigger.config.branchtag_regex || 'All' }} + + + (None) + + + + + View Credentials + + + Run Trigger Now + + + + Disable Trigger + Enable Trigger + + + Delete Trigger + - - Run Trigger Now - - - Delete Trigger - - - - + + + + + + This build trigger is currently disabled and will not build: + Re-enable this trigger + + + @@ -174,7 +188,16 @@
- + +
+ Are you sure you want to disableenable this trigger? +
+ +
Date: Wed, 18 Oct 2017 16:03:38 -0400 Subject: [PATCH 2/6] Automatically disable build triggers with successive failures or internal errors We allow users to reenable them manually once disabled --- buildman/server.py | 7 ++- config.py | 8 ++++ data/database.py | 4 +- ...add_automatic_disable_of_build_triggers.py | 45 ++++++++++++++++++ data/model/build.py | 41 ++++++++++++++++- data/model/test/test_build.py | 46 +++++++++++++++++++ endpoints/api/test/test_security.py | 3 -- initdb.py | 2 + .../repo-view/repo-panel-builds.html | 21 +++++++-- 9 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 data/migrations/versions/17aff2e1354e_add_automatic_disable_of_build_triggers.py create mode 100644 data/model/test/test_build.py diff --git a/buildman/server.py b/buildman/server.py index 13dd20444..466eee9b7 100644 --- a/buildman/server.py +++ b/buildman/server.py @@ -14,7 +14,7 @@ from flask import Flask from buildman.enums import BuildJobResult, BuildServerStatus, RESULT_PHASES from buildman.jobutil.buildstatus import StatusHandler from buildman.jobutil.buildjob import BuildJob, BuildJobLoadException -from data import database +from data import database, model from app import app, metric_queue logger = logging.getLogger(__name__) @@ -151,6 +151,11 @@ class BuilderServer(object): else: self._queue.complete(build_job.job_item) + # Update the trigger failure tracking (if applicable). + if build_job.repo_build.trigger is not None: + model.build.update_trigger_disable_status(build_job.repo_build.trigger, + RESULT_PHASES[job_status]) + if update_phase: status_handler = StatusHandler(self._build_logs, build_job.repo_build.uuid) yield From(status_handler.set_phase(RESULT_PHASES[job_status])) diff --git a/config.py b/config.py index 4fcb7f336..369c850c2 100644 --- a/config.py +++ b/config.py @@ -519,3 +519,11 @@ class DefaultConfig(ImmutableConfig): 'engine': 'memcached', 'endpoint': ('127.0.0.1', 18080), } + + # Defines the number of successive failures of a build trigger's build before the trigger is + # automatically disabled. + SUCCESSIVE_TRIGGER_FAILURE_DISABLE_THRESHOLD = 100 + + # Defines the number of successive internal errors of a build trigger's build before the + # trigger is automatically disabled. + SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD = 5 diff --git a/data/database.py b/data/database.py index 6e41a9307..cc8def8b2 100644 --- a/data/database.py +++ b/data/database.py @@ -710,7 +710,9 @@ class RepositoryBuildTrigger(BaseModel): pull_robot = QuayUserField(allows_robots=True, null=True, related_name='triggerpullrobot', robot_null_delete=True) enabled = BooleanField(default=True) - disabled_reason = ForeignKeyField(DisableReason, null=True) + disabled_reason = EnumField(DisableReason, null=True) + successive_failure_count = IntegerField(default=0) + successive_internal_error_count = IntegerField(default=0) class EmailConfirmation(BaseModel): diff --git a/data/migrations/versions/17aff2e1354e_add_automatic_disable_of_build_triggers.py b/data/migrations/versions/17aff2e1354e_add_automatic_disable_of_build_triggers.py new file mode 100644 index 000000000..ca71dd73a --- /dev/null +++ b/data/migrations/versions/17aff2e1354e_add_automatic_disable_of_build_triggers.py @@ -0,0 +1,45 @@ +"""Add automatic disable of build triggers + +Revision ID: 17aff2e1354e +Revises: 61cadbacb9fc +Create Date: 2017-10-18 15:58:03.971526 + +""" + +# revision identifiers, used by Alembic. +revision = '17aff2e1354e' +down_revision = '61cadbacb9fc' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('repositorybuildtrigger', sa.Column('successive_failure_count', sa.Integer(), nullable=False)) + op.add_column('repositorybuildtrigger', sa.Column('successive_internal_error_count', sa.Integer(), nullable=False)) + # ### end Alembic commands ### + + op.bulk_insert( + tables.disablereason, + [ + {'id': 2, 'name': 'successive_build_failures'}, + {'id': 3, 'name': 'successive_build_internal_errors'}, + ], + ) + +def downgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('repositorybuildtrigger', 'successive_internal_error_count') + op.drop_column('repositorybuildtrigger', 'successive_failure_count') + # ### end Alembic commands ### + + op.execute(tables + .disablereason + .delete() + .where(tables.disablereason.c.name == op.inline_literal('successive_internal_error_count'))) + + op.execute(tables + .disablereason + .delete() + .where(tables.disablereason.c.name == op.inline_literal('successive_failure_count'))) diff --git a/data/model/build.py b/data/model/build.py index 5d491389a..9d844e665 100644 --- a/data/model/build.py +++ b/data/model/build.py @@ -263,6 +263,45 @@ def toggle_build_trigger(trigger, enabled, reason='user_toggled'): trigger.enabled = enabled if not enabled: - trigger.disabled_reason = DisableReason.get(name=reason) + trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id(reason) trigger.save() + + +def update_trigger_disable_status(trigger, final_phase): + """ Updates the disable status of the given build trigger. If the build trigger had a + failure, then the counter is increased and, if we've reached the limit, the trigger is + automatically disabled. Otherwise, if the trigger succeeded, it's counter is reset. This + ensures that triggers that continue to error are eventually automatically disabled. + """ + with db_transaction(): + # If the build completed successfully, then reset the successive counters. + if final_phase == BUILD_PHASE.COMPLETE: + trigger.successive_failure_count = 0 + trigger.successive_internal_error_count = 0 + trigger.save() + return + + # Otherwise, increment the counters and check for trigger disable. + if final_phase == BUILD_PHASE.ERROR: + trigger.successive_failure_count = trigger.successive_failure_count + 1 + trigger.successive_internal_error_count = 0 + elif final_phase == BUILD_PHASE.INTERNAL_ERROR: + trigger.successive_failure_count = 0 + trigger.successive_internal_error_count = trigger.successive_internal_error_count + 1 + + # Check if we need to disable the trigger. + failure_threshold = config.app_config.get('SUCCESSIVE_TRIGGER_FAILURE_DISABLE_THRESHOLD') + error_threshold = config.app_config.get('SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD') + + if failure_threshold and trigger.successive_failure_count >= failure_threshold: + trigger.enabled = False + trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_failures') + elif (error_threshold and + trigger.successive_internal_error_count >= error_threshold): + trigger.enabled = False + trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_internal_errors') + + # Save the trigger changes. + trigger.save() + \ No newline at end of file diff --git a/data/model/test/test_build.py b/data/model/test/test_build.py new file mode 100644 index 000000000..17b15c6b5 --- /dev/null +++ b/data/model/test/test_build.py @@ -0,0 +1,46 @@ +import pytest + +from mock import patch + +from data.database import BUILD_PHASE, RepositoryBuildTrigger +from data.model.build import update_trigger_disable_status +from test.fixtures import * + +TEST_FAIL_THRESHOLD = 5 +TEST_INTERNAL_ERROR_THRESHOLD = 2 + +@pytest.mark.parametrize('starting_failure_count, starting_error_count, status, expected_reason', [ + (0, 0, BUILD_PHASE.COMPLETE, None), + (10, 10, BUILD_PHASE.COMPLETE, None), + + (TEST_FAIL_THRESHOLD - 1, TEST_INTERNAL_ERROR_THRESHOLD - 1, BUILD_PHASE.COMPLETE, None), + (TEST_FAIL_THRESHOLD - 1, 0, BUILD_PHASE.ERROR, 'successive_build_failures'), + (0, TEST_INTERNAL_ERROR_THRESHOLD - 1, BUILD_PHASE.INTERNAL_ERROR, + 'successive_build_internal_errors'), +]) +def test_update_trigger_disable_status(starting_failure_count, starting_error_count, status, + expected_reason, initialized_db): + test_config = { + 'SUCCESSIVE_TRIGGER_FAILURE_DISABLE_THRESHOLD': TEST_FAIL_THRESHOLD, + 'SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD': TEST_INTERNAL_ERROR_THRESHOLD, + } + + trigger = model.build.list_build_triggers('devtable', 'building')[0] + trigger.successive_failure_count = starting_failure_count + trigger.successive_internal_error_count = starting_error_count + trigger.enabled = True + trigger.save() + + with patch('data.model.config.app_config', test_config): + update_trigger_disable_status(trigger, status) + updated_trigger = RepositoryBuildTrigger.get(uuid=trigger.uuid) + + assert updated_trigger.enabled == (expected_reason is None) + + if expected_reason is not None: + assert updated_trigger.disabled_reason.name == expected_reason + else: + assert updated_trigger.disabled_reason is None + assert updated_trigger.successive_failure_count == 0 + assert updated_trigger.successive_internal_error_count == 0 + \ No newline at end of file diff --git a/endpoints/api/test/test_security.py b/endpoints/api/test/test_security.py index 9d24b0367..863a78f2e 100644 --- a/endpoints/api/test/test_security.py +++ b/endpoints/api/test/test_security.py @@ -13,11 +13,8 @@ from endpoints.api.signing import RepositorySignatures from endpoints.api.search import ConductRepositorySearch from endpoints.api.superuser import SuperUserRepositoryBuildLogs, SuperUserRepositoryBuildResource from endpoints.api.superuser import SuperUserRepositoryBuildStatus -<<<<<<< HEAD from endpoints.api.appspecifictokens import AppTokens, AppToken -======= from endpoints.api.trigger import BuildTrigger ->>>>>>> Add ability for triggers to be disabled from endpoints.test.shared import client_with_identity, toggle_feature from test.fixtures import * diff --git a/initdb.py b/initdb.py index e42d599e4..378a22e93 100644 --- a/initdb.py +++ b/initdb.py @@ -436,6 +436,8 @@ def initialize_database(): TagKind.create(name='channel') DisableReason.create(name='user_toggled') + DisableReason.create(name='successive_build_failures') + DisableReason.create(name='successive_build_internal_errors') def wipe_database(): diff --git a/static/directives/repo-view/repo-panel-builds.html b/static/directives/repo-view/repo-panel-builds.html index 1e7577ffc..91961fff7 100644 --- a/static/directives/repo-view/repo-panel-builds.html +++ b/static/directives/repo-view/repo-panel-builds.html @@ -169,16 +169,27 @@ - + - This build trigger is currently disabled and will not build: + This build trigger is user disabled and will not build: + Re-enable this trigger + + + + This build trigger was automatically disabled due to successive failures: + Re-enable this trigger + + + + This build trigger was automatically disabled due to successive internal errors: Re-enable this trigger - + - -
From 3837a7c2eddd612ae2169ea648c1c70938eef800 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 24 Oct 2017 14:20:01 -0400 Subject: [PATCH 3/6] Add datetime of when a trigger was disabled --- data/database.py | 1 + ...224f10_add_disabled_datetime_to_trigger.py | 28 +++++++++++++++++++ data/model/build.py | 2 ++ 3 files changed, 31 insertions(+) create mode 100644 data/migrations/versions/87fbbc224f10_add_disabled_datetime_to_trigger.py diff --git a/data/database.py b/data/database.py index cc8def8b2..51251bc27 100644 --- a/data/database.py +++ b/data/database.py @@ -711,6 +711,7 @@ class RepositoryBuildTrigger(BaseModel): robot_null_delete=True) enabled = BooleanField(default=True) disabled_reason = EnumField(DisableReason, null=True) + disabled_datetime = DateTimeField(default=datetime.utcnow, null=True, index=True) successive_failure_count = IntegerField(default=0) successive_internal_error_count = IntegerField(default=0) diff --git a/data/migrations/versions/87fbbc224f10_add_disabled_datetime_to_trigger.py b/data/migrations/versions/87fbbc224f10_add_disabled_datetime_to_trigger.py new file mode 100644 index 000000000..5cb4df7ff --- /dev/null +++ b/data/migrations/versions/87fbbc224f10_add_disabled_datetime_to_trigger.py @@ -0,0 +1,28 @@ +"""Add disabled datetime to trigger + +Revision ID: 87fbbc224f10 +Revises: 17aff2e1354e +Create Date: 2017-10-24 14:06:37.658705 + +""" + +# revision identifiers, used by Alembic. +revision = '87fbbc224f10' +down_revision = '17aff2e1354e' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('repositorybuildtrigger', sa.Column('disabled_datetime', sa.DateTime(), nullable=True)) + op.create_index('repositorybuildtrigger_disabled_datetime', 'repositorybuildtrigger', ['disabled_datetime'], unique=False) + # ### end Alembic commands ### + + +def downgrade(tables): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index('repositorybuildtrigger_disabled_datetime', table_name='repositorybuildtrigger') + op.drop_column('repositorybuildtrigger', 'disabled_datetime') + # ### end Alembic commands ### diff --git a/data/model/build.py b/data/model/build.py index 9d844e665..5ac11f677 100644 --- a/data/model/build.py +++ b/data/model/build.py @@ -295,10 +295,12 @@ def update_trigger_disable_status(trigger, final_phase): error_threshold = config.app_config.get('SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD') if failure_threshold and trigger.successive_failure_count >= failure_threshold: + trigger.disabled_datetime = datetime.utcnow() trigger.enabled = False trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_failures') elif (error_threshold and trigger.successive_internal_error_count >= error_threshold): + trigger.disabled_datetime = datetime.utcnow() trigger.enabled = False trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_internal_errors') From de2469ccdcabec406e1fe320f17a6907585893e5 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 8 Nov 2017 16:34:33 -0500 Subject: [PATCH 4/6] Add warning that triggers will be auto-disabled --- static/partials/trigger-setup.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/partials/trigger-setup.html b/static/partials/trigger-setup.html index 938301bdc..5be53d77e 100644 --- a/static/partials/trigger-setup.html +++ b/static/partials/trigger-setup.html @@ -27,6 +27,10 @@

Trigger has been successfully activated

+
+ Please note: If the trigger continuously fails to build, it will be automatically + disabled. It can be re-enabled from the build trigger list. +
From 3438c1bfadc7417bc99ab5786b175dc9a65be30e Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 26 Feb 2018 15:08:22 -0500 Subject: [PATCH 5/6] Add new config fields to the schema --- util/config/schema.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/util/config/schema.py b/util/config/schema.py index f9860946d..4cc4a825d 100644 --- a/util/config/schema.py +++ b/util/config/schema.py @@ -707,6 +707,16 @@ CONFIG_SCHEMA = { 'description': 'If not None, the default maximum number of builds that can be queued in a namespace.', 'x-example': 20, }, + 'SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD': { + 'type': ['number', 'null'], + 'description': 'If not None, the number of successive internal errors that can occur before a build trigger is automatically disabled. Defaults to 5.', + 'x-example': 10, + }, + 'SUCCESSIVE_TRIGGER_FAILURE_DISABLE_THRESHOLD': { + 'type': ['number', 'null'], + 'description': 'If not None, the number of successive failures that can occur before a build trigger is automatically disabled. Defaults to 100.', + 'x-example': 50, + }, # Login 'FEATURE_GITHUB_LOGIN': { From ed84835d23d37a13bbe53ab67a539048a6dab63f Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 26 Feb 2018 15:12:18 -0500 Subject: [PATCH 6/6] Changes for code review --- data/database.py | 7 +++++ ...c_add_ability_for_build_triggers_to_be_.py | 7 +++-- data/model/build.py | 26 ++++++++++-------- test/data/test.db | Bin 1724416 -> 1740800 bytes 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/data/database.py b/data/database.py index 51251bc27..4e767c9b0 100644 --- a/data/database.py +++ b/data/database.py @@ -892,6 +892,13 @@ class BUILD_PHASE(object): 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): queue_name = CharField(index=True, max_length=1024) body = TextField() diff --git a/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py b/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py index 0ff76ff08..e9e55e716 100644 --- a/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py +++ b/data/migrations/versions/61cadbacb9fc_add_ability_for_build_triggers_to_be_.py @@ -1,24 +1,25 @@ """Add ability for build triggers to be disabled Revision ID: 61cadbacb9fc -Revises: d8989249f8f6 +Revises: b4c2d45bc132 Create Date: 2017-10-18 12:07:26.190901 """ # revision identifiers, used by Alembic. revision = '61cadbacb9fc' -down_revision = 'd8989249f8f6' +down_revision = 'b4c2d45bc132' from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import mysql +from util.migrate import UTF8CharField def upgrade(tables): # ### commands auto generated by Alembic - please adjust! ### op.create_table('disablereason', 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')) ) op.create_index('disablereason_name', 'disablereason', ['name'], unique=True) diff --git a/data/model/build.py b/data/model/build.py index 5ac11f677..acb0f6549 100644 --- a/data/model/build.py +++ b/data/model/build.py @@ -7,7 +7,7 @@ from peewee import JOIN_LEFT_OUTER import features from data.database import (BuildTriggerService, RepositoryBuildTrigger, Repository, Namespace, User, RepositoryBuild, BUILD_PHASE, db_random_func, UseThenDisconnect, - DisableReason) + DisableReason, TRIGGER_DISABLE_REASON) from data.model import (InvalidBuildTriggerException, InvalidRepositoryBuildException, db_transaction, user as user_model, config) @@ -258,12 +258,13 @@ def mark_build_archived(build_uuid): .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. """ trigger.enabled = enabled if not enabled: trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id(reason) + trigger.disabled_datetime = datetime.utcnow() 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. """ 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 final_phase == BUILD_PHASE.COMPLETE: 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_internal_error_count = 0 elif final_phase == BUILD_PHASE.INTERNAL_ERROR: - trigger.successive_failure_count = 0 trigger.successive_internal_error_count = trigger.successive_internal_error_count + 1 # 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') if failure_threshold and trigger.successive_failure_count >= failure_threshold: - trigger.disabled_datetime = datetime.utcnow() - trigger.enabled = False - trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_failures') + toggle_build_trigger(trigger, False, TRIGGER_DISABLE_REASON.BUILD_FALURES) elif (error_threshold and trigger.successive_internal_error_count >= error_threshold): - trigger.disabled_datetime = datetime.utcnow() - trigger.enabled = False - trigger.disabled_reason = RepositoryBuildTrigger.disabled_reason.get_id('successive_build_internal_errors') - - # Save the trigger changes. - trigger.save() + toggle_build_trigger(trigger, False, TRIGGER_DISABLE_REASON.INTERNAL_ERRORS) + else: + # Save the trigger changes. + trigger.save() \ No newline at end of file diff --git a/test/data/test.db b/test/data/test.db index 286e2d0fc1163590e8bb4cf91ae54af614106912..46d05acbb92d62636c98e674703559d5e1155634 100644 GIT binary patch delta 82870 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 s>m&X+D5rh2%dRy6*(K?pS|n<0;4iEW&i*H