Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4595c44

Browse files
authored
support filtering of events by pattern using eventPattern (#3144)
1 parent 2c622a7 commit 4595c44

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

‎localstack/services/events/events_starter.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ def filter_event_with_target_input_path(target, event):
5151
return event
5252

5353

54+
def filter_event_based_on_event_format(self, rule, event):
55+
rule_information = self.events_backend.describe_rule(rule)
56+
if rule_information.event_pattern:
57+
event_pattern = json.loads(rule_information.event_pattern)
58+
for key, value in event_pattern.items():
59+
if event.get(key.lower()) and event.get(key.lower()) not in value and event.get(key) != value:
60+
return False
61+
return True
62+
63+
5464
def process_events(event, targets):
5565
for target in targets:
5666
arn = target['Arn']
@@ -133,10 +143,6 @@ def events_handler_put_events(self):
133143

134144
rules = EVENT_RULES.get(event_bus, [])
135145

136-
targets = []
137-
for rule in rules:
138-
targets.extend(self.events_backend.list_targets_by_rule(rule)['Targets'])
139-
140146
formatted_event = {
141147
'version': '0',
142148
'id': event_envelope['uuid'],
@@ -148,6 +154,12 @@ def events_handler_put_events(self):
148154
'resources': event.get('Resources', []),
149155
'detail': json.loads(event.get('Detail')),
150156
}
157+
158+
targets = []
159+
for rule in rules:
160+
if filter_event_based_on_event_format(self, rule, formatted_event):
161+
targets.extend(self.events_backend.list_targets_by_rule(rule)['Targets'])
162+
151163
# process event
152164
process_events(formatted_event, targets)
153165

‎tests/integration/test_events.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,12 +537,24 @@ def test_put_events_with_input_path(self):
537537

538538
def get_message(queue_url):
539539
resp = sqs_client.receive_message(QueueUrl=queue_url)
540-
return resp['Messages']
540+
return resp.get('Messages')
541541

542542
messages = retry(get_message, retries=3, sleep=1, queue_url=queue_url)
543543
self.assertEqual(len(messages), 1)
544544
self.assertEqual(json.loads(messages[0].get('Body')), EVENT_DETAIL)
545545

546+
self.events_client.put_events(
547+
Entries=[{
548+
'EventBusName': TEST_EVENT_BUS_NAME,
549+
'Source': 'dummySource',
550+
'DetailType': TEST_EVENT_PATTERN['DetailType'],
551+
'Detail': json.dumps(TEST_EVENT_PATTERN['Detail'])
552+
}]
553+
)
554+
555+
messages = retry(get_message, retries=3, sleep=1, queue_url=queue_url)
556+
self.assertEqual(messages, None)
557+
546558
# clean up
547559
sqs_client.delete_queue(QueueUrl=queue_url)
548560

0 commit comments

Comments
 (0)