Skip to content

Commit d6dc913

Browse files
committed
CCM-12616: rename client to sender
1 parent 1054505 commit d6dc913

10 files changed

Lines changed: 176 additions & 164 deletions

File tree

infrastructure/terraform/components/dl/module_lambda_mesh_download.tf

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,19 @@ module "mesh_download" {
3737

3838
lambda_env_vars = {
3939
# Required by Config
40-
EVENT_PUBLISHER_EVENT_BUS_ARN = aws_cloudwatch_event_bus.main.arn
41-
EVENT_PUBLISHER_DLQ_URL = module.sqs_event_publisher_dlq.queue_url
42-
ENVIRONMENT = var.environment
43-
DEPLOYMENT = var.deployment
44-
PII_BUCKET = module.s3bucket_pii_data.bucket
40+
SSM_PREFIX = "dl/${var.environment}/mesh"
41+
EVENT_PUBLISHER_EVENT_BUS_ARN = aws_cloudwatch_event_bus.main.arn
42+
EVENT_PUBLISHER_DLQ_URL = module.sqs_event_publisher_dlq.queue_url
43+
ENVIRONMENT = var.environment
44+
PII_BUCKET = module.s3bucket_pii_data.bucket
45+
CERTIFICATE_EXPIRY_METRIC_NAME = "mesh-download-client-certificate-near-expiry"
46+
CERTIFICATE_EXPIRY_METRIC_NAMESPACE = "dl-mesh-download"
47+
POLLING_METRIC_NAME = "mesh-download-successful-polls"
48+
POLLING_METRIC_NAMESPACE = "dl-mesh-download"
4549

4650
# Optional
47-
USE_MESH_MOCK = var.enable_mock_mesh ? "true" : "false"
48-
MOCK_MESH_BUCKET = module.s3bucket_non_pii_data.bucket
51+
USE_MESH_MOCK = var.enable_mock_mesh ? "true" : "false"
52+
MOCK_MESH_BUCKET = module.s3bucket_non_pii_data.bucket
4953
}
5054

5155
}

infrastructure/terraform/components/dl/module_lambda_mesh_poll.tf

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,16 @@ module "mesh_poll" {
3838

3939
lambda_env_vars = {
4040
# Required by Config
41-
SSM_PREFIX = var.ssm_prefix
42-
SSM_CLIENTS_PARAMETER_PATH = var.ssm_clients_parameter_path
43-
INBOX_WORKFLOW_ID = var.inbox_workflow_id
44-
OUTBOX_WORKFLOW_ID = var.outbox_workflow_id
45-
MAXIMUM_RUNTIME_MILLISECONDS = var.maximum_runtime_milliseconds
41+
SSM_PREFIX = "dl/${var.environment}/mesh"
42+
SSM_SENDERS_PARAMETER_PATH = "dl/${var.environment}/mesh/senders"
43+
MAXIMUM_RUNTIME_MILLISECONDS = "240000" # 4 minutes (Lambda has 5 min timeout)
4644
ENVIRONMENT = var.environment
4745
EVENT_PUBLISHER_EVENT_BUS_ARN = aws_cloudwatch_event_bus.main.arn
48-
CERTIFICATE_EXPIRY_METRIC_NAME = var.certificate_expiry_metric_name
49-
CERTIFICATE_EXPIRY_METRIC_NAMESPACE = var.certificate_expiry_metric_namespace
50-
POLLING_METRIC_NAME = var.polling_metric_name
51-
POLLING_METRIC_NAMESPACE = var.polling_metric_namespace
46+
EVENT_PUBLISHER_DLQ_URL = module.sqs_event_publisher_dlq.queue_url
47+
CERTIFICATE_EXPIRY_METRIC_NAME = "mesh-poll-client-certificate-near-expiry"
48+
CERTIFICATE_EXPIRY_METRIC_NAMESPACE = "dl-mesh-poll"
49+
POLLING_METRIC_NAME = "mesh-poll-successful-polls"
50+
POLLING_METRIC_NAMESPACE = "dl-mesh-poll"
5251

5352
# Optional
5453
USE_MESH_MOCK = var.enable_mock_mesh ? "true" : "false"
@@ -111,4 +110,17 @@ data "aws_iam_policy_document" "mesh_poll_lambda" {
111110
module.kms.key_arn,
112111
]
113112
}
113+
114+
statement {
115+
sid = "EventBridgePermissions"
116+
effect = "Allow"
117+
118+
actions = [
119+
"events:PutEvents",
120+
]
121+
122+
resources = [
123+
aws_cloudwatch_event_bus.main.arn,
124+
]
125+
}
114126
}

lambdas/mesh-poll/src/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
from .config import *
99
from .handler import *
1010
from .processor import *
11-
from .client_lookup import *
11+
from .sender_lookup import *
1212
from .errors import *

lambdas/mesh-poll/src/__tests__/test_handler.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def setup_mocks():
1818

1919
mock_ssm = Mock()
2020

21-
mock_client_lookup = Mock()
21+
mock_sender_lookup = Mock()
2222

2323
mock_processor = Mock()
2424
mock_processor.process_messages = Mock()
@@ -27,7 +27,7 @@ def setup_mocks():
2727
mock_context,
2828
mock_config,
2929
mock_ssm,
30-
mock_client_lookup,
30+
mock_sender_lookup,
3131
mock_processor
3232
)
3333

@@ -36,21 +36,21 @@ class TestHandler:
3636
"""Test suite for Lambda handler"""
3737

3838
@patch('src.handler.Config')
39-
@patch('src.handler.ClientLookup')
39+
@patch('src.handler.SenderLookup')
4040
@patch('src.handler.MeshMessageProcessor')
4141
@patch('src.handler.client')
42-
def test_handler_success(self, mock_boto_client, mock_processor_class, mock_client_lookup_class, mock_config_class):
42+
def test_handler_success(self, mock_boto_client, mock_processor_class, mock_sender_lookup_class, mock_config_class):
4343
"""Test successful handler execution"""
4444
from src.handler import handler
4545

4646
(mock_context, mock_config, mock_ssm,
47-
mock_client_lookup, mock_processor) = setup_mocks()
47+
mock_sender_lookup, mock_processor) = setup_mocks()
4848

4949
# Wire up the mocks
5050
mock_config_class.return_value.__enter__.return_value = mock_config
5151
mock_config_class.return_value.__exit__ = Mock(return_value=None)
5252
mock_boto_client.return_value = mock_ssm
53-
mock_client_lookup_class.return_value = mock_client_lookup
53+
mock_sender_lookup_class.return_value = mock_sender_lookup
5454
mock_processor_class.return_value = mock_processor
5555

5656
# Execute handler
@@ -63,17 +63,17 @@ def test_handler_success(self, mock_boto_client, mock_processor_class, mock_clie
6363
# Verify SSM client was created
6464
mock_boto_client.assert_called_once_with('ssm')
6565

66-
# Verify ClientLookup was created with correct parameters
67-
mock_client_lookup_class.assert_called_once()
68-
call_args = mock_client_lookup_class.call_args
66+
# Verify SenderLookup was created with correct parameters
67+
mock_sender_lookup_class.assert_called_once()
68+
call_args = mock_sender_lookup_class.call_args
6969
assert call_args[0][0] == mock_ssm
7070
assert call_args[0][1] == mock_config
7171

7272
# Verify MeshMessageProcessor was created with correct parameters
7373
mock_processor_class.assert_called_once()
7474
call_kwargs = mock_processor_class.call_args[1]
7575
assert call_kwargs['config'] == mock_config
76-
assert call_kwargs['client_lookup'] == mock_client_lookup
76+
assert call_kwargs['sender_lookup'] == mock_sender_lookup
7777
assert call_kwargs['mesh_client'] == mock_config.mesh_client
7878
assert call_kwargs['get_remaining_time_in_millis'] == mock_context.get_remaining_time_in_millis
7979
assert call_kwargs['polling_metric'] == mock_config.polling_metric
@@ -82,15 +82,15 @@ def test_handler_success(self, mock_boto_client, mock_processor_class, mock_clie
8282
mock_processor.process_messages.assert_called_once()
8383

8484
@patch('src.handler.Config')
85-
@patch('src.handler.ClientLookup')
85+
@patch('src.handler.SenderLookup')
8686
@patch('src.handler.MeshMessageProcessor')
8787
@patch('src.handler.client')
88-
def test_handler_config_cleanup_on_exception(self, mock_boto_client, mock_processor_class, mock_client_lookup_class, mock_config_class):
88+
def test_handler_config_cleanup_on_exception(self, mock_boto_client, mock_processor_class, mock_sender_lookup_class, mock_config_class):
8989
"""Test that Config context manager cleanup is called even on exception"""
9090
from src.handler import handler
9191

9292
(mock_context, mock_config, mock_ssm,
93-
mock_client_lookup, mock_processor) = setup_mocks()
93+
mock_sender_lookup, mock_processor) = setup_mocks()
9494

9595
# Make processor raise an exception
9696
test_exception = RuntimeError("Test error")
@@ -100,7 +100,7 @@ def test_handler_config_cleanup_on_exception(self, mock_boto_client, mock_proces
100100
mock_exit = Mock(return_value=None)
101101
mock_config_class.return_value.__exit__ = mock_exit
102102
mock_boto_client.return_value = mock_ssm
103-
mock_client_lookup_class.return_value = mock_client_lookup
103+
mock_sender_lookup_class.return_value = mock_sender_lookup
104104
mock_processor_class.return_value = mock_processor
105105

106106
# Handler should raise the exception
@@ -115,15 +115,15 @@ def test_handler_config_cleanup_on_exception(self, mock_boto_client, mock_proces
115115
assert call_args[1] == test_exception
116116

117117
@patch('src.handler.Config')
118-
@patch('src.handler.ClientLookup')
118+
@patch('src.handler.SenderLookup')
119119
@patch('src.handler.MeshMessageProcessor')
120120
@patch('src.handler.client')
121-
def test_handler_passes_correct_parameters_to_processor(self, mock_boto_client, mock_processor_class, mock_client_lookup_class, mock_config_class):
121+
def test_handler_passes_correct_parameters_to_processor(self, mock_boto_client, mock_processor_class, mock_sender_lookup_class, mock_config_class):
122122
"""Test that handler passes all required parameters to MeshMessageProcessor"""
123123
from src.handler import handler
124124

125125
(mock_context, mock_config, mock_ssm,
126-
mock_client_lookup, mock_processor) = setup_mocks()
126+
mock_sender_lookup, mock_processor) = setup_mocks()
127127

128128
mock_remaining_time_func = Mock(return_value=250000)
129129
mock_context.get_remaining_time_in_millis = mock_remaining_time_func
@@ -135,7 +135,7 @@ def test_handler_passes_correct_parameters_to_processor(self, mock_boto_client,
135135
mock_config_class.return_value.__enter__.return_value = mock_config
136136
mock_config_class.return_value.__exit__ = Mock(return_value=None)
137137
mock_boto_client.return_value = mock_ssm
138-
mock_client_lookup_class.return_value = mock_client_lookup
138+
mock_sender_lookup_class.return_value = mock_sender_lookup
139139
mock_processor_class.return_value = mock_processor
140140

141141
handler(None, mock_context)
@@ -144,7 +144,7 @@ def test_handler_passes_correct_parameters_to_processor(self, mock_boto_client,
144144
call_kwargs = mock_processor_class.call_args[1]
145145

146146
assert call_kwargs['config'] == mock_config
147-
assert call_kwargs['client_lookup'] == mock_client_lookup
147+
assert call_kwargs['sender_lookup'] == mock_sender_lookup
148148
assert call_kwargs['mesh_client'] == mock_mesh_client
149149
assert call_kwargs['get_remaining_time_in_millis'] == mock_remaining_time_func
150150
assert call_kwargs['polling_metric'] == mock_polling_metric

lambdas/mesh-poll/src/__tests__/test_processor.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ def setup_mocks():
1616
config.maximum_runtime_milliseconds = "500"
1717
config.ssm_prefix = "/dl/test/mesh"
1818

19-
client_lookup = Mock()
20-
client_lookup.is_valid_sender.return_value = True # Default to valid sender
19+
sender_lookup = Mock()
20+
sender_lookup.is_valid_sender.return_value = True # Default to valid sender
2121

2222
mesh_client = Mock(spec=MeshClient)
2323

@@ -27,7 +27,7 @@ def setup_mocks():
2727

2828
return (
2929
config,
30-
client_lookup,
30+
sender_lookup,
3131
mesh_client,
3232
log,
3333
polling_metric
@@ -67,7 +67,7 @@ class TestMeshMessageProcessor:
6767

6868
def test_process_messages_iterates_through_inbox(self, mock_event_publisher_class, mock_getenv):
6969
"""Test that processor iterates through all messages in MESH inbox"""
70-
(config, client_lookup, mesh_client, log, polling_metric) = setup_mocks()
70+
(config, sender_lookup, mesh_client, log, polling_metric) = setup_mocks()
7171
message1 = setup_message_data("1")
7272
message2 = setup_message_data("2")
7373

@@ -79,7 +79,7 @@ def test_process_messages_iterates_through_inbox(self, mock_event_publisher_clas
7979

8080
processor = MeshMessageProcessor(
8181
config=config,
82-
client_lookup=client_lookup,
82+
sender_lookup=sender_lookup,
8383
mesh_client=mesh_client,
8484
get_remaining_time_in_millis=get_remaining_time_in_millis,
8585
log=log,
@@ -88,7 +88,7 @@ def test_process_messages_iterates_through_inbox(self, mock_event_publisher_clas
8888

8989
mesh_client.iterate_all_messages.side_effect = [
9090
[message1, message2], []]
91-
client_lookup.is_valid_sender.return_value = True
91+
sender_lookup.is_valid_sender.return_value = True
9292

9393
processor.process_messages()
9494

@@ -98,7 +98,7 @@ def test_process_messages_iterates_through_inbox(self, mock_event_publisher_clas
9898

9999
def test_process_messages_stops_near_timeout(self, mock_event_publisher_class, mock_getenv):
100100
"""Test that processor stops processing when near timeout"""
101-
(config, client_lookup, mesh_client, log, polling_metric) = setup_mocks()
101+
(config, sender_lookup, mesh_client, log, polling_metric) = setup_mocks()
102102
message1 = setup_message_data("1")
103103

104104
mock_getenv.side_effect = lambda key, default='': {
@@ -108,7 +108,7 @@ def test_process_messages_stops_near_timeout(self, mock_event_publisher_class, m
108108

109109
processor = MeshMessageProcessor(
110110
config=config,
111-
client_lookup=client_lookup,
111+
sender_lookup=sender_lookup,
112112
mesh_client=mesh_client,
113113
get_remaining_time_in_millis=get_remaining_time_in_millis_near_timeout,
114114
log=log,
@@ -119,12 +119,12 @@ def test_process_messages_stops_near_timeout(self, mock_event_publisher_class, m
119119

120120
processor.process_messages()
121121

122-
client_lookup.is_valid_sender.assert_not_called()
122+
sender_lookup.is_valid_sender.assert_not_called()
123123
polling_metric.record.assert_called_once()
124124

125125
def test_process_message_with_valid_sender(self, mock_event_publisher_class, mock_getenv):
126126
"""Test processing a single message from valid sender"""
127-
(config, client_lookup, mesh_client, log, polling_metric) = setup_mocks()
127+
(config, sender_lookup, mesh_client, log, polling_metric) = setup_mocks()
128128
message = setup_message_data("1")
129129

130130
mock_getenv.side_effect = lambda key, default='': {
@@ -138,25 +138,25 @@ def test_process_message_with_valid_sender(self, mock_event_publisher_class, moc
138138

139139
processor = MeshMessageProcessor(
140140
config=config,
141-
client_lookup=client_lookup,
141+
sender_lookup=sender_lookup,
142142
mesh_client=mesh_client,
143143
get_remaining_time_in_millis=get_remaining_time_in_millis,
144144
log=log,
145145
polling_metric=polling_metric
146146
)
147147

148-
client_lookup.is_valid_sender.return_value = True
148+
sender_lookup.is_valid_sender.return_value = True
149149

150150
processor.process_message(message)
151151

152152
mesh_client.handshake.assert_called_once()
153-
client_lookup.is_valid_sender.assert_called_once_with(message.sender)
153+
sender_lookup.is_valid_sender.assert_called_once_with(message.sender)
154154
mock_event_publisher.send_events.assert_called_once()
155155
message.acknowledge.assert_not_called() # Only acknowledged on auth error
156156

157157
def test_process_message_with_unknown_sender(self, mock_event_publisher_class, mock_getenv):
158158
"""Test that messages from unknown senders are rejected silently"""
159-
(config, client_lookup, mesh_client, log, polling_metric) = setup_mocks()
159+
(config, sender_lookup, mesh_client, log, polling_metric) = setup_mocks()
160160
message = setup_message_data("1")
161161

162162
mock_getenv.side_effect = lambda key, default='': {
@@ -166,24 +166,24 @@ def test_process_message_with_unknown_sender(self, mock_event_publisher_class, m
166166

167167
processor = MeshMessageProcessor(
168168
config=config,
169-
client_lookup=client_lookup,
169+
sender_lookup=sender_lookup,
170170
mesh_client=mesh_client,
171171
get_remaining_time_in_millis=get_remaining_time_in_millis,
172172
log=log,
173173
polling_metric=polling_metric
174174
)
175175

176176
# Invalid sender
177-
client_lookup.is_valid_sender.return_value = False
177+
sender_lookup.is_valid_sender.return_value = False
178178

179179
processor.process_message(message)
180180

181-
client_lookup.is_valid_sender.assert_called_once_with(message.sender)
181+
sender_lookup.is_valid_sender.assert_called_once_with(message.sender)
182182
message.acknowledge.assert_called_once()
183183

184184
def test_process_messages_across_multiple_iterations(self, mock_event_publisher_class, mock_getenv):
185185
"""Test that processor continues polling until no messages remain"""
186-
(config, client_lookup, mesh_client, log, polling_metric) = setup_mocks()
186+
(config, sender_lookup, mesh_client, log, polling_metric) = setup_mocks()
187187
message1 = setup_message_data("1")
188188
message2 = setup_message_data("2")
189189
message3 = setup_message_data("3")
@@ -195,7 +195,7 @@ def test_process_messages_across_multiple_iterations(self, mock_event_publisher_
195195

196196
processor = MeshMessageProcessor(
197197
config=config,
198-
client_lookup=client_lookup,
198+
sender_lookup=sender_lookup,
199199
mesh_client=mesh_client,
200200
get_remaining_time_in_millis=get_remaining_time_in_millis,
201201
log=log,
@@ -207,11 +207,11 @@ def test_process_messages_across_multiple_iterations(self, mock_event_publisher_
207207
[message3], # Second iteration
208208
[] # Third iteration - empty, stops
209209
]
210-
client_lookup.is_valid_sender.return_value = True
210+
sender_lookup.is_valid_sender.return_value = True
211211

212212
processor.process_messages()
213213

214214
mesh_client.handshake.assert_called_once()
215215
assert mesh_client.iterate_all_messages.call_count == 3
216-
assert client_lookup.is_valid_sender.call_count == 3
216+
assert sender_lookup.is_valid_sender.call_count == 3
217217
polling_metric.record.assert_called_once()

0 commit comments

Comments
 (0)