Skip to content

Commit f0fc16b

Browse files
authored
RedrivePolicy added (#2583)
Co-authored-by: Slava Senchenko <[email protected]>
1 parent 61b5a8f commit f0fc16b

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

samtranslator/model/eventsources/push.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import copy
22
import re
3+
from typing import Any, Dict, Optional
34

45
from samtranslator.metrics.method_decorator import cw_timer
56
from samtranslator.model import ResourceMacro, PropertyType
@@ -451,6 +452,7 @@ class SNS(PushEventSource):
451452
"Region": PropertyType(False, is_str()),
452453
"FilterPolicy": PropertyType(False, dict_of(is_str(), list_of(one_of(is_str(), is_type(dict))))),
453454
"SqsSubscription": PropertyType(False, one_of(is_type(bool), is_type(dict))),
455+
"RedrivePolicy": PropertyType(False, is_type(dict)),
454456
}
455457

456458
@cw_timer(prefix=FUNCTION_EVETSOURCE_METRIC_PREFIX) # type: ignore[no-untyped-call]
@@ -469,12 +471,13 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
469471

470472
# SNS -> Lambda
471473
if not self.SqsSubscription: # type: ignore[attr-defined]
472-
subscription = self._inject_subscription( # type: ignore[no-untyped-call]
474+
subscription = self._inject_subscription(
473475
"lambda",
474476
function.get_runtime_attr("arn"),
475477
self.Topic, # type: ignore[attr-defined]
476478
self.Region, # type: ignore[attr-defined]
477479
self.FilterPolicy, # type: ignore[attr-defined]
480+
self.RedrivePolicy, # type: ignore[attr-defined]
478481
function,
479482
)
480483
return [self._construct_permission(function, source_arn=self.Topic), subscription] # type: ignore[attr-defined, no-untyped-call]
@@ -487,8 +490,8 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
487490
queue_url = queue.get_runtime_attr("queue_url")
488491

489492
queue_policy = self._inject_sqs_queue_policy(self.Topic, queue_arn, queue_url, function) # type: ignore[attr-defined, no-untyped-call]
490-
subscription = self._inject_subscription( # type: ignore[no-untyped-call]
491-
"sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, function # type: ignore[attr-defined, attr-defined, attr-defined]
493+
subscription = self._inject_subscription(
494+
"sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, self.RedrivePolicy, function # type: ignore[attr-defined, attr-defined, attr-defined]
492495
)
493496
event_source = self._inject_sqs_event_source_mapping(function, role, queue_arn) # type: ignore[no-untyped-call]
494497

@@ -512,15 +515,26 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
512515
queue_policy = self._inject_sqs_queue_policy( # type: ignore[no-untyped-call]
513516
self.Topic, queue_arn, queue_url, function, queue_policy_logical_id # type: ignore[attr-defined]
514517
)
515-
subscription = self._inject_subscription("sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, function) # type: ignore[attr-defined, attr-defined, attr-defined, no-untyped-call]
518+
subscription = self._inject_subscription(
519+
"sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, self.RedrivePolicy, function # type: ignore[attr-defined, attr-defined, attr-defined]
520+
)
516521
event_source = self._inject_sqs_event_source_mapping(function, role, queue_arn, batch_size, enabled) # type: ignore[no-untyped-call]
517522

518523
resources = resources + event_source
519524
resources.append(queue_policy)
520525
resources.append(subscription)
521526
return resources
522527

523-
def _inject_subscription(self, protocol, endpoint, topic, region, filterPolicy, function): # type: ignore[no-untyped-def]
528+
def _inject_subscription(
529+
self,
530+
protocol: str,
531+
endpoint: str,
532+
topic: str,
533+
region: Optional[str],
534+
filterPolicy: Optional[Dict[str, Any]],
535+
redrivePolicy: Optional[Dict[str, Any]],
536+
function: Any,
537+
) -> SNSSubscription:
524538
subscription = SNSSubscription(self.logical_id, attributes=function.get_passthrough_resource_attributes())
525539
subscription.Protocol = protocol
526540
subscription.Endpoint = endpoint
@@ -532,6 +546,9 @@ def _inject_subscription(self, protocol, endpoint, topic, region, filterPolicy,
532546
if filterPolicy is not None:
533547
subscription.FilterPolicy = filterPolicy
534548

549+
if redrivePolicy is not None:
550+
subscription.RedrivePolicy = redrivePolicy
551+
535552
return subscription
536553

537554
def _inject_sqs_queue(self, function): # type: ignore[no-untyped-def]

samtranslator/model/sns.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class SNSSubscription(Resource):
1111
"TopicArn": PropertyType(True, is_str()),
1212
"Region": PropertyType(False, is_str()),
1313
"FilterPolicy": PropertyType(False, is_type(dict)),
14+
"RedrivePolicy": PropertyType(False, is_type(dict)),
1415
}
1516

1617

tests/model/eventsources/test_sns_event_source.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def test_to_cloudformation_returns_permission_and_subscription_resources(self):
2929
self.assertEqual(subscription.Endpoint, "arn:aws:lambda:mock")
3030
self.assertIsNone(subscription.Region)
3131
self.assertIsNone(subscription.FilterPolicy)
32+
self.assertIsNone(subscription.RedrivePolicy)
3233

3334
def test_to_cloudformation_passes_the_region(self):
3435
region = "us-west-2"
@@ -54,6 +55,16 @@ def test_to_cloudformation_passes_the_filter_policy(self):
5455
subscription = resources[1]
5556
self.assertEqual(subscription.FilterPolicy, filterPolicy)
5657

58+
def test_to_cloudformation_passes_the_redrive_policy(self):
59+
redrive_policy = {"deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"}
60+
self.sns_event_source.RedrivePolicy = redrive_policy
61+
62+
resources = self.sns_event_source.to_cloudformation(function=self.function)
63+
self.assertEqual(len(resources), 2)
64+
self.assertEqual(resources[1].resource_type, "AWS::SNS::Subscription")
65+
subscription = resources[1]
66+
self.assertEqual(subscription.RedrivePolicy, redrive_policy)
67+
5768
def test_to_cloudformation_throws_when_no_function(self):
5869
self.assertRaises(TypeError, self.sns_event_source.to_cloudformation)
5970

@@ -77,3 +88,4 @@ def test_to_cloudformation_when_sqs_subscription_disable(self):
7788
self.assertEqual(subscription.Endpoint, "arn:aws:lambda:mock")
7889
self.assertIsNone(subscription.Region)
7990
self.assertIsNone(subscription.FilterPolicy)
91+
self.assertIsNone(subscription.RedrivePolicy)

0 commit comments

Comments
 (0)