Projet

Général

Profil

0001-base-do-not-log-errors-in-check-status-45001.patch

Valentin Deniaud, 22 juillet 2021 11:22

Télécharger (3,57 ko)

Voir les différences:

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(-)
passerelle/base/models.py
10 10
import sys
11 11
import traceback
12 12
import uuid
13
from contextlib import contextmanager
13 14

  
14 15
from django import VERSION
15 16
from django.apps import apps
......
27 28
from django.urls import reverse
28 29
from django.utils import six, timezone
29 30
from django.utils.encoding import force_text
31
from django.utils.log import AdminEmailHandler
30 32
from django.utils.six.moves.urllib.parse import urlparse
31 33
from django.utils.text import slugify
32 34
from django.utils.timezone import now
......
482 484
        availability_parameters = self.availability_parameters
483 485

  
484 486
        try:
485
            self.check_status()
487
            with self.logger.disable_admin_emails():
488
                self.check_status()
486 489
            status = 'up'
487 490
            message = ''
488 491
        except NotImplementedError:
......
905 908
    def level(self):
906 909
        return self._logger.getEffectiveLevel()
907 910

  
911
    @contextmanager
912
    def disable_admin_emails(self):
913
        mail_admin_handlers = [
914
            handler for handler in self._logger.root.handlers if isinstance(handler, AdminEmailHandler)
915
        ]
916
        for handler in mail_admin_handlers:
917
            handler.previous_level = handler.level
918
            handler.setLevel(logging.CRITICAL)
919
        try:
920
            yield
921
        finally:
922
            for handler in mail_admin_handlers:
923
                handler.setLevel(handler.previous_level)
924

  
908 925
    def _log(self, levelname, message, *args, **kwargs):
909 926
        force = kwargs.pop('force', False)
910 927
        if self.connector.down() and not force:
tests/test_misc.py
1 1
import datetime
2 2

  
3
import mock
3 4
import pytest
4 5
from django.contrib.contenttypes.models import ContentType
5 6
from django.core.files import File
......
9 10
from django.utils import timezone
10 11
from django.utils.six import StringIO
11 12
from mock import patch
13
from requests.exceptions import ReadTimeout
12 14
from test_manager import login
13 15

  
16
from passerelle.apps.base_adresse.models import BaseAdresse
14 17
from passerelle.apps.clicrdv.models import ClicRdv
15 18
from passerelle.apps.opengis.models import OpenGIS
16 19
from passerelle.base.models import ResourceLog
......
172 175
    CsvDataSource = apps.get_model(app, 'CsvDataSource')
173 176
    connector = CsvDataSource.objects.get(pk=pk)
174 177
    assert connector._dialect_options == data
178

  
179

  
180
def test_check_status_no_traceback_email(db, settings, email_handler, mailoutbox):
181
    settings.ADMINS = [('admin', 'admin@example.net')]
182
    connector = BaseAdresse.objects.create(slug='base-adresse')
183

  
184
    with mock.patch('requests.sessions.HTTPAdapter.send', autospec=True, side_effect=ReadTimeout('timeout')):
185
        connector.availability()
186
    assert len(mailoutbox) == 1
187
    assert 'is now down' in mailoutbox[0].subject
188
    assert ResourceLog.objects.exists()
175
-