From 7459a4f6f686fd6984c8752288d20c2902200807 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Thu, 19 Mar 2020 09:15:38 +0000 Subject: [PATCH] Add a try/except around the code to get the files. The idea is to log the exception but keep going. That way the "good" files still get sent and we can investigate why a file failed. --- app/celery/letters_pdf_tasks.py | 21 ++++++----- tests/app/celery/test_letters_pdf_tasks.py | 42 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/app/celery/letters_pdf_tasks.py b/app/celery/letters_pdf_tasks.py index b78028596..74fc22fcf 100644 --- a/app/celery/letters_pdf_tasks.py +++ b/app/celery/letters_pdf_tasks.py @@ -172,15 +172,18 @@ def get_key_and_size_of_letters_to_be_sent_to_print(print_run_deadline): letter_pdfs = [] for letter in letters_awaiting_sending: - letter_file_name = get_letter_pdf_filename( - reference=letter.reference, - crown=letter.service.crown, - sending_date=letter.created_at, - postage=letter.postage - ) - - letter_head = s3.head_s3_object(current_app.config['LETTERS_PDF_BUCKET_NAME'], letter_file_name) - letter_pdfs.append({"Key": letter_file_name, "Size": letter_head['ContentLength']}) + try: + letter_file_name = get_letter_pdf_filename( + reference=letter.reference, + crown=letter.service.crown, + sending_date=letter.created_at, + postage=letter.postage + ) + letter_head = s3.head_s3_object(current_app.config['LETTERS_PDF_BUCKET_NAME'], letter_file_name) + letter_pdfs.append({"Key": letter_file_name, "Size": letter_head['ContentLength']}) + except BotoClientError as e: + current_app.logger.exception( + f"Error getting letter from bucket for notification: {letter.id} with reference: {letter.reference}", e) return letter_pdfs diff --git a/tests/app/celery/test_letters_pdf_tasks.py b/tests/app/celery/test_letters_pdf_tasks.py index ef95a17b0..2f52bbb2e 100644 --- a/tests/app/celery/test_letters_pdf_tasks.py +++ b/tests/app/celery/test_letters_pdf_tasks.py @@ -315,6 +315,48 @@ def test_get_key_and_size_of_letters_to_be_sent_to_print(notify_api, mocker, sam ] +@freeze_time('2020-02-17 18:00:00') +def test_get_key_and_size_of_letters_to_be_sent_to_print_catches_exception( + notify_api, mocker, sample_letter_template +): + create_notification( + template=sample_letter_template, + status='created', + reference='ref0', + created_at=(datetime.now() - timedelta(hours=2)) + ) + + create_notification( + template=sample_letter_template, + status='created', + reference='ref1', + created_at=(datetime.now() - timedelta(hours=3)) + ) + error_response = { + 'Error': { + 'Code': 'FileNotFound', + 'Message': 'some error message from amazon', + 'Type': 'Sender' + } + } + mock_head_s3_object = mocker.patch('app.celery.tasks.s3.head_s3_object', side_effect=[ + {'ContentLength': 2}, + ClientError(error_response, "File not found") + ]) + + results = get_key_and_size_of_letters_to_be_sent_to_print(datetime.now() - timedelta(minutes=30)) + + assert mock_head_s3_object.call_count == 2 + mock_head_s3_object.assert_has_calls( + [ + call(current_app.config['LETTERS_PDF_BUCKET_NAME'], '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF'), + call(current_app.config['LETTERS_PDF_BUCKET_NAME'], '2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF'), + ] + ) + + assert results == [{'Key': '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF', 'Size': 2}] + + @pytest.mark.parametrize('time_to_run_task', [ "2020-02-17 18:00:00", # after 5:30pm "2020-02-18 02:00:00", # the next day after midnight, before 5:30pm we expect the same results