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.
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +17 -2
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +36 -42
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +52 -23
- localstack/services/cloudformation/v2/entities.py +1 -0
- localstack/services/lambda_/event_source_mapping/esm_event_processor.py +2 -0
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +2 -0
- localstack/services/lambda_/event_source_mapping/pollers/sqs_poller.py +12 -8
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +42 -27
- localstack/services/lambda_/provider.py +2 -0
- localstack/version.py +2 -2
- {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/METADATA +1 -1
- {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/RECORD +20 -20
- localstack_core-4.3.1.dev74.dist-info/plux.json +1 -0
- localstack_core-4.3.1.dev72.dist-info/plux.json +0 -1
- {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack +0 -0
- {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/WHEEL +0 -0
- {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/licenses/LICENSE.txt +0 -0
- {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__(
|
28
|
-
|
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
|
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
|
-
|
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__(
|
38
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
80
|
+
f"No PhysicalResourceId was found for resource '{after_physical_id}' post-update."
|
72
81
|
)
|
73
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
265
|
+
"awsAccountId": self._change_set.stack.account_id,
|
272
266
|
"callbackContext": {},
|
273
|
-
"stackId": self.
|
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.
|
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
|
-
|
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
|
-
|
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.
|
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
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
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
|
-
|
432
|
-
|
433
|
-
|
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
|
-
|
440
|
-
|
441
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
327
|
-
|
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
|
-
|
260
|
-
|
261
|
-
|
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
|
-
|
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
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
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.
|
21
|
-
__version_tuple__ = version_tuple = (4, 3, 1, '
|
20
|
+
__version__ = version = '4.3.1.dev74'
|
21
|
+
__version_tuple__ = version_tuple = (4, 3, 1, 'dev74')
|
@@ -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
|
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=
|
314
|
-
localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=
|
315
|
-
localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=
|
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
|
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=
|
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
|
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=
|
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=
|
567
|
-
localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py,sha256=
|
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.
|
1283
|
-
localstack_core-4.3.1.
|
1284
|
-
localstack_core-4.3.1.
|
1285
|
-
localstack_core-4.3.1.
|
1286
|
-
localstack_core-4.3.1.
|
1287
|
-
localstack_core-4.3.1.
|
1288
|
-
localstack_core-4.3.1.
|
1289
|
-
localstack_core-4.3.1.
|
1290
|
-
localstack_core-4.3.1.
|
1291
|
-
localstack_core-4.3.1.
|
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"]}
|
File without changes
|
{localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack-supervisor
RENAMED
File without changes
|
{localstack_core-4.3.1.dev72.data → localstack_core-4.3.1.dev74.data}/scripts/localstack.bat
RENAMED
File without changes
|
File without changes
|
{localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/entry_points.txt
RENAMED
File without changes
|
{localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/licenses/LICENSE.txt
RENAMED
File without changes
|
{localstack_core-4.3.1.dev72.dist-info → localstack_core-4.3.1.dev74.dist-info}/top_level.txt
RENAMED
File without changes
|