localstack-core 4.4.1.dev58__py3-none-any.whl → 4.4.1.dev60__py3-none-any.whl

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