From 264937fdb9c3d2f3d399c630823f14403eaac097 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 25 May 2022 13:35:00 +0200 Subject: [PATCH] atos_genesys: add a configurable timeout and report timeout errors (#65701) --- .../migrations/0005_resource_http_timeout.py | 18 ++++++++++++++++++ passerelle/apps/atos_genesys/models.py | 4 ++++ tests/test_atos_genesys.py | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 passerelle/apps/atos_genesys/migrations/0005_resource_http_timeout.py diff --git a/passerelle/apps/atos_genesys/migrations/0005_resource_http_timeout.py b/passerelle/apps/atos_genesys/migrations/0005_resource_http_timeout.py new file mode 100644 index 00000000..a1ef2a9e --- /dev/null +++ b/passerelle/apps/atos_genesys/migrations/0005_resource_http_timeout.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2022-05-25 11:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('atos_genesys', '0004_text_to_jsonb'), + ] + + operations = [ + migrations.AddField( + model_name='resource', + name='http_timeout', + field=models.PositiveIntegerField(default=60, verbose_name='HTTP timeout'), + ), + ] diff --git a/passerelle/apps/atos_genesys/models.py b/passerelle/apps/atos_genesys/models.py index a2e1ae29..25bcc1fc 100644 --- a/passerelle/apps/atos_genesys/models.py +++ b/passerelle/apps/atos_genesys/models.py @@ -38,6 +38,7 @@ class Resource(BaseResource, HTTPResource): webservice_base_url = models.URLField(_('Webservice Base URL')) cod_rgp = models.CharField(_('Code RGP'), max_length=64, default='RGP_PUB') + http_timeout = models.PositiveIntegerField(_('HTTP timeout'), default=60) class Meta: verbose_name = _('ATOS Genesys') @@ -68,9 +69,12 @@ class Resource(BaseResource, HTTPResource): return rows def _xml_request_base(self, url, *args, **kwargs): + kwargs.setdefault('timeout', self.http_timeout) try: response = self.requests.get(url, *args, **kwargs) response.raise_for_status() + except (requests.ConnectionError, requests.Timeout) as e: + raise APIError('genesys is down', data={'exception': str(e)}) except requests.RequestException as e: raise APIError('HTTP request failed', data={'exception': str(e)}) try: diff --git a/tests/test_atos_genesys.py b/tests/test_atos_genesys.py index 09342779..5b7374be 100644 --- a/tests/test_atos_genesys.py +++ b/tests/test_atos_genesys.py @@ -2,7 +2,9 @@ import os +import mock import pytest +import requests from django.utils.http import urlencode import tests.utils @@ -216,6 +218,23 @@ def test_ws_dossiers(app, genesys): assert response.json['data']['text'] == '%s - John DOE' % link2.id_per +def test_ws_dossiers_timeout_error(app, genesys): + Link.objects.create(resource=genesys, name_id='zob', id_per='1234') + url = tests.utils.generic_endpoint_url('atos-genesys', 'dossiers', slug=genesys.slug) + with mock.patch('passerelle.utils.Request.request') as request: + request.side_effect = requests.Timeout + response = app.get( + url + + '?' + + urlencode( + { + 'NameID': 'zob', + } + ) + ) + assert response.json['err_desc'] == 'genesys is down' + + def test_row_locked_cache(genesys, freezer): import time -- 2.35.1