localstack-core 4.7.1.dev52__py3-none-any.whl → 4.7.1.dev53__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.

Potentially problematic release.


This version of localstack-core might be problematic. Click here for more details.

Files changed (18) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model.py +113 -10
  2. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +5 -0
  3. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +250 -100
  4. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +8 -0
  5. localstack/services/cloudformation/v2/entities.py +3 -3
  6. localstack/services/cloudformation/v2/provider.py +28 -3
  7. localstack/version.py +2 -2
  8. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/METADATA +1 -1
  9. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/RECORD +17 -17
  10. localstack_core-4.7.1.dev53.dist-info/plux.json +1 -0
  11. localstack_core-4.7.1.dev52.dist-info/plux.json +0 -1
  12. {localstack_core-4.7.1.dev52.data → localstack_core-4.7.1.dev53.data}/scripts/localstack +0 -0
  13. {localstack_core-4.7.1.dev52.data → localstack_core-4.7.1.dev53.data}/scripts/localstack-supervisor +0 -0
  14. {localstack_core-4.7.1.dev52.data → localstack_core-4.7.1.dev53.data}/scripts/localstack.bat +0 -0
  15. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/WHEEL +0 -0
  16. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/entry_points.txt +0 -0
  17. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/licenses/LICENSE.txt +0 -0
  18. {localstack_core-4.7.1.dev52.dist-info → localstack_core-4.7.1.dev53.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,7 @@ from localstack.services.cloudformation.v2.types import (
14
14
  EngineParameter,
15
15
  engine_parameter_value,
16
16
  )
17
+ from localstack.utils.json import extract_jsonpath
17
18
  from localstack.utils.strings import camel_to_snake_case
18
19
 
19
20
  T = TypeVar("T")
@@ -106,6 +107,30 @@ class Scope(str):
106
107
  def unwrap(self) -> list[str]:
107
108
  return self.split(self._SEPARATOR)
108
109
 
110
+ @property
111
+ def parent(self) -> Scope:
112
+ return Scope(self._SEPARATOR.join(self.split(self._SEPARATOR)[:-1]))
113
+
114
+ @property
115
+ def jsonpath(self) -> str:
116
+ parts = self.split("/")
117
+ json_parts = []
118
+
119
+ for part in parts:
120
+ if not part: # Skip empty strings from leading/trailing slashes
121
+ continue
122
+
123
+ if part == "divergence":
124
+ continue
125
+
126
+ # Wrap keys with special characters (e.g., colon) in quotes
127
+ if ":" in part:
128
+ json_parts.append(f'"{part}"')
129
+ else:
130
+ json_parts.append(part)
131
+
132
+ return f"$.{'.'.join(json_parts)}"
133
+
109
134
 
110
135
  class ChangeType(enum.Enum):
111
136
  UNCHANGED = "Unchanged"
@@ -343,11 +368,18 @@ class NodeTransform(ChangeSetNode):
343
368
 
344
369
  class NodeResources(ChangeSetNode):
345
370
  resources: Final[list[NodeResource]]
371
+ fn_transform: Final[Maybe[NodeIntrinsicFunctionFnTransform]]
346
372
 
347
- def __init__(self, scope: Scope, resources: list[NodeResource]):
373
+ def __init__(
374
+ self,
375
+ scope: Scope,
376
+ resources: list[NodeResource],
377
+ fn_transform: Maybe[NodeIntrinsicFunctionFnTransform],
378
+ ):
348
379
  change_type = parent_change_type_of(resources)
349
380
  super().__init__(scope=scope, change_type=change_type)
350
381
  self.resources = resources
382
+ self.fn_transform = fn_transform
351
383
 
352
384
 
353
385
  class NodeResource(ChangeSetNode):
@@ -359,6 +391,7 @@ class NodeResource(ChangeSetNode):
359
391
  requires_replacement: Final[bool]
360
392
  deletion_policy: Final[Maybe[ChangeSetTerminal]]
361
393
  update_replace_policy: Final[Maybe[ChangeSetTerminal]]
394
+ fn_transform: Final[Maybe[NodeIntrinsicFunctionFnTransform]]
362
395
 
363
396
  def __init__(
364
397
  self,
@@ -372,6 +405,7 @@ class NodeResource(ChangeSetNode):
372
405
  requires_replacement: bool,
373
406
  deletion_policy: Maybe[ChangeSetTerminal],
374
407
  update_replace_policy: Maybe[ChangeSetTerminal],
408
+ fn_transform: Maybe[NodeIntrinsicFunctionFnTransform],
375
409
  ):
376
410
  super().__init__(scope=scope, change_type=change_type)
377
411
  self.name = name
@@ -382,15 +416,23 @@ class NodeResource(ChangeSetNode):
382
416
  self.requires_replacement = requires_replacement
383
417
  self.deletion_policy = deletion_policy
384
418
  self.update_replace_policy = update_replace_policy
419
+ self.fn_transform = fn_transform
385
420
 
386
421
 
387
422
  class NodeProperties(ChangeSetNode):
388
423
  properties: Final[list[NodeProperty]]
424
+ fn_transform: Final[Maybe[NodeIntrinsicFunctionFnTransform]]
389
425
 
390
- def __init__(self, scope: Scope, properties: list[NodeProperty]):
426
+ def __init__(
427
+ self,
428
+ scope: Scope,
429
+ properties: list[NodeProperty],
430
+ fn_transform: Maybe[NodeIntrinsicFunctionFnTransform],
431
+ ):
391
432
  change_type = parent_change_type_of(properties)
392
433
  super().__init__(scope=scope, change_type=change_type)
393
434
  self.properties = properties
435
+ self.fn_transform = fn_transform
394
436
 
395
437
 
396
438
  class NodeDependsOn(ChangeSetNode):
@@ -427,6 +469,26 @@ class NodeIntrinsicFunction(ChangeSetNode):
427
469
  self.arguments = arguments
428
470
 
429
471
 
472
+ class NodeIntrinsicFunctionFnTransform(NodeIntrinsicFunction):
473
+ def __init__(
474
+ self,
475
+ scope: Scope,
476
+ change_type: ChangeType,
477
+ intrinsic_function: str,
478
+ arguments: ChangeSetEntity,
479
+ before_siblings: list[Any],
480
+ after_siblings: list[Any],
481
+ ):
482
+ super().__init__(
483
+ scope=scope,
484
+ change_type=change_type,
485
+ intrinsic_function=intrinsic_function,
486
+ arguments=arguments,
487
+ )
488
+ self.before_siblings = before_siblings
489
+ self.after_siblings = after_siblings
490
+
491
+
430
492
  class NodeObject(ChangeSetNode):
431
493
  bindings: Final[dict[str, ChangeSetEntity]]
432
494
 
@@ -611,12 +673,32 @@ class ChangeSetModel:
611
673
  change_type = resolve_function(arguments)
612
674
  else:
613
675
  change_type = arguments.change_type
614
- node_intrinsic_function = NodeIntrinsicFunction(
615
- scope=scope,
616
- change_type=change_type,
617
- intrinsic_function=intrinsic_function,
618
- arguments=arguments,
619
- )
676
+
677
+ if intrinsic_function == FnTransform:
678
+ if scope.count(FnTransform) > 1:
679
+ raise RuntimeError(
680
+ "Invalid: Fn::Transforms cannot be nested inside another Fn::Transform"
681
+ )
682
+
683
+ path = "$" + ".".join(scope.split("/")[:-1])
684
+ before_siblings = extract_jsonpath(self._before_template, path)
685
+ after_siblings = extract_jsonpath(self._after_template, path)
686
+
687
+ node_intrinsic_function = NodeIntrinsicFunctionFnTransform(
688
+ scope=scope,
689
+ change_type=change_type,
690
+ arguments=arguments,
691
+ intrinsic_function=intrinsic_function,
692
+ before_siblings=before_siblings,
693
+ after_siblings=after_siblings,
694
+ )
695
+ else:
696
+ node_intrinsic_function = NodeIntrinsicFunction(
697
+ scope=scope,
698
+ change_type=change_type,
699
+ intrinsic_function=intrinsic_function,
700
+ arguments=arguments,
701
+ )
620
702
  self._visited_scopes[scope] = node_intrinsic_function
621
703
  return node_intrinsic_function
622
704
 
@@ -889,10 +971,18 @@ class ChangeSetModel:
889
971
  return node_properties
890
972
  property_names: list[str] = self._safe_keys_of(before_properties, after_properties)
891
973
  properties: list[NodeProperty] = []
974
+ fn_transform = Nothing
975
+
892
976
  for property_name in property_names:
893
977
  property_scope, (before_property, after_property) = self._safe_access_in(
894
978
  scope, property_name, before_properties, after_properties
895
979
  )
980
+ if property_name == FnTransform:
981
+ fn_transform = self._visit_intrinsic_function(
982
+ property_scope, FnTransform, before_property, after_property
983
+ )
984
+ continue
985
+
896
986
  property_ = self._visit_property(
897
987
  scope=property_scope,
898
988
  property_name=property_name,
@@ -900,7 +990,10 @@ class ChangeSetModel:
900
990
  after_property=after_property,
901
991
  )
902
992
  properties.append(property_)
903
- node_properties = NodeProperties(scope=scope, properties=properties)
993
+
994
+ node_properties = NodeProperties(
995
+ scope=scope, properties=properties, fn_transform=fn_transform
996
+ )
904
997
  self._visited_scopes[scope] = node_properties
905
998
  return node_properties
906
999
 
@@ -1019,6 +1112,7 @@ class ChangeSetModel:
1019
1112
  requires_replacement=requires_replacement,
1020
1113
  deletion_policy=deletion_policy,
1021
1114
  update_replace_policy=update_replace_policy,
1115
+ fn_transform=Nothing, # TODO
1022
1116
  )
1023
1117
  self._visited_scopes[scope] = node_resource
1024
1118
  return node_resource
@@ -1029,10 +1123,19 @@ class ChangeSetModel:
1029
1123
  # TODO: investigate type changes behavior.
1030
1124
  resources: list[NodeResource] = []
1031
1125
  resource_names = self._safe_keys_of(before_resources, after_resources)
1126
+ fn_transform = Nothing
1032
1127
  for resource_name in resource_names:
1033
1128
  resource_scope, (before_resource, after_resource) = self._safe_access_in(
1034
1129
  scope, resource_name, before_resources, after_resources
1035
1130
  )
1131
+ if resource_name == FnTransform:
1132
+ fn_transform = self._visit_intrinsic_function(
1133
+ scope=resource_scope,
1134
+ intrinsic_function=resource_name,
1135
+ before_arguments=before_resource,
1136
+ after_arguments=after_resource,
1137
+ )
1138
+ continue
1036
1139
  resource = self._visit_resource(
1037
1140
  scope=resource_scope,
1038
1141
  resource_name=resource_name,
@@ -1040,7 +1143,7 @@ class ChangeSetModel:
1040
1143
  after_resource=after_resource,
1041
1144
  )
1042
1145
  resources.append(resource)
1043
- return NodeResources(scope=scope, resources=resources)
1146
+ return NodeResources(scope=scope, resources=resources, fn_transform=fn_transform)
1044
1147
 
1045
1148
  def _visit_mapping(
1046
1149
  self, scope: Scope, name: str, before_mapping: Maybe[dict], after_mapping: Maybe[dict]
@@ -1216,3 +1216,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
1216
1216
  resolver=_compute_fn_import_value,
1217
1217
  )
1218
1218
  return delta
1219
+
1220
+ def visit_node_intrinsic_function_fn_transform(
1221
+ self, node_intrinsic_function: NodeIntrinsicFunction
1222
+ ):
1223
+ raise RuntimeError("Fn::Transform should have been handled by the Transformer")
@@ -1,9 +1,12 @@
1
1
  import copy
2
+ import json
2
3
  import logging
3
4
  import os
5
+ import re
4
6
  from typing import Any, Final, TypedDict
5
7
 
6
8
  import boto3
9
+ import jsonpath_ng
7
10
  from botocore.exceptions import ClientError
8
11
  from samtranslator.translator.transform import transform as transform_sam
9
12
 
@@ -12,13 +15,16 @@ from localstack.services.cloudformation.engine.policy_loader import create_polic
12
15
  from localstack.services.cloudformation.engine.template_preparer import parse_template
13
16
  from localstack.services.cloudformation.engine.transformers import (
14
17
  FailedTransformationException,
15
- execute_macro,
16
18
  )
17
19
  from localstack.services.cloudformation.engine.v2.change_set_model import (
18
20
  ChangeType,
21
+ FnTransform,
19
22
  Maybe,
20
23
  NodeGlobalTransform,
21
- NodeParameter,
24
+ NodeIntrinsicFunction,
25
+ NodeIntrinsicFunctionFnTransform,
26
+ NodeProperties,
27
+ NodeResources,
22
28
  NodeTransform,
23
29
  Nothing,
24
30
  Scope,
@@ -27,10 +33,14 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
27
33
  from localstack.services.cloudformation.engine.v2.change_set_model_preproc import (
28
34
  ChangeSetModelPreproc,
29
35
  PreprocEntityDelta,
36
+ PreprocProperties,
30
37
  )
38
+ from localstack.services.cloudformation.engine.validations import ValidationError
31
39
  from localstack.services.cloudformation.stores import get_cloudformation_store
32
40
  from localstack.services.cloudformation.v2.entities import ChangeSet
41
+ from localstack.services.cloudformation.v2.types import engine_parameter_value
33
42
  from localstack.utils import testutil
43
+ from localstack.utils.strings import long_uid
34
44
 
35
45
  LOG = logging.getLogger(__name__)
36
46
 
@@ -79,45 +89,6 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
79
89
  self._before_template = before_template or Nothing
80
90
  self._after_template = after_template or Nothing
81
91
 
82
- def visit_node_parameter(
83
- self, node_parameter: NodeParameter
84
- ) -> PreprocEntityDelta[
85
- dict[str, TransformPreprocParameter], dict[str, TransformPreprocParameter]
86
- ]:
87
- # Enable compatability with v1 util.
88
- # TODO: port v1's SSM parameter resolution
89
-
90
- parameter_value_delta = super().visit_node_parameter(node_parameter=node_parameter)
91
- parameter_value_before = parameter_value_delta.before
92
- parameter_value_after = parameter_value_delta.after
93
-
94
- parameter_type_delta = self.visit(node_parameter.type_)
95
- parameter_type_before = parameter_type_delta.before
96
- parameter_type_after = parameter_type_delta.after
97
-
98
- parameter_key = node_parameter.name
99
-
100
- before = Nothing
101
- if not is_nothing(parameter_value_before):
102
- before = TransformPreprocParameter(
103
- ParameterKey=parameter_key,
104
- ParameterValue=parameter_value_before,
105
- ParameterType=parameter_type_before
106
- if not is_nothing(parameter_type_before)
107
- else None,
108
- )
109
- after = Nothing
110
- if not is_nothing(parameter_value_after):
111
- after = TransformPreprocParameter(
112
- ParameterKey=parameter_key,
113
- ParameterValue=parameter_value_after,
114
- ParameterType=parameter_type_after
115
- if not is_nothing(parameter_type_after)
116
- else None,
117
- )
118
-
119
- return PreprocEntityDelta(before=before, after=after)
120
-
121
92
  # Ported from v1:
122
93
  @staticmethod
123
94
  def _apply_global_serverless_transformation(
@@ -143,18 +114,17 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
143
114
  if region_before is not None:
144
115
  os.environ["AWS_DEFAULT_REGION"] = region_before
145
116
 
146
- @staticmethod
147
- def _apply_global_include(
148
- global_transform: GlobalTransform, template: dict, parameters: dict, account_id, region_name
149
- ) -> dict:
150
- location = global_transform.parameters.get("Location")
117
+ def _compute_include_transform(self, parameters: dict, fragment: dict) -> dict:
118
+ location = parameters.get("Location")
151
119
  if not location or not location.startswith("s3://"):
152
120
  raise FailedTransformationException(
153
121
  transformation=INCLUDE_TRANSFORM,
154
122
  message="Unexpected Location parameter for AWS::Include transformer: %s" % location,
155
123
  )
156
124
 
157
- s3_client = connect_to(aws_access_key_id=account_id, region_name=region_name).s3
125
+ s3_client = connect_to(
126
+ aws_access_key_id=self._change_set.account_id, region_name=self._change_set.region_name
127
+ ).s3
158
128
  bucket, _, path = location.removeprefix("s3://").partition("/")
159
129
  try:
160
130
  content = testutil.download_s3_object(s3_client, bucket, path)
@@ -167,34 +137,8 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
167
137
  template_to_include = parse_template(content)
168
138
  except Exception as e:
169
139
  raise FailedTransformationException(transformation=INCLUDE_TRANSFORM, message=str(e))
170
- return {**template, **template_to_include}
171
140
 
172
- @staticmethod
173
- def _apply_global_macro_transformation(
174
- account_id: str,
175
- region_name,
176
- global_transform: GlobalTransform,
177
- template: dict,
178
- parameters: dict,
179
- ) -> dict | None:
180
- macro_name = global_transform.name
181
- macros_store = get_cloudformation_store(
182
- account_id=account_id, region_name=region_name
183
- ).macros
184
- macro = macros_store.get(macro_name)
185
- if macro is None:
186
- raise RuntimeError(f"No definitions for global transform '{macro_name}'")
187
- transformation_parameters = global_transform.parameters or {}
188
- transformed_template = execute_macro(
189
- account_id,
190
- region_name,
191
- parsed_template=template,
192
- macro=macro,
193
- stack_parameters=parameters,
194
- transformation_parameters=transformation_parameters,
195
- )
196
- # The type annotation on the v1 util appears to be incorrect.
197
- return transformed_template # noqa
141
+ return {**fragment, **template_to_include}
198
142
 
199
143
  def _apply_global_transform(
200
144
  self, global_transform: GlobalTransform, template: dict, parameters: dict
@@ -214,20 +158,18 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
214
158
  LOG.warning("%s is not yet supported. Ignoring.", SECRETSMANAGER_TRANSFORM)
215
159
  transformed_template = template
216
160
  elif transform_name == INCLUDE_TRANSFORM:
217
- transformed_template = self._apply_global_include(
218
- global_transform=global_transform,
219
- region_name=self._change_set.region_name,
220
- account_id=self._change_set.account_id,
221
- template=template,
222
- parameters=parameters,
161
+ transformed_template = self._compute_include_transform(
162
+ parameters=global_transform.parameters,
163
+ fragment=template,
223
164
  )
224
165
  else:
225
- transformed_template = self._apply_global_macro_transformation(
226
- account_id=self._change_set.account_id,
227
- region_name=self._change_set.region_name,
228
- global_transform=global_transform,
229
- template=template,
230
- parameters=parameters,
166
+ transformed_template = self._invoke_macro(
167
+ name=global_transform.name,
168
+ parameters=global_transform.parameters
169
+ if not is_nothing(global_transform.parameters)
170
+ else {},
171
+ fragment=template,
172
+ allow_string=False,
231
173
  )
232
174
  return transformed_template
233
175
 
@@ -240,6 +182,8 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
240
182
  parameters_before = parameters_delta.before
241
183
  parameters_after = parameters_delta.after
242
184
 
185
+ self.visit_node_resources(node_template.resources)
186
+
243
187
  transform_delta: PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]] = (
244
188
  self.visit_node_transform(node_template.transform)
245
189
  )
@@ -248,9 +192,9 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
248
192
 
249
193
  transformed_before_template = self._before_template
250
194
  if transform_before and not is_nothing(self._before_template):
251
- transformed_before_template = self._before_cache.get(_SCOPE_TRANSFORM_TEMPLATE_OUTCOME)
252
- if not transformed_before_template:
253
- transformed_before_template = self._before_template
195
+ if _SCOPE_TRANSFORM_TEMPLATE_OUTCOME in self._before_cache:
196
+ transformed_before_template = self._before_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME]
197
+ else:
254
198
  for before_global_transform in transform_before:
255
199
  if not is_nothing(before_global_transform.name):
256
200
  transformed_before_template = self._apply_global_transform(
@@ -258,21 +202,26 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
258
202
  parameters=parameters_before,
259
203
  template=transformed_before_template,
260
204
  )
205
+
206
+ # Macro transformations won't remove the transform from the template
207
+ if "Transform" in transformed_before_template:
208
+ transformed_before_template.pop("Transform")
261
209
  self._before_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = transformed_before_template
262
210
 
263
211
  transformed_after_template = self._after_template
264
212
  if transform_after and not is_nothing(self._after_template):
265
- transformed_after_template = self._after_cache.get(_SCOPE_TRANSFORM_TEMPLATE_OUTCOME)
266
- if not transformed_after_template:
267
- transformed_after_template = self._after_template
268
- for after_global_transform in transform_after:
269
- if not is_nothing(after_global_transform.name):
270
- transformed_after_template = self._apply_global_transform(
271
- global_transform=after_global_transform,
272
- parameters=parameters_after,
273
- template=transformed_after_template,
274
- )
275
- self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = transformed_after_template
213
+ transformed_after_template = self._after_template
214
+ for after_global_transform in transform_after:
215
+ if not is_nothing(after_global_transform.name):
216
+ transformed_after_template = self._apply_global_transform(
217
+ global_transform=after_global_transform,
218
+ parameters=parameters_after,
219
+ template=transformed_after_template,
220
+ )
221
+ # Macro transformations won't remove the transform from the template
222
+ if "Transform" in transformed_after_template:
223
+ transformed_after_template.pop("Transform")
224
+ self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = transformed_after_template
276
225
 
277
226
  self._save_runtime_cache()
278
227
 
@@ -301,6 +250,9 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
301
250
  before = [] if change_type != ChangeType.CREATED else Nothing
302
251
  after = [] if change_type != ChangeType.REMOVED else Nothing
303
252
  for change_set_entity in node_transform.global_transforms:
253
+ if not isinstance(change_set_entity.name.value, str):
254
+ raise ValidationError("Key Name of transform definition must be a string.")
255
+
304
256
  delta: PreprocEntityDelta[GlobalTransform, GlobalTransform] = self.visit(
305
257
  change_set_entity=change_set_entity
306
258
  )
@@ -311,3 +263,201 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
311
263
  if not is_nothing(after) and not is_nothing(delta_after):
312
264
  after.append(delta_after)
313
265
  return PreprocEntityDelta(before=before, after=after)
266
+
267
+ def _compute_fn_transform(
268
+ self, macro_definition: Any, siblings: Any, allow_string: False
269
+ ) -> Any:
270
+ def _normalize_transform(obj):
271
+ transforms = []
272
+
273
+ if isinstance(obj, str):
274
+ transforms.append({"Name": obj, "Parameters": {}})
275
+
276
+ if isinstance(obj, dict):
277
+ transforms.append(obj)
278
+
279
+ if isinstance(obj, list):
280
+ for v in obj:
281
+ if isinstance(v, str):
282
+ transforms.append({"Name": v, "Parameters": {}})
283
+
284
+ if isinstance(v, dict):
285
+ if not v.get("Parameters"):
286
+ v["Parameters"] = {}
287
+ transforms.append(v)
288
+
289
+ return transforms
290
+
291
+ normalized_transforms = _normalize_transform(macro_definition)
292
+ transform_output = copy.deepcopy(siblings)
293
+ for transform in normalized_transforms:
294
+ transform_name = transform["Name"]
295
+ if transform_name == INCLUDE_TRANSFORM:
296
+ transform_output = self._compute_include_transform(
297
+ parameters=transform["Parameters"], fragment=transform_output
298
+ )
299
+ else:
300
+ transform_output: dict | str = self._invoke_macro(
301
+ fragment=transform_output,
302
+ name=transform["Name"],
303
+ parameters=transform.get("Parameters", {}),
304
+ allow_string=allow_string,
305
+ )
306
+
307
+ if isinstance(transform_output, dict) and FnTransform in transform_output:
308
+ transform_output.pop(FnTransform)
309
+
310
+ return transform_output
311
+
312
+ def _replace_at_jsonpath(self, template: dict, path: str, result: Any):
313
+ pattern = jsonpath_ng.parse(path)
314
+ result_template = pattern.update(template, result)
315
+
316
+ return result_template
317
+
318
+ def visit_node_intrinsic_function_fn_transform(
319
+ self, node_intrinsic_function: NodeIntrinsicFunctionFnTransform
320
+ ) -> PreprocEntityDelta:
321
+ arguments_delta = self.visit(node_intrinsic_function.arguments)
322
+ parent_json_path = node_intrinsic_function.scope.parent.jsonpath
323
+
324
+ # Only when a FnTransform is used as Property value the macro function is allowed to return a str
325
+ property_value_regex = r"\.(Properties)"
326
+ allow_string = False
327
+ if re.search(property_value_regex, parent_json_path):
328
+ allow_string = True
329
+
330
+ if not is_nothing(arguments_delta.before):
331
+ before = self._compute_fn_transform(
332
+ arguments_delta.before,
333
+ node_intrinsic_function.before_siblings,
334
+ allow_string=allow_string,
335
+ )
336
+ updated_before_template = self._replace_at_jsonpath(
337
+ self._before_template, parent_json_path, before
338
+ )
339
+ self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = updated_before_template
340
+ else:
341
+ before = Nothing
342
+
343
+ if not is_nothing(arguments_delta.after):
344
+ after = self._compute_fn_transform(
345
+ arguments_delta.after,
346
+ node_intrinsic_function.after_siblings,
347
+ allow_string=allow_string,
348
+ )
349
+ updated_after_template = self._replace_at_jsonpath(
350
+ self._after_template, parent_json_path, after
351
+ )
352
+ self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = updated_after_template
353
+ else:
354
+ after = Nothing
355
+
356
+ self._save_runtime_cache()
357
+ return PreprocEntityDelta(before=before, after=after)
358
+
359
+ def visit_node_properties(
360
+ self, node_properties: NodeProperties
361
+ ) -> PreprocEntityDelta[PreprocProperties, PreprocProperties]:
362
+ if not is_nothing(node_properties.fn_transform):
363
+ self.visit_node_intrinsic_function_fn_transform(node_properties.fn_transform)
364
+
365
+ return super().visit_node_properties(node_properties=node_properties)
366
+
367
+ def visit_node_resources(self, node_resources: NodeResources) -> PreprocEntityDelta:
368
+ if not is_nothing(node_resources.fn_transform):
369
+ self.visit_node_intrinsic_function_fn_transform(
370
+ node_intrinsic_function=node_resources.fn_transform
371
+ )
372
+
373
+ return super().visit_node_resources(node_resources=node_resources)
374
+
375
+ def _invoke_macro(self, name: str, parameters: dict, fragment: dict, allow_string=False):
376
+ account_id = self._change_set.account_id
377
+ region_name = self._change_set.region_name
378
+ macro_definition = get_cloudformation_store(
379
+ account_id=account_id, region_name=region_name
380
+ ).macros.get(name)
381
+
382
+ if not macro_definition:
383
+ raise FailedTransformationException(name, f"Transformation {name} is not supported.")
384
+
385
+ simplified_parameters = {}
386
+ if resolved_parameters := self._change_set.resolved_parameters:
387
+ for key, resolved_parameter in resolved_parameters.items():
388
+ final_value = engine_parameter_value(resolved_parameter)
389
+ simplified_parameters[key] = (
390
+ final_value.split(",")
391
+ if resolved_parameter["type_"] == "CommaDelimitedList"
392
+ else final_value
393
+ )
394
+
395
+ transformation_id = f"{account_id}::{name}"
396
+ event = {
397
+ "region": region_name,
398
+ "accountId": account_id,
399
+ "fragment": fragment,
400
+ "transformId": transformation_id,
401
+ "params": parameters,
402
+ "requestId": long_uid(),
403
+ "templateParameterValues": simplified_parameters,
404
+ }
405
+
406
+ client = connect_to(aws_access_key_id=account_id, region_name=region_name).lambda_
407
+ try:
408
+ invocation = client.invoke(
409
+ FunctionName=macro_definition["FunctionName"], Payload=json.dumps(event)
410
+ )
411
+ except ClientError:
412
+ LOG.error(
413
+ "client error executing lambda function '%s' with payload '%s'",
414
+ macro_definition["FunctionName"],
415
+ json.dumps(event),
416
+ )
417
+ raise
418
+ if invocation.get("StatusCode") != 200 or invocation.get("FunctionError") == "Unhandled":
419
+ raise FailedTransformationException(
420
+ transformation=name,
421
+ message=f"Received malformed response from transform {transformation_id}. Rollback requested by user.",
422
+ )
423
+ result = json.loads(invocation["Payload"].read())
424
+
425
+ if result.get("status") != "success":
426
+ error_message = result.get("errorMessage")
427
+ message = (
428
+ f"Transform {transformation_id} failed with: {error_message}. Rollback requested by user."
429
+ if error_message
430
+ else f"Transform {transformation_id} failed without an error message.. Rollback requested by user."
431
+ )
432
+ raise FailedTransformationException(transformation=name, message=message)
433
+
434
+ if not isinstance(result.get("fragment"), dict) and not allow_string:
435
+ raise FailedTransformationException(
436
+ transformation=name,
437
+ message="Template format error: unsupported structure.. Rollback requested by user.",
438
+ )
439
+
440
+ return result.get("fragment")
441
+
442
+ def visit_node_intrinsic_function_fn_get_att(
443
+ self, node_intrinsic_function: NodeIntrinsicFunction
444
+ ) -> PreprocEntityDelta:
445
+ return self.visit(node_intrinsic_function.arguments)
446
+
447
+ def visit_node_intrinsic_function_fn_sub(
448
+ self, node_intrinsic_function: NodeIntrinsicFunction
449
+ ) -> PreprocEntityDelta:
450
+ try:
451
+ # If an argument is a Parameter it should be resolved, any other case, ignore it
452
+ return super().visit_node_intrinsic_function_fn_sub(node_intrinsic_function)
453
+ except RuntimeError:
454
+ return self.visit(node_intrinsic_function.arguments)
455
+
456
+ def visit_node_intrinsic_function_fn_split(
457
+ self, node_intrinsic_function: NodeIntrinsicFunction
458
+ ) -> PreprocEntityDelta:
459
+ try:
460
+ # If an argument is a Parameter it should be resolved, any other case, ignore it
461
+ return super().visit_node_intrinsic_function_fn_split(node_intrinsic_function)
462
+ except RuntimeError:
463
+ return self.visit(node_intrinsic_function.arguments)
@@ -139,3 +139,11 @@ class ChangeSetModelValidator(ChangeSetModelPreproc):
139
139
  if is_nothing(after) and not is_nothing(arguments_after):
140
140
  after = _compute_sub(args=arguments_after, select_before=False)
141
141
  return PreprocEntityDelta(before=before, after=after)
142
+
143
+ def visit_node_intrinsic_function_fn_transform(
144
+ self, node_intrinsic_function: NodeIntrinsicFunction
145
+ ):
146
+ # TODO Research this issue:
147
+ # Function is already resolved in the template reaching this point
148
+ # But transformation is still present in update model
149
+ return self.visit(node_intrinsic_function.arguments)
@@ -29,7 +29,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
29
29
  ChangeType,
30
30
  UpdateModel,
31
31
  )
32
- from localstack.services.cloudformation.v2.types import ResolvedResource
32
+ from localstack.services.cloudformation.v2.types import EngineParameter, ResolvedResource
33
33
  from localstack.utils.aws import arns
34
34
  from localstack.utils.strings import long_uid, short_uid
35
35
 
@@ -192,7 +192,7 @@ class ChangeSet:
192
192
  execution_status: ExecutionStatus
193
193
  creation_time: datetime
194
194
  processed_template: dict | None
195
- resolved_parameters: list[ApiParameter]
195
+ resolved_parameters: dict[str, EngineParameter]
196
196
  description: str | None
197
197
 
198
198
  def __init__(
@@ -210,7 +210,7 @@ class ChangeSet:
210
210
  self.execution_status = ExecutionStatus.AVAILABLE
211
211
  self.update_model = None
212
212
  self.creation_time = datetime.now(tz=UTC)
213
- self.resolved_parameters = []
213
+ self.resolved_parameters = {}
214
214
 
215
215
  self.change_set_name = request_payload["ChangeSetName"]
216
216
  self.change_set_type = request_payload.get("ChangeSetType", ChangeSetType.UPDATE)
@@ -80,6 +80,7 @@ from localstack.aws.connect import connect_to
80
80
  from localstack.services.cloudformation import api_utils
81
81
  from localstack.services.cloudformation.engine import template_preparer
82
82
  from localstack.services.cloudformation.engine.parameters import resolve_ssm_parameter
83
+ from localstack.services.cloudformation.engine.transformers import FailedTransformationException
83
84
  from localstack.services.cloudformation.engine.v2.change_set_model import (
84
85
  ChangeSetModel,
85
86
  ChangeType,
@@ -299,9 +300,18 @@ class CloudformationProviderV2(CloudformationProvider):
299
300
  before_template=before_template,
300
301
  after_template=after_template,
301
302
  )
302
- transformed_before_template, transformed_after_template = (
303
- change_set_model_transform.transform()
304
- )
303
+ try:
304
+ transformed_before_template, transformed_after_template = (
305
+ change_set_model_transform.transform()
306
+ )
307
+ except FailedTransformationException as e:
308
+ change_set.status = ChangeSetStatus.FAILED
309
+ change_set.status_reason = e.message
310
+ change_set.stack.set_stack_status(
311
+ status=StackStatus.ROLLBACK_IN_PROGRESS, reason=e.message
312
+ )
313
+ change_set.stack.set_stack_status(status=StackStatus.CREATE_FAILED)
314
+ return
305
315
 
306
316
  # Remodel the update graph after the applying the global transforms.
307
317
  change_set_model = ChangeSetModel(
@@ -363,6 +373,12 @@ class CloudformationProviderV2(CloudformationProvider):
363
373
  template_body = api_utils.extract_template_body(request)
364
374
  structured_template = template_preparer.parse_template(template_body)
365
375
 
376
+ if len(template_body) > 51200:
377
+ raise ValidationError(
378
+ f"1 validation error detected: Value '{template_body}' at 'templateBody' "
379
+ "failed to satisfy constraint: Member must have length less than or equal to 51200"
380
+ )
381
+
366
382
  # this is intentionally not in a util yet. Let's first see how the different operations deal with these before generalizing
367
383
  # handle ARN stack_name here (not valid for initial CREATE, since stack doesn't exist yet)
368
384
  if is_stack_arn(stack_name):
@@ -688,6 +704,12 @@ class CloudformationProviderV2(CloudformationProvider):
688
704
  template_body = api_utils.extract_template_body(request)
689
705
  structured_template = template_preparer.parse_template(template_body)
690
706
 
707
+ if len(template_body) > 51200:
708
+ raise ValidationError(
709
+ f"1 validation error detected: Value '{template_body}' at 'templateBody' "
710
+ "failed to satisfy constraint: Member must have length less than or equal to 51200"
711
+ )
712
+
691
713
  if "CAPABILITY_AUTO_EXPAND" not in request.get("Capabilities", []) and (
692
714
  "Transform" in structured_template.keys() or "Fn::Transform" in template_body
693
715
  ):
@@ -727,6 +749,8 @@ class CloudformationProviderV2(CloudformationProvider):
727
749
  after_parameters=after_parameters,
728
750
  previous_update_model=None,
729
751
  )
752
+ if change_set.status == ChangeSetStatus.FAILED:
753
+ return CreateStackOutput(StackId=stack.stack_id)
730
754
 
731
755
  # deployment process
732
756
  stack.set_stack_status(StackStatus.CREATE_IN_PROGRESS)
@@ -742,6 +766,7 @@ class CloudformationProviderV2(CloudformationProvider):
742
766
  # which was just deployed
743
767
  stack.template = change_set.template
744
768
  stack.template_body = change_set.template_body
769
+ stack.processed_template = change_set.processed_template
745
770
  stack.resolved_parameters = change_set.resolved_parameters
746
771
  stack.resolved_exports = {}
747
772
  for output in result.outputs:
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.7.1.dev52'
21
- __version_tuple__ = version_tuple = (4, 7, 1, 'dev52')
20
+ __version__ = version = '4.7.1.dev53'
21
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev53')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.7.1.dev52
3
+ Version: 4.7.1.dev53
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=78Sf99fgH3ckJ20a9SMqsu01r1cm5GgcomkuY4yDMDo,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=Wtj1cEke6qP9dIUkcEAGdq5SSyVnWEDSIQCOV-B8PHM,526
7
+ localstack/version.py,sha256=gkzjmZOQJuMMvuJT5ymjPQTk1DKZiC_UIEBlujGzqHg,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
@@ -311,12 +311,12 @@ localstack/services/cloudformation/engine/types.py,sha256=JQF2aM5DUtnJhvQ30RTaKv
311
311
  localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
312
312
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
313
313
  localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
314
- localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=Ti2WVoqxCdza7EX64jWOvvce8mTE0n8Pd01e03FjScM,60553
314
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=7-mOvqx-hib-IwGFm6wY6DM00VTqdPz15BY0LS2s7zo,64011
315
315
  localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=ROQwv8a2geaA0HVqCJWftAO0TKCnWPK-z82-wWU_vbE,10397
316
316
  localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=NPe43w7c4wRyHzW762zrpstDQ6iq5jL-ZMpU68CKUXA,25799
317
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=SMau1rTDjeh7j_K4eU6qY2aAFSi30EnQR130uxIqFkM,52511
318
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=IwEaWUcTivug2ZfLvB4_uQnHmj-3hRE9VR4SH8pkvRw,13383
319
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=N6iWlTptglJB1PQ5HKBc2pvD--KpJWlOuvTBeeMjslk,6341
317
+ localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=xTV501asFt4GZJpsQ254zPL0voe4lujWLyWMlRCZ1Q8,52720
318
+ localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=yBcLjMnSh0O3DZq6uKjlSU4JEMpRqTB0yvIuCtMv73I,19828
319
+ localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=KkqMrApsWRzRSZ8VogljPg4_9S1FU_Leitx7ZnlvInA,6696
320
320
  localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=ygUVPgM3b8SAXLLhLeGSD2k_Oo81ukFkug6bcmvRSJg,7843
321
321
  localstack/services/cloudformation/engine/v2/resolving.py,sha256=ot76GycQsw6Y9SvxB8sAlK7tRntJb5CTrKYqyEnfiHc,4002
322
322
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
@@ -336,8 +336,8 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
336
336
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=W4qA6eMNejKWLEhYL340DZEE2D9Bdkcl0Jmp0C7VnWc,30964
337
337
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=id7l43zsJsTgUyQ8F3jpfbpEoicc8GC6cB2ESEktDxc,7936
338
338
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
- localstack/services/cloudformation/v2/entities.py,sha256=Q-3ixLWSmmjhClBIzGo6469oU73-DAPa8ZSXWixuUHk,8976
340
- localstack/services/cloudformation/v2/provider.py,sha256=mDW15iOnkb91Vqos0Kjueo2CMkP15yFdzq5P8bUnepI,61481
339
+ localstack/services/cloudformation/v2/entities.py,sha256=SqSmdcw3toeRdxuIHyel5DCKlhRIeNHCRASBTpMGnbc,9001
340
+ localstack/services/cloudformation/v2/provider.py,sha256=oRiVt7fX5wRYDu99eH0TOTt0iw7Opl5YXANJVlawNWE,62742
341
341
  localstack/services/cloudformation/v2/types.py,sha256=YOKERHmgRjK3RCjqKwQ3ZxZKfa0D-Uwjt2W9GaFDkiM,864
342
342
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
343
343
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1286,13 +1286,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1286
1286
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1287
1287
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1288
1288
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1289
- localstack_core-4.7.1.dev52.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1290
- localstack_core-4.7.1.dev52.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1291
- localstack_core-4.7.1.dev52.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1292
- localstack_core-4.7.1.dev52.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1293
- localstack_core-4.7.1.dev52.dist-info/METADATA,sha256=_BLZs0Cz0nfNX9uMyi11LBgXEOJCzbjctb4bM7SPPbM,5570
1294
- localstack_core-4.7.1.dev52.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1295
- localstack_core-4.7.1.dev52.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1296
- localstack_core-4.7.1.dev52.dist-info/plux.json,sha256=X-gyAr2g65h_gm6JA2LW9I8BqX5s9BZaI_bAk3b9FB0,20891
1297
- localstack_core-4.7.1.dev52.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1298
- localstack_core-4.7.1.dev52.dist-info/RECORD,,
1289
+ localstack_core-4.7.1.dev53.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1290
+ localstack_core-4.7.1.dev53.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1291
+ localstack_core-4.7.1.dev53.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1292
+ localstack_core-4.7.1.dev53.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1293
+ localstack_core-4.7.1.dev53.dist-info/METADATA,sha256=UTJydFnqzldfLCawmEKeJEQAPkVCN62rYhGC4-d7Vro,5570
1294
+ localstack_core-4.7.1.dev53.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1295
+ localstack_core-4.7.1.dev53.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1296
+ localstack_core-4.7.1.dev53.dist-info/plux.json,sha256=0nilt3JYHcNLYOpoIpj2hcVTTZXF_QOaqBp3WP4mzgM,20891
1297
+ localstack_core-4.7.1.dev53.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1298
+ localstack_core-4.7.1.dev53.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "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::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_start": ["delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_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", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "eager_load_services=localstack.services.plugins:eager_load_services", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.packages": ["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", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "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.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"], "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.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"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "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::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "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::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "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::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "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::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "eager_load_services=localstack.services.plugins:eager_load_services", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "_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", "_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", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches"], "localstack.packages": ["lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "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"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server", "publish_metrics=localstack.utils.analytics.metrics.publisher: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"], "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.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.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "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"]}