From 3b762f92de1660a8b81dd1a59e029293094104d6 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 21 Jul 2021 15:48:41 +0200 Subject: [PATCH] base: do not log errors in check status (#45001) --- passerelle/base/models.py | 19 ++++++++++++++++++- tests/test_misc.py | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index e6628880..94cc45b0 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -10,6 +10,7 @@ import re import sys import traceback import uuid +from contextlib import contextmanager from django import VERSION from django.apps import apps @@ -27,6 +28,7 @@ from django.test import override_settings from django.urls import reverse from django.utils import six, timezone from django.utils.encoding import force_text +from django.utils.log import AdminEmailHandler from django.utils.six.moves.urllib.parse import urlparse from django.utils.text import slugify from django.utils.timezone import now @@ -482,7 +484,8 @@ class BaseResource(models.Model): availability_parameters = self.availability_parameters try: - self.check_status() + with self.logger.disable_admin_emails(): + self.check_status() status = 'up' message = '' except NotImplementedError: @@ -905,6 +908,20 @@ class ProxyLogger(object): def level(self): return self._logger.getEffectiveLevel() + @contextmanager + def disable_admin_emails(self): + mail_admin_handlers = [ + handler for handler in self._logger.root.handlers if isinstance(handler, AdminEmailHandler) + ] + for handler in mail_admin_handlers: + handler.previous_level = handler.level + handler.setLevel(logging.CRITICAL) + try: + yield + finally: + for handler in mail_admin_handlers: + handler.setLevel(handler.previous_level) + def _log(self, levelname, message, *args, **kwargs): force = kwargs.pop('force', False) if self.connector.down() and not force: diff --git a/tests/test_misc.py b/tests/test_misc.py index 05f2df94..a4dcd635 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,5 +1,6 @@ import datetime +import mock import pytest from django.contrib.contenttypes.models import ContentType from django.core.files import File @@ -9,8 +10,10 @@ from django.urls import reverse from django.utils import timezone from django.utils.six import StringIO from mock import patch +from requests.exceptions import ReadTimeout from test_manager import login +from passerelle.apps.base_adresse.models import BaseAdresse from passerelle.apps.clicrdv.models import ClicRdv from passerelle.apps.opengis.models import OpenGIS from passerelle.base.models import ResourceLog @@ -172,3 +175,14 @@ def test_jsonb_migration(transactional_db): CsvDataSource = apps.get_model(app, 'CsvDataSource') connector = CsvDataSource.objects.get(pk=pk) assert connector._dialect_options == data + + +def test_check_status_no_traceback_email(db, settings, email_handler, mailoutbox): + settings.ADMINS = [('admin', 'admin@example.net')] + connector = BaseAdresse.objects.create(slug='base-adresse') + + with mock.patch('requests.sessions.HTTPAdapter.send', autospec=True, side_effect=ReadTimeout('timeout')): + connector.availability() + assert len(mailoutbox) == 1 + assert 'is now down' in mailoutbox[0].subject + assert ResourceLog.objects.exists() -- 2.20.1