Add proxy client for o2 cell croadcasting

o2 use One-2-many CBC so we can use the O2M/CAP client.

Once differences between CBCs have been worked out we can consolidate O2M clients to reduce duplication.

Signed-off-by: Richard Baker <richard.baker@digital.cabinet-office.gov.uk>
This commit is contained in:
Richard Baker
2021-01-26 11:11:44 +00:00
parent 770f81a1c7
commit 6256cdf792
3 changed files with 76 additions and 22 deletions

View File

@@ -46,6 +46,7 @@ class CBCProxyClient:
'canary': CBCProxyCanary, 'canary': CBCProxyCanary,
BroadcastProvider.EE: CBCProxyEE, BroadcastProvider.EE: CBCProxyEE,
BroadcastProvider.THREE: CBCProxyThree, BroadcastProvider.THREE: CBCProxyThree,
BroadcastProvider.O2: CBCProxyO2,
BroadcastProvider.VODAFONE: CBCProxyVodafone, BroadcastProvider.VODAFONE: CBCProxyVodafone,
} }
return proxy_classes[provider](self._lambda_client) return proxy_classes[provider](self._lambda_client)
@@ -291,6 +292,65 @@ class CBCProxyThree(CBCProxyClientBase):
} }
self._invoke_lambda_with_failover(payload=payload) self._invoke_lambda_with_failover(payload=payload)
class CBCProxyO2(CBCProxyClientBase):
lambda_name = 'o2-1-proxy'
failover_lambda_name = 'o2-2-proxy'
LANGUAGE_ENGLISH = 'en-GB'
LANGUAGE_WELSH = 'cy-GB'
def send_link_test(
self,
identifier,
sequential_number=None,
):
"""
link test - open up a connection to a specific provider, and send them an xml payload with a <msgType> of
test.
"""
payload = {
'message_type': 'test',
'identifier': identifier,
'message_format': 'cap'
}
self._invoke_lambda_with_failover(payload=payload)
def create_and_send_broadcast(
self, identifier, headline, description, areas, sent, expires, message_number=None
):
payload = {
'message_type': 'alert',
'identifier': identifier,
'message_format': 'cap',
'headline': headline,
'description': description,
'areas': areas,
'sent': sent,
'expires': expires,
'language': self.infer_language_from(description),
}
self._invoke_lambda_with_failover(payload=payload)
def cancel_broadcast(
self,
identifier, previous_provider_messages,
sent, message_number=None
):
payload = {
'message_type': 'cancel',
'identifier': identifier,
'message_format': 'cap',
"references": [
{
"message_id": str(message.id),
"sent": message.created_at.strftime(DATETIME_FORMAT)
} for message in previous_provider_messages
],
'sent': sent,
}
self._invoke_lambda_with_failover(payload=payload)
class CBCProxyVodafone(CBCProxyClientBase): class CBCProxyVodafone(CBCProxyClientBase):
lambda_name = 'vodafone-1-proxy' lambda_name = 'vodafone-1-proxy'

View File

@@ -380,7 +380,7 @@ class Config(object):
CBC_PROXY_ENABLED = bool(CBC_PROXY_AWS_ACCESS_KEY_ID) CBC_PROXY_ENABLED = bool(CBC_PROXY_AWS_ACCESS_KEY_ID)
ENABLED_CBCS = {BroadcastProvider.EE, BroadcastProvider.THREE, BroadcastProvider.VODAFONE} ENABLED_CBCS = {BroadcastProvider.EE, BroadcastProvider.THREE, BroadcastProvider.O2, BroadcastProvider.VODAFONE}
###################### ######################

View File

@@ -7,7 +7,7 @@ from unittest.mock import Mock, call
import pytest import pytest
from app.clients.cbc_proxy import ( from app.clients.cbc_proxy import (
CBCProxyClient, CBCProxyException, CBCProxyEE, CBCProxyCanary, CBCProxyVodafone, CBCProxyThree CBCProxyClient, CBCProxyException, CBCProxyEE, CBCProxyCanary, CBCProxyVodafone, CBCProxyThree, CBCProxyO2
) )
from app.utils import DATETIME_FORMAT from app.utils import DATETIME_FORMAT
@@ -39,12 +39,6 @@ def cbc_proxy_client(client, mocker):
def cbc_proxy_ee(cbc_proxy_client): def cbc_proxy_ee(cbc_proxy_client):
return cbc_proxy_client.get_proxy('ee') return cbc_proxy_client.get_proxy('ee')
@pytest.fixture
def cbc_proxy_three(cbc_proxy_client):
return cbc_proxy_client.get_proxy('three')
@pytest.fixture @pytest.fixture
def cbc_proxy_vodafone(cbc_proxy_client): def cbc_proxy_vodafone(cbc_proxy_client):
return cbc_proxy_client.get_proxy('vodafone') return cbc_proxy_client.get_proxy('vodafone')
@@ -53,6 +47,7 @@ def cbc_proxy_vodafone(cbc_proxy_client):
@pytest.mark.parametrize('provider_name, expected_provider_class', [ @pytest.mark.parametrize('provider_name, expected_provider_class', [
('ee', CBCProxyEE), ('ee', CBCProxyEE),
('three', CBCProxyThree), ('three', CBCProxyThree),
('o2', CBCProxyO2),
('vodafone', CBCProxyVodafone), ('vodafone', CBCProxyVodafone),
('canary', CBCProxyCanary), ('canary', CBCProxyCanary),
]) ])
@@ -83,16 +78,15 @@ def test_cbc_proxy_lambda_client_has_correct_keys(cbc_proxy_ee):
('my-description', 'en-GB'), ('my-description', 'en-GB'),
('mŷ-description', 'cy-GB'), ('mŷ-description', 'cy-GB'),
)) ))
@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'three', 'o2'])
def test_cbc_proxy_one_2_many_create_and_send_invokes_function( def test_cbc_proxy_one_2_many_create_and_send_invokes_function(
mocker, mocker,
cbc_proxy_ee, cbc_proxy_client,
cbc_proxy_three,
description, description,
cbc, cbc,
expected_language, expected_language,
): ):
cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc)
identifier = 'my-identifier' identifier = 'my-identifier'
headline = 'my-headline' headline = 'my-headline'
@@ -141,9 +135,9 @@ def test_cbc_proxy_one_2_many_create_and_send_invokes_function(
assert payload['language'] == expected_language assert payload['language'] == expected_language
@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'three', 'o2'])
def test_cbc_proxy_one_2_many_cancel_invokes_function(mocker, cbc_proxy_ee, cbc_proxy_three, cbc): def test_cbc_proxy_one_2_many_cancel_invokes_function(mocker, cbc_proxy_client, cbc):
cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc)
identifier = 'my-identifier' identifier = 'my-identifier'
MockProviderMessage = namedtuple( MockProviderMessage = namedtuple(
@@ -316,7 +310,7 @@ def test_cbc_proxy_vodafone_cancel_invokes_function(mocker, cbc_proxy_vodafone):
assert payload['sent'] == sent assert payload['sent'] == sent
@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three', 'o2'])
def test_cbc_proxy_will_failover_to_second_lambda_if_function_error( def test_cbc_proxy_will_failover_to_second_lambda_if_function_error(
mocker, mocker,
cbc_proxy_client, cbc_proxy_client,
@@ -368,7 +362,7 @@ def test_cbc_proxy_will_failover_to_second_lambda_if_function_error(
] ]
@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three', 'o2'])
def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error( def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error(
mocker, mocker,
cbc_proxy_client, cbc_proxy_client,
@@ -415,7 +409,7 @@ def test_cbc_proxy_will_failover_to_second_lambda_if_invoke_error(
] ]
@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three', 'o2'])
def test_cbc_proxy_create_and_send_tries_failover_lambda_on_invoke_error_and_raises_if_both_invoke_error( def test_cbc_proxy_create_and_send_tries_failover_lambda_on_invoke_error_and_raises_if_both_invoke_error(
mocker, cbc_proxy_client, cbc mocker, cbc_proxy_client, cbc
): ):
@@ -458,7 +452,7 @@ def test_cbc_proxy_create_and_send_tries_failover_lambda_on_invoke_error_and_rai
] ]
@pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'vodafone', 'three', 'o2'])
def test_cbc_proxy_create_and_send_tries_failover_lambda_on_function_error_and_raises_if_both_function_error( def test_cbc_proxy_create_and_send_tries_failover_lambda_on_function_error_and_raises_if_both_function_error(
mocker, cbc_proxy_client, cbc mocker, cbc_proxy_client, cbc
): ):
@@ -538,9 +532,9 @@ def test_cbc_proxy_send_canary_invokes_function(mocker, cbc_proxy_client):
assert payload['identifier'] == identifier assert payload['identifier'] == identifier
@pytest.mark.parametrize('cbc', ['bt-ee', 'three']) @pytest.mark.parametrize('cbc', ['bt-ee', 'three', 'o2'])
def test_cbc_proxy_one_2_many_send_link_test_invokes_function(mocker, cbc_proxy_ee, cbc_proxy_three, cbc): def test_cbc_proxy_one_2_many_send_link_test_invokes_function(mocker, cbc_proxy_client, cbc):
cbc_proxy = cbc_proxy_ee if cbc == 'bt-ee' else cbc_proxy_three cbc_proxy = cbc_proxy_client.get_proxy('ee') if cbc == 'bt-ee' else cbc_proxy_client.get_proxy(cbc)
identifier = str(uuid.uuid4()) identifier = str(uuid.uuid4())