From e52b0800044eb8cfccf13352ba1f7c96e10785ce Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Sat, 6 Feb 2016 02:48:16 +0100 Subject: [PATCH] wscall: store more informations after the call (#9889) --- tests/test_workflows.py | 42 ++++++++++++++++++++++++++++++++++++++++-- tests/utilities.py | 2 ++ wcs/wf/wscall.py | 19 +++++++++++++++++-- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 8b7fd8e..407638d 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -494,8 +494,10 @@ def test_webservice_call(pub): item.post = False item.varname = 'xxx' item.perform(formdata) - assert formdata.workflow_data.get('xxx_status') == 200 - assert formdata.workflow_data.get('xxx_response') == {'foo': 'bar'} + assert formdata.workflow_data['xxx_status'] == 200 + assert formdata.workflow_data['xxx_response'] == {'foo': 'bar'} + assert formdata.workflow_data.get('xxx_time') + formdata.workflow_data = None item = WebserviceCallStatusItem() item.url = 'http://remote.example.net' @@ -520,10 +522,38 @@ def test_webservice_call(pub): assert 'signature=' in http_requests.get_last('url') item = WebserviceCallStatusItem() + item.url = 'http://remote.example.net/204' + item.post = False + item.varname = 'xxx' + item.perform(formdata) + assert formdata.workflow_data.get('xxx_status') == 204 + assert formdata.workflow_data.get('xxx_time') + assert 'xxx_response' not in formdata.workflow_data + assert 'xxx_error_response' not in formdata.workflow_data + formdata.workflow_data = None + + item = WebserviceCallStatusItem() item.url = 'http://remote.example.net/404' item.post = False + item.varname = 'xxx' with pytest.raises(AbortActionException): item.perform(formdata) + assert formdata.workflow_data.get('xxx_status') == 404 + assert formdata.workflow_data.get('xxx_time') + assert 'xxx_error_response' not in formdata.workflow_data + formdata.workflow_data = None + + item = WebserviceCallStatusItem() + item.url = 'http://remote.example.net/404-json' + item.post = False + item.varname = 'xxx' + with pytest.raises(AbortActionException): + item.perform(formdata) + assert formdata.workflow_data.get('xxx_status') == 404 + assert formdata.workflow_data.get('xxx_error_response') == {'err': 1} + assert formdata.workflow_data.get('xxx_time') + assert 'xxx_response' not in formdata.workflow_data + formdata.workflow_data = None item = WebserviceCallStatusItem() item.url = 'http://remote.example.net/404' @@ -563,6 +593,10 @@ def test_webservice_call(pub): item.action_on_bad_data = ':stop' with pytest.raises(AbortActionException): item.perform(formdata) + assert formdata.workflow_data.get('xxx_status') == 200 + assert 'xxx_response' not in formdata.workflow_data + assert 'xxx_error_response' not in formdata.workflow_data + formdata.workflow_data = None item = WebserviceCallStatusItem() item.url = 'http://remote.example.net/404' @@ -582,6 +616,10 @@ def test_webservice_call(pub): with pytest.raises(AbortActionException): item.perform(formdata) assert formdata.evolution[-1].parts[-1].summary == 'ValueError: No JSON object could be decoded\n' + assert formdata.workflow_data.get('xxx_status') == 200 + assert formdata.workflow_data.get('xxx_time') + assert 'xxx_error_response' not in formdata.workflow_data + formdata.workflow_data = None def test_timeout(pub): diff --git a/tests/utilities.py b/tests/utilities.py index e3c5cea..cc48daa 100644 --- a/tests/utilities.py +++ b/tests/utilities.py @@ -216,7 +216,9 @@ class HttpRequestsMocking(object): 'timeout': timeout}) status, data = { + 'http://remote.example.net/204': (204, None), 'http://remote.example.net/404': (404, 'page not found'), + 'http://remote.example.net/404-json': (404, '{"err": 1}'), 'http://remote.example.net/500': (500, 'internal server error'), 'http://remote.example.net/json': (200, '{"foo": "bar"}'), 'http://remote.example.net/xml': (200, ''), diff --git a/wcs/wf/wscall.py b/wcs/wf/wscall.py index 7341028..146224d 100644 --- a/wcs/wf/wscall.py +++ b/wcs/wf/wscall.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, see . +import datetime import json import sys import traceback @@ -177,11 +178,18 @@ class WebserviceCallStatusItem(WorkflowStatusItem): exc_info=sys.exc_info()) if self.varname: - workflow_data = {'%s_status' % self.varname: status} - if status == 200: + workflow_data = { + '%s_status' % self.varname: status, + '%s_time' % self.varname: datetime.datetime.now().isoformat(), + } + if status in (204, 205): + pass # not returning any content + elif (status // 100) == 2: try: d = json_loads(data) except (ValueError, TypeError) as e: + formdata.update_workflow_data(workflow_data) + formdata.store() self.action_on_error(self.action_on_bad_data, formdata, response, data=data, exc_info=sys.exc_info()) else: @@ -190,6 +198,13 @@ class WebserviceCallStatusItem(WorkflowStatusItem): formdata.id_display = d.get('data', {}).get('display_id') elif d.get('display_id'): formdata.id_display = d.get('display_id') + else: # on error, record data if it is JSON + try: + d = json_loads(data) + except (ValueError, TypeError) as e: + pass + else: + workflow_data['%s_error_response' % self.varname] = d formdata.update_workflow_data(workflow_data) formdata.store() -- 2.7.0