Merge pull request #3036 from alphagov/cbc-proxy-refactor

Cbc proxy refactor
This commit is contained in:
Leo Hemsted
2020-11-19 15:50:02 +00:00
committed by GitHub
7 changed files with 49 additions and 61 deletions

View File

@@ -22,7 +22,7 @@ from werkzeug.exceptions import HTTPException as WerkzeugHTTPException
from werkzeug.local import LocalProxy
from app.celery.celery import NotifyCelery
from app.clients import Clients
from app.clients import NotificationProviderClients
from app.clients.cbc_proxy import CBCProxyClient, CBCProxyNoopClient
from app.clients.document_download import DocumentDownloadClient
from app.clients.email.aws_ses import AwsSesClient
@@ -65,7 +65,7 @@ cbc_proxy_client = CBCProxyNoopClient()
document_download_client = DocumentDownloadClient()
metrics = GDSMetrics()
clients = Clients()
notification_provider_clients = NotificationProviderClients()
api_user = LocalProxy(lambda: _request_ctx_stack.top.api_user)
authenticated_service = LocalProxy(lambda: _request_ctx_stack.top.authenticated_service)
@@ -106,7 +106,7 @@ def create_app(application):
)
# If a stub url is provided for SES, then use the stub client rather than the real SES boto client
email_clients = [aws_ses_stub_client] if application.config['SES_STUB_URL'] else [aws_ses_client]
clients.init_app(sms_clients=[firetext_client, mmg_client], email_clients=email_clients)
notification_provider_clients.init_app(sms_clients=[firetext_client, mmg_client], email_clients=email_clients)
notify_celery.init_app(application)
encryption.init_app(application)

View File

@@ -17,7 +17,7 @@ STATISTICS_DELIVERED = 'delivered'
STATISTICS_FAILURE = 'failure'
class Clients(object):
class NotificationProviderClients(object):
sms_clients = {}
email_clients = {}

View File

@@ -20,6 +20,10 @@ import boto3
# the preceeding Alert message in the references field
class CBCProxyException(Exception):
pass
# Noop = no operation
class CBCProxyNoopClient:
@@ -72,72 +76,53 @@ class CBCProxyClient:
aws_secret_access_key=app.config['CBC_PROXY_AWS_SECRET_ACCESS_KEY'],
)
def send_canary(
self,
identifier,
):
payload_bytes = bytes(json.dumps({
'identifier': identifier,
}), encoding='utf8')
def _invoke_lambda(self, function_name, payload):
payload_bytes = bytes(json.dumps(payload), encoding='utf8')
result = self._lambda_client.invoke(
FunctionName='canary',
FunctionName=function_name,
InvocationType='RequestResponse',
Payload=payload_bytes,
)
if result['StatusCode'] > 299:
raise Exception('Could not invoke lambda')
raise CBCProxyException('Could not invoke lambda')
if 'FunctionError' in result:
raise Exception('Function exited with unhandled exception')
raise CBCProxyException('Function exited with unhandled exception')
return result
def send_canary(
self,
identifier,
):
self._invoke_lambda(function_name='canary', payload={'identifier': identifier})
def send_link_test(
self,
identifier,
):
payload_bytes = bytes(json.dumps({
'message_type': 'test',
'identifier': identifier,
}), encoding='utf8')
payload = {'message_type': 'test', 'identifier': identifier}
result = self._lambda_client.invoke(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=payload_bytes,
)
if result['StatusCode'] > 299:
raise Exception('Could not invoke lambda')
if 'FunctionError' in result:
raise Exception('Function exited with unhandled exception')
self._invoke_lambda(function_name='bt-ee-1-proxy', payload=payload)
def create_and_send_broadcast(
self,
identifier, headline, description, areas,
sent, expires,
):
payload_bytes = bytes(json.dumps({
payload = {
'message_type': 'alert',
'identifier': identifier,
'headline': headline,
'description': description,
'areas': areas,
'sent': sent, 'expires': expires,
}), encoding='utf8')
'sent': sent,
'expires': expires,
}
result = self._lambda_client.invoke(
FunctionName='bt-ee-1-proxy',
InvocationType='RequestResponse',
Payload=payload_bytes,
)
if result['StatusCode'] > 299:
raise Exception('Could not invoke lambda')
if 'FunctionError' in result:
raise Exception('Function exited with unhandled exception')
self._invoke_lambda(function_name='bt-ee-1-proxy', payload=payload)
# We have not implementated updating a broadcast
def update_and_send_broadcast(

View File

@@ -9,7 +9,7 @@ from notifications_utils.recipients import (
)
from notifications_utils.template import HTMLEmailTemplate, PlainTextEmailTemplate, SMSMessageTemplate
from app import clients, statsd_client, create_uuid
from app import notification_provider_clients, statsd_client, create_uuid
from app.dao.notifications_dao import (
dao_update_notification
)
@@ -144,7 +144,7 @@ def provider_to_use(notification_type, international=False):
chosen_provider = random.choices(active_providers, weights=[p.priority for p in active_providers])[0]
return clients.get_client_by_name_and_type(chosen_provider.identifier, notification_type)
return notification_provider_clients.get_client_by_name_and_type(chosen_provider.identifier, notification_type)
def get_logo_url(base_url, logo_file):