Rename CBCProxyFatalException

We only actually use this when the data we're working with is in an
unexpected state, which is unrelated to the CBC Proxy. Using this
name also means we can re-use this exception in the next commits.

Note that we may still care if a broadcast message has expired, since
it's not expected that someone would send one in this condition.
This commit is contained in:
Ben Thorner
2021-04-19 14:54:15 +01:00
parent bcd1939179
commit b2398fcaf4
3 changed files with 17 additions and 24 deletions

View File

@@ -5,10 +5,7 @@ from flask import current_app
from sqlalchemy.schema import Sequence from sqlalchemy.schema import Sequence
from app import cbc_proxy_client, db, notify_celery, zendesk_client from app import cbc_proxy_client, db, notify_celery, zendesk_client
from app.clients.cbc_proxy import ( from app.clients.cbc_proxy import CBCProxyRetryableException
CBCProxyFatalException,
CBCProxyRetryableException,
)
from app.config import QueueNames from app.config import QueueNames
from app.dao.broadcast_message_dao import ( from app.dao.broadcast_message_dao import (
create_broadcast_provider_message, create_broadcast_provider_message,
@@ -23,6 +20,10 @@ from app.models import (
from app.utils import format_sequential_number from app.utils import format_sequential_number
class BroadcastIntegrityError(Exception):
pass
def get_retry_delay(retry_count): def get_retry_delay(retry_count):
""" """
Given a count of retries so far, return a delay for the next one. Given a count of retries so far, return a delay for the next one.
@@ -58,16 +59,14 @@ def check_provider_message_should_send(broadcast_event, provider):
current_provider_message = broadcast_event.get_provider_message(provider) current_provider_message = broadcast_event.get_provider_message(provider)
# if this is the first time a task is being executed, it won't have a provider message yet # if this is the first time a task is being executed, it won't have a provider message yet
if current_provider_message and current_provider_message.status != BroadcastProviderMessageStatus.SENDING: if current_provider_message and current_provider_message.status != BroadcastProviderMessageStatus.SENDING:
raise CBCProxyFatalException( raise BroadcastIntegrityError(
f'Cannot send broadcast_event {broadcast_event.id} ' + f'Cannot send broadcast_event {broadcast_event.id} ' +
f'to provider {provider}: ' + f'to provider {provider}: ' +
f'It is in status {current_provider_message.status}' f'It is in status {current_provider_message.status}'
) )
if broadcast_event.transmitted_finishes_at < datetime.utcnow(): if broadcast_event.transmitted_finishes_at < datetime.utcnow():
# TODO: This should be a different kind of exception to distinguish "We should know something went wrong, but raise BroadcastIntegrityError(
# no immediate action" from "We need to fix this immediately"
raise CBCProxyFatalException(
f'Cannot send broadcast_event {broadcast_event.id} ' + f'Cannot send broadcast_event {broadcast_event.id} ' +
f'to provider {provider}: ' + f'to provider {provider}: ' +
f'The expiry time of {broadcast_event.transmitted_finishes_at} has already passed' f'The expiry time of {broadcast_event.transmitted_finishes_at} has already passed'
@@ -83,7 +82,7 @@ def check_provider_message_should_send(broadcast_event, provider):
# the previous message hasn't even got round to running `send_broadcast_provider_message` yet. # the previous message hasn't even got round to running `send_broadcast_provider_message` yet.
if not prev_provider_message: if not prev_provider_message:
raise CBCProxyFatalException( raise BroadcastIntegrityError(
f'Cannot send {broadcast_event.id}. Previous event {prev_event.id} ' + f'Cannot send {broadcast_event.id}. Previous event {prev_event.id} ' +
f'(type {prev_event.message_type}) has no provider_message for provider {provider} yet.\n' + f'(type {prev_event.message_type}) has no provider_message for provider {provider} yet.\n' +
'You must ensure that the other event sends succesfully, then manually kick off this event ' + 'You must ensure that the other event sends succesfully, then manually kick off this event ' +
@@ -93,7 +92,7 @@ def check_provider_message_should_send(broadcast_event, provider):
# if there's a previous message that has started but not finished sending (whether it fatally errored or is # if there's a previous message that has started but not finished sending (whether it fatally errored or is
# currently retrying) # currently retrying)
if prev_provider_message.status != BroadcastProviderMessageStatus.ACK: if prev_provider_message.status != BroadcastProviderMessageStatus.ACK:
raise CBCProxyFatalException( raise BroadcastIntegrityError(
f'Cannot send {broadcast_event.id}. Previous event {prev_event.id} ' + f'Cannot send {broadcast_event.id}. Previous event {prev_event.id} ' +
f'(type {prev_event.message_type}) has not finished sending to provider {provider} yet.\n' + f'(type {prev_event.message_type}) has not finished sending to provider {provider} yet.\n' +
f'It is currently in status "{prev_provider_message.status}".\n' + f'It is currently in status "{prev_provider_message.status}".\n' +

View File

@@ -26,10 +26,6 @@ from app.utils import DATETIME_FORMAT, format_sequential_number
# the preceeding Alert message in the previous_provider_messages field # the preceeding Alert message in the previous_provider_messages field
class CBCProxyFatalException(Exception):
pass
class CBCProxyRetryableException(Exception): class CBCProxyRetryableException(Exception):
pass pass

View File

@@ -7,16 +7,14 @@ from celery.exceptions import Retry
from freezegun import freeze_time from freezegun import freeze_time
from app.celery.broadcast_message_tasks import ( from app.celery.broadcast_message_tasks import (
BroadcastIntegrityError,
check_provider_message_should_send, check_provider_message_should_send,
get_retry_delay, get_retry_delay,
send_broadcast_event, send_broadcast_event,
send_broadcast_provider_message, send_broadcast_provider_message,
trigger_link_test, trigger_link_test,
) )
from app.clients.cbc_proxy import ( from app.clients.cbc_proxy import CBCProxyRetryableException
CBCProxyFatalException,
CBCProxyRetryableException,
)
from app.models import ( from app.models import (
BROADCAST_TYPE, BROADCAST_TYPE,
BroadcastEventMessageType, BroadcastEventMessageType,
@@ -620,7 +618,7 @@ def test_check_provider_message_should_send_raises_if_event_has_expired(sample_t
transmitted_starts_at=datetime(2021, 1, 1, 0, 0), transmitted_starts_at=datetime(2021, 1, 1, 0, 0),
transmitted_finishes_at=datetime(2021, 1, 1, 11, 59), transmitted_finishes_at=datetime(2021, 1, 1, 11, 59),
) )
with pytest.raises(CBCProxyFatalException) as exc: with pytest.raises(BroadcastIntegrityError) as exc:
check_provider_message_should_send(current_event, 'ee') check_provider_message_should_send(current_event, 'ee')
assert 'The expiry time of 2021-01-01 11:59:00 has already passed' in str(exc.value) assert 'The expiry time of 2021-01-01 11:59:00 has already passed' in str(exc.value)
@@ -651,7 +649,7 @@ def test_check_provider_message_should_send_raises_if_older_event_still_sending(
create_broadcast_provider_message(past_still_sending_event, provider='ee', status=BroadcastProviderMessageStatus.SENDING) # noqa create_broadcast_provider_message(past_still_sending_event, provider='ee', status=BroadcastProviderMessageStatus.SENDING) # noqa
# we havent sent the previous update yet - it's still in sending - so don't try and send this one. # we havent sent the previous update yet - it's still in sending - so don't try and send this one.
with pytest.raises(CBCProxyFatalException) as exc: with pytest.raises(BroadcastIntegrityError) as exc:
check_provider_message_should_send(current_event, 'ee') check_provider_message_should_send(current_event, 'ee')
assert f'Previous event {past_still_sending_event.id} (type update) has not finished sending to provider ee' in str(exc.value) # noqa assert f'Previous event {past_still_sending_event.id} (type update) has not finished sending to provider ee' in str(exc.value) # noqa
@@ -683,7 +681,7 @@ def test_check_provider_message_should_send_raises_if_older_event_hasnt_started_
create_broadcast_provider_message(past_succesful_event, provider='ee', status=BroadcastProviderMessageStatus.ACK) create_broadcast_provider_message(past_succesful_event, provider='ee', status=BroadcastProviderMessageStatus.ACK)
# we shouldn't send the update now, because a previous event is still stuck in sending # we shouldn't send the update now, because a previous event is still stuck in sending
with pytest.raises(CBCProxyFatalException) as exc: with pytest.raises(BroadcastIntegrityError) as exc:
check_provider_message_should_send(current_event, 'ee') check_provider_message_should_send(current_event, 'ee')
assert f'Previous event {past_still_sending_event.id} (type update) has no provider_message for provider ee' in str(exc.value) # noqa assert f'Previous event {past_still_sending_event.id} (type update) has no provider_message for provider ee' in str(exc.value) # noqa
@@ -714,15 +712,15 @@ def test_check_provider_message_should_send_doesnt_raise_if_newer_event_not_acke
BroadcastProviderMessageStatus.SENDING, BroadcastProviderMessageStatus.SENDING,
pytest.param( pytest.param(
BroadcastProviderMessageStatus.ACK, BroadcastProviderMessageStatus.ACK,
marks=pytest.mark.xfail(raises=CBCProxyFatalException) marks=pytest.mark.xfail(raises=BroadcastIntegrityError)
), ),
pytest.param( pytest.param(
BroadcastProviderMessageStatus.ERR, BroadcastProviderMessageStatus.ERR,
marks=pytest.mark.xfail(raises=CBCProxyFatalException) marks=pytest.mark.xfail(raises=BroadcastIntegrityError)
), ),
pytest.param( pytest.param(
BroadcastProviderMessageStatus.TECHNICAL_FAILURE, BroadcastProviderMessageStatus.TECHNICAL_FAILURE,
marks=pytest.mark.xfail(raises=CBCProxyFatalException) marks=pytest.mark.xfail(raises=BroadcastIntegrityError)
), ),
]) ])
def test_check_provider_message_should_send_raises_if_current_event_already_has_provider_message_not_in_sending( def test_check_provider_message_should_send_raises_if_current_event_already_has_provider_message_not_in_sending(