Merge pull request #3035 from alphagov/broadcast-event-response

Send broadcast events per provider
This commit is contained in:
Leo Hemsted
2020-11-25 10:16:30 +00:00
committed by GitHub
13 changed files with 447 additions and 253 deletions

View File

@@ -1,17 +1,33 @@
import uuid
from flask import current_app
from notifications_utils.statsd_decorators import statsd
from app import cbc_proxy_client, notify_celery
from app.config import QueueNames
from app.models import BroadcastEventMessageType
from app.dao.broadcast_message_dao import dao_get_broadcast_event_by_id
from app.dao.broadcast_message_dao import dao_get_broadcast_event_by_id, create_broadcast_provider_message
@notify_celery.task(name="send-broadcast-event")
@statsd(namespace="tasks")
def send_broadcast_event(broadcast_event_id):
for provider in current_app.config['ENABLED_CBCS']:
# TODO: Decide whether to send to each provider based on platform admin, service level settings, broadcast
# level settings, etc.
send_broadcast_provider_message.apply_async(
kwargs={'broadcast_event_id': broadcast_event_id, 'provider': provider},
queue=QueueNames.NOTIFY
)
@notify_celery.task(name="send-broadcast-provider-message")
@statsd(namespace="tasks")
def send_broadcast_provider_message(broadcast_event_id, provider):
broadcast_event = dao_get_broadcast_event_by_id(broadcast_event_id)
broadcast_provider_message = create_broadcast_provider_message(broadcast_event, provider)
current_app.logger.info(
f'invoking cbc proxy to send '
f'broadcast_event {broadcast_event.reference} '
@@ -23,9 +39,11 @@ def send_broadcast_event(broadcast_event_id):
for polygon in broadcast_event.transmitted_areas["simple_polygons"]
]
cbc_proxy_provider_client = cbc_proxy_client.get_proxy(provider)
if broadcast_event.message_type == BroadcastEventMessageType.ALERT:
cbc_proxy_client.create_and_send_broadcast(
identifier=str(broadcast_event.id),
cbc_proxy_provider_client.create_and_send_broadcast(
identifier=str(broadcast_provider_message.id),
headline="GOV.UK Notify Broadcast",
description=broadcast_event.transmitted_content['body'],
areas=areas,
@@ -33,22 +51,43 @@ def send_broadcast_event(broadcast_event_id):
expires=broadcast_event.transmitted_finishes_at_as_cap_datetime_string,
)
elif broadcast_event.message_type == BroadcastEventMessageType.UPDATE:
cbc_proxy_client.update_and_send_broadcast(
identifier=str(broadcast_event.id),
cbc_proxy_provider_client.update_and_send_broadcast(
identifier=str(broadcast_provider_message.id),
headline="GOV.UK Notify Broadcast",
description=broadcast_event.transmitted_content['body'],
areas=areas,
references=broadcast_event.get_earlier_message_references(),
previous_provider_messages=broadcast_event.get_earlier_provider_messages(provider),
sent=broadcast_event.sent_at_as_cap_datetime_string,
expires=broadcast_event.transmitted_finishes_at_as_cap_datetime_string,
)
elif broadcast_event.message_type == BroadcastEventMessageType.CANCEL:
cbc_proxy_client.cancel_broadcast(
identifier=str(broadcast_event.id),
cbc_proxy_provider_client.cancel_broadcast(
identifier=str(broadcast_provider_message.id),
headline="GOV.UK Notify Broadcast",
description=broadcast_event.transmitted_content['body'],
areas=areas,
references=broadcast_event.get_earlier_message_references(),
previous_provider_messages=broadcast_event.get_earlier_provider_messages(provider),
sent=broadcast_event.sent_at_as_cap_datetime_string,
expires=broadcast_event.transmitted_finishes_at_as_cap_datetime_string,
)
@notify_celery.task(name='trigger-link-test')
def trigger_link_test(provider):
"""
Currently we only have one hardcoded CBC Proxy, which corresponds to one
CBC, and so currently we do not specify the CBC Proxy name
In future we will have multiple CBC proxies, each proxy corresponding to
one MNO's CBC
This task should invoke other tasks which do the actual link tests, eg:
for cbc_name in app.config.ENABLED_CBCS:
send_link_test_for_cbc(cbc_name)
Alternatively this task could be configured to be a Celery group
"""
identifier = str(uuid.uuid4())
message = f"Sending a link test to CBC proxy for provider {provider} with ID {identifier}"
current_app.logger.info(message)
cbc_proxy_client.get_proxy(provider).send_link_test(identifier)

View File

@@ -17,6 +17,7 @@ from app.celery.tasks import (
process_row,
process_incomplete_jobs)
from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter
from app.celery.broadcast_message_tasks import trigger_link_test
from app.config import QueueNames
from app.dao.invited_org_user_dao import delete_org_invitations_created_more_than_two_days_ago
from app.dao.invited_user_dao import delete_invitations_created_more_than_two_days_ago
@@ -300,26 +301,10 @@ def send_canary_to_cbc_proxy():
identifier = str(uuid.uuid4())
message = f"Sending a canary message to CBC proxy with ID {identifier}"
current_app.logger.info(message)
cbc_proxy_client.send_canary(identifier)
cbc_proxy_client.get_proxy('canary').send_canary(identifier)
@notify_celery.task(name='trigger-link-tests')
def trigger_link_tests():
"""
Currently we only have one hardcoded CBC Proxy, which corresponds to one
CBC, and so currently we do not specify the CBC Proxy name
In future we will have multiple CBC proxies, each proxy corresponding to
one MNO's CBC
This task should invoke other tasks which do the actual link tests, eg:
for cbc_name in app.config.ENABLED_CBCS:
send_link_test_for_cbc(cbc_name)
Alternatively this task could be configured to be a Celery group
"""
for _ in range(1):
identifier = str(uuid.uuid4())
message = f"Sending a link test to CBC proxy with ID {identifier}"
current_app.logger.info(message)
cbc_proxy_client.send_link_test(identifier)
for cbc_name in current_app.config['ENABLED_CBCS']:
trigger_link_test.apply_async(kwargs={'provider': cbc_name}, queue=QueueNames.NOTIFY)