feat(full-stack): disable notifications after 3 failures
This stops notifications from firing over and over again if they are repeatedly failing. [TESTING -> locally with docker compose, DATABASE MIGRATION -> there is a single migration] Issue: https://www.pivotaltracker.com/story/show/b144646649n - [ ] It works! - [ ] Comments provide sufficient explanations for the next contributor - [ ] Tests cover changes and corner cases - [ ] Follows Quay syntax patterns and format
This commit is contained in:
parent
2282af2619
commit
993f2a174c
13 changed files with 140 additions and 20 deletions
|
@ -1,9 +1,9 @@
|
|||
import json
|
||||
|
||||
from data.model import InvalidNotificationException, db_transaction
|
||||
from data.database import (Notification, NotificationKind, User, Team, TeamMember, TeamRole,
|
||||
RepositoryNotification, ExternalNotificationEvent, Repository,
|
||||
ExternalNotificationMethod, Namespace)
|
||||
ExternalNotificationMethod, Namespace, db_for_update)
|
||||
from data.model import InvalidNotificationException, db_transaction
|
||||
|
||||
|
||||
def create_notification(kind_name, target, metadata={}, lookup_path=None):
|
||||
|
@ -125,6 +125,29 @@ def delete_matching_notifications(target, kind_name, **kwargs):
|
|||
notification.delete_instance()
|
||||
|
||||
|
||||
def increment_notification_failure_count(notification_id):
|
||||
""" This increments the number of failures by one """
|
||||
RepositoryNotification.update(number_of_failures=RepositoryNotification.number_of_failures + 1).where(
|
||||
RepositoryNotification.id == notification_id).execute()
|
||||
|
||||
|
||||
def reset_notification_number_of_failures(namespace_name, repository_name, uuid):
|
||||
""" This resets the number of failures for a repo notification to 0 """
|
||||
try:
|
||||
notification = RepositoryNotification.select().where(RepositoryNotification.uuid == uuid).get()
|
||||
if (notification.repository.namespace_user.username != namespace_name or
|
||||
notification.repository.name != repository_name):
|
||||
raise InvalidNotificationException('No repository notification found with uuid: %s' % uuid)
|
||||
reset_number_of_failures_to_zero(notification.id)
|
||||
except RepositoryNotification.DoesNotExist:
|
||||
pass
|
||||
|
||||
|
||||
def reset_number_of_failures_to_zero(notification_id):
|
||||
""" This resets the number of failures for a repo notification to 0 """
|
||||
RepositoryNotification.update(number_of_failures=0).where(RepositoryNotification.id == notification_id).execute()
|
||||
|
||||
|
||||
def create_repo_notification(repo, event_name, method_name, method_config, event_config, title=None):
|
||||
event = ExternalNotificationEvent.get(ExternalNotificationEvent.name == event_name)
|
||||
method = ExternalNotificationMethod.get(ExternalNotificationMethod.name == method_name)
|
||||
|
@ -134,23 +157,34 @@ def create_repo_notification(repo, event_name, method_name, method_config, event
|
|||
event_config_json=json.dumps(event_config))
|
||||
|
||||
|
||||
def _base_get_notification(uuid):
|
||||
""" This is a base query for get statements """
|
||||
return (RepositoryNotification
|
||||
.select(RepositoryNotification, Repository, Namespace)
|
||||
.join(Repository)
|
||||
.join(Namespace, on=(Repository.namespace_user == Namespace.id))
|
||||
.where(RepositoryNotification.uuid == uuid))
|
||||
|
||||
|
||||
def get_enabled_notification(uuid):
|
||||
""" This returns a notification with less than 3 failures """
|
||||
try:
|
||||
return _base_get_notification(uuid).where(RepositoryNotification.number_of_failures < 3).get()
|
||||
except RepositoryNotification.DoesNotExist:
|
||||
raise InvalidNotificationException('No repository notification found with uuid: %s' % uuid)
|
||||
|
||||
|
||||
def get_repo_notification(uuid):
|
||||
try:
|
||||
return (RepositoryNotification
|
||||
.select(RepositoryNotification, Repository, Namespace)
|
||||
.join(Repository)
|
||||
.join(Namespace, on=(Repository.namespace_user == Namespace.id))
|
||||
.where(RepositoryNotification.uuid == uuid)
|
||||
.get())
|
||||
return _base_get_notification(uuid).get()
|
||||
except RepositoryNotification.DoesNotExist:
|
||||
raise InvalidNotificationException('No repository notification found with id: %s' % uuid)
|
||||
raise InvalidNotificationException('No repository notification found with uuid: %s' % uuid)
|
||||
|
||||
|
||||
def delete_repo_notification(namespace_name, repository_name, uuid):
|
||||
found = get_repo_notification(uuid)
|
||||
if (found.repository.namespace_user.username != namespace_name or
|
||||
found.repository.name != repository_name):
|
||||
raise InvalidNotificationException('No repository notifiation found with id: %s' % uuid)
|
||||
if found.repository.namespace_user.username != namespace_name or found.repository.name != repository_name:
|
||||
raise InvalidNotificationException('No repository notifiation found with uuid: %s' % uuid)
|
||||
found.delete_instance()
|
||||
return found
|
||||
|
||||
|
|
Reference in a new issue