localstack-core 4.4.1.dev59__py3-none-any.whl → 4.4.1.dev61__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model.py +3 -2
  2. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +33 -16
  3. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +47 -20
  4. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +108 -16
  5. localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +11 -1
  6. localstack/testing/pytest/cloudformation/fixtures.py +13 -1
  7. localstack/version.py +2 -2
  8. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/METADATA +1 -1
  9. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/RECORD +17 -17
  10. localstack_core-4.4.1.dev61.dist-info/plux.json +1 -0
  11. localstack_core-4.4.1.dev59.dist-info/plux.json +0 -1
  12. {localstack_core-4.4.1.dev59.data → localstack_core-4.4.1.dev61.data}/scripts/localstack +0 -0
  13. {localstack_core-4.4.1.dev59.data → localstack_core-4.4.1.dev61.data}/scripts/localstack-supervisor +0 -0
  14. {localstack_core-4.4.1.dev59.data → localstack_core-4.4.1.dev61.data}/scripts/localstack.bat +0 -0
  15. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/WHEEL +0 -0
  16. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/entry_points.txt +0 -0
  17. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/licenses/LICENSE.txt +0 -0
  18. {localstack_core-4.4.1.dev59.dist-info → localstack_core-4.4.1.dev61.dist-info}/top_level.txt +0 -0
@@ -386,6 +386,7 @@ FnGetAttKey: Final[str] = "Fn::GetAtt"
386
386
  FnEqualsKey: Final[str] = "Fn::Equals"
387
387
  FnFindInMapKey: Final[str] = "Fn::FindInMap"
388
388
  FnSubKey: Final[str] = "Fn::Sub"
389
+ FnTransform: Final[str] = "Fn::Transform"
389
390
  INTRINSIC_FUNCTIONS: Final[set[str]] = {
390
391
  RefKey,
391
392
  FnIfKey,
@@ -395,6 +396,7 @@ INTRINSIC_FUNCTIONS: Final[set[str]] = {
395
396
  FnGetAttKey,
396
397
  FnFindInMapKey,
397
398
  FnSubKey,
399
+ FnTransform,
398
400
  }
399
401
 
400
402
 
@@ -523,7 +525,6 @@ class ChangeSetModel:
523
525
  def _resolve_intrinsic_function_ref(self, arguments: ChangeSetEntity) -> ChangeType:
524
526
  if arguments.change_type != ChangeType.UNCHANGED:
525
527
  return arguments.change_type
526
- # TODO: add support for nested functions, here we assume the argument is a logicalID.
527
528
  if not isinstance(arguments, TerminalValue):
528
529
  return arguments.change_type
529
530
 
@@ -1170,7 +1171,7 @@ class ChangeSetModel:
1170
1171
  parameters_scope, parameter_name, before_parameters, after_parameters
1171
1172
  )
1172
1173
  node_parameter = self._visit_parameter(
1173
- parameters_scope,
1174
+ parameter_scope,
1174
1175
  parameter_name,
1175
1176
  before_parameter=before_parameter,
1176
1177
  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
- before_argument_list = arguments_delta.before
49
- after_argument_list = arguments_delta.after
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 before_argument_list:
53
- before_logical_name_of_resource = before_argument_list[0]
54
- before_attribute_name = before_argument_list[1]
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
- before_property_delta = self.visit(before_node_property)
62
- before = before_property_delta.before
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 after_argument_list:
66
- after_logical_name_of_resource = after_argument_list[0]
67
- after_attribute_name = after_argument_list[1]
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
- after_property_delta = PreprocEntityDelta(after=CHANGESET_KNOWN_AFTER_APPLY)
79
- if after_property_delta.before == after_property_delta.after:
80
- after = after_property_delta.after
81
- else:
82
- after = CHANGESET_KNOWN_AFTER_APPLY
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
- self._execute_on_resource_change(
107
- name=node_resource.name, before=delta.before, after=delta.after
108
- )
109
- after_resource = delta.after
110
- if after_resource is not None and delta.before != delta.after:
111
- after_logical_id = after_resource.logical_id
112
- after_physical_id: Optional[str] = self._after_resource_physical_id(
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
- if after_physical_id is None:
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
- if delta.after is None:
127
- # handling deletion so the output does not really matter
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 _execute_on_resource_change(
140
+ def _execute_resource_change(
135
141
  self, name: str, before: Optional[PreprocResource], after: Optional[PreprocResource]
136
142
  ) -> None:
137
- if before == after:
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(
@@ -3,6 +3,11 @@ from __future__ import annotations
3
3
  import re
4
4
  from typing import Any, Final, Generic, Optional, TypeVar
5
5
 
6
+ from localstack.services.cloudformation.engine.transformers import (
7
+ Transformer,
8
+ execute_macro,
9
+ transformers,
10
+ )
6
11
  from localstack.services.cloudformation.engine.v2.change_set_model import (
7
12
  ChangeSetEntity,
8
13
  ChangeType,
@@ -30,6 +35,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
30
35
  from localstack.services.cloudformation.engine.v2.change_set_model_visitor import (
31
36
  ChangeSetModelVisitor,
32
37
  )
38
+ from localstack.services.cloudformation.stores import get_cloudformation_store
33
39
  from localstack.services.cloudformation.v2.entities import ChangeSet
34
40
  from localstack.utils.aws.arns import get_partition
35
41
  from localstack.utils.urls import localstack_host
@@ -168,6 +174,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
168
174
  # TODO: this could be improved with hashmap lookups if the Node contained bindings and not lists.
169
175
  for node_resource in node_template.resources.resources:
170
176
  if node_resource.name == resource_name:
177
+ self.visit(node_resource)
171
178
  return node_resource
172
179
  raise RuntimeError(f"No resource '{resource_name}' was found")
173
180
 
@@ -177,6 +184,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
177
184
  # TODO: this could be improved with hashmap lookups if the Node contained bindings and not lists.
178
185
  for node_property in node_resource.properties.properties:
179
186
  if node_property.name == property_name:
187
+ self.visit(node_property)
180
188
  return node_property
181
189
  return None
182
190
 
@@ -189,10 +197,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
189
197
  # process the resource if this wasn't processed already. Ideally, values should only
190
198
  # be accessible through delta objects, to ensure computation is always complete at
191
199
  # every level.
192
- node_resource = self._get_node_resource_for(
200
+ _ = self._get_node_resource_for(
193
201
  resource_name=resource_logical_id, node_template=self._node_template
194
202
  )
195
- self.visit(node_resource)
196
203
 
197
204
  resolved_resource = resolved_resources.get(resource_logical_id)
198
205
  if resolved_resource is None:
@@ -228,6 +235,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
228
235
  # TODO: another scenarios suggesting property lookups might be preferable.
229
236
  for mapping in mappings:
230
237
  if mapping.name == map_name:
238
+ self.visit(mapping)
231
239
  return mapping
232
240
  # TODO
233
241
  raise RuntimeError()
@@ -237,6 +245,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
237
245
  # TODO: another scenarios suggesting property lookups might be preferable.
238
246
  for parameter in parameters:
239
247
  if parameter.name == parameter_name:
248
+ self.visit(parameter)
240
249
  return parameter
241
250
  return None
242
251
 
@@ -245,6 +254,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
245
254
  # TODO: another scenarios suggesting property lookups might be preferable.
246
255
  for condition in conditions:
247
256
  if condition.name == condition_name:
257
+ self.visit(condition)
248
258
  return condition
249
259
  return None
250
260
 
@@ -372,15 +382,19 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
372
382
  def visit_node_intrinsic_function_fn_get_att(
373
383
  self, node_intrinsic_function: NodeIntrinsicFunction
374
384
  ) -> PreprocEntityDelta:
375
- arguments_delta = self.visit(node_intrinsic_function.arguments)
376
385
  # TODO: validate the return value according to the spec.
377
- before_argument_list = arguments_delta.before
378
- after_argument_list = arguments_delta.after
386
+ arguments_delta = self.visit(node_intrinsic_function.arguments)
387
+ before_argument: Optional[list[str]] = arguments_delta.before
388
+ if isinstance(before_argument, str):
389
+ before_argument = before_argument.split(".")
390
+ after_argument: Optional[list[str]] = arguments_delta.after
391
+ if isinstance(after_argument, str):
392
+ after_argument = after_argument.split(".")
379
393
 
380
394
  before = None
381
- if before_argument_list:
382
- before_logical_name_of_resource = before_argument_list[0]
383
- before_attribute_name = before_argument_list[1]
395
+ if before_argument:
396
+ before_logical_name_of_resource = before_argument[0]
397
+ before_attribute_name = before_argument[1]
384
398
 
385
399
  before_node_resource = self._get_node_resource_for(
386
400
  resource_name=before_logical_name_of_resource, node_template=self._node_template
@@ -401,9 +415,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
401
415
  )
402
416
 
403
417
  after = None
404
- if after_argument_list:
405
- after_logical_name_of_resource = after_argument_list[0]
406
- after_attribute_name = after_argument_list[1]
418
+ if after_argument:
419
+ after_logical_name_of_resource = after_argument[0]
420
+ after_attribute_name = after_argument[1]
407
421
  after_node_resource = self._get_node_resource_for(
408
422
  resource_name=after_logical_name_of_resource, node_template=self._node_template
409
423
  )
@@ -452,10 +466,14 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
452
466
  )
453
467
 
454
468
  # TODO: add support for this being created or removed.
455
- before_outcome_delta = _compute_delta_for_if_statement(arguments_delta.before)
456
- before = before_outcome_delta.before
457
- after_outcome_delta = _compute_delta_for_if_statement(arguments_delta.after)
458
- after = after_outcome_delta.after
469
+ before = None
470
+ if arguments_delta.before:
471
+ before_outcome_delta = _compute_delta_for_if_statement(arguments_delta.before)
472
+ before = before_outcome_delta.before
473
+ after = None
474
+ if arguments_delta.after:
475
+ after_outcome_delta = _compute_delta_for_if_statement(arguments_delta.after)
476
+ after = after_outcome_delta.after
459
477
  return PreprocEntityDelta(before=before, after=after)
460
478
 
461
479
  def visit_node_intrinsic_function_fn_not(
@@ -478,6 +496,78 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
478
496
  # Implicit change type computation.
479
497
  return PreprocEntityDelta(before=before, after=after)
480
498
 
499
+ def _compute_fn_transform(self, args: dict[str, Any]) -> Any:
500
+ # TODO: add typing to arguments before this level.
501
+ # TODO: add schema validation
502
+ # TODO: add support for other transform types
503
+
504
+ account_id = self._change_set.account_id
505
+ region_name = self._change_set.region_name
506
+ transform_name: str = args.get("Name")
507
+ if not isinstance(transform_name, str):
508
+ raise RuntimeError("Invalid or missing Fn::Transform 'Name' argument")
509
+ transform_parameters: dict = args.get("Parameters")
510
+ if not isinstance(transform_parameters, dict):
511
+ raise RuntimeError("Invalid or missing Fn::Transform 'Parameters' argument")
512
+
513
+ if transform_name in transformers:
514
+ # TODO: port and refactor this 'transformers' logic to this package.
515
+ builtin_transformer_class = transformers[transform_name]
516
+ builtin_transformer: Transformer = builtin_transformer_class()
517
+ transform_output: Any = builtin_transformer.transform(
518
+ account_id=account_id, region_name=region_name, parameters=transform_parameters
519
+ )
520
+ return transform_output
521
+
522
+ macros_store = get_cloudformation_store(
523
+ account_id=account_id, region_name=region_name
524
+ ).macros
525
+ if transform_name in macros_store:
526
+ # TODO: this formatting of stack parameters is odd but required to integrate with v1 execute_macro util.
527
+ # consider porting this utils and passing the plain list of parameters instead.
528
+ stack_parameters = {
529
+ parameter["ParameterKey"]: parameter
530
+ for parameter in self._change_set.stack.parameters
531
+ }
532
+ transform_output: Any = execute_macro(
533
+ account_id=account_id,
534
+ region_name=region_name,
535
+ parsed_template=dict(), # TODO: review the requirements for this argument.
536
+ macro=args, # TODO: review support for non dict bindings (v1).
537
+ stack_parameters=stack_parameters,
538
+ transformation_parameters=transform_parameters,
539
+ is_intrinsic=True,
540
+ )
541
+ return transform_output
542
+
543
+ raise RuntimeError(
544
+ f"Unsupported transform function '{transform_name}' in '{self._change_set.stack.stack_name}'"
545
+ )
546
+
547
+ def visit_node_intrinsic_function_fn_transform(
548
+ self, node_intrinsic_function: NodeIntrinsicFunction
549
+ ) -> PreprocEntityDelta:
550
+ arguments_delta = self.visit(node_intrinsic_function.arguments)
551
+ arguments_before = arguments_delta.before
552
+ arguments_after = arguments_delta.after
553
+
554
+ # TODO: review the use of cache in self.precessed from the 'before' run to
555
+ # ensure changes to the lambda (such as after UpdateFunctionCode) do not
556
+ # generalise tot he before value at this depth (thus making it seems as
557
+ # though for this transformation before==after). Another options may be to
558
+ # have specialised caching for transformations.
559
+
560
+ # TODO: add tests to review the behaviour of CFN with changes to transformation
561
+ # function code and no changes to the template.
562
+
563
+ before = None
564
+ if arguments_before:
565
+ before = self._compute_fn_transform(args=arguments_before)
566
+ after = None
567
+ if arguments_after:
568
+ after = self._compute_fn_transform(args=arguments_after)
569
+ return PreprocEntityDelta(before=before, after=after)
570
+
481
571
  def visit_node_intrinsic_function_fn_sub(
482
572
  self, node_intrinsic_function: NodeIntrinsicFunction
483
573
  ) -> PreprocEntityDelta:
@@ -520,6 +610,8 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
520
610
  template_variable_value = (
521
611
  reference_delta.before if select_before else reference_delta.after
522
612
  )
613
+ if isinstance(template_variable_value, PreprocResource):
614
+ template_variable_value = template_variable_value.logical_id
523
615
  except RuntimeError:
524
616
  raise RuntimeError(
525
617
  f"Undefined variable name in Fn::Sub string template '{template_variable_name}'"
@@ -558,7 +650,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
558
650
  delimiter: str = str(args[0])
559
651
  values: list[Any] = args[1]
560
652
  if not isinstance(values, list):
561
- raise RuntimeError("Invalid arguments list definition for Fn::Join")
653
+ raise RuntimeError(f"Invalid arguments list definition for Fn::Join: '{args}'")
562
654
  join_result = delimiter.join(map(str, values))
563
655
  return join_result
564
656
 
@@ -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
- self.visit_children(node_template)
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,11 @@ class ChangeSetModelVisitor(abc.ABC):
108
113
  ):
109
114
  self.visit_children(node_intrinsic_function)
110
115
 
116
+ def visit_node_intrinsic_function_fn_transform(
117
+ self, node_intrinsic_function: NodeIntrinsicFunction
118
+ ):
119
+ self.visit_children(node_intrinsic_function)
120
+
111
121
  def visit_node_intrinsic_function_fn_sub(self, node_intrinsic_function: NodeIntrinsicFunction):
112
122
  self.visit_children(node_intrinsic_function)
113
123
 
@@ -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.dev59'
21
- __version_tuple__ = version_tuple = (4, 4, 1, 'dev59')
20
+ __version__ = version = '4.4.1.dev61'
21
+ __version_tuple__ = version_tuple = (4, 4, 1, 'dev61')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.4.1.dev59
3
+ Version: 4.4.1.dev61
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=BYrj66uZL2FFDTGqTWZXT_ndfO3b0HoyRbzr625xxWc,526
7
+ localstack/version.py,sha256=BiE34atc8jkKXYJSnPavvUElTXitHO1CC7TKf01jArs,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=cfxoD1HStfiiSwpWbb3DsKUpdibzDmy0Vlvn4rp9dC4,50969
314
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=7o59mpZKvh5QdTKuI9dqzmWJglCh-p96gx3BCmRt1u8,8329
315
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=WG5OHU15TeHAy1rbbjI4lIoqifbiSpVlrMlHBmLEU2k,14459
316
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=Evp3N3PF61NMhIeckBuY_eTFqnaK_PnWEtqwb1zIIEc,34429
317
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=wv_J8HrsIfs7c9i796ZdkGcJCIY9_BqAva89zG4Qoxo,5606
313
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=w0LYTNQnW0mMZnAQvL4CHBX_r2oK0phCwnLpcf73vnk,50933
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=nZHQ_s5k0pAK-JIsi5U73ZYelTRFxA91rhYg9jrpyGU,38822
317
+ localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=spv0qpCb9-I4yT4rIkSWyTU5XsbcFZBj5M1SUl2iAJo,6208
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=0R7SFKkSrYvdjt5bC8VjutfJgXO1M9lALwPYdrrfP8U,6434
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.dev59.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
- localstack_core-4.4.1.dev59.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
- localstack_core-4.4.1.dev59.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
- localstack_core-4.4.1.dev59.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
- localstack_core-4.4.1.dev59.dist-info/METADATA,sha256=wRlyuwyYvVewvZCvsn7ZUVBxu2VubEEwiaK6i5G1f24,5539
1287
- localstack_core-4.4.1.dev59.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1288
- localstack_core-4.4.1.dev59.dist-info/entry_points.txt,sha256=K5M7il9Vwev64SlQiOaZVUhYpVNIE6IFHiWJ0znpbHQ,20491
1289
- localstack_core-4.4.1.dev59.dist-info/plux.json,sha256=xZPetbTlxHoi3N3nEf14pd1jLNOq5D5oTiC1S-bkD0I,20712
1290
- localstack_core-4.4.1.dev59.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
- localstack_core-4.4.1.dev59.dist-info/RECORD,,
1282
+ localstack_core-4.4.1.dev61.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
+ localstack_core-4.4.1.dev61.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
+ localstack_core-4.4.1.dev61.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
+ localstack_core-4.4.1.dev61.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
+ localstack_core-4.4.1.dev61.dist-info/METADATA,sha256=FRb_3DESddb_1an0xfEZFph237GChJ_yLE98C4u3hqo,5539
1287
+ localstack_core-4.4.1.dev61.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1288
+ localstack_core-4.4.1.dev61.dist-info/entry_points.txt,sha256=K5M7il9Vwev64SlQiOaZVUhYpVNIE6IFHiWJ0znpbHQ,20491
1289
+ localstack_core-4.4.1.dev61.dist-info/plux.json,sha256=2I9IjVDjFdYnr155NCMe5Fe6q6uCH1ObYe_bK6TB-_0,20712
1290
+ localstack_core-4.4.1.dev61.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
+ localstack_core-4.4.1.dev61.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "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::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin"], "localstack.packages": ["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", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.hooks.on_infra_start": ["register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_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", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "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", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "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.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "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::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "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::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "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::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "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::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "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::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "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::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin"], "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", "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", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "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", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "_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", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "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.packages": ["jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_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", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_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", "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", "stop_server=localstack.dns.plugins:stop_server", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.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.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"]}