localstack-core 4.3.1.dev72__py3-none-any.whl → 4.3.1.dev74__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +17 -2
  2. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +36 -42
  3. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +52 -23
  4. localstack/services/cloudformation/v2/entities.py +1 -0
  5. localstack/services/lambda_/event_source_mapping/esm_event_processor.py +2 -0
  6. localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +2 -0
  7. localstack/services/lambda_/event_source_mapping/pollers/sqs_poller.py +12 -8
  8. localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +42 -27
  9. localstack/services/lambda_/provider.py +2 -0
  10. localstack/version.py +2 -2
  11. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/METADATA +1 -1
  12. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/RECORD +20 -20
  13. localstack_core-4.3.1.dev74.dist-info/plux.json +1 -0
  14. localstack_core-4.3.1.dev72.dist-info/plux.json +0 -1
  15. {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack +0 -0
  16. {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack-supervisor +0 -0
  17. {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack.bat +0 -0
  18. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/WHEEL +0 -0
  19. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/entry_points.txt +0 -0
  20. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/licenses/LICENSE.txt +0 -0
  21. {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/top_level.txt +0 -0
@@ -24,8 +24,15 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
24
24
  _include_property_values: Final[bool]
25
25
  _changes: Final[cfn_api.Changes]
26
26
 
27
- def __init__(self, node_template: NodeTemplate, include_property_values: bool):
28
- super().__init__(node_template=node_template)
27
+ def __init__(
28
+ self,
29
+ node_template: NodeTemplate,
30
+ before_resolved_resources: dict,
31
+ include_property_values: bool,
32
+ ):
33
+ super().__init__(
34
+ node_template=node_template, before_resolved_resources=before_resolved_resources
35
+ )
29
36
  self._include_property_values = include_property_values
30
37
  self._changes = list()
31
38
 
@@ -79,6 +86,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
79
86
  self,
80
87
  logical_id: str,
81
88
  type_: str,
89
+ physical_id: Optional[str],
82
90
  before_properties: Optional[PreprocProperties],
83
91
  after_properties: Optional[PreprocProperties],
84
92
  ) -> None:
@@ -92,6 +100,8 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
92
100
  resource_change["Action"] = action
93
101
  resource_change["LogicalResourceId"] = logical_id
94
102
  resource_change["ResourceType"] = type_
103
+ if physical_id:
104
+ resource_change["PhysicalResourceId"] = physical_id
95
105
  if self._include_property_values and before_properties is not None:
96
106
  before_context_properties = {PropertiesKey: before_properties.properties}
97
107
  before_context_properties_json_str = json.dumps(before_context_properties)
@@ -116,6 +126,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
116
126
  # Register a Modified if changed.
117
127
  self._register_resource_change(
118
128
  logical_id=name,
129
+ physical_id=before.physical_resource_id,
119
130
  type_=before.resource_type,
120
131
  before_properties=before.properties,
121
132
  after_properties=after.properties,
@@ -126,6 +137,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
126
137
  # Register a Removed for the previous type.
127
138
  self._register_resource_change(
128
139
  logical_id=name,
140
+ physical_id=before.physical_resource_id,
129
141
  type_=before.resource_type,
130
142
  before_properties=before.properties,
131
143
  after_properties=None,
@@ -133,6 +145,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
133
145
  # Register a Create for the next type.
134
146
  self._register_resource_change(
135
147
  logical_id=name,
148
+ physical_id=None,
136
149
  type_=after.resource_type,
137
150
  before_properties=None,
138
151
  after_properties=after.properties,
@@ -141,6 +154,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
141
154
  # Case: removal
142
155
  self._register_resource_change(
143
156
  logical_id=name,
157
+ physical_id=before.physical_resource_id,
144
158
  type_=before.resource_type,
145
159
  before_properties=before.properties,
146
160
  after_properties=None,
@@ -149,6 +163,7 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
149
163
  # Case: addition
150
164
  self._register_resource_change(
151
165
  logical_id=name,
166
+ physical_id=None,
152
167
  type_=after.resource_type,
153
168
  before_properties=None,
154
169
  after_properties=after.properties,
@@ -1,7 +1,7 @@
1
1
  import copy
2
2
  import logging
3
3
  import uuid
4
- from typing import Any, Final, Optional
4
+ from typing import Final, Optional
5
5
 
6
6
  from localstack.aws.api.cloudformation import ChangeAction, StackStatus
7
7
  from localstack.constants import INTERNAL_AWS_SECRET_ACCESS_KEY
@@ -28,14 +28,17 @@ LOG = logging.getLogger(__name__)
28
28
 
29
29
 
30
30
  class ChangeSetModelExecutor(ChangeSetModelPreproc):
31
- change_set: Final[ChangeSet]
32
- # TODO: add typing.
31
+ _change_set: Final[ChangeSet]
32
+ # TODO: add typing for resolved resources and parameters.
33
33
  resources: Final[dict]
34
34
  resolved_parameters: Final[dict]
35
35
 
36
36
  def __init__(self, change_set: ChangeSet):
37
- super().__init__(node_template=change_set.update_graph)
38
- self.change_set = change_set
37
+ super().__init__(
38
+ node_template=change_set.update_graph,
39
+ before_resolved_resources=change_set.stack.resolved_resources,
40
+ )
41
+ self._change_set = change_set
39
42
  self.resources = dict()
40
43
  self.resolved_parameters = dict()
41
44
 
@@ -49,44 +52,35 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
49
52
  self.resolved_parameters[node_parameter.name] = delta.after
50
53
  return delta
51
54
 
55
+ def _after_resource_physical_id(self, resource_logical_id: str) -> Optional[str]:
56
+ after_resolved_resources = self.resources
57
+ return self._resource_physical_resource_id_from(
58
+ logical_resource_id=resource_logical_id, resolved_resources=after_resolved_resources
59
+ )
60
+
52
61
  def visit_node_resource(
53
62
  self, node_resource: NodeResource
54
63
  ) -> PreprocEntityDelta[PreprocResource, PreprocResource]:
64
+ """
65
+ Overrides the default preprocessing for NodeResource objects by annotating the
66
+ `after` delta with the physical resource ID, if side effects resulted in an update.
67
+ """
55
68
  delta = super().visit_node_resource(node_resource=node_resource)
56
69
  self._execute_on_resource_change(
57
70
  name=node_resource.name, before=delta.before, after=delta.after
58
71
  )
59
- return delta
60
-
61
- def _reduce_intrinsic_function_ref_value(self, preproc_value: Any) -> PreprocEntityDelta:
62
- if not isinstance(preproc_value, PreprocResource):
63
- return super()._reduce_intrinsic_function_ref_value(preproc_value=preproc_value)
64
-
65
- logical_id = preproc_value.name
66
-
67
- def _get_physical_id_of_resolved_resource(resolved_resource: dict) -> str:
68
- physical_resource_id = resolved_resource.get("PhysicalResourceId")
69
- if not isinstance(physical_resource_id, str):
72
+ after_resource = delta.after
73
+ if after_resource is not None and delta.before != delta.after:
74
+ after_logical_id = after_resource.logical_id
75
+ after_physical_id: Optional[str] = self._after_resource_physical_id(
76
+ resource_logical_id=after_logical_id
77
+ )
78
+ if after_physical_id is None:
70
79
  raise RuntimeError(
71
- f"No physical resource id found for resource '{logical_id}' during ChangeSet execution"
80
+ f"No PhysicalResourceId was found for resource '{after_physical_id}' post-update."
72
81
  )
73
- return physical_resource_id
74
-
75
- before_resolved_resources = self.change_set.stack.resolved_resources
76
- after_resolved_resources = self.resources
77
-
78
- before_physical_id = None
79
- if logical_id in before_resolved_resources:
80
- before_resolved_resource = before_resolved_resources[logical_id]
81
- before_physical_id = _get_physical_id_of_resolved_resource(before_resolved_resource)
82
- after_physical_id = None
83
- if logical_id in after_resolved_resources:
84
- after_resolved_resource = after_resolved_resources[logical_id]
85
- after_physical_id = _get_physical_id_of_resolved_resource(after_resolved_resource)
86
-
87
- if before_physical_id is None and after_physical_id is None:
88
- raise RuntimeError(f"No resource '{logical_id}' found during ChangeSet execution")
89
- return PreprocEntityDelta(before=before_physical_id, after=after_physical_id)
82
+ after_resource.physical_resource_id = after_physical_id
83
+ return delta
90
84
 
91
85
  def _execute_on_resource_change(
92
86
  self, name: str, before: Optional[PreprocResource], after: Optional[PreprocResource]
@@ -156,7 +150,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
156
150
  def _merge_before_properties(
157
151
  self, name: str, preproc_resource: PreprocResource
158
152
  ) -> PreprocProperties:
159
- if previous_resource_properties := self.change_set.stack.resolved_resources.get(
153
+ if previous_resource_properties := self._change_set.stack.resolved_resources.get(
160
154
  name, {}
161
155
  ).get("Properties"):
162
156
  return PreprocProperties(properties=previous_resource_properties)
@@ -174,7 +168,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
174
168
  ) -> None:
175
169
  LOG.debug("Executing resource action: %s for resource '%s'", action, logical_resource_id)
176
170
  resource_provider_executor = ResourceProviderExecutor(
177
- stack_name=self.change_set.stack.stack_name, stack_id=self.change_set.stack.stack_id
171
+ stack_name=self._change_set.stack.stack_name, stack_id=self._change_set.stack.stack_id
178
172
  )
179
173
  payload = self.create_resource_provider_payload(
180
174
  action=action,
@@ -199,7 +193,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
199
193
  reason,
200
194
  exc_info=LOG.isEnabledFor(logging.DEBUG),
201
195
  )
202
- stack = self.change_set.stack
196
+ stack = self._change_set.stack
203
197
  stack_status = stack.status
204
198
  if stack_status == StackStatus.CREATE_IN_PROGRESS:
205
199
  stack.set_stack_status(StackStatus.CREATE_FAILED, reason=reason)
@@ -226,7 +220,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
226
220
  reason,
227
221
  )
228
222
  # TODO: duplication
229
- stack = self.change_set.stack
223
+ stack = self._change_set.stack
230
224
  stack_status = stack.status
231
225
  if stack_status == StackStatus.CREATE_IN_PROGRESS:
232
226
  stack.set_stack_status(StackStatus.CREATE_FAILED, reason=reason)
@@ -247,7 +241,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
247
241
  ) -> Optional[ResourceProviderPayload]:
248
242
  # FIXME: use proper credentials
249
243
  creds: Credentials = {
250
- "accessKeyId": self.change_set.stack.account_id,
244
+ "accessKeyId": self._change_set.stack.account_id,
251
245
  "secretAccessKey": INTERNAL_AWS_SECRET_ACCESS_KEY,
252
246
  "sessionToken": "",
253
247
  }
@@ -268,14 +262,14 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
268
262
  raise NotImplementedError(f"Action '{action}' not handled")
269
263
 
270
264
  resource_provider_payload: ResourceProviderPayload = {
271
- "awsAccountId": self.change_set.stack.account_id,
265
+ "awsAccountId": self._change_set.stack.account_id,
272
266
  "callbackContext": {},
273
- "stackId": self.change_set.stack.stack_name,
267
+ "stackId": self._change_set.stack.stack_name,
274
268
  "resourceType": resource_type,
275
269
  "resourceTypeVersion": "000000",
276
270
  # TODO: not actually a UUID
277
271
  "bearerToken": str(uuid.uuid4()),
278
- "region": self.change_set.stack.region_name,
272
+ "region": self._change_set.stack.region_name,
279
273
  "action": str(action),
280
274
  "requestData": {
281
275
  "logicalResourceId": logical_resource_id,
@@ -61,20 +61,23 @@ class PreprocProperties:
61
61
 
62
62
 
63
63
  class PreprocResource:
64
- name: str
64
+ logical_id: str
65
+ physical_resource_id: Optional[str]
65
66
  condition: Optional[bool]
66
67
  resource_type: str
67
68
  properties: PreprocProperties
68
69
 
69
70
  def __init__(
70
71
  self,
71
- name: str,
72
+ logical_id: str,
73
+ physical_resource_id: str,
72
74
  condition: Optional[bool],
73
75
  resource_type: str,
74
76
  properties: PreprocProperties,
75
77
  ):
78
+ self.logical_id = logical_id
79
+ self.physical_resource_id = physical_resource_id
76
80
  self.condition = condition
77
- self.name = name
78
81
  self.resource_type = resource_type
79
82
  self.properties = properties
80
83
 
@@ -90,7 +93,7 @@ class PreprocResource:
90
93
  return False
91
94
  return all(
92
95
  [
93
- self.name == other.name,
96
+ self.logical_id == other.logical_id,
94
97
  self._compare_conditions(self.condition, other.condition),
95
98
  self.resource_type == other.resource_type,
96
99
  self.properties == other.properties,
@@ -125,10 +128,12 @@ class PreprocOutput:
125
128
 
126
129
  class ChangeSetModelPreproc(ChangeSetModelVisitor):
127
130
  _node_template: Final[NodeTemplate]
131
+ _before_resolved_resources: Final[dict]
128
132
  _processed: dict[Scope, Any]
129
133
 
130
- def __init__(self, node_template: NodeTemplate):
134
+ def __init__(self, node_template: NodeTemplate, before_resolved_resources: dict):
131
135
  self._node_template = node_template
136
+ self._before_resolved_resources = before_resolved_resources
132
137
  self._processed = dict()
133
138
 
134
139
  def process(self) -> None:
@@ -411,35 +416,49 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
411
416
  delta = self.visit(node_condition.body)
412
417
  return delta
413
418
 
414
- def _reduce_intrinsic_function_ref_value(self, preproc_value: Any) -> PreprocEntityDelta:
415
- if isinstance(preproc_value, PreprocResource):
416
- value = preproc_value.name
417
- else:
418
- value = preproc_value
419
- return PreprocEntityDelta(value, value)
419
+ def _resource_physical_resource_id_from(
420
+ self, logical_resource_id: str, resolved_resources: dict
421
+ ) -> Optional[str]:
422
+ # TODO: typing around resolved resources is needed and should be reflected here.
423
+ resolved_resource = resolved_resources.get(logical_resource_id)
424
+ if resolved_resource is None:
425
+ return None
426
+ physical_resource_id: Optional[str] = resolved_resource.get("PhysicalResourceId")
427
+ if not isinstance(physical_resource_id, str):
428
+ raise RuntimeError(f"No PhysicalResourceId found for resource '{logical_resource_id}'")
429
+ return physical_resource_id
430
+
431
+ def _before_resource_physical_id(self, resource_logical_id: str) -> Optional[str]:
432
+ # TODO: typing around resolved resources is needed and should be reflected here.
433
+ return self._resource_physical_resource_id_from(
434
+ logical_resource_id=resource_logical_id,
435
+ resolved_resources=self._before_resolved_resources,
436
+ )
437
+
438
+ def _after_resource_physical_id(self, resource_logical_id: str) -> Optional[str]:
439
+ return self._before_resource_physical_id(resource_logical_id=resource_logical_id)
420
440
 
421
441
  def visit_node_intrinsic_function_ref(
422
442
  self, node_intrinsic_function: NodeIntrinsicFunction
423
443
  ) -> PreprocEntityDelta:
424
444
  arguments_delta = self.visit(node_intrinsic_function.arguments)
425
-
426
- # TODO: add tests with created and deleted parameters and verify this logic holds.
427
445
  before_logical_id = arguments_delta.before
446
+ after_logical_id = arguments_delta.after
447
+
448
+ # TODO: extend this to support references to other types.
428
449
  before = None
429
450
  if before_logical_id is not None:
430
451
  before_delta = self._resolve_reference(logical_id=before_logical_id)
431
- before_value = before_delta.before
432
- before_ref_delta = self._reduce_intrinsic_function_ref_value(before_value)
433
- before = before_ref_delta.before
452
+ before = before_delta.before
453
+ if isinstance(before, PreprocResource):
454
+ before = before.physical_resource_id
434
455
 
435
- after_logical_id = arguments_delta.after
436
456
  after = None
437
457
  if after_logical_id is not None:
438
458
  after_delta = self._resolve_reference(logical_id=after_logical_id)
439
- after_value = after_delta.after
440
- # TODO: swap isinstance to be a structured type check
441
- after_ref_delta = self._reduce_intrinsic_function_ref_value(after_value)
442
- after = after_ref_delta.after
459
+ after = after_delta.after
460
+ if isinstance(after, PreprocResource):
461
+ after = after.physical_resource_id
443
462
 
444
463
  return PreprocEntityDelta(before=before, after=after)
445
464
 
@@ -505,15 +524,25 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
505
524
  before = None
506
525
  after = None
507
526
  if change_type != ChangeType.CREATED and condition_before is None or condition_before:
527
+ logical_resource_id = node_resource.name
528
+ before_physical_resource_id = self._before_resource_physical_id(
529
+ resource_logical_id=logical_resource_id
530
+ )
508
531
  before = PreprocResource(
509
- name=node_resource.name,
532
+ logical_id=logical_resource_id,
533
+ physical_resource_id=before_physical_resource_id,
510
534
  condition=condition_before,
511
535
  resource_type=type_delta.before,
512
536
  properties=properties_delta.before,
513
537
  )
514
538
  if change_type != ChangeType.REMOVED and condition_after is None or condition_after:
539
+ logical_resource_id = node_resource.name
540
+ after_physical_resource_id = self._after_resource_physical_id(
541
+ resource_logical_id=logical_resource_id
542
+ )
515
543
  after = PreprocResource(
516
- name=node_resource.name,
544
+ logical_id=logical_resource_id,
545
+ physical_resource_id=after_physical_resource_id,
517
546
  condition=condition_after,
518
547
  resource_type=type_delta.after,
519
548
  properties=properties_delta.after,
@@ -173,6 +173,7 @@ class ChangeSet:
173
173
  def describe_details(self, include_property_values: bool) -> DescribeChangeSetOutput:
174
174
  change_set_describer = ChangeSetModelDescriber(
175
175
  node_template=self.update_graph,
176
+ before_resolved_resources=self.stack.resolved_resources,
176
177
  include_property_values=include_property_values,
177
178
  )
178
179
  changes: Changes = change_set_describer.get_changes()
@@ -159,6 +159,8 @@ class EsmEventProcessor(EventProcessor):
159
159
  if not error_payload:
160
160
  return {}
161
161
  # TODO: Should 'requestContext' and 'responseContext' be defined as models?
162
+ # TODO: Allow for generating failure context where there is no responseContext i.e
163
+ # if a RecordAgeExceeded condition is triggered.
162
164
  context = {
163
165
  "requestContext": {
164
166
  "requestId": error_payload.get("requestId"),
@@ -172,6 +172,7 @@ class EsmWorkerFactory:
172
172
  "MaximumBatchingWindowInSeconds"
173
173
  ],
174
174
  MaximumRetryAttempts=self.esm_config["MaximumRetryAttempts"],
175
+ MaximumRecordAgeInSeconds=self.esm_config["MaximumRecordAgeInSeconds"],
175
176
  **optional_params,
176
177
  ),
177
178
  )
@@ -203,6 +204,7 @@ class EsmWorkerFactory:
203
204
  "MaximumBatchingWindowInSeconds"
204
205
  ],
205
206
  MaximumRetryAttempts=self.esm_config["MaximumRetryAttempts"],
207
+ MaximumRecordAgeInSeconds=self.esm_config["MaximumRecordAgeInSeconds"],
206
208
  **optional_params,
207
209
  ),
208
210
  )
@@ -1,3 +1,4 @@
1
+ import functools
1
2
  import json
2
3
  import logging
3
4
  from collections import defaultdict
@@ -7,7 +8,7 @@ from botocore.client import BaseClient
7
8
 
8
9
  from localstack.aws.api.pipes import PipeSourceSqsQueueParameters
9
10
  from localstack.aws.api.sqs import MessageSystemAttributeName
10
- from localstack.config import internal_service_url
11
+ from localstack.aws.connect import connect_to
11
12
  from localstack.services.lambda_.event_source_mapping.event_processor import (
12
13
  EventProcessor,
13
14
  PartialBatchFailureError,
@@ -315,16 +316,19 @@ def transform_into_events(messages: list[dict]) -> list[dict]:
315
316
  return events
316
317
 
317
318
 
319
+ @functools.cache
318
320
  def get_queue_url(queue_arn: str) -> str:
319
- # TODO: consolidate this method with localstack.services.sqs.models.SqsQueue.url
320
- # * Do we need to support different endpoint strategies?
321
- # * If so, how can we achieve this without having a request context
322
- host_url = internal_service_url()
323
- host = host_url.rstrip("/")
324
321
  parsed_arn = parse_arn(queue_arn)
322
+
323
+ queue_name = parsed_arn["resource"]
325
324
  account_id = parsed_arn["account"]
326
- name = parsed_arn["resource"]
327
- return f"{host}/{account_id}/{name}"
325
+ region = parsed_arn["region"]
326
+
327
+ sqs_client = connect_to(region_name=region).sqs
328
+ queue_url = sqs_client.get_queue_url(QueueName=queue_name, QueueOwnerAWSAccountId=account_id)[
329
+ "QueueUrl"
330
+ ]
331
+ return queue_url
328
332
 
329
333
 
330
334
  def message_attributes_to_lower(message_attrs):
@@ -2,6 +2,7 @@ import json
2
2
  import logging
3
3
  import threading
4
4
  from abc import abstractmethod
5
+ from bisect import bisect_left
5
6
  from collections import defaultdict
6
7
  from datetime import datetime
7
8
  from typing import Iterator
@@ -209,16 +210,7 @@ class StreamPoller(Poller):
209
210
 
210
211
  def forward_events_to_target(self, shard_id, next_shard_iterator, records):
211
212
  polled_events = self.transform_into_events(records, shard_id)
212
-
213
213
  abort_condition = None
214
- # Check MaximumRecordAgeInSeconds
215
- if maximum_record_age_in_seconds := self.stream_parameters.get("MaximumRecordAgeInSeconds"):
216
- arrival_timestamp_of_last_event = polled_events[-1]["approximateArrivalTimestamp"]
217
- now = get_current_time().timestamp()
218
- record_age_in_seconds = now - arrival_timestamp_of_last_event
219
- if record_age_in_seconds > maximum_record_age_in_seconds:
220
- abort_condition = "RecordAgeExpired"
221
-
222
214
  # TODO: implement format detection behavior (e.g., for JSON body):
223
215
  # https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-event-filtering.html
224
216
  # Check whether we need poller-specific filter-preprocessing here without modifying the actual event!
@@ -243,23 +235,32 @@ class StreamPoller(Poller):
243
235
  return
244
236
  events = self.add_source_metadata(matching_events_post_filter)
245
237
  LOG.debug("Polled %d events from %s in shard %s", len(events), self.source_arn, shard_id)
246
- # TODO: A retry should probably re-trigger fetching the record from the stream again?!
247
238
  # -> This could be tested by setting a high retry number, using a long pipe execution, and a relatively
248
239
  # short record expiration age at the source. Check what happens if the record expires at the source.
249
240
  # A potential implementation could use checkpointing based on the iterator position (within shard scope)
250
241
  # TODO: handle partial batch failure (see poller.py:parse_batch_item_failures)
251
242
  # TODO: think about how to avoid starvation of other shards if one shard runs into infinite retries
252
243
  attempts = 0
244
+ discarded_events_for_dlq = []
253
245
  error_payload = {}
254
246
 
255
247
  max_retries = self.stream_parameters.get("MaximumRetryAttempts", -1)
248
+ max_record_age = max(
249
+ self.stream_parameters.get("MaximumRecordAgeInSeconds", -1), 0
250
+ ) # Disable check if -1
256
251
  # NOTE: max_retries == 0 means exponential backoff is disabled
257
252
  boff = ExponentialBackoff(max_retries=max_retries)
258
- while (
259
- not abort_condition
260
- and not self.max_retries_exceeded(attempts)
261
- and not self._is_shutdown.is_set()
262
- ):
253
+ while not abort_condition and events and not self._is_shutdown.is_set():
254
+ if self.max_retries_exceeded(attempts):
255
+ abort_condition = "RetryAttemptsExhausted"
256
+ break
257
+
258
+ if max_record_age:
259
+ events, expired_events = self.bisect_events_by_record_age(max_record_age, events)
260
+ if expired_events:
261
+ discarded_events_for_dlq.extend(expired_events)
262
+ continue
263
+
263
264
  try:
264
265
  if attempts > 0:
265
266
  # TODO: Should we always backoff (with jitter) before processing since we may not want multiple pollers
@@ -269,10 +270,8 @@ class StreamPoller(Poller):
269
270
 
270
271
  self.processor.process_events_batch(events)
271
272
  boff.reset()
272
-
273
- # Update shard iterator if execution is successful
274
- self.shards[shard_id] = next_shard_iterator
275
- return
273
+ # We may need to send on data to a DLQ so break the processing loop and proceed if invocation successful.
274
+ break
276
275
  except PartialBatchFailureError as ex:
277
276
  # TODO: add tests for partial batch failure scenarios
278
277
  if (
@@ -327,15 +326,20 @@ class StreamPoller(Poller):
327
326
  # Retry polling until the record expires at the source
328
327
  attempts += 1
329
328
 
329
+ if discarded_events_for_dlq:
330
+ abort_condition = "RecordAgeExceeded"
331
+ error_payload = {}
332
+ events = discarded_events_for_dlq
333
+
330
334
  # Send failed events to potential DLQ
331
- abort_condition = abort_condition or "RetryAttemptsExhausted"
332
- failure_context = self.processor.generate_event_failure_context(
333
- abort_condition=abort_condition,
334
- error=error_payload,
335
- attempts_count=attempts,
336
- partner_resource_arn=self.partner_resource_arn,
337
- )
338
- self.send_events_to_dlq(shard_id, events, context=failure_context)
335
+ if abort_condition:
336
+ failure_context = self.processor.generate_event_failure_context(
337
+ abort_condition=abort_condition,
338
+ error=error_payload,
339
+ attempts_count=attempts,
340
+ partner_resource_arn=self.partner_resource_arn,
341
+ )
342
+ self.send_events_to_dlq(shard_id, events, context=failure_context)
339
343
  # Update shard iterator if the execution failed but the events are sent to a DLQ
340
344
  self.shards[shard_id] = next_shard_iterator
341
345
 
@@ -479,6 +483,17 @@ class StreamPoller(Poller):
479
483
 
480
484
  return events, []
481
485
 
486
+ def bisect_events_by_record_age(
487
+ self, maximum_record_age: int, events: list[dict]
488
+ ) -> tuple[list[dict], list[dict]]:
489
+ """Splits events into [valid_events], [expired_events] based on record age.
490
+ Where:
491
+ - Events with age < maximum_record_age are valid.
492
+ - Events with age >= maximum_record_age are expired."""
493
+ cutoff_timestamp = get_current_time().timestamp() - maximum_record_age
494
+ index = bisect_left(events, cutoff_timestamp, key=self.get_approximate_arrival_time)
495
+ return events[index:], events[:index]
496
+
482
497
 
483
498
  def get_failure_s3_object_key(esm_uuid: str, shard_id: str, failure_datetime: datetime) -> str:
484
499
  """
@@ -1988,6 +1988,8 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
1988
1988
 
1989
1989
  def validate_event_source_mapping(self, context, request):
1990
1990
  # TODO: test whether stream ARNs are valid sources for Pipes or ESM or whether only DynamoDB table ARNs work
1991
+ # TODO: Validate MaxRecordAgeInSeconds (i.e cannot subceed 60s but can be -1) and MaxRetryAttempts parameters.
1992
+ # See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-maximumrecordageinseconds
1991
1993
  is_create_esm_request = context.operation.name == self.create_event_source_mapping.operation
1992
1994
 
1993
1995
  if destination_config := request.get("DestinationConfig"):
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.3.1.dev72'
21
- __version_tuple__ = version_tuple = (4, 3, 1, 'dev72')
20
+ __version__ = version = '4.3.1.dev74'
21
+ __version_tuple__ = version_tuple = (4, 3, 1, 'dev74')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.3.1.dev72
3
+ Version: 4.3.1.dev74
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=-mr9Pi7tUBkh_YI4CsbiETM6FyPDd32kBg1CuTx3kGg,526
7
+ localstack/version.py,sha256=nsAge7BuIQzjgjPv2QyWTjpwTNPRcLMJMsur4XTSeBY,526
8
8
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
10
10
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -310,9 +310,9 @@ localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnf
310
310
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
311
311
  localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
312
312
  localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=oDFbFgHgfebPTLFARjtdjS5vsVBfm7w0Iq1lSBMdpbc,47770
313
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=FfuPfGnytFgUt0MFtiJCs7Tua6NsuXWlRGK7VVO380Y,6828
314
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=avjo24cC0S5q_QXEal1nfZCLS0JIEit3obdrwsmXcMs,12962
315
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=WiTYpGCetQkFP5cXOlucD2vIdI1vX-ubvErp0avDmMc,23751
313
+ localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=W2gbMS-qL_9-PM4NBtEuFDBIqVSewKDSErHowsDBNAM,7350
314
+ localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=OAgblbbwqWbmYVdK66bISWM70qfl2cc1VxxNwK1kMqY,12583
315
+ localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=gBNy3dh4zss-i3vjeRzwbut8pCydV7W3yqMhYk3nGQg,25343
316
316
  localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=NF97l94cHxxBuqNJ6kR3EarNyjLM9KnT8zPV4puOtZQ,5163
317
317
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
318
318
  localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -331,7 +331,7 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
331
331
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=zjedOdqvnfN99WzQ43gxtGZxLDitSnbFGA-zpWbyMQ0,30960
332
332
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=9YsSCkDegcU_Yp8Sfw8eNV26N5ibOlLC6Hg6lxPeBBM,7949
333
333
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
- localstack/services/cloudformation/v2/entities.py,sha256=h-5zNCYcGP6ZprptF_VSkGuXqDJvMoOnyU-b4ps1CSU,6632
334
+ localstack/services/cloudformation/v2/entities.py,sha256=-qrMPVCZBnhLuwcfAMLp9l_jecfRIiRI_Vc917cm8gU,6701
335
335
  localstack/services/cloudformation/v2/provider.py,sha256=RgDgv0B6vXBNHHteOYPP1AQyfasMOZPMD-n_q-cANhg,15521
336
336
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
337
337
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -544,15 +544,15 @@ localstack/services/lambda_/lambda_utils.py,sha256=pxnRJnYzwhwbHbW1-GKV1TJyJgn52
544
544
  localstack/services/lambda_/networking.py,sha256=H9fq1aYThqXZkOi0fCoJrHI9rm19qgUVxFe3vYloN08,938
545
545
  localstack/services/lambda_/packages.py,sha256=pGDSFMZe_XkkYLlNczW9YFW8G0sulVr2pRHqVAhchhY,3965
546
546
  localstack/services/lambda_/plugins.py,sha256=eZsdzZqgEG9EZpd3W8TUdoydTpPXl6JBzJgDx_qeFUU,1275
547
- localstack/services/lambda_/provider.py,sha256=9FZEyjWcoSn4Eytkovfu1XLi0GioKqKEB_7OoPt2GCQ,190636
547
+ localstack/services/lambda_/provider.py,sha256=Mgiez4AoXs-vpgWz5HuOwgn7YGx3gNz-PQmUZjN5KoU,190932
548
548
  localstack/services/lambda_/provider_utils.py,sha256=-vM__pt5qIVhTiPA05N2P0P_pQpwyZggyRuL_QvsQHs,3210
549
549
  localstack/services/lambda_/runtimes.py,sha256=0ODrFfr2VYb1jWC-Gqyro7CoTyO3NyY_SpR9paE4_w8,8332
550
550
  localstack/services/lambda_/urlrouter.py,sha256=ZuVUaAn3tmesDQntkrVQ_-xkMAmdDzmAqx7XIzK9dOo,8351
551
551
  localstack/services/lambda_/event_source_mapping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
552
552
  localstack/services/lambda_/event_source_mapping/esm_config_factory.py,sha256=E7N81Dm9PV7lbvD_JRWDeqACYnEhazrFV4YEPejkXgw,6180
553
- localstack/services/lambda_/event_source_mapping/esm_event_processor.py,sha256=-VOSmZmNi38ob_zMUEcFjIk6Hy-Aa4cXYPmB71R-zQo,6842
553
+ localstack/services/lambda_/event_source_mapping/esm_event_processor.py,sha256=nPQYRRX3AMnqlNCTUapFy3bhCeM00VZQwMASfuA3VqQ,6990
554
554
  localstack/services/lambda_/event_source_mapping/esm_worker.py,sha256=ro4t7DAvrlMd-U7WWly1XKnyKXL6du3T4IgtVVtLoKw,9368
555
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py,sha256=L96xgwRNTY38TUN0zijU1QEGF25vBNmOVMaTJNxB5H0,10340
555
+ localstack/services/lambda_/event_source_mapping/esm_worker_factory.py,sha256=TXhrTKbqN-gZwy38aoI7abKlXS-C0lyMbQP8u-5j2Gg,10524
556
556
  localstack/services/lambda_/event_source_mapping/event_processor.py,sha256=lrneBFEeitdd-KVOtVzyWDHbE_dulRP5J44PpAONfJE,2481
557
557
  localstack/services/lambda_/event_source_mapping/noops_event_processor.py,sha256=rCdI2_y0yoOqQ1WwF3rrscwbNVz6AqDScPqAZcR5tTQ,382
558
558
  localstack/services/lambda_/event_source_mapping/pipe_utils.py,sha256=ajZGcrkXpr8skwkufe-alCvY002nm9nb19x7QjhBkXc,2553
@@ -563,8 +563,8 @@ localstack/services/lambda_/event_source_mapping/pollers/__init__.py,sha256=47DE
563
563
  localstack/services/lambda_/event_source_mapping/pollers/dynamodb_poller.py,sha256=_HD7tfp7NmE53MXaYVca_ko5DIkmHvowv1hoekt85lQ,4681
564
564
  localstack/services/lambda_/event_source_mapping/pollers/kinesis_poller.py,sha256=2e9GsgumV6YgNlDwWyxrx_GQGuornQy78r2Y1Z8zu64,8802
565
565
  localstack/services/lambda_/event_source_mapping/pollers/poller.py,sha256=qqIowkqJH5mMsnsTQMBX3XMqrdafuQKdsdFhyDp6Yss,8065
566
- localstack/services/lambda_/event_source_mapping/pollers/sqs_poller.py,sha256=MOIWO4iMeZys1xnwd63kV39_wdBH2HRJ6q8Sqjg3mJw,17786
567
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py,sha256=gCM3bQlbsEfMhczblAexnN1gM1P2C6rpWJwWGj1dai0,24045
566
+ localstack/services/lambda_/event_source_mapping/pollers/sqs_poller.py,sha256=lIKx2zdK-qqD-suHUZxCPKmAPdmrJsRVU3-ZEt0wRfY,17725
567
+ localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py,sha256=Bd_j73-tLyOAhdvLIRLJphkjrATJSnqS531WwerDcM0,24709
568
568
  localstack/services/lambda_/event_source_mapping/senders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
569
569
  localstack/services/lambda_/event_source_mapping/senders/lambda_sender.py,sha256=YigmLtTzSBXSt97jis6bvcLqXau35umSaiSeS3T-vzs,4892
570
570
  localstack/services/lambda_/event_source_mapping/senders/sender.py,sha256=73CxzisqP4Jiuz9w_NWzc2rz6X-FaM7Z88BsVTPNi4Q,1744
@@ -1279,13 +1279,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1279
1279
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1280
1280
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1281
1281
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1282
- localstack_core-4.3.1.dev72.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
- localstack_core-4.3.1.dev72.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
- localstack_core-4.3.1.dev72.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
- localstack_core-4.3.1.dev72.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
- localstack_core-4.3.1.dev72.dist-info/METADATA,sha256=9nzlCBAKNeZEajNqxPqtyo4qeuFra0jrOAd_Q7-k6Ro,5531
1287
- localstack_core-4.3.1.dev72.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
1288
- localstack_core-4.3.1.dev72.dist-info/entry_points.txt,sha256=UqGFR0MPKa2sfresdqiCpqBZuWyRxCb3UG77oPVMzVA,20564
1289
- localstack_core-4.3.1.dev72.dist-info/plux.json,sha256=1z50zuwXVMOK_gN4whzajk9TWL8kjflSXobMr8WVlUM,20786
1290
- localstack_core-4.3.1.dev72.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
- localstack_core-4.3.1.dev72.dist-info/RECORD,,
1282
+ localstack_core-4.3.1.dev74.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
+ localstack_core-4.3.1.dev74.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
+ localstack_core-4.3.1.dev74.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
+ localstack_core-4.3.1.dev74.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
+ localstack_core-4.3.1.dev74.dist-info/METADATA,sha256=y1G193cLQ-Te6LToKjVRK7hH81K8zLNFOxpq4Xm_S4k,5531
1287
+ localstack_core-4.3.1.dev74.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
1288
+ localstack_core-4.3.1.dev74.dist-info/entry_points.txt,sha256=UqGFR0MPKa2sfresdqiCpqBZuWyRxCb3UG77oPVMzVA,20564
1289
+ localstack_core-4.3.1.dev74.dist-info/plux.json,sha256=G5GBDsJkq2K0uDVzmXlfIT5rVr56__bEIP66QifaA0g,20786
1290
+ localstack_core-4.3.1.dev74.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
+ localstack_core-4.3.1.dev74.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.hooks.on_infra_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.on_infra_start": ["_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.hooks.on_infra_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.packages": ["vosk/community=localstack.services.transcribe.plugins:vosk_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"]}