Skip to content

Commit cd17985

Browse files
mustafa-sadiqmustafa-sadiq-icfhoffa
authored
Feature: SNS Event FilterPolicyScope attribute (#2988)
Co-authored-by: Mustafa Sadiq <[email protected]> Co-authored-by: Christoffer Rehn <[email protected]>
1 parent 5b1a9ad commit cd17985

29 files changed

+69
-3
lines changed

integration/combination/test_function_with_sns.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,4 @@ def test_function_with_sns_intrinsics(self):
5151
subscription_arn = subscription["SubscriptionArn"]
5252
subscription_attributes = sns_client.get_subscription_attributes(SubscriptionArn=subscription_arn)
5353
self.assertEqual(subscription_attributes["Attributes"]["FilterPolicy"], '{"price_usd":[{"numeric":["<",100]}]}')
54+
self.assertEqual(subscription_attributes["Attributes"]["FilterPolicyScope"], "MessageAttributes")

integration/resources/templates/combination/function_with_sns_intrinsics.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Resources:
3030
- numeric:
3131
- <
3232
- 100
33+
FilterPolicyScope: MessageAttributes
3334
Region:
3435
Ref: AWS::Region
3536
SqsSubscription: true

samtranslator/internal/schema_source/aws_serverless_function.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ class SqsSubscription(BaseModel):
138138

139139
class SNSEventProperties(BaseModel):
140140
FilterPolicy: Optional[PassThroughProp] = snseventproperties("FilterPolicy")
141+
FilterPolicyScope: Optional[PassThroughProp] # TODO: add documentation
141142
Region: Optional[PassThroughProp] = snseventproperties("Region")
142143
SqsSubscription: Optional[Union[bool, SqsSubscription]] = snseventproperties("SqsSubscription")
143144
Topic: PassThroughProp = snseventproperties("Topic")

samtranslator/model/eventsources/push.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from samtranslator.intrinsics.resolver import IntrinsicsResolver
77
from samtranslator.metrics.method_decorator import cw_timer
8-
from samtranslator.model import PropertyType, ResourceMacro
8+
from samtranslator.model import PassThroughProperty, PropertyType, ResourceMacro
99
from samtranslator.model.cognito import CognitoUserPool
1010
from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils
1111
from samtranslator.model.events import EventsRule, generate_valid_target_id
@@ -486,13 +486,15 @@ class SNS(PushEventSource):
486486
"Topic": PropertyType(True, IS_STR),
487487
"Region": PropertyType(False, IS_STR),
488488
"FilterPolicy": PropertyType(False, dict_of(IS_STR, list_of(one_of(IS_STR, IS_DICT)))),
489+
"FilterPolicyScope": PassThroughProperty(False),
489490
"SqsSubscription": PropertyType(False, one_of(IS_BOOL, IS_DICT)),
490491
"RedrivePolicy": PropertyType(False, IS_DICT),
491492
}
492493

493494
Topic: str
494495
Region: Optional[str]
495496
FilterPolicy: Optional[Dict[str, Any]]
497+
FilterPolicyScope: Optional[str]
496498
SqsSubscription: Optional[Any]
497499
RedrivePolicy: Optional[Dict[str, Any]]
498500

@@ -518,6 +520,7 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
518520
self.Topic,
519521
self.Region,
520522
self.FilterPolicy,
523+
self.FilterPolicyScope,
521524
self.RedrivePolicy,
522525
function,
523526
)
@@ -532,7 +535,14 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
532535

533536
queue_policy = self._inject_sqs_queue_policy(self.Topic, queue_arn, queue_url, function) # type: ignore[no-untyped-call]
534537
subscription = self._inject_subscription(
535-
"sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, self.RedrivePolicy, function
538+
"sqs",
539+
queue_arn,
540+
self.Topic,
541+
self.Region,
542+
self.FilterPolicy,
543+
self.FilterPolicyScope,
544+
self.RedrivePolicy,
545+
function,
536546
)
537547
event_source = self._inject_sqs_event_source_mapping(function, role, queue_arn) # type: ignore[no-untyped-call]
538548

@@ -560,7 +570,14 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
560570
self.Topic, queue_arn, queue_url, function, queue_policy_logical_id
561571
)
562572
subscription = self._inject_subscription(
563-
"sqs", queue_arn, self.Topic, self.Region, self.FilterPolicy, self.RedrivePolicy, function
573+
"sqs",
574+
queue_arn,
575+
self.Topic,
576+
self.Region,
577+
self.FilterPolicy,
578+
self.FilterPolicyScope,
579+
self.RedrivePolicy,
580+
function,
564581
)
565582
event_source = self._inject_sqs_event_source_mapping(function, role, queue_arn, batch_size, enabled) # type: ignore[no-untyped-call]
566583

@@ -576,6 +593,7 @@ def _inject_subscription( # noqa: too-many-arguments
576593
topic: str,
577594
region: Optional[str],
578595
filterPolicy: Optional[Dict[str, Any]],
596+
filterPolicyScope: Optional[str],
579597
redrivePolicy: Optional[Dict[str, Any]],
580598
function: Any,
581599
) -> SNSSubscription:
@@ -590,6 +608,9 @@ def _inject_subscription( # noqa: too-many-arguments
590608
if filterPolicy is not None:
591609
subscription.FilterPolicy = filterPolicy
592610

611+
if filterPolicyScope is not None:
612+
subscription.FilterPolicyScope = filterPolicyScope
613+
593614
if redrivePolicy is not None:
594615
subscription.RedrivePolicy = redrivePolicy
595616

samtranslator/model/sns.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class SNSSubscription(Resource):
1010
"TopicArn": GeneratedProperty(),
1111
"Region": GeneratedProperty(),
1212
"FilterPolicy": GeneratedProperty(),
13+
"FilterPolicyScope": GeneratedProperty(),
1314
"RedrivePolicy": GeneratedProperty(),
1415
}
1516

samtranslator/schema/schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196572,6 +196572,9 @@
196572196572
"markdownDescription": "The filter policy JSON assigned to the subscription\\. For more information, see [GetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html) in the Amazon Simple Notification Service API Reference\\. \n*Type*: [SnsFilterPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) \n*Required*: No \n*AWS CloudFormation compatibility*: This property is passed directly to the [`FilterPolicy`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) property of an `AWS::SNS::Subscription` resource\\.",
196573196573
"title": "FilterPolicy"
196574196574
},
196575+
"FilterPolicyScope": {
196576+
"$ref": "#/definitions/PassThroughProp"
196577+
},
196575196578
"Region": {
196576196579
"allOf": [
196577196580
{

samtranslator/validator/sam_schema/schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,9 @@
783783
},
784784
"FilterPolicy": {
785785
"type": "object"
786+
},
787+
"FilterPolicyScope": {
788+
"type": "string"
786789
}
787790
},
788791
"required": [

schema_source/sam.schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,9 @@
24702470
"markdownDescription": "The filter policy JSON assigned to the subscription\\. For more information, see [GetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html) in the Amazon Simple Notification Service API Reference\\. \n*Type*: [SnsFilterPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) \n*Required*: No \n*AWS CloudFormation compatibility*: This property is passed directly to the [`FilterPolicy`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy) property of an `AWS::SNS::Subscription` resource\\.",
24712471
"title": "FilterPolicy"
24722472
},
2473+
"FilterPolicyScope": {
2474+
"$ref": "#/definitions/PassThroughProp"
2475+
},
24732476
"Region": {
24742477
"allOf": [
24752478
{

tests/model/eventsources/test_sns_event_source.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def test_to_cloudformation_returns_permission_and_subscription_resources(self):
3030
self.assertEqual(subscription.Endpoint, "arn:aws:lambda:mock")
3131
self.assertIsNone(subscription.Region)
3232
self.assertIsNone(subscription.FilterPolicy)
33+
self.assertIsNone(subscription.FilterPolicyScope)
3334
self.assertIsNone(subscription.RedrivePolicy)
3435

3536
def test_to_cloudformation_passes_the_region(self):
@@ -56,6 +57,16 @@ def test_to_cloudformation_passes_the_filter_policy(self):
5657
subscription = resources[1]
5758
self.assertEqual(subscription.FilterPolicy, filterPolicy)
5859

60+
def test_to_cloudformation_passes_the_filter_policy_scope(self):
61+
filterPolicyScope = "MessageAttributes"
62+
self.sns_event_source.FilterPolicyScope = filterPolicyScope
63+
64+
resources = self.sns_event_source.to_cloudformation(function=self.function)
65+
self.assertEqual(len(resources), 2)
66+
self.assertEqual(resources[1].resource_type, "AWS::SNS::Subscription")
67+
subscription = resources[1]
68+
self.assertEqual(subscription.FilterPolicyScope, filterPolicyScope)
69+
5970
def test_to_cloudformation_passes_the_redrive_policy(self):
6071
redrive_policy = {"deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"}
6172
self.sns_event_source.RedrivePolicy = redrive_policy
@@ -89,4 +100,5 @@ def test_to_cloudformation_when_sqs_subscription_disable(self):
89100
self.assertEqual(subscription.Endpoint, "arn:aws:lambda:mock")
90101
self.assertIsNone(subscription.Region)
91102
self.assertIsNone(subscription.FilterPolicy)
103+
self.assertIsNone(subscription.FilterPolicyScope)
92104
self.assertIsNone(subscription.RedrivePolicy)

tests/translator/input/function_with_sns_event_source_all_parameters.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ Resources:
2525
- numeric:
2626
- '>='
2727
- 100
28+
FilterPolicyScope: MessageAttributes

0 commit comments

Comments
 (0)