localstack-core 4.4.1.dev58__py3-none-any.whl → 4.4.1.dev60__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.py +3 -2
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +33 -16
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +47 -20
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +106 -26
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +9 -1
- localstack/testing/pytest/cloudformation/fixtures.py +13 -1
- localstack/version.py +2 -2
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/METADATA +1 -1
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/RECORD +17 -17
- localstack_core-4.4.1.dev60.dist-info/plux.json +1 -0
- localstack_core-4.4.1.dev58.dist-info/plux.json +0 -1
- {localstack_core-4.4.1.dev58.data → localstack_core-4.4.1.dev60.data}/scripts/localstack +0 -0
- {localstack_core-4.4.1.dev58.data → localstack_core-4.4.1.dev60.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.4.1.dev58.data → localstack_core-4.4.1.dev60.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/WHEEL +0 -0
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/top_level.txt +0 -0
@@ -385,6 +385,7 @@ FnJoinKey: Final[str] = "Fn::Join"
|
|
385
385
|
FnGetAttKey: Final[str] = "Fn::GetAtt"
|
386
386
|
FnEqualsKey: Final[str] = "Fn::Equals"
|
387
387
|
FnFindInMapKey: Final[str] = "Fn::FindInMap"
|
388
|
+
FnSubKey: Final[str] = "Fn::Sub"
|
388
389
|
INTRINSIC_FUNCTIONS: Final[set[str]] = {
|
389
390
|
RefKey,
|
390
391
|
FnIfKey,
|
@@ -393,6 +394,7 @@ INTRINSIC_FUNCTIONS: Final[set[str]] = {
|
|
393
394
|
FnEqualsKey,
|
394
395
|
FnGetAttKey,
|
395
396
|
FnFindInMapKey,
|
397
|
+
FnSubKey,
|
396
398
|
}
|
397
399
|
|
398
400
|
|
@@ -521,7 +523,6 @@ class ChangeSetModel:
|
|
521
523
|
def _resolve_intrinsic_function_ref(self, arguments: ChangeSetEntity) -> ChangeType:
|
522
524
|
if arguments.change_type != ChangeType.UNCHANGED:
|
523
525
|
return arguments.change_type
|
524
|
-
# TODO: add support for nested functions, here we assume the argument is a logicalID.
|
525
526
|
if not isinstance(arguments, TerminalValue):
|
526
527
|
return arguments.change_type
|
527
528
|
|
@@ -1168,7 +1169,7 @@ class ChangeSetModel:
|
|
1168
1169
|
parameters_scope, parameter_name, before_parameters, after_parameters
|
1169
1170
|
)
|
1170
1171
|
node_parameter = self._visit_parameter(
|
1171
|
-
|
1172
|
+
parameter_scope,
|
1172
1173
|
parameter_name,
|
1173
1174
|
before_parameter=before_parameter,
|
1174
1175
|
after_parameter=after_parameter,
|
@@ -6,6 +6,7 @@ from typing import Final, Optional
|
|
6
6
|
import localstack.aws.api.cloudformation as cfn_api
|
7
7
|
from localstack.services.cloudformation.engine.v2.change_set_model import (
|
8
8
|
NodeIntrinsicFunction,
|
9
|
+
NodeProperty,
|
9
10
|
NodeResource,
|
10
11
|
PropertiesKey,
|
11
12
|
)
|
@@ -45,26 +46,36 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
|
|
45
46
|
# artificially limit the precision of our output to match AWS's?
|
46
47
|
|
47
48
|
arguments_delta = self.visit(node_intrinsic_function.arguments)
|
48
|
-
|
49
|
-
|
49
|
+
before_argument: Optional[list[str]] = arguments_delta.before
|
50
|
+
if isinstance(before_argument, str):
|
51
|
+
before_argument = before_argument.split(".")
|
52
|
+
after_argument: Optional[list[str]] = arguments_delta.after
|
53
|
+
if isinstance(after_argument, str):
|
54
|
+
after_argument = after_argument.split(".")
|
50
55
|
|
51
56
|
before = None
|
52
|
-
if
|
53
|
-
before_logical_name_of_resource =
|
54
|
-
before_attribute_name =
|
57
|
+
if before_argument:
|
58
|
+
before_logical_name_of_resource = before_argument[0]
|
59
|
+
before_attribute_name = before_argument[1]
|
55
60
|
before_node_resource = self._get_node_resource_for(
|
56
61
|
resource_name=before_logical_name_of_resource, node_template=self._node_template
|
57
62
|
)
|
58
|
-
before_node_property = self._get_node_property_for(
|
63
|
+
before_node_property: Optional[NodeProperty] = self._get_node_property_for(
|
59
64
|
property_name=before_attribute_name, node_resource=before_node_resource
|
60
65
|
)
|
61
|
-
|
62
|
-
|
66
|
+
if before_node_property is not None:
|
67
|
+
before_property_delta = self.visit(before_node_property)
|
68
|
+
before = before_property_delta.before
|
69
|
+
else:
|
70
|
+
before = self._before_deployed_property_value_of(
|
71
|
+
resource_logical_id=before_logical_name_of_resource,
|
72
|
+
property_name=before_attribute_name,
|
73
|
+
)
|
63
74
|
|
64
75
|
after = None
|
65
|
-
if
|
66
|
-
after_logical_name_of_resource =
|
67
|
-
after_attribute_name =
|
76
|
+
if after_argument:
|
77
|
+
after_logical_name_of_resource = after_argument[0]
|
78
|
+
after_attribute_name = after_argument[1]
|
68
79
|
after_node_resource = self._get_node_resource_for(
|
69
80
|
resource_name=after_logical_name_of_resource, node_template=self._node_template
|
70
81
|
)
|
@@ -74,12 +85,18 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
|
|
74
85
|
)
|
75
86
|
if after_node_property is not None:
|
76
87
|
after_property_delta = self.visit(after_node_property)
|
88
|
+
if after_property_delta.before == after_property_delta.after:
|
89
|
+
after = after_property_delta.after
|
90
|
+
else:
|
91
|
+
after = CHANGESET_KNOWN_AFTER_APPLY
|
77
92
|
else:
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
93
|
+
try:
|
94
|
+
after = self._after_deployed_property_value_of(
|
95
|
+
resource_logical_id=after_logical_name_of_resource,
|
96
|
+
property_name=after_attribute_name,
|
97
|
+
)
|
98
|
+
except RuntimeError:
|
99
|
+
after = CHANGESET_KNOWN_AFTER_APPLY
|
83
100
|
|
84
101
|
return PreprocEntityDelta(before=before, after=after)
|
85
102
|
|
@@ -103,40 +103,44 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
103
103
|
`after` delta with the physical resource ID, if side effects resulted in an update.
|
104
104
|
"""
|
105
105
|
delta = super().visit_node_resource(node_resource=node_resource)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
106
|
+
before = delta.before
|
107
|
+
after = delta.after
|
108
|
+
|
109
|
+
if before != after:
|
110
|
+
# There are changes for this resource.
|
111
|
+
self._execute_resource_change(name=node_resource.name, before=before, after=after)
|
112
|
+
else:
|
113
|
+
# There are no updates for this resource; iff the resource was previously
|
114
|
+
# deployed, then the resolved details are copied in the current state for
|
115
|
+
# references or other downstream operations.
|
116
|
+
if before is not None:
|
117
|
+
before_logical_id = delta.before.logical_id
|
118
|
+
before_resource = self._before_resolved_resources.get(before_logical_id, dict())
|
119
|
+
self.resources[before_logical_id] = before_resource
|
120
|
+
|
121
|
+
# Update the latest version of this resource for downstream references.
|
122
|
+
if after is not None:
|
123
|
+
after_logical_id = after.logical_id
|
124
|
+
after_physical_id: str = self._after_resource_physical_id(
|
113
125
|
resource_logical_id=after_logical_id
|
114
126
|
)
|
115
|
-
|
116
|
-
raise RuntimeError(
|
117
|
-
f"No PhysicalResourceId was found for resource '{after_physical_id}' post-update."
|
118
|
-
)
|
119
|
-
after_resource.physical_resource_id = after_physical_id
|
127
|
+
after.physical_resource_id = after_physical_id
|
120
128
|
return delta
|
121
129
|
|
122
130
|
def visit_node_output(
|
123
131
|
self, node_output: NodeOutput
|
124
132
|
) -> PreprocEntityDelta[PreprocOutput, PreprocOutput]:
|
125
133
|
delta = super().visit_node_output(node_output=node_output)
|
126
|
-
|
127
|
-
|
128
|
-
# TODO: are there other situations?
|
134
|
+
after = delta.after
|
135
|
+
if after is None or (isinstance(after, PreprocOutput) and after.condition is False):
|
129
136
|
return delta
|
130
|
-
|
131
137
|
self.outputs[delta.after.name] = delta.after.value
|
132
138
|
return delta
|
133
139
|
|
134
|
-
def
|
140
|
+
def _execute_resource_change(
|
135
141
|
self, name: str, before: Optional[PreprocResource], after: Optional[PreprocResource]
|
136
142
|
) -> None:
|
137
|
-
|
138
|
-
# unchanged: nothing to do.
|
139
|
-
return
|
143
|
+
# Changes are to be made about this resource.
|
140
144
|
# TODO: this logic is a POC and should be revised.
|
141
145
|
if before is not None and after is not None:
|
142
146
|
# Case: change on same type.
|
@@ -257,11 +261,34 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
257
261
|
case OperationStatus.SUCCESS:
|
258
262
|
# merge the resources state with the external state
|
259
263
|
# TODO: this is likely a duplicate of updating from extra_resource_properties
|
264
|
+
|
265
|
+
# TODO: add typing
|
266
|
+
# TODO: avoid the use of string literals for sampling from the object, use typed classes instead
|
267
|
+
# TODO: avoid sampling from resources and use tmp var reference
|
268
|
+
# TODO: add utils functions to abstract this logic away (resource.update(..))
|
269
|
+
# TODO: avoid the use of setdefault (debuggability/readability)
|
270
|
+
# TODO: review the use of merge
|
271
|
+
|
260
272
|
self.resources[logical_resource_id]["Properties"].update(event.resource_model)
|
261
273
|
self.resources[logical_resource_id].update(extra_resource_properties)
|
262
274
|
# XXX for legacy delete_stack compatibility
|
263
275
|
self.resources[logical_resource_id]["LogicalResourceId"] = logical_resource_id
|
264
276
|
self.resources[logical_resource_id]["Type"] = resource_type
|
277
|
+
|
278
|
+
# TODO: review why the physical id is returned as None during updates
|
279
|
+
# TODO: abstract this in member function of resource classes instead
|
280
|
+
physical_resource_id = None
|
281
|
+
try:
|
282
|
+
physical_resource_id = self._after_resource_physical_id(logical_resource_id)
|
283
|
+
except RuntimeError:
|
284
|
+
# The physical id is missing or is set to None, which is invalid.
|
285
|
+
pass
|
286
|
+
if physical_resource_id is None:
|
287
|
+
# The physical resource id is None after an update that didn't rewrite the resource, the previous
|
288
|
+
# resource id is therefore the current physical id of this resource.
|
289
|
+
physical_resource_id = self._before_resource_physical_id(logical_resource_id)
|
290
|
+
self.resources[logical_resource_id]["PhysicalResourceId"] = physical_resource_id
|
291
|
+
|
265
292
|
case OperationStatus.FAILED:
|
266
293
|
reason = event.message
|
267
294
|
LOG.warning(
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
import re
|
3
4
|
from typing import Any, Final, Generic, Optional, TypeVar
|
4
5
|
|
5
6
|
from localstack.services.cloudformation.engine.v2.change_set_model import (
|
@@ -167,6 +168,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
167
168
|
# TODO: this could be improved with hashmap lookups if the Node contained bindings and not lists.
|
168
169
|
for node_resource in node_template.resources.resources:
|
169
170
|
if node_resource.name == resource_name:
|
171
|
+
self.visit(node_resource)
|
170
172
|
return node_resource
|
171
173
|
raise RuntimeError(f"No resource '{resource_name}' was found")
|
172
174
|
|
@@ -176,6 +178,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
176
178
|
# TODO: this could be improved with hashmap lookups if the Node contained bindings and not lists.
|
177
179
|
for node_property in node_resource.properties.properties:
|
178
180
|
if node_property.name == property_name:
|
181
|
+
self.visit(node_property)
|
179
182
|
return node_property
|
180
183
|
return None
|
181
184
|
|
@@ -188,10 +191,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
188
191
|
# process the resource if this wasn't processed already. Ideally, values should only
|
189
192
|
# be accessible through delta objects, to ensure computation is always complete at
|
190
193
|
# every level.
|
191
|
-
|
194
|
+
_ = self._get_node_resource_for(
|
192
195
|
resource_name=resource_logical_id, node_template=self._node_template
|
193
196
|
)
|
194
|
-
self.visit(node_resource)
|
195
197
|
|
196
198
|
resolved_resource = resolved_resources.get(resource_logical_id)
|
197
199
|
if resolved_resource is None:
|
@@ -227,6 +229,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
227
229
|
# TODO: another scenarios suggesting property lookups might be preferable.
|
228
230
|
for mapping in mappings:
|
229
231
|
if mapping.name == map_name:
|
232
|
+
self.visit(mapping)
|
230
233
|
return mapping
|
231
234
|
# TODO
|
232
235
|
raise RuntimeError()
|
@@ -236,6 +239,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
236
239
|
# TODO: another scenarios suggesting property lookups might be preferable.
|
237
240
|
for parameter in parameters:
|
238
241
|
if parameter.name == parameter_name:
|
242
|
+
self.visit(parameter)
|
239
243
|
return parameter
|
240
244
|
return None
|
241
245
|
|
@@ -244,6 +248,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
244
248
|
# TODO: another scenarios suggesting property lookups might be preferable.
|
245
249
|
for condition in conditions:
|
246
250
|
if condition.name == condition_name:
|
251
|
+
self.visit(condition)
|
247
252
|
return condition
|
248
253
|
return None
|
249
254
|
|
@@ -254,20 +259,20 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
254
259
|
return condition_delta
|
255
260
|
raise RuntimeError(f"No condition '{logical_id}' was found.")
|
256
261
|
|
257
|
-
def _resolve_pseudo_parameter(self, pseudo_parameter_name: str) ->
|
262
|
+
def _resolve_pseudo_parameter(self, pseudo_parameter_name: str) -> Any:
|
258
263
|
match pseudo_parameter_name:
|
259
264
|
case "AWS::Partition":
|
260
|
-
|
265
|
+
return get_partition(self._change_set.region_name)
|
261
266
|
case "AWS::AccountId":
|
262
|
-
|
267
|
+
return self._change_set.stack.account_id
|
263
268
|
case "AWS::Region":
|
264
|
-
|
269
|
+
return self._change_set.stack.region_name
|
265
270
|
case "AWS::StackName":
|
266
|
-
|
271
|
+
return self._change_set.stack.stack_name
|
267
272
|
case "AWS::StackId":
|
268
|
-
|
273
|
+
return self._change_set.stack.stack_id
|
269
274
|
case "AWS::URLSuffix":
|
270
|
-
|
275
|
+
return _AWS_URL_SUFFIX
|
271
276
|
case "AWS::NoValue":
|
272
277
|
# TODO: add support for NoValue, None cannot be used to communicate a Null value in preproc classes.
|
273
278
|
raise NotImplementedError("The use of AWS:NoValue is currently unsupported")
|
@@ -277,14 +282,14 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
277
282
|
)
|
278
283
|
case _:
|
279
284
|
raise RuntimeError(f"Unknown pseudo parameter value '{pseudo_parameter_name}'")
|
280
|
-
return PreprocEntityDelta(before=after, after=after)
|
281
285
|
|
282
286
|
def _resolve_reference(self, logical_id: str) -> PreprocEntityDelta:
|
283
287
|
if logical_id in _PSEUDO_PARAMETERS:
|
284
|
-
|
288
|
+
pseudo_parameter_value = self._resolve_pseudo_parameter(
|
285
289
|
pseudo_parameter_name=logical_id
|
286
290
|
)
|
287
|
-
|
291
|
+
# Pseudo parameters are constants within the lifecycle of a template.
|
292
|
+
return PreprocEntityDelta(before=pseudo_parameter_value, after=pseudo_parameter_value)
|
288
293
|
|
289
294
|
node_parameter = self._get_node_parameter_if_exists(parameter_name=logical_id)
|
290
295
|
if isinstance(node_parameter, NodeParameter):
|
@@ -371,15 +376,19 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
371
376
|
def visit_node_intrinsic_function_fn_get_att(
|
372
377
|
self, node_intrinsic_function: NodeIntrinsicFunction
|
373
378
|
) -> PreprocEntityDelta:
|
374
|
-
arguments_delta = self.visit(node_intrinsic_function.arguments)
|
375
379
|
# TODO: validate the return value according to the spec.
|
376
|
-
|
377
|
-
|
380
|
+
arguments_delta = self.visit(node_intrinsic_function.arguments)
|
381
|
+
before_argument: Optional[list[str]] = arguments_delta.before
|
382
|
+
if isinstance(before_argument, str):
|
383
|
+
before_argument = before_argument.split(".")
|
384
|
+
after_argument: Optional[list[str]] = arguments_delta.after
|
385
|
+
if isinstance(after_argument, str):
|
386
|
+
after_argument = after_argument.split(".")
|
378
387
|
|
379
388
|
before = None
|
380
|
-
if
|
381
|
-
before_logical_name_of_resource =
|
382
|
-
before_attribute_name =
|
389
|
+
if before_argument:
|
390
|
+
before_logical_name_of_resource = before_argument[0]
|
391
|
+
before_attribute_name = before_argument[1]
|
383
392
|
|
384
393
|
before_node_resource = self._get_node_resource_for(
|
385
394
|
resource_name=before_logical_name_of_resource, node_template=self._node_template
|
@@ -400,9 +409,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
400
409
|
)
|
401
410
|
|
402
411
|
after = None
|
403
|
-
if
|
404
|
-
after_logical_name_of_resource =
|
405
|
-
after_attribute_name =
|
412
|
+
if after_argument:
|
413
|
+
after_logical_name_of_resource = after_argument[0]
|
414
|
+
after_attribute_name = after_argument[1]
|
406
415
|
after_node_resource = self._get_node_resource_for(
|
407
416
|
resource_name=after_logical_name_of_resource, node_template=self._node_template
|
408
417
|
)
|
@@ -451,10 +460,14 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
451
460
|
)
|
452
461
|
|
453
462
|
# TODO: add support for this being created or removed.
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
463
|
+
before = None
|
464
|
+
if arguments_delta.before:
|
465
|
+
before_outcome_delta = _compute_delta_for_if_statement(arguments_delta.before)
|
466
|
+
before = before_outcome_delta.before
|
467
|
+
after = None
|
468
|
+
if arguments_delta.after:
|
469
|
+
after_outcome_delta = _compute_delta_for_if_statement(arguments_delta.after)
|
470
|
+
after = after_outcome_delta.after
|
458
471
|
return PreprocEntityDelta(before=before, after=after)
|
459
472
|
|
460
473
|
def visit_node_intrinsic_function_fn_not(
|
@@ -477,6 +490,73 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
477
490
|
# Implicit change type computation.
|
478
491
|
return PreprocEntityDelta(before=before, after=after)
|
479
492
|
|
493
|
+
def visit_node_intrinsic_function_fn_sub(
|
494
|
+
self, node_intrinsic_function: NodeIntrinsicFunction
|
495
|
+
) -> PreprocEntityDelta:
|
496
|
+
arguments_delta = self.visit(node_intrinsic_function.arguments)
|
497
|
+
arguments_before = arguments_delta.before
|
498
|
+
arguments_after = arguments_delta.after
|
499
|
+
|
500
|
+
def _compute_sub(args: str | list[Any], select_before: bool = False) -> str:
|
501
|
+
# TODO: add further schema validation.
|
502
|
+
string_template: str
|
503
|
+
sub_parameters: dict
|
504
|
+
if isinstance(args, str):
|
505
|
+
string_template = args
|
506
|
+
sub_parameters = dict()
|
507
|
+
elif (
|
508
|
+
isinstance(args, list)
|
509
|
+
and len(args) == 2
|
510
|
+
and isinstance(args[0], str)
|
511
|
+
and isinstance(args[1], dict)
|
512
|
+
):
|
513
|
+
string_template = args[0]
|
514
|
+
sub_parameters = args[1]
|
515
|
+
else:
|
516
|
+
raise RuntimeError(
|
517
|
+
"Invalid arguments shape for Fn::Sub, expected a String "
|
518
|
+
f"or a Tuple of String and Map but got '{args}'"
|
519
|
+
)
|
520
|
+
sub_string = string_template
|
521
|
+
template_variable_names = re.findall("\\${([^}]+)}", string_template)
|
522
|
+
for template_variable_name in template_variable_names:
|
523
|
+
if template_variable_name in _PSEUDO_PARAMETERS:
|
524
|
+
template_variable_value = self._resolve_pseudo_parameter(
|
525
|
+
pseudo_parameter_name=template_variable_name
|
526
|
+
)
|
527
|
+
elif template_variable_name in sub_parameters:
|
528
|
+
template_variable_value = sub_parameters[template_variable_name]
|
529
|
+
else:
|
530
|
+
try:
|
531
|
+
reference_delta = self._resolve_reference(logical_id=template_variable_name)
|
532
|
+
template_variable_value = (
|
533
|
+
reference_delta.before if select_before else reference_delta.after
|
534
|
+
)
|
535
|
+
except RuntimeError:
|
536
|
+
raise RuntimeError(
|
537
|
+
f"Undefined variable name in Fn::Sub string template '{template_variable_name}'"
|
538
|
+
)
|
539
|
+
sub_string = sub_string.replace(
|
540
|
+
f"${{{template_variable_name}}}", template_variable_value
|
541
|
+
)
|
542
|
+
return sub_string
|
543
|
+
|
544
|
+
before = None
|
545
|
+
if (
|
546
|
+
isinstance(arguments_before, str)
|
547
|
+
or isinstance(arguments_before, list)
|
548
|
+
and len(arguments_before) == 2
|
549
|
+
):
|
550
|
+
before = _compute_sub(args=arguments_before, select_before=True)
|
551
|
+
after = None
|
552
|
+
if (
|
553
|
+
isinstance(arguments_after, str)
|
554
|
+
or isinstance(arguments_after, list)
|
555
|
+
and len(arguments_after) == 2
|
556
|
+
):
|
557
|
+
after = _compute_sub(args=arguments_after)
|
558
|
+
return PreprocEntityDelta(before=before, after=after)
|
559
|
+
|
480
560
|
def visit_node_intrinsic_function_fn_join(
|
481
561
|
self, node_intrinsic_function: NodeIntrinsicFunction
|
482
562
|
) -> PreprocEntityDelta:
|
@@ -490,7 +570,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
|
|
490
570
|
delimiter: str = str(args[0])
|
491
571
|
values: list[Any] = args[1]
|
492
572
|
if not isinstance(values, list):
|
493
|
-
raise RuntimeError("Invalid arguments list definition for Fn::Join")
|
573
|
+
raise RuntimeError(f"Invalid arguments list definition for Fn::Join: '{args}'")
|
494
574
|
join_result = delimiter.join(map(str, values))
|
495
575
|
return join_result
|
496
576
|
|
@@ -48,7 +48,12 @@ class ChangeSetModelVisitor(abc.ABC):
|
|
48
48
|
self.visit(child)
|
49
49
|
|
50
50
|
def visit_node_template(self, node_template: NodeTemplate):
|
51
|
-
|
51
|
+
# Visit the resources, which will lazily evaluate all the referenced (direct and indirect)
|
52
|
+
# entities (parameters, mappings, conditions, etc.). Then compute the output fields; computing
|
53
|
+
# only the output fields would only result in the deployment logic of the referenced outputs
|
54
|
+
# being evaluated, hence enforce the visiting of all the resources first.
|
55
|
+
self.visit(node_template.resources)
|
56
|
+
self.visit(node_template.outputs)
|
52
57
|
|
53
58
|
def visit_node_outputs(self, node_outputs: NodeOutputs):
|
54
59
|
self.visit_children(node_outputs)
|
@@ -108,6 +113,9 @@ class ChangeSetModelVisitor(abc.ABC):
|
|
108
113
|
):
|
109
114
|
self.visit_children(node_intrinsic_function)
|
110
115
|
|
116
|
+
def visit_node_intrinsic_function_fn_sub(self, node_intrinsic_function: NodeIntrinsicFunction):
|
117
|
+
self.visit_children(node_intrinsic_function)
|
118
|
+
|
111
119
|
def visit_node_intrinsic_function_fn_if(self, node_intrinsic_function: NodeIntrinsicFunction):
|
112
120
|
self.visit_children(node_intrinsic_function)
|
113
121
|
|
@@ -4,7 +4,7 @@ from typing import Callable
|
|
4
4
|
|
5
5
|
import pytest
|
6
6
|
|
7
|
-
from localstack.aws.api.cloudformation import StackEvent
|
7
|
+
from localstack.aws.api.cloudformation import DescribeChangeSetOutput, StackEvent
|
8
8
|
from localstack.aws.connect import ServiceLevelClientFactory
|
9
9
|
from localstack.utils.functions import call_safe
|
10
10
|
from localstack.utils.strings import short_uid
|
@@ -29,6 +29,12 @@ def capture_per_resource_events(
|
|
29
29
|
return capture
|
30
30
|
|
31
31
|
|
32
|
+
def _normalise_describe_change_set_output(value: DescribeChangeSetOutput) -> None:
|
33
|
+
value.get("Changes", list()).sort(
|
34
|
+
key=lambda change: change.get("ResourceChange", dict()).get("LogicalResourceId", str())
|
35
|
+
)
|
36
|
+
|
37
|
+
|
32
38
|
@pytest.fixture
|
33
39
|
def capture_update_process(aws_client_no_retry, cleanups, capture_per_resource_events):
|
34
40
|
"""
|
@@ -84,12 +90,15 @@ def capture_update_process(aws_client_no_retry, cleanups, capture_per_resource_e
|
|
84
90
|
ChangeSetName=change_set_id, IncludePropertyValues=True
|
85
91
|
)
|
86
92
|
)
|
93
|
+
_normalise_describe_change_set_output(describe_change_set_with_prop_values)
|
87
94
|
snapshot.match("describe-change-set-1-prop-values", describe_change_set_with_prop_values)
|
95
|
+
|
88
96
|
describe_change_set_without_prop_values = (
|
89
97
|
aws_client_no_retry.cloudformation.describe_change_set(
|
90
98
|
ChangeSetName=change_set_id, IncludePropertyValues=False
|
91
99
|
)
|
92
100
|
)
|
101
|
+
_normalise_describe_change_set_output(describe_change_set_without_prop_values)
|
93
102
|
snapshot.match("describe-change-set-1", describe_change_set_without_prop_values)
|
94
103
|
|
95
104
|
execute_results = aws_client_no_retry.cloudformation.execute_change_set(
|
@@ -132,12 +141,15 @@ def capture_update_process(aws_client_no_retry, cleanups, capture_per_resource_e
|
|
132
141
|
ChangeSetName=change_set_id, IncludePropertyValues=True
|
133
142
|
)
|
134
143
|
)
|
144
|
+
_normalise_describe_change_set_output(describe_change_set_with_prop_values)
|
135
145
|
snapshot.match("describe-change-set-2-prop-values", describe_change_set_with_prop_values)
|
146
|
+
|
136
147
|
describe_change_set_without_prop_values = (
|
137
148
|
aws_client_no_retry.cloudformation.describe_change_set(
|
138
149
|
ChangeSetName=change_set_id, IncludePropertyValues=False
|
139
150
|
)
|
140
151
|
)
|
152
|
+
_normalise_describe_change_set_output(describe_change_set_without_prop_values)
|
141
153
|
snapshot.match("describe-change-set-2", describe_change_set_without_prop_values)
|
142
154
|
|
143
155
|
execute_results = aws_client_no_retry.cloudformation.execute_change_set(
|
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.4.1.
|
21
|
-
__version_tuple__ = version_tuple = (4, 4, 1, '
|
20
|
+
__version__ = version = '4.4.1.dev60'
|
21
|
+
__version_tuple__ = version_tuple = (4, 4, 1, 'dev60')
|
@@ -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=ftu0PZjA0U1SLNDuydA5w6KByBd8FBfQ_Ak1Pr7zm4U,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,11 +310,11 @@ localstack/services/cloudformation/engine/types.py,sha256=YIhmTrO__obIviYvzzCovK
|
|
310
310
|
localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
|
311
311
|
localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
|
312
312
|
localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
313
|
-
localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=
|
314
|
-
localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=
|
315
|
-
localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=
|
316
|
-
localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=
|
317
|
-
localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=
|
313
|
+
localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=oWkemW9yfGqqVVXG0sYQB9Igfne-acjk43hmbIYv7CY,50874
|
314
|
+
localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=IkuH0jSOd9VdZpexYXl04B5iod9PFNAImrcgD3Lh1zc,9126
|
315
|
+
localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=6hyGcqSTBAfEdEJZ8mG9pkWc8X_UfQ6KeL6SR-FNaQQ,16168
|
316
|
+
localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=tAbjR-DtjMAplrytfprgyxEkNWgMq9_Ws_nr-TRXofY,34921
|
317
|
+
localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=pwtSYUsfIFiYj0oBv15oCT9bSdqmhBhu1oJnD1H7Xvo,6034
|
318
318
|
localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
|
319
319
|
localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
320
320
|
localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py,sha256=Grn3dP1jANRlVO9HyKQV5GHv0x1eNRBeaIYhgn-FKv4,2812
|
@@ -1178,7 +1178,7 @@ localstack/testing/pytest/path_filter.py,sha256=U1V5qy23H7yZ6Tznr-MdveeH7TvCM_u4
|
|
1178
1178
|
localstack/testing/pytest/util.py,sha256=TQAAb_Cj5gTSX0VkenAbSabvyCkl7THxEj70PrT_H7Y,941
|
1179
1179
|
localstack/testing/pytest/validation_tracking.py,sha256=zGYn2r2n1xEe2Xq2JLPhS5dQJ9s29pIQEFpiF7ifehM,5630
|
1180
1180
|
localstack/testing/pytest/cloudformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1181
|
-
localstack/testing/pytest/cloudformation/fixtures.py,sha256=
|
1181
|
+
localstack/testing/pytest/cloudformation/fixtures.py,sha256=q0dyZlcjUwNlhlZuxCCxWJFhgq9HQF9jt_WjFxdHHJk,7029
|
1182
1182
|
localstack/testing/pytest/stepfunctions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1183
1183
|
localstack/testing/pytest/stepfunctions/fixtures.py,sha256=m9gdU7opK1LoDKuUDTJKcuUfWi4LWHw0idL0_GNlkfo,32817
|
1184
1184
|
localstack/testing/pytest/stepfunctions/utils.py,sha256=zK9qD4o1dOoKkr2hwmNBfv4DqgxNiX1zRd335FG9i7o,31298
|
@@ -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.4.1.
|
1283
|
-
localstack_core-4.4.1.
|
1284
|
-
localstack_core-4.4.1.
|
1285
|
-
localstack_core-4.4.1.
|
1286
|
-
localstack_core-4.4.1.
|
1287
|
-
localstack_core-4.4.1.
|
1288
|
-
localstack_core-4.4.1.
|
1289
|
-
localstack_core-4.4.1.
|
1290
|
-
localstack_core-4.4.1.
|
1291
|
-
localstack_core-4.4.1.
|
1282
|
+
localstack_core-4.4.1.dev60.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
|
1283
|
+
localstack_core-4.4.1.dev60.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
|
1284
|
+
localstack_core-4.4.1.dev60.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
|
1285
|
+
localstack_core-4.4.1.dev60.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
|
1286
|
+
localstack_core-4.4.1.dev60.dist-info/METADATA,sha256=-sYOMpwA10b1iRC3d9m5IHOYfF9Ms1_9z08eFgF9P2Y,5539
|
1287
|
+
localstack_core-4.4.1.dev60.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
1288
|
+
localstack_core-4.4.1.dev60.dist-info/entry_points.txt,sha256=K5M7il9Vwev64SlQiOaZVUhYpVNIE6IFHiWJ0znpbHQ,20491
|
1289
|
+
localstack_core-4.4.1.dev60.dist-info/plux.json,sha256=YlpaDidcqEtpq1hqeKzMBz8BEznWfug-_iNxA2_EWlY,20712
|
1290
|
+
localstack_core-4.4.1.dev60.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
|
1291
|
+
localstack_core-4.4.1.dev60.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"localstack.cloudformation.resource_providers": ["AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "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::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "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::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "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::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin"], "localstack.hooks.on_infra_start": ["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", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "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", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_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.hooks.on_infra_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", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics"], "localstack.packages": ["kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_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", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_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.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.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "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"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"localstack.cloudformation.resource_providers": ["AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "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::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin"], "localstack.packages": ["jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_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"], "localstack.hooks.on_infra_start": ["setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "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", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start"], "localstack.hooks.on_infra_shutdown": ["stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "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", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "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.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "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.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "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"]}
|
File without changes
|
{localstack_core-4.4.1.dev58.data → localstack_core-4.4.1.dev60.data}/scripts/localstack-supervisor
RENAMED
File without changes
|
{localstack_core-4.4.1.dev58.data → localstack_core-4.4.1.dev60.data}/scripts/localstack.bat
RENAMED
File without changes
|
File without changes
|
{localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/entry_points.txt
RENAMED
File without changes
|
{localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/licenses/LICENSE.txt
RENAMED
File without changes
|
{localstack_core-4.4.1.dev58.dist-info → localstack_core-4.4.1.dev60.dist-info}/top_level.txt
RENAMED
File without changes
|