Projet

Général

Profil

0001-wscall-store-more-informations-after-the-call-9889.patch

Thomas Noël, 07 février 2016 19:20

Télécharger (6,16 ko)

Voir les différences:

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(-)
tests/test_workflows.py
494 494
    item.post = False
495 495
    item.varname = 'xxx'
496 496
    item.perform(formdata)
497
    assert formdata.workflow_data.get('xxx_status') == 200
498
    assert formdata.workflow_data.get('xxx_response') == {'foo': 'bar'}
497
    assert formdata.workflow_data['xxx_status'] == 200
498
    assert formdata.workflow_data['xxx_response'] == {'foo': 'bar'}
499
    assert formdata.workflow_data.get('xxx_time')
500
    formdata.workflow_data = None
499 501

  
500 502
    item = WebserviceCallStatusItem()
501 503
    item.url = 'http://remote.example.net'
......
520 522
    assert 'signature=' in http_requests.get_last('url')
521 523

  
522 524
    item = WebserviceCallStatusItem()
525
    item.url = 'http://remote.example.net/204'
526
    item.post = False
527
    item.varname = 'xxx'
528
    item.perform(formdata)
529
    assert formdata.workflow_data.get('xxx_status') == 204
530
    assert formdata.workflow_data.get('xxx_time')
531
    assert 'xxx_response' not in formdata.workflow_data
532
    assert 'xxx_error_response' not in formdata.workflow_data
533
    formdata.workflow_data = None
534

  
535
    item = WebserviceCallStatusItem()
523 536
    item.url = 'http://remote.example.net/404'
524 537
    item.post = False
538
    item.varname = 'xxx'
525 539
    with pytest.raises(AbortActionException):
526 540
        item.perform(formdata)
541
    assert formdata.workflow_data.get('xxx_status') == 404
542
    assert formdata.workflow_data.get('xxx_time')
543
    assert 'xxx_error_response' not in formdata.workflow_data
544
    formdata.workflow_data = None
545

  
546
    item = WebserviceCallStatusItem()
547
    item.url = 'http://remote.example.net/404-json'
548
    item.post = False
549
    item.varname = 'xxx'
550
    with pytest.raises(AbortActionException):
551
        item.perform(formdata)
552
    assert formdata.workflow_data.get('xxx_status') == 404
553
    assert formdata.workflow_data.get('xxx_error_response') == {'err': 1}
554
    assert formdata.workflow_data.get('xxx_time')
555
    assert 'xxx_response' not in formdata.workflow_data
556
    formdata.workflow_data = None
527 557

  
528 558
    item = WebserviceCallStatusItem()
529 559
    item.url = 'http://remote.example.net/404'
......
563 593
    item.action_on_bad_data = ':stop'
564 594
    with pytest.raises(AbortActionException):
565 595
        item.perform(formdata)
596
    assert formdata.workflow_data.get('xxx_status') == 200
597
    assert 'xxx_response' not in formdata.workflow_data
598
    assert 'xxx_error_response' not in formdata.workflow_data
599
    formdata.workflow_data = None
566 600

  
567 601
    item = WebserviceCallStatusItem()
568 602
    item.url = 'http://remote.example.net/404'
......
582 616
    with pytest.raises(AbortActionException):
583 617
        item.perform(formdata)
584 618
    assert formdata.evolution[-1].parts[-1].summary == 'ValueError: No JSON object could be decoded\n'
619
    assert formdata.workflow_data.get('xxx_status') == 200
620
    assert formdata.workflow_data.get('xxx_time')
621
    assert 'xxx_error_response' not in formdata.workflow_data
622
    formdata.workflow_data = None
585 623

  
586 624

  
587 625
def test_timeout(pub):
tests/utilities.py
216 216
                 'timeout': timeout})
217 217

  
218 218
        status, data = {
219
            'http://remote.example.net/204': (204, None),
219 220
            'http://remote.example.net/404': (404, 'page not found'),
221
            'http://remote.example.net/404-json': (404, '{"err": 1}'),
220 222
            'http://remote.example.net/500': (500, 'internal server error'),
221 223
            'http://remote.example.net/json': (200, '{"foo": "bar"}'),
222 224
            'http://remote.example.net/xml': (200, '<?xml version="1.0"><foo/>'),
wcs/wf/wscall.py
14 14
# You should have received a copy of the GNU General Public License
15 15
# along with this program; if not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import datetime
17 18
import json
18 19
import sys
19 20
import traceback
......
177 178
                    exc_info=sys.exc_info())
178 179

  
179 180
        if self.varname:
180
            workflow_data = {'%s_status' % self.varname: status}
181
            if status == 200:
181
            workflow_data = {
182
                '%s_status' % self.varname: status,
183
                '%s_time' % self.varname: datetime.datetime.now().isoformat(),
184
            }
185
            if status in (204, 205):
186
                pass # not returning any content
187
            elif (status // 100) == 2:
182 188
                try:
183 189
                    d = json_loads(data)
184 190
                except (ValueError, TypeError) as e:
191
                    formdata.update_workflow_data(workflow_data)
192
                    formdata.store()
185 193
                    self.action_on_error(self.action_on_bad_data, formdata,
186 194
                            response, data=data, exc_info=sys.exc_info())
187 195
                else:
......
190 198
                        formdata.id_display = d.get('data', {}).get('display_id')
191 199
                    elif d.get('display_id'):
192 200
                        formdata.id_display = d.get('display_id')
201
            else: # on error, record data if it is JSON
202
                try:
203
                    d = json_loads(data)
204
                except (ValueError, TypeError) as e:
205
                    pass
206
                else:
207
                    workflow_data['%s_error_response' % self.varname] = d
193 208
            formdata.update_workflow_data(workflow_data)
194 209
            formdata.store()
195 210

  
196
-