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
|